cross-toolchain-base-devs team mailing list archive
-
cross-toolchain-base-devs team
-
Mailing list archive
-
Message #00080
Bug#1064003: Bug#1065416: Bug#1065416: linux-libc-dev claims to provide linux-libc-dev-ARCH-cross, but it doesn't do that completely
Hi,
In this mail, I'll try to summarize my state of knowledge on this
matter while noting that I don't see the full picture.
On Fri, Mar 29, 2024 at 11:17:55AM +0100, Bastian Blank wrote:
> On Thu, Mar 21, 2024 at 08:48:01PM +0100, Helmut Grohne wrote:
> > I was recently working on gcc builds and this disagreement currently
> > makes stuff unbuildable. Hence I looked into solutions and/or
> > workarounds.
>
> Care to just share what you actually found? Where is it broken and how
> to see this?
>
> Because this whole thing started with "it is broken, but I won't tell
> you where or what or how".
Quite clearly, this is not a single problem, but a mesh of problems and
in a few cases it is not obvious where to solve them.
> > As a result, I implemented the proposed change and am attaching it for
> > discussion here. I've implemented it in a way that if there is a sysroot
> > linux header installation, it'll be preferred. Do you see any downsides
> > of this approach?
>
> I wonder now. How would that ever work for the native build? Or does
> the native build already do those symlinks? Or are native and cross
> configured differently? Or is that a weird difference in gcc itself?
Native and cross builds work quite differently indeed.
So let me first try to collect all relevant problems that I encountered
here. I vaguely try to list the more important ones earlier. I have
caused some of these problems and don't want to assign any blame but
look for solutions.
1. API expectation of *-$arch-cross packages
When *-$arch-cross packages were first introduced before multiarch
was a thing, there was (and still is) and implicit contract saying
that their functionality is to be provided within the
/usr/$DEB_HOST_GNU_TYPE hierarchy. In particular, this layout does
not interfere with multiarch on a filesystem level and hence
*-$arch-cross packages typically are arch:all m-a:foreign.
In particular, linux-libc-dev now provides such packages without
actually providing those paths violating this implicit contract.
2. Violation of Multi-Arch: foreign
linux-libc-dev was changed from an Arch:any + Multi-Arch:same package
to an Architecture:all + Multi-Arch:foreign package. It does so by
providing the headers for all architectures in a single package via
symlink farms. "all" architectures is debatable though. The set of
architectures changes rather frequently with new ones being added and
old ones being removed. Therefore, linux-libc-dev will often look
like it provides linux-libc-dev:$somearch to dependency resolvers
while in fact not providing the functionality - thus violating the
promise of Multi-Arch: foreign. For example, linux-libc-dev is
currently dysfunctional for arc, but next year it'll be a different
architecture.
Moreover, looking at the metadata of linux-libc-dev initially did not
provide means of figuring out which architectures were actually
supported and which were not. This has been changed as linux-libc-dev
now Provides linux-libc-dev-$arch-cross packages (causing the first
problem), but at least giving bootstrappers a means to figure out
whether a given linux-libc-dev package is usable to them.
3. linux-libc-dev consumes much space on mirrors and installations
linux-libc-dev originally was Arch:any and yet much of its content
was the same across architectures albeit in different paths. Thus,
the size of the .deb (multiplied by the number of architectures) was
quite big and also coinstalling linux-libc-dev would result in
duplicate files being extracted to multiple locations increasing the
installation size in a multiarch setting.
As a result, linux-libc-dev now is Arch:all and we only get to have
one package. It grew from about 1.8MB (times 10 architectures) to
about 2.2MB and its installed size grew from about 7MB (per
architecture) to 10MB (for all architectures).
This change caused the second problem.
4. cross-toolchain-base being bd-uninstallable
cross-toolchain-base cannot currently be built (FTBFS #1064003 and
#1067370) and one of the aspects is that it declares Build-Conflicts
with linux-libc-dev-$arch-cross. The recently added Provides on
linux-libc-dev satisfy them and thus cause cross-toolchain-base to be
bd-uninstallable.
I don't exactly understand why it declares them, but I guess that
having a different set of kernel headers available in
/usr/$DEB_HOST_GNU_TYPE would cause them to be picked up by the build
and potentially cause misbuilds. cross-toolchain-base builds these
packages and it also uses them during build of glibc.
5. gcc-V-cross not being buildable
The gcc-V-cross package relies on -$arch-cross packages usually built
from cross-toolchain-base and expects them to provide their
functionality in /usr/$DEB_HOST_GNU_TYPE. The current linux-libc-dev
provides the package names but not the expected path (this actually
is the first problem) and as a consequence, gcc-V-cross currently
fails to build from source.
6. Cross bootstrap cannot tell whether linux-libc-dev supports an
architecture
Before linux-libc-dev gained the -$arch-cross Provides, there was no
way of determining whether linux-libc-dev supports an architecture by
looking at its metadata. As a result, cross bootstrap had now way of
knowing whether linux-libc-dev needed to be rebuilt. This is a
consequence of the second problem.
7. Cross bootstrap needs to deal with Arch:all packages
Until linux-libc-dev became an architecture-dependent Arch:all
package, the entire cross bootstrap was possible by only performing
arch-only builds and using a repository of only arch:any packages
used in conjunction with a Debian mirror restricted to Arch:all
packages. Now, the bootstrap repository must also be able to carry
an Arch:all package and handle the fact that multiple versions of
linux-libc-dev exist in a bootstrap setting one of which does not
work (as a result of the second problem).
8. Duplication of functionality via -$arch-cross packages
When performing cross builds, we currently need both -$arch-cross
packages and :$arch packages for glibc and linux-libc-dev. These can
be built from different versions and we know that using
libc6-dev-$arch-cross packages built from a different glibc version
than libc6-dev:$arch together causes problems (repeatedly) and hence
glibc now declares Conflicts with old libc6-dev-$arch-cross packages.
If gcc-V-cross were to use :$arch packages, it would have to declare
cross-architecture dependencies, which is not currently supported by
our buildd network. That is one reason for it still using
-$arch-cross packages.
When I say problems here, you may read that more as "challenge" and in
particular, it is not obvious that the change that caused a problem
should be reverted. Rather, there are often multiple ways to resolve
these. Let me sketch a few options that may not be obvious from this
list:
1+3+5. linux-libc-dev could add a symlink farm for
/usr/$DEB_HOST_GNU_TYPE.
1+3+4+6. linux-libc-dev could rename its Provides dropping the -cross
suffix.
2. Ignore the violation. libc6 also violates Multi-Arch:same, because
the dynamic loader conflicts for some pairs of architectures. There
is nothing that can be done about this as architecture-dependent
breaks or conflicts are not supported. Hence, we can argue that this
violation is so useful that it should be tolerated.
2+3+6+7. linux-libc-dev could be split into linux-libc-dev-common
arch:all m-a:foreign and the symlink farms could be kept in
linux-libc-dev:any m-a:same retaining the size reduction.
3. cross-toolchain-base could build a linux-libc-dev-cross package
that Provides the earlier -$arch-cross packages and contains a
similar symlink farm to linux-libc-dev.
3+8. cross-toolchain-base could stop creating linux-libc-dev-$arch-cross
packages.
Patch: https://bugs.debian.org/1059786#10
4. cross-toolchain-base could drop its Build-Conflicts. This may cause
further problems though.
Patch: https://bugs.debian.org/1067370#17
5. gcc-V-cross could create its own symlink farm for linux-libc-dev at
build time and pass that to the gcc build removing the need for the
/usr/$DEB_HOST_GNU_TYPE location.
Patch: https://bugs.debian.org/1065416#129
7. cross bootstrap can implement indep builds.
8. Implement cross-architecture dependencies in the buildd network such
that we can get rid of -$arch-cross packages.
Please consider both the list of problems and in particular the list of
options incomplete.
On a procedural level, linux-libc-dev hijacked
linux-libc-dev-$arch-cross. After I sent
https://bugs.debian.org/1059786#10, there was quite some silence which I
mistakenly interpreted as agreement and hence suggested to Bastian that
linux-libc-dev should provide linux-libc-dev-$arch-cross as a solution
to the sixth problem.
Regarding CTTE, I am prejudiced on this matter and want to abstain from
voting.
Helmut
References