Bug#1065416: requesting input on recent posts to #1065416

YunQiang Su <[email protected]>
Newsgroups gmane.linux.debian.devel.ctte
Message-ID <CAKcpw6XnTkqYLRzdu403gV8S_MQ9U2Y=wLPLZ1RYnpLpErv=CQ__18471.1104071297$1724519909$gmane$org@mail.gmail.com>
Helmut Grohne <[email protected]> 于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/[email protected]/
> >
> >     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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.