Package: pkg-config
Version: 0.21-1
Tags: patch
Followup-For: Bug #217902

Hi,

Someone asked for this on #debian-devel today so I threw a patch
together without first checking the BTS.

This patch adds a --arch option that you pass a triple arch-os-gnu and
it then searches /usr/lib/arch-os-gnu/pkgconfig for .pc files.

I have no experience with multiarch, but this is what was asked for. I
don't know how this approach compares to the other one.

There are 3 things I would address in this patch before it would be
accepted any way.
  1) free the strings if necessary.
  2) Check that the --arch argument contains no .. or / etc.
  3) Support multiple bases in the ./configure argument, so that say
     usr/local/lib and usr/lib can both be supported.

Let me know what you think of the patch.

James
Index: main.c
===================================================================
--- main.c.orig	2006-10-08 20:01:29.000000000 +0100
+++ main.c	2006-10-08 21:11:45.000000000 +0100
@@ -201,6 +201,7 @@
   char **search_dirs;
   char **iter;
   gboolean need_newline;
+  char *cross_arch = NULL;
 
   const char *pkgname;
   Package *pkg;
@@ -257,6 +258,8 @@
       "show verbose information about missing or conflicting packages" },
     { "errors-to-stdout", 0, POPT_ARG_NONE, &want_stdout_errors, 0,
       "print errors from --print-errors to stdout not stderr" },
+    { "arch", 0, POPT_ARG_STRING, &cross_arch, 0,
+      "Output information for the given architecture" },
 #ifdef G_OS_WIN32
     { "dont-define-prefix", 0, POPT_ARG_NONE, &dont_define_prefix, 0,
       "don't try to override the value of prefix for each .pc file found with "
@@ -281,20 +284,6 @@
       debug_spew ("PKG_CONFIG_DEBUG_SPEW variable enabling debug spew\n");
     }
 
-  search_path = getenv ("PKG_CONFIG_PATH");
-  if (search_path) 
-    {
-      add_search_dirs(search_path, G_SEARCHPATH_SEPARATOR_S);
-    }
-  if (getenv("PKG_CONFIG_LIBDIR") != NULL) 
-    {
-      add_search_dirs(getenv("PKG_CONFIG_LIBDIR"), G_SEARCHPATH_SEPARATOR_S);
-    }
-  else
-    {
-      add_search_dirs(PKG_CONFIG_PC_PATH, G_SEARCHPATH_SEPARATOR_S);
-    }
-
 #ifdef G_OS_WIN32
   {
     /* Add search directories from the Registry */
@@ -375,6 +364,26 @@
       return 1;
     }
 
+  search_path = getenv ("PKG_CONFIG_PATH");
+  if (search_path) 
+    {
+      add_search_dirs(search_path, G_SEARCHPATH_SEPARATOR_S);
+    }
+  if (getenv("PKG_CONFIG_LIBDIR") != NULL) 
+    {
+      add_search_dirs(getenv("PKG_CONFIG_LIBDIR"), G_SEARCHPATH_SEPARATOR_S);
+    }
+  else if (cross_arch != NULL)
+    {      
+      char *dir = strndup(PKG_CONFIG_MULTI_BASE_PATH, 25);
+      char *arch = strndup(cross_arch, 25);
+      add_search_dir(strncat(strncat(dir, arch, 50), "/pkgconfig/", 61)); 
+    }
+  else
+    {
+      add_search_dirs(PKG_CONFIG_PC_PATH, G_SEARCHPATH_SEPARATOR_S);
+    }
+
 
   /* Error printing is determined as follows:
    *     - for --cflags, --libs, etc. it's on by default
Index: Makefile.am
===================================================================
--- Makefile.am.orig	2006-10-08 20:18:12.000000000 +0100
+++ Makefile.am	2006-10-08 20:55:05.000000000 +0100
@@ -16,7 +16,9 @@
 bin_PROGRAMS = pkg-config
 [EMAIL PROTECTED]@
 
-INCLUDES=-DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" $(included_glib_includes)
+INCLUDES=-DPKG_CONFIG_PC_PATH="\"$(pc_path)\"" \
+			-DPKG_CONFIG_MULTI_BASE_PATH="\"$(pc_multiarch_path)/\"" \
+			$(included_glib_includes)
 
 pkg_config_SOURCES= \
 	pkg.h \
Index: configure.in
===================================================================
--- configure.in.orig	2006-10-08 20:14:20.000000000 +0100
+++ configure.in	2006-10-08 20:18:05.000000000 +0100
@@ -22,7 +22,18 @@
 
 ])
 
+AC_DEFUN([PKG_CONFIG_FIND_PC_MULTI_PATH],
+[AC_ARG_WITH(pc_multiarch_path,
+ [  --with-pc-multiarch-path      Override the default base path for use in multiarch mode ],
+ [ pc_multiarch_path="$withval"
+   AC_MSG_CHECKING([for default base path for use in multiarch mode])
+   AC_MSG_RESULT([$pc_multiarch_path])],
+ [pc_multiarch_path="$libdir"])
+ AC_SUBST([pc_multiarch_path])
+])
+
 PKG_CONFIG_FIND_PC_PATH
+PKG_CONFIG_FIND_PC_MULTI_PATH
 
 #
 # Code taken from gtk+-2.0's configure.in.
Index: pkg-config.1
===================================================================
--- pkg-config.1.orig	2006-10-08 21:13:21.000000000 +0100
+++ pkg-config.1	2006-10-08 21:16:09.000000000 +0100
@@ -35,7 +35,7 @@
 [\-\-define-variable=VARIABLENAME=VARIABLEVALUE]
 [\-\-uninstalled]
 [\-\-exists] [\-\-atleast-version=VERSION] [\-\-exact-version=VERSION]
-[\-\-max-version=VERSION] [LIBRARIES...]
+[\-\-max-version=VERSION] [\-\-arch=ARCH] [LIBRARIES...]
 .SH DESCRIPTION
 
 The \fIpkg-config\fP program is used to retrieve information about
@@ -217,6 +217,12 @@
 the .pc files, else a too large number of libraries will ordinarily be
 output.
 
+.TP
+.I "--arch=ARCH"
+For use in multiarch situations. Pass it a triple arch-os-gnu and it will
+search $libdir/arch-os-gnu/pkgconfig for the .pc files. It can only use that
+one location currently.
+
 .SH ENVIRONMENT VARIABLES
 
 .TP

Reply via email to