From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37497) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZxBpK-0007F2-VY for qemu-devel@nongnu.org; Fri, 13 Nov 2015 05:43:32 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZxBpG-0001pS-UU for qemu-devel@nongnu.org; Fri, 13 Nov 2015 05:43:30 -0500 Received: from mx1.redhat.com ([209.132.183.28]:55701) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZxBpG-0001pK-Mw for qemu-devel@nongnu.org; Fri, 13 Nov 2015 05:43:26 -0500 Received: from int-mx09.intmail.prod.int.phx2.redhat.com (int-mx09.intmail.prod.int.phx2.redhat.com [10.5.11.22]) by mx1.redhat.com (Postfix) with ESMTPS id 52F47C000410 for ; Fri, 13 Nov 2015 10:43:26 +0000 (UTC) From: "Daniel P. Berrange" Date: Fri, 13 Nov 2015 10:43:22 +0000 Message-Id: <1447411402-29238-1-git-send-email-berrange@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH] configure: sanity check the glib library that pkg-config finds List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Paolo Bonzini , "Dr. David Alan Gilbert" Developers on 64-bit machines will often try to perform a 32-bit build of QEMU by running ./configure --extra-cflags=3D"-m32" Unfortunately if PKG_CONFIG_LIBDIR is not set to point to the location of the 32-bit pkg-config files, then configure will silently pick up the 64-bit pkg-config files and still succeed. This causes a problem for glib because it means QEMU will be pulling in /usr/lib64/glib-2.0/include/glibconfig.h instead of /usr/lib/glib-2.0/include/glibconfig.h This causes problems because the 'gsize' type (defined as 'unsigned long') will no longer be fully compatible with the 'size_t' type (defined as 'unsigned int'). Although both are the same size, the compiler refuses to allow casts from 'unsigned long *' to 'unsigned int *' as they are different pointer types. This results in non-obvious compiler errors when building QEMU eg qga/commands-posix.c: In function =E2=80=98qmp_guest_set_user_password=E2= =80=99: qga/commands-posix.c:1912:55: error: passing argument 2 of =E2=80=98g_bas= e64_decode=E2=80=99 from incompatible pointer type [-Werror=3Dincompatibl= e-pointer-types] rawpasswddata =3D (char *)g_base64_decode(password, &rawpasswdlen); ^ In file included from /usr/include/glib-2.0/glib.h:35:0, from qga/commands-posix.c:14: /usr/include/glib-2.0/glib/gbase64.h:52:9: note: expected =E2=80=98gsize = * {aka long unsigned int *}=E2=80=99 but argument is of type =E2=80=98siz= e_t * {aka unsigned int *}=E2=80=99 guchar *g_base64_decode (const gchar *text, ^ cc1: all warnings being treated as errors To detect this problem, add a check to configure that verifies that GLIB_SIZEOF_SIZE_T matches sizeof(size_t). If this fails print a warning suggesting that the dev probably needs to set PKG_CONFIG_LIBDIR. On Fedora x86_64 it passes with any of: # ./configure # PKG_CONFIG_LIBDIR=3D/usr/lib/pkgconfig ./configure --extra-cflags=3D"-= m32" # PKG_CONFIG_LIBDIR=3D/usr/lib64/pkgconfig ./configure --extra-cflags=3D= "-m64" And fails with a mis-match # PKG_CONFIG_LIBDIR=3D/usr/lib64/pkgconfig ./configure --extra-cflags=3D= "-m32" # PKG_CONFIG_LIBDIR=3D/usr/lib/pkgconfig ./configure --extra-cflags=3D"-= m64" ERROR: sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. You probably need to set PKG_CONFIG_LIBDIR to point to the right pkg-config files for your build target Signed-off-by: Daniel P. Berrange --- configure | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/configure b/configure index f75df4b..64642c4 100755 --- a/configure +++ b/configure @@ -2939,6 +2939,26 @@ for i in $glib_modules; do fi done =20 +# Sanity check that the current size_t matches the +# size that glib thinks it should be. This catches +# problems on multi-arch where people try to build +# 32-bit QEMU while pointing at 64-bit glib headers +cat > $TMPC < +#include + +int main(void) { + G_STATIC_ASSERT(sizeof(size_t) =3D=3D GLIB_SIZEOF_SIZE_T); +} +EOF + +if ! compile_prog "-Werror $CFLAGS" "$LIBS" ; then + error_exit "sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T."\ + "You probably need to set PKG_CONFIG_LIBDIR"\ + "to point to the right pkg-config files for your"\ + "build target" +fi + # g_test_trap_subprocess added in 2.38. Used by some tests. glib_subprocess=3Dyes if ! $pkg_config --atleast-version=3D2.38 glib-2.0; then --=20 2.5.0