About a year on, here are updated patches for #631275 and #642292, and a version of Wookey's patch for #650298 that applies on top of those (also available from the multiarch2 branch in my Alioth repository, gitweb at <http://anonscm.debian.org/gitweb/?p=users/smcv/multiarch/pkg-config.git;a=shortlog;h=refs/heads/multiarch2>). Tollef, Steve, Wookey, anyone else interested: any thoughts on these?
In particular, Tollef, if these changes look OK to you, an upload to experimental would be great. Any project depending on libraries that rely on pkg-config to set search paths (such as dbus and glib2.0) can't usefully be cross-built without something like this. On Wed, 21 Sep 2011 at 22:36:18 -0700, Steve Langasek wrote: > So my suggestion would be to make the script special-case i386, instead of > adding a runtime dependency on dpkg-dev for dpkg-architecture. I can do this if you feel strongly about it, but as Wookey pointed out, dpkg-dev is build-essential. The version in my repository ignores errors from dpkg-architecture; on non-Debian systems it'll skip the Debian-style multiarch paths (because $multiarch is empty), and only use the traditional /usr/TRIPLET-style paths. > Ah; my patch had gone by the manpage and as a result, I overlooked the fact > that the multiarch paths were part of this variable. Yes, we certainly > don't want to search in multiarch directories for the native architecture as > part of the cross tools! I've checked (via pkg-config --debug) that my version does not do this. > > One subtle departure from Steve's patch here is that if you run > > armv5tel-linux-gnueabi-pkg-config on an i386 system, it will never search > > /usr/lib/pkgconfig - which I think is desirable. > > Keeping /usr/lib/pkgconfig on the path was quite deliberate on my part. > Certainly any library shipping in /usr/lib/pkgconfig is not a multiarch > library, but that doesn't actually mean it has to be a *native* library: it > will be possible to cross-install many -dev packages for a while before it's > possible to co-install them together with the native versions. Fair enough. My second patch attached to this mail does what you asked. > > I attach a patch to give the semantics I suggest, plus a patch to put > > pkg-config-crosswrapper into a directory that complies with the FHS (with > > a compatibility symlink). > > By my reading of the FHS, there is no requirement to move it. I've dropped that patch from the multiarch2 branch. On Mon, 28 Nov 2011 at 22:06:42 +0000, Wookey wrote: > Protoecting its use with a test -x would probably be wise. I'm running it with 2>/dev/null; if it isn't executable, ${multiarch} will be "" and the multiarch directories will be ignored altogether. That seems somewhat simpler than playing with "command -v" to find out whether there is an executable dpkg-architecture on $PATH. > When the multiarch transition is 'complete' (however we define that) > we can remove /usr/lib/pkgconfig from the search path and > cross-building within your main rootfs will work nicely. When the time comes, reverting the second patch here will have that effect. Regards, S
>From c0ae63630dcbb8789f6fe2e546f29f827918d504 Mon Sep 17 00:00:00 2001 From: Simon McVittie <s...@debian.org> Date: Wed, 21 Sep 2011 14:29:59 +0100 Subject: [PATCH 1/3] Search multiarch directories in pkg-config-crosswrapper We use PKG_CONFIG_LIBDIR, not PKG_CONFIG_PATH, so that we don't search /usr/lib/pkgconfig (legacy path likely to contain wrong-arch libraries), and so that the user can prepend paths in /opt or whatever by using PKG_CONFIG_PATH in the usual way. If the user has set PKG_CONFIG_LIBDIR, the cross-wrapper does nothing - the user is assumed to know best, just as they are with native pkg-config. This leaves the search path as something like this (if you invoke armv5tel-linux-gnueabi-pkg-config): if PKG_CONFIG_PATH is set: the elements of PKG_CONFIG_PATH if PKG_CONFIG_LIBDIR is set: the elements of PKG_CONFIG_LIBDIR else: /usr/local/lib/arm-linux-gnueabi/pkgconfig (site multiarch) /usr/local/share/pkg-config (site arch-indep) /usr/local/armv5tel-linux-gnueabi/lib/pkgconfig (site pre-MA cross) /usr/lib/arm-linux-gnueabi/pkgconfig (distro multiarch) /usr/share/pkg-config (distro arch-indep) /usr/armv5tel-linux-gnueabi/lib/pkgconfig (distro pre-MA cross) Signed-off-by: Simon McVittie <s...@debian.org> --- debian/changelog | 18 ++++++++++++++++++ debian/control | 1 + debian/pkg-config-crosswrapper | 30 ++++++++++++++++++++++++++++-- 3 files changed, 47 insertions(+), 2 deletions(-) mode change 100644 => 100755 debian/pkg-config-crosswrapper diff --git a/debian/changelog b/debian/changelog index b6adc3c..07814f7 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,21 @@ +pkg-config (0.26-1+multiarch) UNRELEASED; urgency=low + + [ Steve Langasek ] + * debian/control: mark pkg-config Multi-Arch: foreign; it provides an + executable interface which points to architecture-dependent paths, but + those paths only need to be overridden in a cross-build environment, in + which case it's the responsibility of the cross-toolchain packages to + provide the appropriate glue. + + [ Simon McVittie ] + * In pkg-config-crosswrapper, search the multiarch directory (using the + multiarch tuple), the traditional cross-compilation directory (using the + GNU tuple), /usr/share/pkgconfig and their /usr/local counterparts. + Based on patches from Steve Langasek and Vincent Danjean. + Closes: #631275, #642292. + + -- Simon McVittie <s...@debian.org> Wed, 21 Sep 2011 12:46:26 +0100 + pkg-config (0.26-1) unstable; urgency=low * New upstream release diff --git a/debian/control b/debian/control index 2c9bf46..d4f1707 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Standards-Version: 3.8.4 Package: pkg-config Architecture: any +Multi-Arch: foreign Depends: ${shlibs:Depends}, ${misc:Depends} Description: manage compile and link flags for libraries pkg-config is a system for managing library compile and link flags that diff --git a/debian/pkg-config-crosswrapper b/debian/pkg-config-crosswrapper old mode 100644 new mode 100755 index ab38abb..15e9e2f --- a/debian/pkg-config-crosswrapper +++ b/debian/pkg-config-crosswrapper @@ -2,5 +2,31 @@ # pkg-config wrapper for cross-building # Sets pkg-config search path to target arch path only. -triplet=`basename $0 | sed -e 's:-pkg-config::'` -PKG_CONFIG_LIBDIR=/usr/${triplet}/lib/pkgconfig pkg-config $@ +# If the user has already set PKG_CONFIG_LIBDIR, believe it: it's documented +# to be an override +if [ -z "$PKG_CONFIG_LIBDIR" ]; then + # GNU triplet for the compiler, e.g. i486-linux-gnu for Debian i386, + # i686-linux-gnu for Ubuntu i386 + triplet="`basename $0 | sed -e 's:-pkg-config::'`" + # Normalized multiarch path if any, e.g. i386-linux-gnu for i386 + multiarch="`dpkg-architecture -t"${triplet}" -qDEB_HOST_MULTIARCH 2>/dev/null`" + + PKG_CONFIG_LIBDIR="/usr/local/${triplet}/lib/pkgconfig" + # For a native build we would also want to append /usr/local/lib/pkgconfig + # at this point; but this is a cross-building script, so don't + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/local/share/pkgconfig" + + if [ -n "$multiarch" ]; then + PKG_CONFIG_LIBDIR="/usr/local/lib/${multiarch}/pkgconfig:$PKG_CONFIG_LIBDIR" + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/lib/${multiarch}/pkgconfig" + fi + + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/${triplet}/lib/pkgconfig" + # For a native build we would also want to append /usr/lib/pkgconfig + # at this point; but this is a cross-building script, so don't + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/share/pkgconfig" + + export PKG_CONFIG_LIBDIR +fi + +exec pkg-config $@ -- 1.7.10.4
>From b500fd5ee94fe3755c63500f56e9406ed48a750e Mon Sep 17 00:00:00 2001 From: Simon McVittie <s...@debian.org> Date: Mon, 1 Oct 2012 18:24:24 +0100 Subject: [PATCH 2/3] Search /usr/lib/pkgconfig and /usr/local/lib/pkgconfig in the cross-wrapper In <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=642292#30>, Steve Langasek argues that this is advantageous: if you have a foreign library that hasn't yet had its .pc file moved from /usr/lib to /usr/lib/TUPLE, then you can't co-install it with the same native library, but you might not need to have the native version anyway. This allows cross-compiling against more libraries, sooner. --- debian/changelog | 9 +++++---- debian/pkg-config-crosswrapper | 6 ++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/debian/changelog b/debian/changelog index 07814f7..c7eedf9 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,4 @@ -pkg-config (0.26-1+multiarch) UNRELEASED; urgency=low +pkg-config (0.26-1+multiarch2) UNRELEASED; urgency=low [ Steve Langasek ] * debian/control: mark pkg-config Multi-Arch: foreign; it provides an @@ -10,9 +10,10 @@ pkg-config (0.26-1+multiarch) UNRELEASED; urgency=low [ Simon McVittie ] * In pkg-config-crosswrapper, search the multiarch directory (using the multiarch tuple), the traditional cross-compilation directory (using the - GNU tuple), /usr/share/pkgconfig and their /usr/local counterparts. - Based on patches from Steve Langasek and Vincent Danjean. - Closes: #631275, #642292. + GNU tuple), /usr/lib/pkgconfig (for foreign packages whose .pc file + has not moved to the multiarch directory), /usr/share/pkgconfig and their + /usr/local counterparts. Based on patches from Steve Langasek and + Vincent Danjean. Closes: #631275, #642292. -- Simon McVittie <s...@debian.org> Wed, 21 Sep 2011 12:46:26 +0100 diff --git a/debian/pkg-config-crosswrapper b/debian/pkg-config-crosswrapper index 15e9e2f..2c10d38 100755 --- a/debian/pkg-config-crosswrapper +++ b/debian/pkg-config-crosswrapper @@ -12,8 +12,7 @@ if [ -z "$PKG_CONFIG_LIBDIR" ]; then multiarch="`dpkg-architecture -t"${triplet}" -qDEB_HOST_MULTIARCH 2>/dev/null`" PKG_CONFIG_LIBDIR="/usr/local/${triplet}/lib/pkgconfig" - # For a native build we would also want to append /usr/local/lib/pkgconfig - # at this point; but this is a cross-building script, so don't + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/local/lib/pkgconfig" PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/local/share/pkgconfig" if [ -n "$multiarch" ]; then @@ -22,8 +21,7 @@ if [ -z "$PKG_CONFIG_LIBDIR" ]; then fi PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/${triplet}/lib/pkgconfig" - # For a native build we would also want to append /usr/lib/pkgconfig - # at this point; but this is a cross-building script, so don't + PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/lib/pkgconfig" PKG_CONFIG_LIBDIR="$PKG_CONFIG_LIBDIR:/usr/share/pkgconfig" export PKG_CONFIG_LIBDIR -- 1.7.10.4
>From caeefebd90435e000292054702722220f5d1c745 Mon Sep 17 00:00:00 2001 From: Simon McVittie <s...@debian.org> Date: Mon, 1 Oct 2012 18:57:00 +0100 Subject: [PATCH 3/3] Harden pkg-config-crosswrapper against paths containing spaces, and avoid an unnecesary use of sed. Closes: #650298. --- debian/changelog | 4 ++++ debian/pkg-config-crosswrapper | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index c7eedf9..d799e5f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -15,6 +15,10 @@ pkg-config (0.26-1+multiarch2) UNRELEASED; urgency=low /usr/local counterparts. Based on patches from Steve Langasek and Vincent Danjean. Closes: #631275, #642292. + [ Wookey ] + * Harden pkg-config-crosswrapper against paths containing spaces, + and avoid an unnecesary use of sed. Closes: #650298. + -- Simon McVittie <s...@debian.org> Wed, 21 Sep 2011 12:46:26 +0100 pkg-config (0.26-1) unstable; urgency=low diff --git a/debian/pkg-config-crosswrapper b/debian/pkg-config-crosswrapper index 2c10d38..2e0b399 100755 --- a/debian/pkg-config-crosswrapper +++ b/debian/pkg-config-crosswrapper @@ -5,9 +5,10 @@ # If the user has already set PKG_CONFIG_LIBDIR, believe it: it's documented # to be an override if [ -z "$PKG_CONFIG_LIBDIR" ]; then + basename="`basename "$0"`" # GNU triplet for the compiler, e.g. i486-linux-gnu for Debian i386, # i686-linux-gnu for Ubuntu i386 - triplet="`basename $0 | sed -e 's:-pkg-config::'`" + triplet="${basename%-pkg-config}" # Normalized multiarch path if any, e.g. i386-linux-gnu for i386 multiarch="`dpkg-architecture -t"${triplet}" -qDEB_HOST_MULTIARCH 2>/dev/null`" -- 1.7.10.4