Source: gcc-4.2
Version: 4.2.2-7
Severity: normal
Tags: patch

I am trying to build a cross compiler targeting amd64, using the method
described at <http://www.emdebian.org/tools/crossdev.html>:

* Build and install cross-binutils
* Convert and install libc etc. with dpkg-cross
  [ NB: libc6-i386, libc6-dev-i386 and lib32gcc1 may need manual
    conversion - see Bug #463588 ]
* gcc:
$ export GCC_TARGET=amd64
$ cd gcc-4.2-4.2.2
$ debian/rules control
$ dpkg-buildpackage -b -rfakeroot

Below is the tail of the output from the last step. This turns out to be
just the first of several errors in debian/rules.d/binary-libstdcxx-cross.mk:

* The commands for make target $(binary-stamp)-lib32stdcxx use variables
  $(dirs_lib32) and $(files_lib32), which are not defined anywhere.
  Fixed by adding definitions analogous to those for _lib and _lib64.

* In the same rule, the commands to move libraries to the debug package
  directory say usr/$(DEB_TARGET_GNU_TYPE)/lib/debug where they should
  be using .../lib32/... .

* In the same rule, dh_makeshlibs is not invoked, causing subsequent
  shlibs manipulation to fail.

* In the lib, lib64 and lib32 rules, dh_shlibdeps either fails or finds
  the wrong libraries, because it searches the build host's libraries
  and not the cross lib dir. "Fixed" with -l option, but may still
  misbehave if the required cross libs are not installed - arguably a
  deficiency of dpkg-shlibdeps.

* The lib32 and lib64 rules run dh_gencontrol for the corresponding
  debug package, but not dh_installdeb. This makes dpkg-genchanges fail
  when it cannot find a deb listed in debian/files.

* lib32stdc++ is built but is left out of the generated control file.

I attach a patch for all of the above.


dh_testdir
dh_testroot
mv stamps/07-install-stamp stamps/07-install-stamp-tmp
rm -rf debian/lib32stdc++6-amd64-cross
dh_installdirs -plib32stdc++6-amd64-cross 
DH_COMPAT=2 dh_movefiles -plib32stdc++6-amd64-cross 
dh_movefiles: Compatibility levels before 4 are deprecated.
dh_installdirs -plib32stdc++6-4.2-dbg-amd64-cross \
                usr/x86_64-linux-gnu/lib32
mv debian/tmp/usr/x86_64-linux-gnu/lib32/debug 
debian/lib32stdc++6-4.2-dbg-amd64-cross/usr/x86_64-linux-gnu/lib32/.
mkdir -p debian/lib32stdc++6-4.2-dbg-amd64-cross
PATH=/usr/share/dpkg-cross:$PATH dh_strip -plib32stdc++6-amd64-cross 
--keep-debug
# The above line puts debugging information into some strange location
# that is hardcoded into dh_strip. Move it from there.
mkdir -p debian/lib32stdc++6-amd64-cross/usr/x86_64-linux-gnu/lib32/debug
mv debian/lib32stdc++6-amd64-cross/usr/lib/debug/usr/x86_64-linux-gnu/lib32/* 
debian/lib32stdc++6-amd64-cross/usr/x86_64-linux-gnu/lib32/debug/
mv: cannot stat 
`debian/lib32stdc++6-amd64-cross/usr/lib/debug/usr/x86_64-linux-gnu/lib32/*': 
No such file or directory
make[1]: *** [stamps/08-binary-stamp-lib32stdcxx] Error 1
make[1]: Leaving directory `/mnt/spare/timb/gcc-4.2-4.2.2'
make: *** [binary] Error 2
dpkg-buildpackage: failure: fakeroot debian/rules binary gave error exit status 
2


-- System Information:
Debian Release: lenny/sid
  APT prefers unstable
  APT policy: (500, 'unstable'), (1, 'experimental')
Architecture: i386 (i686)

Kernel: Linux 2.6.22-1-686 (SMP w/2 CPU cores)
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Shell: /bin/sh linked to /bin/bash

Versions of packages gcc-4.2 depends on:
ii  binutils            2.18.1~cvs20080103-1 The GNU assembler, linker and bina
ii  cpp-4.2             4.2.2-7              The GNU C preprocessor
ii  gcc-4.2-base        4.2.2-7              The GNU Compiler Collection (base 
ii  libc6               2.7-6                GNU C Library: Shared libraries
ii  libgcc1             1:4.3-20080127-1     GCC support library

Versions of packages gcc-4.2 recommends:
ii  libc6-dev                     2.7-6      GNU C Library: Development Librari

-- no debconf information

--- debian/rules.d/binary-libstdcxx-cross.mk
+++ debian/rules.d/binary-libstdcxx-cross.mk
@@ -40,12 +40,19 @@
 	$(docdir) \
 	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib64
 
+dirs_lib32 = \
+	$(docdir) \
+	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib32
+
 files_lib = \
 	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib/libstdc++.so.*
 
 files_lib64 = \
 	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib64/libstdc++.so.*
 
+files_lib32 = \
+	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib32/libstdc++.so.*
+
 dirs_dev = \
 	$(docdir) \
 	$(PF)/$(DEB_TARGET_GNU_TYPE)/lib \
@@ -124,7 +131,7 @@
 	dh_makeshlibs -p$(p_lib) -V '$(p_lib) (>= $(DEB_STDCXX_SOVERSION))' -n
 	sed s/$(cross_lib_arch)//g < debian/$(p_lib)/DEBIAN/shlibs > debian/$(p_lib)/DEBIAN/shlibs.fixed
 	mv debian/$(p_lib)/DEBIAN/shlibs.fixed debian/$(p_lib)/DEBIAN/shlibs
-	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib)
+	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib) -l/usr/$(DEB_TARGET_GNU_TYPE)/lib
 	sed 's/\(lib[^ ]*\) /\1$(cross_lib_arch) /g' < debian/$(p_lib).substvars > debian/$(p_lib).substvars.new
 	mv debian/$(p_lib).substvars.new debian/$(p_lib).substvars
 	dh_gencontrol -p$(p_lib) -- -v$(DEB_VERSION) $(common_substvars)
@@ -174,11 +181,11 @@
 	dh_makeshlibs -p$(p_lib64) -V '$(p_lib64) (>= $(DEB_STDCXX_SOVERSION))' -n
 	sed s/$(cross_lib_arch)//g < debian/$(p_lib64)/DEBIAN/shlibs > debian/$(p_lib64)/DEBIAN/shlibs.fixed
 	mv debian/$(p_lib64)/DEBIAN/shlibs.fixed debian/$(p_lib64)/DEBIAN/shlibs
-	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib64)
+	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib64) -l/usr/$(DEB_TARGET_GNU_TYPE)/lib64
 	sed 's/\(lib[^ ]*\) /\1$(cross_lib_arch) /g' < debian/$(p_lib64).substvars > debian/$(p_lib64).substvars.new
 	mv debian/$(p_lib64).substvars.new debian/$(p_lib64).substvars
 	dh_gencontrol -p$(p_lib64) -- -v$(DEB_VERSION) $(common_substvars)
-	dh_gencontrol -p$(p_dbg64) -- -v$(DEB_VERSION) $(common_substvars)
+	#dh_gencontrol -p$(p_dbg64) -- -v$(DEB_VERSION) $(common_substvars)
 
 	dh_installdeb -p$(p_lib64)
 	dh_md5sums -p$(p_lib64)
@@ -210,8 +217,8 @@
 	rm -rf $(d_lib32)/usr/lib32
 	# End workaround
 	find $(d_lib32)
-	tar -C $(d_lib32) -c -f - usr/$(DEB_TARGET_GNU_TYPE)/lib/debug | tar -v -C $(d_dbg32) -x -f -
-	rm -rf $(d_lib32)/usr/$(DEB_TARGET_GNU_TYPE)/lib/debug
+	tar -C $(d_lib32) -c -f - usr/$(DEB_TARGET_GNU_TYPE)/lib32/debug | tar -v -C $(d_dbg32) -x -f -
+	rm -rf $(d_lib32)/usr/$(DEB_TARGET_GNU_TYPE)/lib32/debug
 
 	dh_installdocs -p$(p_lib32)
 	echo "See /$(docdir)/$(p_base) for more information" \
@@ -222,14 +229,14 @@
 	debian/dh_rmemptydirs -p$(p_lib32)
 	dh_compress -p$(p_lib32)
 	dh_fixperms -p$(p_lib32)
-
+	dh_makeshlibs -p$(p_lib32) -V '$(p_lib32) (>= $(DEB_STDCXX_SOVERSION))' -n
 	sed s/$(cross_lib_arch)//g < debian/$(p_lib32)/DEBIAN/shlibs > debian/$(p_lib32)/DEBIAN/shlibs.fixed
 	mv debian/$(p_lib32)/DEBIAN/shlibs.fixed debian/$(p_lib32)/DEBIAN/shlibs
-	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib32)
+	ARCH=$(DEB_TARGET_ARCH) MAKEFLAGS="CC=something" dh_shlibdeps -p$(p_lib32) -l/usr/$(DEB_TARGET_GNU_TYPE)/lib32
 	sed 's/\(lib[^ ]*\) /\1$(cross_lib_arch) /g' < debian/$(p_lib32).substvars > debian/$(p_lib32).substvars.new
 	mv debian/$(p_lib32).substvars.new debian/$(p_lib32).substvars
 	dh_gencontrol -p$(p_lib32) -- -v$(DEB_VERSION) $(common_substvars)
-	dh_gencontrol -p$(p_dbg32) -- -v$(DEB_VERSION) $(common_substvars)
+	#dh_gencontrol -p$(p_dbg32) -- -v$(DEB_VERSION) $(common_substvars)
 
 	dh_installdeb -p$(p_lib32)
 	dh_md5sums -p$(p_lib32)
--- debian/rules.conf
+++ debian/rules.conf
@@ -447,7 +447,7 @@
 
 ifdef DEB_CROSS
   languages = c c++ objc objpp
-  addons = libgcc lib64gcc libcxx lib64cxx cdev c++dev libobjc objcdev objppdev gccxbase
+  addons = libgcc lib64gcc libcxx lib32cxx lib64cxx cdev c++dev libobjc objcdev objppdev gccxbase
   ifeq ($(with_d),yes)
     ifeq ($(with_separate_gdc),yes)
       languages = # disable others languages

Reply via email to