On Fri, Jul 9, 2021 at 1:07 AM Arnd Bergmann <arnd@xxxxxxxxxx> wrote: > > On Thu, Jul 8, 2021 at 8:04 PM 'Nick Desaulniers' via Clang Built > Linux <clang-built-linux@xxxxxxxxxxxxxxxx> wrote: > > > > /usr/bin/powerpc64-linux-gnu-gcc-5.2.0 > > > /usr/bin/powerpc64-linux-gnu-gcc -> powerpc64-linux-gnu-gcc-5.2.0 > > > /usr/local/bin/ppc64le-linux-gcc-9 > > > ~/bin/powerpc/powerpc-linux-unknown-gcc-12.0.20210708.experimental > > > > > > all of these should be able to cross-build any powerpc kernel, but > > > there is no obvious first choice (highest version, first in path, > > > ordered list of target triples, ...). I tried coming up with a heuristic > > > to pick a reasonable toolchain, but at some point gave up because > > > I failed to express that in a readable bash or Makefile syntax. > > > > Right; foremost in my mind was arm-linux-gnueabi-gcc vs > > arm-linux-gnueabihf-gcc. That's not even to mention the versioned > > suffixes. > > > > In terms of multiversion support; this series doesn't regress doing > > things the hard/verbose way. But I think for most users we can have a > > simpler common case; folks can play with their $PATH or focus on more > > hermetic builds if they want this new feature (CROSS_COMPILE > > inference) AND support for multiple versions of the same toolchain. > > Fair enough. So how something like this: > > powerpc-targets := powerpc32 powerpc64 powerpc32le \ > powerpc32be powerpc64le powerpc64be ppc64le ppc64be > arm-targets := arm-linux-gnueabi arm-linux-gnueabihf > x86-targets := x86_64 i386 i686 > x86_64-targets := x86 > i386-targets := i686 x86 x86_64 > parisc-targets := hppa64 hppa > ... > > CROSS_COMPILE ?= `find-toolchain $(ARCH) $($(ARCH)-targets)` > > where find-toolchain just finds the first working toolchain based, looking > for $(target)-linux-gcc $(target)-gcc $(target)-unknown-linux-gcc etc > in $(PATH) but ignoring the versions? Sure, debian doesn't even package different versions of the cross GCC packages AFAIK; no idea about other distros. Though the user may have built from source, or have multiple versions fetched from tarballs. I think we can simplify the common case of "I just wan't to cross compile, I don't necessarily care about an older compiler version co-installed with a newer one." ("and if I did, I could still use CROSS_COMPILE the verbose way"). > What I had actually planned was a set of helpers that allow you to > do this in multiple steps: > > - if $(objtree)/scripts/cross/bin/gcc (or something else we pick) > exists and CROSS_COMPILE is not set, set CROSS_COMPILE > to $(objtree)/scripts/cross/bin/ in the Makefile > - add script to enumerate the installed toolchains > - add a second script to symlink one of those toolchains to > $(objtree)/scripts/cross/bin (and check the symlink isn't broken should the user uninstall a toolchain, or have their distro update their toolchain version) > - add a third script to download a cross-toolchain from kernel.org > for $(ARCH) and install it to one of the locations that the first > script looks for (/opt/cross/, $(HOME)/cross/, $(objtree)scripts/cross/) Would the user be prompted for the download? So during `defconfig`/configuration we could prompt and say "it looks like you're cross compiling without setting CROSS_COMPILE, would you like me to fetch a cross compiler for you?" Seems reasonable, when cross compiling with GCC. -- Thanks, ~Nick Desaulniers