* [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
[not found] ` <20140821090328.GA32580@stefanha-thinkpad.redhat.com>
@ 2014-08-22 0:10 ` John Snow
2014-08-22 7:40 ` Markus Armbruster
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: John Snow @ 2014-08-22 0:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Stefan Hajnoczi
I was running a series of tests on 32 and 64 bit hosts to test for
endianness and variable width issues when I noticed that I couldn't
properly perform a build of "make check" against a 32bit target from a
64bit host:
../../configure --cpu=i386 && make -j4 && make check
This produces some warnings in tests-cutils about overflowing variables
that are of type guint64. It's been mentioned on the mailing lists
before, actually:
http://lists.gnu.org/archive/html/qemu-devel/2014-05/msg00452.html
The problem is that guint64 is being aliased against "unsigned long",
which is only 4 bytes instead of the implied 8. This occurs because we
link against the 64bit headers for glib instead of the 32bit ones when
we're building for i386 from an x86_64 host.
Our include flags wind up looking like: -I/usr/include/glib-2.0 but
-I/usr/lib64/glib-2.0/include
I was discussing the problem with Stefan:
On 08/21/2014 05:03 AM, Stefan Hajnoczi wrote:
> The problem is that pkg-config uses libdir=/usr/lib64 by default on
> amd64 hosts. It doesn't know that gcc -m32 is being used.
>
> This results in glib's 64-bit headers being used where guint64 is just
> unsigned long. On 32-bit hosts this is incorrect.
>
> Two workarounds:
>
> 1. yum install pkgconfig.i686 and run it instead of pkgconfig.x86_64
>
> 2. Use the pkg-config --define-variable libdir=/usr/lib option
>
> You can set PKG_CONFIG=path/to/pkg-config.i686 on QEMU's ./configure
> command-line.
>
> This is all distro-specific :(. Any other solutions?
>
> Stefan
>
I am not extremely well versed in configure or pkg-config ninjutsu, but
I must imagine that the ARCH/cpu variables we are setting in configure
could help us know to call the 32bit pkg-config instead of the native
64bit version and fix this issue.
Does anyone have any good ideas? Surely other projects must have run
into this elsewhere.
--
—js
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 0:10 ` [Qemu-devel] issue: linking 64bit glib when building for cpu=i386 John Snow
@ 2014-08-22 7:40 ` Markus Armbruster
2014-08-22 7:50 ` Peter Maydell
2014-08-22 8:20 ` Daniel P. Berrange
2 siblings, 0 replies; 10+ messages in thread
From: Markus Armbruster @ 2014-08-22 7:40 UTC (permalink / raw)
To: John Snow; +Cc: qemu-devel, Stefan Hajnoczi
John Snow <jsnow@redhat.com> writes:
> I was running a series of tests on 32 and 64 bit hosts to test for
> endianness and variable width issues when I noticed that I couldn't
> properly perform a build of "make check" against a 32bit target from a
> 64bit host:
>
> ../../configure --cpu=i386 && make -j4 && make check
>
> This produces some warnings in tests-cutils about overflowing
> variables that are of type guint64. It's been mentioned on the mailing
> lists before, actually:
> http://lists.gnu.org/archive/html/qemu-devel/2014-05/msg00452.html
>
> The problem is that guint64 is being aliased against "unsigned long",
> which is only 4 bytes instead of the implied 8. This occurs because we
> link against the 64bit headers for glib instead of the 32bit ones when
> we're building for i386 from an x86_64 host.
>From glibconfig.h:
typedef signed char gint8;
typedef unsigned char guint8;
typedef signed short gint16;
typedef unsigned short guint16;
typedef signed int gint32;
typedef unsigned int guint32;
typedef signed long gint64;
typedef unsigned long guint64;
Anyone redoing <stdint.h> in this day and age is a weirdo.
Anyone getting it wrong is a weirdo and a fool.
But getting it wrong in code expressively generated to configure for a
specific platform with a perfectly working <stdint.h>, that's in a
category of weird foolishness of its own.
But wait, it gets even better:
typedef signed long gssize;
typedef unsigned long gsize;
Oh yeah, can't rely on size_t, it's been reliably available only since a
decade before GLib was born!
[...]
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 0:10 ` [Qemu-devel] issue: linking 64bit glib when building for cpu=i386 John Snow
2014-08-22 7:40 ` Markus Armbruster
@ 2014-08-22 7:50 ` Peter Maydell
2014-08-22 8:20 ` Daniel P. Berrange
2 siblings, 0 replies; 10+ messages in thread
From: Peter Maydell @ 2014-08-22 7:50 UTC (permalink / raw)
To: John Snow; +Cc: qemu-devel, Stefan Hajnoczi
On 22 August 2014 01:10, John Snow <jsnow@redhat.com> wrote:
> I was running a series of tests on 32 and 64 bit hosts to test for
> endianness and variable width issues when I noticed that I couldn't properly
> perform a build of "make check" against a 32bit target from a 64bit host:
>
> ../../configure --cpu=i386 && make -j4 && make check
The 32-bit-on-64-bit x86 stuff is a weird special case and I'm
not terribly surprised it's broken. For pretty much every other
non-native build case, --cpu is only there to override configure's
guesses if it guesses wrong: you just tell configure the correct
compiler to use, and then it will automatically figure out it's i386
because of the compiler #defines. If you use --cross-prefix= this
will tell configure to use all of the correct compiler and the
correct pkgconfig, assuming your distro has set up the compiler
and the pkgconfig with the right prefixes. But i386-on-x86_64
seems to be odd in that rather than just having a correct
compiler for it there's the same compiler with a bunch of
flags, and a pkg-config in a non-standard place.
thanks
-- PMM
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 0:10 ` [Qemu-devel] issue: linking 64bit glib when building for cpu=i386 John Snow
2014-08-22 7:40 ` Markus Armbruster
2014-08-22 7:50 ` Peter Maydell
@ 2014-08-22 8:20 ` Daniel P. Berrange
2014-08-22 8:28 ` Peter Maydell
2014-08-22 9:05 ` Stefan Hajnoczi
2 siblings, 2 replies; 10+ messages in thread
From: Daniel P. Berrange @ 2014-08-22 8:20 UTC (permalink / raw)
To: John Snow; +Cc: qemu-devel, Stefan Hajnoczi
On Thu, Aug 21, 2014 at 08:10:54PM -0400, John Snow wrote:
> I was running a series of tests on 32 and 64 bit hosts to test for
> endianness and variable width issues when I noticed that I couldn't properly
> perform a build of "make check" against a 32bit target from a 64bit host:
>
> ../../configure --cpu=i386 && make -j4 && make check
>
> This produces some warnings in tests-cutils about overflowing variables that
> are of type guint64. It's been mentioned on the mailing lists before,
> actually: http://lists.gnu.org/archive/html/qemu-devel/2014-05/msg00452.html
>
> The problem is that guint64 is being aliased against "unsigned long", which
> is only 4 bytes instead of the implied 8. This occurs because we link
> against the 64bit headers for glib instead of the 32bit ones when we're
> building for i386 from an x86_64 host.
>
> Our include flags wind up looking like: -I/usr/include/glib-2.0 but
> -I/usr/lib64/glib-2.0/include
>
> I was discussing the problem with Stefan:
>
> On 08/21/2014 05:03 AM, Stefan Hajnoczi wrote:
> >The problem is that pkg-config uses libdir=/usr/lib64 by default on
> >amd64 hosts. It doesn't know that gcc -m32 is being used.
> >
> >This results in glib's 64-bit headers being used where guint64 is just
> >unsigned long. On 32-bit hosts this is incorrect.
> >
> >Two workarounds:
> >
> >1. yum install pkgconfig.i686 and run it instead of pkgconfig.x86_64
> >
> >2. Use the pkg-config --define-variable libdir=/usr/lib option
> >
> >You can set PKG_CONFIG=path/to/pkg-config.i686 on QEMU's ./configure
> >command-line.
> >
> >This is all distro-specific :(. Any other solutions?
> >
> >Stefan
> >
>
> I am not extremely well versed in configure or pkg-config ninjutsu, but I
> must imagine that the ARCH/cpu variables we are setting in configure could
> help us know to call the 32bit pkg-config instead of the native 64bit
> version and fix this issue.
>
> Does anyone have any good ideas? Surely other projects must have run into
> this elsewhere.
Distros will install pkg-config .pc files for non-native architectures
in a different location normally. The supported / recommended way to
tell pkg-config to look in these alternative dirs is to set the env
variable PKG_CONFIG_LIBDIR. This replaces the built-in default search
directory that looks for native.
So on a Fedora / RHELL system, to make pkg-config use 32-bit libs you
want to set
PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig
which replaces the default location of /usr/lib64/pkgconfig. This is
the same thing you'd need to do to build QEMU for say, mingw32 where
you must set something like
PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig/
Note, i say PKG_CONFIG_LIBDIR here, *not* PKG_CONFIG_PATH. The latter
variable adds the default search path - you want to stop it looking in
the default search path completely because it is the wrong arch, so
must use PKG_CONFIG_LIBDIR
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 8:20 ` Daniel P. Berrange
@ 2014-08-22 8:28 ` Peter Maydell
2014-08-22 8:34 ` Daniel P. Berrange
2014-08-22 9:05 ` Stefan Hajnoczi
1 sibling, 1 reply; 10+ messages in thread
From: Peter Maydell @ 2014-08-22 8:28 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: John Snow, qemu-devel, Stefan Hajnoczi
On 22 August 2014 09:20, Daniel P. Berrange <berrange@redhat.com> wrote:
> Distros will install pkg-config .pc files for non-native architectures
> in a different location normally. The supported / recommended way to
> tell pkg-config to look in these alternative dirs is to set the env
> variable PKG_CONFIG_LIBDIR. This replaces the built-in default search
> directory that looks for native.
>
> So on a Fedora / RHELL system, to make pkg-config use 32-bit libs you
> want to set
>
> PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig
>
> which replaces the default location of /usr/lib64/pkgconfig. This is
> the same thing you'd need to do to build QEMU for say, mingw32 where
> you must set something like
>
> PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig/
Yes, but this should be done by the i686-w64-mingw32-pkg-config
wrapper IMHO. (That's how I have my mingw setup configured,
anyway.)
> Note, i say PKG_CONFIG_LIBDIR here, *not* PKG_CONFIG_PATH. The latter
> variable adds the default search path - you want to stop it looking in
> the default search path completely because it is the wrong arch, so
> must use PKG_CONFIG_LIBDIR
Interestingly, Debian's cross-compile pkg-config wrapper
(aarch64-linux-gnu-pkg-config etc) sets PKG_CONFIG_PATH,
not PKG_CONFIG_LIBDIR. Maybe that's a bug, but it works...
thanks
-- PMM
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 8:28 ` Peter Maydell
@ 2014-08-22 8:34 ` Daniel P. Berrange
2014-08-22 8:46 ` Peter Maydell
0 siblings, 1 reply; 10+ messages in thread
From: Daniel P. Berrange @ 2014-08-22 8:34 UTC (permalink / raw)
To: Peter Maydell; +Cc: John Snow, qemu-devel, Stefan Hajnoczi
On Fri, Aug 22, 2014 at 09:28:05AM +0100, Peter Maydell wrote:
> On 22 August 2014 09:20, Daniel P. Berrange <berrange@redhat.com> wrote:
> > Distros will install pkg-config .pc files for non-native architectures
> > in a different location normally. The supported / recommended way to
> > tell pkg-config to look in these alternative dirs is to set the env
> > variable PKG_CONFIG_LIBDIR. This replaces the built-in default search
> > directory that looks for native.
> >
> > So on a Fedora / RHELL system, to make pkg-config use 32-bit libs you
> > want to set
> >
> > PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig
> >
> > which replaces the default location of /usr/lib64/pkgconfig. This is
> > the same thing you'd need to do to build QEMU for say, mingw32 where
> > you must set something like
> >
> > PKG_CONFIG_LIBDIR=/usr/i686-w64-mingw32/sys-root/mingw/lib/pkgconfig/
>
> Yes, but this should be done by the i686-w64-mingw32-pkg-config
> wrapper IMHO. (That's how I have my mingw setup configured,
> anyway.)
Sure if your distro wants to rebuild the pkg-config binary for each
arch that is a valid approach too, but it is by no means required
in order to get non-native builds working.
> > Note, i say PKG_CONFIG_LIBDIR here, *not* PKG_CONFIG_PATH. The latter
> > variable adds the default search path - you want to stop it looking in
> > the default search path completely because it is the wrong arch, so
> > must use PKG_CONFIG_LIBDIR
>
> Interestingly, Debian's cross-compile pkg-config wrapper
> (aarch64-linux-gnu-pkg-config etc) sets PKG_CONFIG_PATH,
> not PKG_CONFIG_LIBDIR. Maybe that's a bug, but it works...
Yes, that would be a bug. Consider if you have mistakenly only installed
the 64-bit dev package for libusb and not the 32-bit package. Now the
'libusb-1.0.pc' file will only be present in the directory
/usr/lib64/pkgconfig but not in /usr/lib/pkgconfig.
If you used PKG_CONFIG_PATH to point to the 32-bit directory, then
it won't find the 32-bit libusb-1.0, so will fallback to looking in
the 64-bit directory and repo the 64-bit version which is definitely
not what you want. That'll lead to pain & suffering with wierd build
and/or link errors. If you used PKG_CONFIG_LIBDIR then you'll get an
immediate error from pkg-config telling you the 32-bit libusb-1.0
package was not installed.
Regards,
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 8:34 ` Daniel P. Berrange
@ 2014-08-22 8:46 ` Peter Maydell
0 siblings, 0 replies; 10+ messages in thread
From: Peter Maydell @ 2014-08-22 8:46 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: John Snow, qemu-devel, Stefan Hajnoczi
On 22 August 2014 09:34, Daniel P. Berrange <berrange@redhat.com> wrote:
> On Fri, Aug 22, 2014 at 09:28:05AM +0100, Peter Maydell wrote:
>> Yes, but this should be done by the i686-w64-mingw32-pkg-config
>> wrapper IMHO. (That's how I have my mingw setup configured,
>> anyway.)
>
> Sure if your distro wants to rebuild the pkg-config binary for each
> arch that is a valid approach too, but it is by no means required
> in order to get non-native builds working.
It's just a wrapper script, not a complete fresh binary. The
point is that all the compilation tools needed for a build for
$TRIPLET are $TRIPLET-toolname. That's what QEMU's
configure script expects and it's easy for users.
>> Interestingly, Debian's cross-compile pkg-config wrapper
>> (aarch64-linux-gnu-pkg-config etc) sets PKG_CONFIG_PATH,
>> not PKG_CONFIG_LIBDIR. Maybe that's a bug, but it works...
>
> Yes, that would be a bug. Consider if you have mistakenly only installed
> the 64-bit dev package for libusb and not the 32-bit package. Now the
> 'libusb-1.0.pc' file will only be present in the directory
> /usr/lib64/pkgconfig but not in /usr/lib/pkgconfig.
Mmm, this does seem to be a bug. I'll see if it's been
reported to Debian yet...
-- PMM
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 8:20 ` Daniel P. Berrange
2014-08-22 8:28 ` Peter Maydell
@ 2014-08-22 9:05 ` Stefan Hajnoczi
2014-09-23 18:52 ` John Snow
1 sibling, 1 reply; 10+ messages in thread
From: Stefan Hajnoczi @ 2014-08-22 9:05 UTC (permalink / raw)
To: Daniel P. Berrange; +Cc: John Snow, qemu-devel, Stefan Hajnoczi
On Fri, Aug 22, 2014 at 9:20 AM, Daniel P. Berrange <berrange@redhat.com> wrote:
> On Thu, Aug 21, 2014 at 08:10:54PM -0400, John Snow wrote:
>> I was running a series of tests on 32 and 64 bit hosts to test for
>> endianness and variable width issues when I noticed that I couldn't properly
>> perform a build of "make check" against a 32bit target from a 64bit host:
>>
>> ../../configure --cpu=i386 && make -j4 && make check
>>
>> This produces some warnings in tests-cutils about overflowing variables that
>> are of type guint64. It's been mentioned on the mailing lists before,
>> actually: http://lists.gnu.org/archive/html/qemu-devel/2014-05/msg00452.html
>>
>> The problem is that guint64 is being aliased against "unsigned long", which
>> is only 4 bytes instead of the implied 8. This occurs because we link
>> against the 64bit headers for glib instead of the 32bit ones when we're
>> building for i386 from an x86_64 host.
>>
>> Our include flags wind up looking like: -I/usr/include/glib-2.0 but
>> -I/usr/lib64/glib-2.0/include
>>
>> I was discussing the problem with Stefan:
>>
>> On 08/21/2014 05:03 AM, Stefan Hajnoczi wrote:
>> >The problem is that pkg-config uses libdir=/usr/lib64 by default on
>> >amd64 hosts. It doesn't know that gcc -m32 is being used.
>> >
>> >This results in glib's 64-bit headers being used where guint64 is just
>> >unsigned long. On 32-bit hosts this is incorrect.
>> >
>> >Two workarounds:
>> >
>> >1. yum install pkgconfig.i686 and run it instead of pkgconfig.x86_64
>> >
>> >2. Use the pkg-config --define-variable libdir=/usr/lib option
>> >
>> >You can set PKG_CONFIG=path/to/pkg-config.i686 on QEMU's ./configure
>> >command-line.
>> >
>> >This is all distro-specific :(. Any other solutions?
>> >
>> >Stefan
>> >
>>
>> I am not extremely well versed in configure or pkg-config ninjutsu, but I
>> must imagine that the ARCH/cpu variables we are setting in configure could
>> help us know to call the 32bit pkg-config instead of the native 64bit
>> version and fix this issue.
>>
>> Does anyone have any good ideas? Surely other projects must have run into
>> this elsewhere.
>
> Distros will install pkg-config .pc files for non-native architectures
> in a different location normally. The supported / recommended way to
> tell pkg-config to look in these alternative dirs is to set the env
> variable PKG_CONFIG_LIBDIR. This replaces the built-in default search
> directory that looks for native.
>
> So on a Fedora / RHELL system, to make pkg-config use 32-bit libs you
> want to set
>
> PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig
>
> which replaces the default location of /usr/lib64/pkgconfig.
Nice, and Paolo sent me an automated way of doing that:
On Fri, Aug 22, 2014 at 12:14:28AM +0200, Paolo Bonzini wrote:
> You need to set PKG_CONFIG_LIBDIR to
>
> /usr/lib/$MULTILIBDIR/pkgconfig
>
> where MULTILIBDIR is
>
> if $CC -print-multiarch >/dev/null 2>&1; then
> MULTILIBDIR=`$CC -print-multiarch $CFLAGS $CPPFLAGS`
> fi
> if test -z "$MULTILIBDIR"; then
> MULTILIBDIR=`$CC --print-multi-os-directory $CFLAGS $CPPFLAGS`
> fi
>
> This will point at /usr/lib/pkgconfig/glib-2.0.pc instead of
> /usr/lib64/pkgconfig/glib-2.0.pc
I tested that it works.
Stefan
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-08-22 9:05 ` Stefan Hajnoczi
@ 2014-09-23 18:52 ` John Snow
2014-09-23 20:20 ` Peter Maydell
0 siblings, 1 reply; 10+ messages in thread
From: John Snow @ 2014-09-23 18:52 UTC (permalink / raw)
To: Stefan Hajnoczi, Daniel P. Berrange
Cc: bonzini >> Paolo Bonzini, qemu-devel, Stefan Hajnoczi
On 08/22/2014 05:05 AM, Stefan Hajnoczi wrote:
> On Fri, Aug 22, 2014 at 9:20 AM, Daniel P. Berrange <berrange@redhat.com> wrote:
>> On Thu, Aug 21, 2014 at 08:10:54PM -0400, John Snow wrote:
>>> I was running a series of tests on 32 and 64 bit hosts to test for
>>> endianness and variable width issues when I noticed that I couldn't properly
>>> perform a build of "make check" against a 32bit target from a 64bit host:
>>>
>>> ../../configure --cpu=i386 && make -j4 && make check
>>>
>>> This produces some warnings in tests-cutils about overflowing variables that
>>> are of type guint64. It's been mentioned on the mailing lists before,
>>> actually: http://lists.gnu.org/archive/html/qemu-devel/2014-05/msg00452.html
>>>
>>> The problem is that guint64 is being aliased against "unsigned long", which
>>> is only 4 bytes instead of the implied 8. This occurs because we link
>>> against the 64bit headers for glib instead of the 32bit ones when we're
>>> building for i386 from an x86_64 host.
>>>
>>> Our include flags wind up looking like: -I/usr/include/glib-2.0 but
>>> -I/usr/lib64/glib-2.0/include
>>>
>>> I was discussing the problem with Stefan:
>>>
>>> On 08/21/2014 05:03 AM, Stefan Hajnoczi wrote:
>>>> The problem is that pkg-config uses libdir=/usr/lib64 by default on
>>>> amd64 hosts. It doesn't know that gcc -m32 is being used.
>>>>
>>>> This results in glib's 64-bit headers being used where guint64 is just
>>>> unsigned long. On 32-bit hosts this is incorrect.
>>>>
>>>> Two workarounds:
>>>>
>>>> 1. yum install pkgconfig.i686 and run it instead of pkgconfig.x86_64
>>>>
>>>> 2. Use the pkg-config --define-variable libdir=/usr/lib option
>>>>
>>>> You can set PKG_CONFIG=path/to/pkg-config.i686 on QEMU's ./configure
>>>> command-line.
>>>>
>>>> This is all distro-specific :(. Any other solutions?
>>>>
>>>> Stefan
>>>>
>>>
>>> I am not extremely well versed in configure or pkg-config ninjutsu, but I
>>> must imagine that the ARCH/cpu variables we are setting in configure could
>>> help us know to call the 32bit pkg-config instead of the native 64bit
>>> version and fix this issue.
>>>
>>> Does anyone have any good ideas? Surely other projects must have run into
>>> this elsewhere.
>>
>> Distros will install pkg-config .pc files for non-native architectures
>> in a different location normally. The supported / recommended way to
>> tell pkg-config to look in these alternative dirs is to set the env
>> variable PKG_CONFIG_LIBDIR. This replaces the built-in default search
>> directory that looks for native.
>>
>> So on a Fedora / RHELL system, to make pkg-config use 32-bit libs you
>> want to set
>>
>> PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig
>>
>> which replaces the default location of /usr/lib64/pkgconfig.
>
> Nice, and Paolo sent me an automated way of doing that:
>
> On Fri, Aug 22, 2014 at 12:14:28AM +0200, Paolo Bonzini wrote:
>> You need to set PKG_CONFIG_LIBDIR to
>>
>> /usr/lib/$MULTILIBDIR/pkgconfig
>>
>> where MULTILIBDIR is
>>
>> if $CC -print-multiarch >/dev/null 2>&1; then
>> MULTILIBDIR=`$CC -print-multiarch $CFLAGS $CPPFLAGS`
>> fi
>> if test -z "$MULTILIBDIR"; then
>> MULTILIBDIR=`$CC --print-multi-os-directory $CFLAGS $CPPFLAGS`
>> fi
>>
>> This will point at /usr/lib/pkgconfig/glib-2.0.pc instead of
>> /usr/lib64/pkgconfig/glib-2.0.pc
>
> I tested that it works.
>
> Stefan
>
A barrier into introducing this into the configuration script is that
clang, used on OSX hosts, does not support these print flags.
Even worse, clang --print-multi-os-directory produces "x86_64" on Fedora
20, which will lead to an erroneous configuration.
So we'll have to look into another way to support cross-compilation for
i386 on x86_64 to avoid script breakage on other platforms.
Any other ideas? It looks as if there have been proposals in the past to
add some multi-arch awareness into pkg-config, but they haven't gone
anywhere. So some tool needs to tell pkg-config where to look, but clang
is apparently not up to the job.
Where does gcc/g++ find out about the lib directories? Or are they
baked-in per distro?
Any ideas?
--j
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] issue: linking 64bit glib when building for cpu=i386
2014-09-23 18:52 ` John Snow
@ 2014-09-23 20:20 ` Peter Maydell
0 siblings, 0 replies; 10+ messages in thread
From: Peter Maydell @ 2014-09-23 20:20 UTC (permalink / raw)
To: John Snow
Cc: Stefan Hajnoczi, qemu-devel, Stefan Hajnoczi,
bonzini >> Paolo Bonzini
On 23 September 2014 11:52, John Snow <jsnow@redhat.com> wrote:
> On 08/22/2014 05:05 AM, Stefan Hajnoczi wrote:
>> Nice, and Paolo sent me an automated way of doing that:
>>
>> On Fri, Aug 22, 2014 at 12:14:28AM +0200, Paolo Bonzini wrote:
>>>
>>> You need to set PKG_CONFIG_LIBDIR to
>>>
>>> /usr/lib/$MULTILIBDIR/pkgconfig
>>>
>>> where MULTILIBDIR is
>>>
>>> if $CC -print-multiarch >/dev/null 2>&1; then
>>> MULTILIBDIR=`$CC -print-multiarch $CFLAGS $CPPFLAGS`
>>> fi
>>> if test -z "$MULTILIBDIR"; then
>>> MULTILIBDIR=`$CC --print-multi-os-directory $CFLAGS $CPPFLAGS`
>>> fi
>>>
>>> This will point at /usr/lib/pkgconfig/glib-2.0.pc instead of
>>> /usr/lib64/pkgconfig/glib-2.0.pc
> A barrier into introducing this into the configuration script is that clang,
> used on OSX hosts, does not support these print flags.
>
> Even worse, clang --print-multi-os-directory produces "x86_64" on Fedora 20,
> which will lead to an erroneous configuration.
>
> So we'll have to look into another way to support cross-compilation for i386
> on x86_64 to avoid script breakage on other platforms.
>
> Any other ideas? It looks as if there have been proposals in the past to add
> some multi-arch awareness into pkg-config, but they haven't gone anywhere.
> So some tool needs to tell pkg-config where to look, but clang is apparently
> not up to the job.
If you're cross compiling you should probably pass configure
--cross-prefix=whatever-
and make sure your compiler and the pkg-config wrapper which sets
PKG_CONFIG_LIBDIR are all suitably named whatever-cc,
whatever-pkg-config etc. This is the sort of cross compile environment
which configure is designed to work with (and it's the distro's
job to get that environment set up, not QEMU's).
The runes above are specifically for Fedora x86_64-to-i386
compilation, which is a very special case (though you
can treat this like a full cross compile if you want,
which is the direction Debian are taking cross builds with
multiarch).
(In particular, for a cross compile from Fedora to OSX you want a
cross-clang targeting MacOSX and a cross set of libraries and
includes and a cross set of pkg-config config files, so you
definitely don't want to be running the build host's clang or
its pkg-config.)
-- PMM
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-09-23 20:21 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <53F55173.6070704@redhat.com>
[not found] ` <20140821090328.GA32580@stefanha-thinkpad.redhat.com>
2014-08-22 0:10 ` [Qemu-devel] issue: linking 64bit glib when building for cpu=i386 John Snow
2014-08-22 7:40 ` Markus Armbruster
2014-08-22 7:50 ` Peter Maydell
2014-08-22 8:20 ` Daniel P. Berrange
2014-08-22 8:28 ` Peter Maydell
2014-08-22 8:34 ` Daniel P. Berrange
2014-08-22 8:46 ` Peter Maydell
2014-08-22 9:05 ` Stefan Hajnoczi
2014-09-23 18:52 ` John Snow
2014-09-23 20:20 ` Peter Maydell
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).