Wine uses the wrong pkg-config for 32 bit builds

Francois Gouget fgouget at codeweavers.com
Mon Jun 5 10:46:00 CDT 2017


The problem with pkg-config is that it has no idea what the build target 
is so it always returns the include and library paths appropriate for 
the build host.

For instance when Wine tries to figure out how to use GStreamer 1.0 it 
calls:

$ pkg-config --cflags gstreamer-1.0
-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include

It's pretty obvious that the 'x86_64-linux-gnu' is wrong for a 32 bit 
build. But then we never told pkg-config that we wanted to do a 32 bit 
build!

There are two ways to tell pkg-config we want to do a 32 bit build.

* The first way is to set PKG_CONFIG_LIBDIR to force pkg-config to 
  only use the .pc files we want. However this requires knowing where 
  the .pc files are stored and you'd want to make sure to include 
  /usr/lib/<triplet>/pkgconfig, /usr/local/lib/<triplet>/pkgconfig. And 
  then should you also include /usr/lib/pkgconfig?

* Another way is to use a <triplet>-pkg-config tool, which will give us 
  the right information for the specified <triplet>. Red Hat, Debian and 
  its derivatives (Ubuntu, etc) all provide them. This gives:

$ i686-linux-gnu-pkg-config --cflags gstreamer-1.0
-pthread -I/usr/include/gstreamer-1.0 -I/usr/include/glib-2.0 
-I/usr/lib/i386-linux-gnu/glib-2.0/include


We already have a WINE_CHECK_HOST_TOOL() macro that looks like it should 
do the trick. But it only takes ac_tool_prefix into account. So I 
modified it to take the host target into account if ac_tool_prefix is 
not set. This is modeled after the WINE_CHECK_MINGW_PROG macro and you 
can see the result in the patch below.

On Red Hat the it's a quadruplet: it has an extra 'redhat-' in the name 
(it's i686-redhat-linux-gnu-pkg-config for instance). The patch below 
does not account for it. I'm hoping Red Hat developers can suggest how 
to best take this into account.


Is this approach ok?


-----


configure: Take the target host into account in WINE_CHECK_HOST_TOOL().
    
In particular this gets us the right pkg-config tool when building the
32 bit Wine.

Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
 aclocal.m4 | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/aclocal.m4 b/aclocal.m4
index 9364188e334..4ac467a71e5 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -27,13 +27,17 @@ dnl
 dnl Like AC_CHECK_TOOL but without the broken fallback to non-prefixed name
 dnl
 AC_DEFUN([WINE_CHECK_HOST_TOOL],
-[AS_VAR_SET_IF([ac_tool_prefix],
-  AC_CHECK_PROG([$1],[${ac_tool_prefix}$2],[${ac_tool_prefix}$2],,[$4]))
-AS_VAR_IF([ac_cv_prog_$1],[],
-  [AS_VAR_IF([cross_compiling],[yes],[],
-    [AS_UNSET([ac_cv_prog_$1])
-     AC_CHECK_PROG([$1],[$2],[$2],[$3],[$4])])],
-[AS_VAR_COPY([$1],[ac_cv_prog_$1])])])
+[AS_VAR_IF([ac_tool_prefix],[],
+  [case "$host_cpu" in
+   i[[3456789]]86*)
+     ac_host_tool_list="m4_foreach([ac_wine_cpu],[i686,i586,i486,i386],[ac_wine_cpu-${host_os}-$2 ]) $2" ;;
+   x86_64)
+     ac_host_tool_list="x86_64-${host_os}-$2 $2" ;;
+   *)
+     ac_host_tool_list="" ;;
+   esac],
+   [ac_host_tool_tool_list="${ac_tool_prefix}-$2"])
+ AC_CHECK_PROGS($1,$ac_host_tool_list,[$3],[$4])])
 
 dnl **** Initialize the programs used by other checks ****
 dnl
-- 
2.11.0



More information about the wine-devel mailing list