Source: gcc-defaults Version: 1.219 Tags: patch User: helm...@debian.org Usertags: rebootstrap
Hi Matthias, I am sorry for having introduced another problem into the gcc packaging. As it turns out the *-for-host packages are not actually coinstallable at present even though they should be. Attempting to do so results in an unpack error. The root cause for this is the way I implemented documentation linking where the TOOL-for-host package links to the TOOL-GNU_TRIPLET package and that triplet is architecture-dependent of course. For the cpp-for-host package, there is no more fundamental package that we could link documentation to, so I propose that it gains a real documentation directory (thus incurring a symlink_to_dir conversion). All other *-for-host packages transitively depend on cpp-for-host already, so I propose making that dependency explicit and linking there. Please find a patch implementing this conversion attached. I tested the upgrade path and noticed that after unpacking the documentation links are not updated reliably. This is due to a corner case in dpkg where it looks up the actual link targets and if both the old link and the new link refer to the same directory, it skips replacing the symbolic link on disk. In a typical upgrade, cpp-for-host is not the first package to be unpacked and therefore, some of the other *-for-host packages' documentation links are not updated. (Thanks to Guillem for pointing at https://git.dpkg.org/cgit/dpkg/dpkg.git/tree/src/main/archives.c#n793 for understanding the cause.) It is not clear to me whether this is worth mitigating. The old documentation symlinks will continue to be valid as we do not loosen any dependencies. Also dpkg --verify does not spot any issue as the dpkg database does not record link targets. If the *-for-host packages are upgraded another time, the links will be corrected. Since the *-for-host packages have not been part of bookworm and I expect that two more versions of gcc-defaults reach testing before we release trixie, this may be a fair compromise. The alternative likely is adding more maintainer scripts in a similar way to dpkg-maintscript-helper for doing a symlink_to_symlink conversion. Let me know if you prefer this route, but I note that we'd be adding 21 maintainer scripts. Helmut
diff --minimal -Nru gcc-defaults-1.219/debian/changelog gcc-defaults-1.219+nmu1/debian/changelog --- gcc-defaults-1.219/debian/changelog 2024-07-23 11:22:47.000000000 +0200 +++ gcc-defaults-1.219+nmu1/debian/changelog 2024-09-18 14:17:40.000000000 +0200 @@ -1,3 +1,10 @@ +gcc-defaults (1.219+nmu1) UNRELEASED; urgency=medium + + * Non-maintainer upload. + * Fix Multi-Arch coinstallability of *-for-host packages. (Closes: #-1) + + -- Helmut Grohne <hel...@subdivi.de> Wed, 18 Sep 2024 14:17:40 +0200 + gcc-defaults (1.219) unstable; urgency=medium * Build gdc and gm2 packages for loong64. Closes: #1069714, diff --minimal -Nru gcc-defaults-1.219/debian/control gcc-defaults-1.219+nmu1/debian/control --- gcc-defaults-1.219/debian/control 2024-07-23 11:22:47.000000000 +0200 +++ gcc-defaults-1.219+nmu1/debian/control 2024-09-18 14:17:40.000000000 +0200 @@ -372,7 +372,7 @@ Architecture: any Multi-Arch: same Depends: g++${native:suffix} (= ${version:gpp}), cpp${native:suffix} (= ${version:cpp}), - gcc-for-host (= ${version:gcc}), g++-${pv:gpp}-for-host ${reqv:gpp}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), g++-${pv:gpp}-for-host ${reqv:gpp}, ${misc:Depends} Description: GNU C++ compiler for the host architecture This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. @@ -425,7 +425,7 @@ Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:cpp}), gobjc${native:suffix} (= ${version:gobjc}), - gcc-for-host (= ${version:gcc}), gobjc-${pv:gobjc}-for-host ${reqv:gobjc}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gobjc-${pv:gobjc}-for-host ${reqv:gobjc}, ${misc:Depends} Description: GNU Objective-C compiler for the host architecture This is the GNU Objective-C compiler, which compiles Objective-C on platforms @@ -482,7 +482,7 @@ Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:cpp}), gobjc++${native:suffix} (= ${version:gobjcxx}), - gobjc-for-host (= ${version:gobjc}), g++-for-host (= ${version:gpp}), + cpp-for-host (= ${version:cpp}), gobjc-for-host (= ${version:gobjc}), g++-for-host (= ${version:gpp}), gobjc++-${pv:gobjcxx}-for-host ${reqv:gobjcxx}, ${misc:Depends} Description: GNU Objective-C++ compiler for the host architecture This is the GNU Objective-C++ compiler, which compiles @@ -538,7 +538,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (= ${version:gcc}), - gcc-for-host (= ${version:gcc}), gfortran-${pv:gfort}-for-host ${reqv:gfort}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gfortran-${pv:gfort}-for-host ${reqv:gfort}, gfortran${native:suffix} (= ${version:gfort}), ${misc:Depends} Description: GNU Fortran 95 compiler for the host architecture This is the GNU Fortran 95 compiler, which compiles Fortran 95 on platforms @@ -592,7 +592,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:gcc}), - gcc-for-host (= ${version:gcc}), gccgo-${pv:ggo}-for-host ${reqv:ggo}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gccgo-${pv:ggo}-for-host ${reqv:ggo}, gccgo${native:suffix} (= ${version:ggo}), ${misc:Depends} Description: Go compiler, based on the GCC backend for the host architecture This is the GNU Go compiler, which compiles Go on platforms supported by @@ -644,7 +644,7 @@ Architecture: any Multi-Arch: same Depends: gdc${native:suffix} (= ${version:gdc}), ${dep:libgphobos}, - gcc-for-host (= ${version:gcc}), gdc-${pv:gdc}-for-host ${reqv:gdc}, ${misc:Depends} + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gdc-${pv:gdc}-for-host ${reqv:gdc}, ${misc:Depends} Description: D compiler (language version 2) for the host architecture This is a dependency package providing the default D compiler. Per policy, all packages that contain D sources must use this package @@ -701,7 +701,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gm2${native:suffix} (= ${version:gm2}), - gcc-for-host (= ${version:gcc}), gm2-${pv:gm2}-for-host ${reqv:gm2}, ${misc:Depends} + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gm2-${pv:gm2}-for-host ${reqv:gm2}, ${misc:Depends} Description: GNU Modula-2 compiler for the host architecture, based on the GCC backend This is a dependency package providing the default GNU Modula-2 compiler. . diff --minimal -Nru gcc-defaults-1.219/debian/control.native.in gcc-defaults-1.219+nmu1/debian/control.native.in --- gcc-defaults-1.219/debian/control.native.in 2024-01-27 18:41:19.000000000 +0100 +++ gcc-defaults-1.219+nmu1/debian/control.native.in 2024-09-18 14:17:40.000000000 +0200 @@ -361,7 +361,7 @@ Architecture: any Multi-Arch: same Depends: g++${native:suffix} (= ${version:gpp}), cpp${native:suffix} (= ${version:cpp}), - gcc-for-host (= ${version:gcc}), g++-${pv:gpp}-for-host ${reqv:gpp}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), g++-${pv:gpp}-for-host ${reqv:gpp}, ${misc:Depends} Description: GNU C++ compiler for the host architecture This is the GNU C++ compiler, a fairly portable optimizing compiler for C++. @@ -414,7 +414,7 @@ Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:cpp}), gobjc${native:suffix} (= ${version:gobjc}), - gcc-for-host (= ${version:gcc}), gobjc-${pv:gobjc}-for-host ${reqv:gobjc}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gobjc-${pv:gobjc}-for-host ${reqv:gobjc}, ${misc:Depends} Description: GNU Objective-C compiler for the host architecture This is the GNU Objective-C compiler, which compiles Objective-C on platforms @@ -471,7 +471,7 @@ Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:cpp}), gobjc++${native:suffix} (= ${version:gobjcxx}), - gobjc-for-host (= ${version:gobjc}), g++-for-host (= ${version:gpp}), + cpp-for-host (= ${version:cpp}), gobjc-for-host (= ${version:gobjc}), g++-for-host (= ${version:gpp}), gobjc++-${pv:gobjcxx}-for-host ${reqv:gobjcxx}, ${misc:Depends} Description: GNU Objective-C++ compiler for the host architecture This is the GNU Objective-C++ compiler, which compiles @@ -528,7 +528,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (= ${version:gcc}), - gcc-for-host (= ${version:gcc}), gfortran-${pv:gfort}-for-host ${reqv:gfort}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gfortran-${pv:gfort}-for-host ${reqv:gfort}, gfortran${native:suffix} (= ${version:gfort}), ${misc:Depends} Description: GNU Fortran 95 compiler for the host architecture This is the GNU Fortran 95 compiler, which compiles Fortran 95 on platforms @@ -582,7 +582,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gcc${native:suffix} (>= ${version:gcc}), - gcc-for-host (= ${version:gcc}), gccgo-${pv:ggo}-for-host ${reqv:ggo}, + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gccgo-${pv:ggo}-for-host ${reqv:ggo}, gccgo${native:suffix} (= ${version:ggo}), ${misc:Depends} Description: Go compiler, based on the GCC backend for the host architecture This is the GNU Go compiler, which compiles Go on platforms supported by @@ -634,7 +634,7 @@ Architecture: any Multi-Arch: same Depends: gdc${native:suffix} (= ${version:gdc}), ${dep:libgphobos}, - gcc-for-host (= ${version:gcc}), gdc-${pv:gdc}-for-host ${reqv:gdc}, ${misc:Depends} + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gdc-${pv:gdc}-for-host ${reqv:gdc}, ${misc:Depends} Description: D compiler (language version 2) for the host architecture This is a dependency package providing the default D compiler. Per policy, all packages that contain D sources must use this package @@ -691,7 +691,7 @@ Architecture: any Multi-Arch: same Depends: cpp${native:suffix} (= ${version:cpp}), gm2${native:suffix} (= ${version:gm2}), - gcc-for-host (= ${version:gcc}), gm2-${pv:gm2}-for-host ${reqv:gm2}, ${misc:Depends} + cpp-for-host (= ${version:cpp}), gcc-for-host (= ${version:gcc}), gm2-${pv:gm2}-for-host ${reqv:gm2}, ${misc:Depends} Description: GNU Modula-2 compiler for the host architecture, based on the GCC backend This is a dependency package providing the default GNU Modula-2 compiler. . diff --minimal -Nru gcc-defaults-1.219/debian/cpp-for-host.maintscript.in gcc-defaults-1.219+nmu1/debian/cpp-for-host.maintscript.in --- gcc-defaults-1.219/debian/cpp-for-host.maintscript.in 1970-01-01 01:00:00.000000000 +0100 +++ gcc-defaults-1.219+nmu1/debian/cpp-for-host.maintscript.in 2024-09-18 14:17:40.000000000 +0200 @@ -0,0 +1 @@ +symlink_to_dir /usr/share/doc/cpp-for-host cpp@NATIVE_SUFFIX@ 4:14.1.0-2 diff --minimal -Nru gcc-defaults-1.219/debian/rules gcc-defaults-1.219+nmu1/debian/rules --- gcc-defaults-1.219/debian/rules 2024-07-23 11:22:47.000000000 +0200 +++ gcc-defaults-1.219+nmu1/debian/rules 2024-09-18 14:17:40.000000000 +0200 @@ -789,7 +789,7 @@ rm -rf build rm -f debian/control.tmp* rm -f debian/substvars.* - rm -f debian/cpp.maintscript debian/gcc.postinst debian/g++.postinst debian/gdc.maintscript debian/gfortran.postinst + rm -f debian/cpp.maintscript debian/gcc.postinst debian/g++.postinst debian/gdc.maintscript debian/gfortran.postinst debian/cpp-for-host.maintscript dh_clean pre-install: build substvars @@ -812,6 +812,8 @@ dh_link -pcpp \ /usr/bin/cpp-$(PV_CPP) /usr/bin/cpp \ /usr/share/doc/cpp$(NATIVE_SUFFIX) /usr/share/doc/cpp + sed -e 's/@NATIVE_SUFFIX@/$(NATIVE_SUFFIX)/g' \ + debian/cpp-for-host.maintscript.in > debian/cpp-for-host.maintscript ifeq ($(with_gfdl_docs),yes) for i in gfdl.7 gpl.7 fsf-funding.7; do \ @@ -964,7 +966,7 @@ ifneq (,$(filter gdc-for-host, $(packages))) : # gdc-for-host dh_installdirs -pgdc-for-host - dh_link -pgdc-for-host /usr/share/doc/gdc$(NATIVE_SUFFIX) /usr/share/doc/gdc-for-host + dh_link -pgdc-for-host /usr/share/doc/cpp-for-host /usr/share/doc/gdc-for-host endif ifneq (,$(filter gm2, $(packages))) @@ -1358,10 +1360,12 @@ dh_testroot # dh_installdebconf dh_installdocs -pcpp$(NATIVE_SUFFIX) - for p in `dh_listpackages -a $(nopkgs_native) -Ncpp$(NATIVE_SUFFIX) $(if $(filter yes,$(with_gfdl_docs)),-Ncpp-doc -Ngcc-doc -Ngfortran-doc -Ngccgo-doc) -Ngdc -Ngdc$(NATIVE_SUFFIX) -Ngdc-for-host -Nlibgphobos-dev`; do \ + dh_installdocs -pcpp-for-host + for p in `dh_listpackages -a $(nopkgs_native) -Ncpp$(NATIVE_SUFFIX) -Ncpp-for-host $(if $(filter yes,$(with_gfdl_docs)),-Ncpp-doc -Ngcc-doc -Ngfortran-doc -Ngccgo-doc) -Ngdc -Ngdc$(NATIVE_SUFFIX) -Ngdc-for-host -Nlibgphobos-dev`; do \ case "$$p" in \ *$(NATIVE_SUFFIX)) t=cpp$(NATIVE_SUFFIX) ;; \ *-gnu*|*-kfreebsd*|gcc-hppa64-linux-gnu) continue;; \ + *-for-host) t=cpp-for-host ;; \ *) t=cpp$(NATIVE_SUFFIX); \ esac; \ echo ln -sf $$t debian/$$p/usr/share/doc/$$p; \ @@ -1372,6 +1376,7 @@ for p in \ cpp$(NATIVE_SUFFIX) \ + cpp-for-host \ $(if $(filter $(DEB_HOST_ARCH), $(d_archs)), gdc$(NATIVE_SUFFIX)) \ $(if $(filter $(DEB_HOST_ARCH), $(phobos_archs)), libgphobos-dev); \ do \