Helmut Grohne <hel...@subdivi.de> 于2024年8月24日周六 19:20写道:
>
> On Fri, Aug 23, 2024 at 04:08:28PM +0800, Yunqiang Su wrote:
> > I struggled with the build system, and I know the real problem:
>
> Thanks for chiming in!
>
> > 1. linux-libc-dev-ARCH-cross is useful, for some case if we maintain an 
> > cross toolchain of a port
> > that Debian is not supported yet.  The example is 
> > src:cross-toolchain-base-mipsen.
> > I support the cross toolchain for 12 MIPS ports: EL/BE X 32/64/N32 X R2/R6.
> >
> >
> > 2. It is not OK to search base headers when we configure gcc itself.
> >     
> > https://patchwork.sourceware.org/project/gcc/patch/20240614121218.63375-1-...@gcc.gnu.org/
> >
> >     GCC/configure.ac detects features by the headers of linux/glibc.
> >     Let’s have a example: we are building a mips64el cross toolchain on a 
> > amd64 machine:
> >          If gcc/configure.ac sees /usr/include/limits.h before than 
> > /usr/mips64el-linux-gnuabi64/include/limits.h
> >     Our mips64el-linux-gnuabi64-gcc will have some problem.
> >
> >     And you can find the `fixinclude` in GCC for more information.
>
> I think this is a bad example on multiple levels. For one thing,
> limits.h is glibc and not linux. Then, it is not actually
> architecture-dependent[1] (otherwise it could not be in /usr/include
> directly) and finally, the way gcc deals with limits.h is known broken
> for seven years and has a patch, see see
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80677.
>

Sure. That's why I think that we should keep kernel headers in
/usr/<triple>/include for now before that we can be sure that these problem
has been fixed.

> As Bastian pointed out earlier, the exact location of the kernel headers
> is not that important so long as gcc constructs a symlink farm for a
> build-time sysroot. To me, it is not obvious that keeping a non-trivial
> number of linux-libc-dev-$arch-cross packages duplicating content from
> linux-libc-dev is the superior solution to constructing changing the
> build of gcc-cross.
>

One reason I'd prefer to keep the duplicating contents is that we may need to
have cross-toolchains for non debian official ports.

> > @Mattias In fact. The current gcc-X-cross searches /usr/include when 
> > configure, it is dangerous.
> >       --includedir=/usr/mipsel-linux-gnu/include --with-sysroot=/  
> > —prefix=/usr
> > Is not good.
> > The prefer way should be `—prefix=/usr` only  with my patch.
>
> Again, I disagree. One of the biggest benefits of multiarch is that you
> get to no longer distinguish between build-time paths from run-time
> paths and always assume your sysroot to be / resulting in a lot of
> simplification. We certainly want all of our cross compilers to search
> /usr/include, so consulting that directory at build time actually makes
> sense from a multiarch point of view. The multiarch way to deal with
> architecture-specific differences (and headers that do not exist for all
> architectures) is to move them to /usr/include/<triplet> such that
> /usr/include only ever contains fully architecture-independent headers.
>

Keeping duplicating headers of glibc/linux-kernel won't break multiarch support.

> So this is dangerous in the sense that we still have some
> architecture-dependent headers in /usr/include directly. If you happen
> to know any affected headers, I suggest filing bugs with the owning
> packages and ask them to move them to the triplet subdirectory.
>

The configure.ac of GCC won't try to find headers in multiarch directories.
So if we move all architecture-dependent headers into /usr/include/<triple>,
gcc will have some trouble to build itself, especially for multilib support.

That's why gcc-multilib symlinks /usr/include/x86_64-linux-gnu/asm to
/usr/include/asm.

You can have a try to build gcc without gcc-multilib installed with
    ../configure --target=x86_64-linux-gnu --enable-multilib

Or you can have a try to build cross-gcc with gcc-multilib installed:
   ../configure --target=aarch64-linux-gnu
Then some mistake of feature detection will happen.

Thus it may be the best solution for cross-toolchains to have itself
kernel/glibc headers.

> Helmut
>
> [1] Technically, this is a lie if we consider competing libc
>     implementations. As Debian treats the libc as part of the
>     architecture, we'd really require gcc's and musl's limits.h to equal
>     here, but in reality musl just install theirs to the multiarch.
>     However, since musl-linux-any is not bootstrappable, for practical
>     matters, limits.h is architecture-independent on reasonable Debian
>     architectures including ports.
>


-- 
YunQiang Su

Reply via email to