Why is building a cross compiler "out-of-the-box" always broken?
Segher Boessenkool
segher@kernel.crashing.org
Mon Aug 20 01:22:00 GMT 2007
>> 4. Use the minimal cross-compiler produced in step 3 to configure
>> glibc and do "make install-headers" to get glibc headers. At this
>> point you should be able to delete the minimal cross-compiler, it's
>> job has been done.
>>
>> 5. Make distclean and then configure, make, and install a normal gcc
>> cross-compiler for the target using the glibc headers produced in
>> step 4.
>>
>> 6. Make distclean and then configure, make, and install the complete
>> glibc header and libraries etc. for the target.
Sometimes you need to repeat 4,5,6 (but using the full toolchain
produced in the previous run, not the minimal one obviously).
It's a good sanity check anyway ;-)
>> 1. Seems to be a good reliable source of sanitized headers for recent
>> kernels. I know of no problems with the current release.
There still are problems so you're advised to use the separate kernel
headers package instead.
>> 2. Seems to build and work out-of-the-box using the headers from step
>> 1. I know of no problems with current release.
Binutils doesn't need any kernel headers AFAIK.
>> 3. Figuring out the correct combination of --with-newlib,
>> --with-sysroot, and --with-headers (or --without, or =no etc.) to get
>> inhibit_libc set and then figuring out which of the myriad of
>> --with-this-that-and-the-other options can or must be disabled to get
>> a functional minimal compiler is a real pain in the neck.
configure --verbose --help
I posted the full set you currently need.
>> Further more, the make file may try (and fail) to make additional
>> things like crt0 in EXTRA_PARTS=
Don't use --with-newlib if you don't want to build newlib.
>> Right now it's a question of "wtf caused that to die?"
Yeah, it's a fun voyage, isn't it :-)
>> Also, should the inhibit_libc hack also disable things like the
>> unwind support that requires kernel headers? That not scrictly libc,
>> but --without-headers sort of assume neither are present.
Yeah, that's a good point. I use --enable-sjlj-exceptions to
avoid the need for those headers, but that's not enough for
building ia64-linux (it _is_ enough for all other Linux targets).
>> Some people advocate combining steps 3,4,5 by either cribbing a set
>> of headers from someone elses sysroot,
That's the "normal" procedure for building a cross-toolchain, yes.
>> or by fooling glibc configure in to producing them without having a
>> minimal cross compiler.
You should only need this if you're porting to a new target. And
then this all is the least of your troubles ;-)
>> However, it's probably not viable for someone trying to build 20 or
>> so tools chains so they can check for kernel build failure tree wide
>> etc.
That's exactly what I'm doing. Feel free to take a look at my scripts:
git://git.infradead.org/~segher/buildall.git
or browse it at:
http://git.infradead.org/?p=users/segher/buildall.git
>> And besides, it would sure be nice if gcc would build a
>> cross-compiler out-of-the-box if there is no problem with some other
>> part of the tool chain. That does not seem to be the case for all
>> targets at this point.
Bugs happen :-)
>> So, that's the situation as I see it. How should things work in an
>> ideal world and where do we go from here? Or, are other people happy
>> enough with the current ecosystem and think nothing needs to change?
It would be nice if things were a bit easier; maybe a single configure
flag "--from-scratch" or something like that. Someone needs to create
that though.
Segher
More information about the Gcc
mailing list