From 6087e5905c25b0b08fac576a1a54977ca71d2afb Mon Sep 17 00:00:00 2001
From: Philip Withnall
Date: Sun, 22 Feb 2015 17:10:17 +0000
Subject: [PATCH] pkg: Add PKG_CHECK_MODULES_SUBST macro
This is a tweaked version of PKG_CHECK_MODULES which supports separating
out the private and public dependencies and substituting them into the
.pc file using autoconf magic.
See the documentation for the macro for more information.
https://bugs.freedesktop.org/show_bug.cgi?id=87154
---
README | 19 +++++++++++++++++-
pkg-config-guide.html | 19 ++++++++++++++++--
pkg-config.1 | 55 ++++++++++++++++++++++++++++++++++++++++-----------
pkg.m4 | 53 +++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 132 insertions(+), 14 deletions(-)
diff --git a/README b/README
index 5a53aeb..3f0c2fb 100644
--- a/README
+++ b/README
@@ -3,7 +3,24 @@ flags when compiling/linking a lot easier.
Report bugs at http://bugzilla.freedesktop.org/
-To use pkg-config, do something like the following in your configure.ac
+To use pkg-config from a library, do something like the following in your
+configure.ac
+
+ PKG_CHECK_MODULES_SUBST([GLIB], [gio-2.0 gthread-2.0], [glib-2.0 >= 2.40.0])
+
+This puts the necessary include flags to compile/link something against GIO,
+GLib, GThread and all their dependencies in $(GLIB_CFLAGS), and the -L/-l flags
+for linking in $(GLIB_LIBS). It also substitutes @PKG_REQUIRES_PRIVATE@ and
+@PKG_REQUIRES@ in autoconf outputted files, so by putting:
+
+ Requires: @PKG_REQUIRES@
+ Requires.private: @PKG_REQUIRES_PRIVATE@
+
+in your library’s .pc.in file, its private and public dependencies are
+automatically advertised correctly for programs to link again.
+
+To use pkg-config from a program, do something like the following in your
+configure.ac:
PKG_CHECK_MODULES([GNOME], [gtk > 1.2.8 gnomeui >= 1.2.0])
diff --git a/pkg-config-guide.html b/pkg-config-guide.html
index 16c43e2..4bc9382 100644
--- a/pkg-config-guide.html
+++ b/pkg-config-guide.html
@@ -354,6 +354,14 @@ $ pkg-config --modversion hello
<VARIABLE-PREFIX>_CFLAGS and
<VARIABLE-PREFIX>_LIBS according to the output from
pkg-config --cflags and pkg-config --libs.
+
+ PKG_CHECK_MODULES_SUBST(VARIABLE-PREFIX, PRIVATE-MODULES, PUBLIC-MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [PRIVATE-VARIABLE], [PUBLIC-VARIABLE]):
+ A wrapper around PKG_CHECK_MODULES which split the list of modules
+ into public and private dependencies, and produces two variables listing the
+ dependencies across all invocations of PKG_CHECK_MODULES_SUBST. These
+ two variables are exposed via AC_SUBST and should be used in a
+ pkg-config file as the substituted variables for Requires and
+ Requires.private.
@@ -371,8 +379,8 @@ $ pkg-config --modversion hello
The integration can be more robust when used with
autoconf and
automake. By using the
- supplied PKG_CHECK_MODULES macro, the metadata is easily accessed
- in the build process.
+ supplied PKG_CHECK_MODULES_SUBST and PKG_CHECK_MODULES
+ macros, the metadata is easily accessed in the build process.
configure.ac:
PKG_CHECK_MODULES([X], [x])
@@ -396,6 +404,13 @@ myapp_LDADD = $(X_LIBS)
libx headers. In either case, pkg-config will output
the compiler flags when --static is used or not.
+ The PKG_CHECK_MODULES_SUBST macro can help with this: use it
+ instead of PKG_CHECK_MODULES and list your private dependencies
+ separately from your public ones — so the x library should be
+ listed in the second argument to PKG_CHECK_MODULES_SUBST. Put
+ Requires.private: @PKG_REQUIRES_PRIVATE@ and
+ Requires: @PKG_REQUIRES@ in your z.pc file.
+
My library z uses libx internally, but does not
expose libx data types in its public API. What do I put in my
z.pc file?
diff --git a/pkg-config.1 b/pkg-config.1
index 74bb70a..891cf3c 100644
--- a/pkg-config.1
+++ b/pkg-config.1
@@ -396,25 +396,46 @@ variables described above.
.\"
.SH AUTOCONF MACROS
.TP
-.I "PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])"
+.I "PKG_CHECK_MODULES_SUBST(VARIABLE-PREFIX, PRIVATE-MODULES, PUBLIC-MODULES [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND [,PRIVATE-VARIABLE [,PUBLIC-VARIABLE]]]])"
-The macro PKG_CHECK_MODULES can be used in \fIconfigure.ac\fP to
+The macro PKG_CHECK_MODULES_SUBST can be used in \fIconfigure.ac\fP to
check whether modules exist. A typical usage would be:
.nf
- PKG_CHECK_MODULES([MYSTUFF], [gtk+-2.0 >= 1.3.5 libxml = 1.8.4])
+ PKG_CHECK_MODULES_SUBST([MYSTUFF], [gio-2.0 >= 2.40.1 gthread-2.0], [glib-2.0 >= 2.38.3])
+ PKG_CHECK_MODULES_SUBST([MYSTUFF_UI], [gtk+-3.0], [])
.fi
This would result in MYSTUFF_LIBS and MYSTUFF_CFLAGS substitution
-variables, set to the libs and cflags for the given module list.
-If a module is missing or has the wrong version, by default configure
-will abort with a message. To replace the default action,
-specify an \%ACTION-IF-NOT-FOUND. \%PKG_CHECK_MODULES will not print any
-error messages if you specify your own ACTION-IF-NOT-FOUND.
-However, it will set the variable MYSTUFF_PKG_ERRORS, which you can
-use to display what went wrong.
+variables, set to the libs and cflags for the given module lists (both
+public and private). If a module is missing or has the wrong version, by
+default configure will abort with a message. To replace the default action,
+specify an \%ACTION-IF-NOT-FOUND. \%PKG_CHECK_MODULES_SUBST will not print
+any error messages if you specify your own ACTION-IF-NOT-FOUND. However, it
+will set the variable MYSTUFF_PKG_ERRORS, which you can use to display what
+went wrong.
+
+\%PKG_CHECK_MODULES_SUBST will produce two lists of modules, concatenated
+across all invocations of the macro. These two variables are exposed via
+\%AC_SUBST, and should be used in a pkg-config file as the substituted
+variables for \%Requires and \%Requires.private:
+.nf
+ Requires.private: @PKG_REQUIRES_PRIVATE@
+ Requires: @PKG_REQUIRES@
+.fi
+
+For the example above, the variables would be set to:
+.nf
+ PKG_REQUIRES_PRIVATE="gio-2.0 >= 2.40.1 gthread-2.0 gtk+-3.0"
+ PKG_REQUIRES="glib-2.0 >= 2.38.3"
+.fi
+
+The names of the \%PKG_REQUIRES_PRIVATE and \%PKG_REQUIRES variables can
+be set using the PRIVATE-VARIABLE and PUBLIC-VARIABLE arguments, which
+default to PKG_REQUIRES and PKG_REQUIRES_PRIVATE. Both variables are
+AC_SUBST-ed by this macro.
Note that if there is a possibility the first call to
-PKG_CHECK_MODULES might not happen, you should be sure to include an
+PKG_CHECK_MODULES_SUBST might not happen, you should be sure to include an
explicit call to PKG_PROG_PKG_CONFIG in your configure.ac.
Also note that repeated usage of VARIABLE-PREFIX is not recommended.
@@ -423,6 +444,18 @@ VARIABLE-PREFIX will simply use the _LIBS and _CFLAGS variables set from
the previous usage without calling \fIpkg-config\fP again.
.\"
.TP
+.I "PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES [,ACTION-IF-FOUND [,ACTION-IF-NOT-FOUND]])"
+
+A simpler version of \%PKG_CHECK_MODULES_SUBST, suitable for use in
+applications which do not need to differentiate between public and private
+dependencies.
+
+It behaves like \%PKG_CHECK_MODULES_SUBST, but does not build the
+PKG_REQUIRES and PKG_REQUIRES_PRIVATE lists, and takes a single list of
+modules to check for.
+
+.\"
+.TP
.I "PKG_PROG_PKG_CONFIG([MIN-VERSION])"
Defines the PKG_CONFIG variable to the best pkg-config available,
diff --git a/pkg.m4 b/pkg.m4
index 62995f0..133cb29 100644
--- a/pkg.m4
+++ b/pkg.m4
@@ -178,6 +178,59 @@ PKG_CONFIG=$_save_PKG_CONFIG[]dnl
])
+# PKG_CHECK_MODULES_SUBST(PREFIX, PRIVATE-MODULES, PUBLIC-MODULES,
+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND], [PRIVATE-VARIABLE],
+# [PUBLIC-VARIABLE])
+# ---------------------------------------------------------------------
+#
+# A wrapper around PKG_CHECK_MODULES which splits the list of modules into
+# public and private dependencies, and produces two variables listing the
+# dependencies across all invocations of PKG_CHECK_MODULES_SUBST. These two
+# variables are exposed via AC_SUBST, and should be used in a pkg-config
+# file as the substituted values for Requires and Requires.private.
+#
+# The PREFIX, PRIVATE-MODULES and PUBLIC-MODULES arguments should be
+# specified as for PKG_CHECK_MODULES, with the concatenation of
+# PUBLIC-MODULES and PRIVATE-MODULES equaling the LIST-OF-MODULES from
+# PKG_CHECK_MODULES. The ACTION-IF-FOUND and ACTION-IF-NOT-FOUND arguments
+# are optional, and should also be specified as for PKG_CHECK_MODULES.
+# ACTION-IF-FOUND is evaluated if the full LIST-OF-MODULES is found;
+# ACTION-IF-NOT-FOUND similarly.
+#
+# PUBLIC-VARIABLE defaults to PKG_REQUIRES, and PRIVATE-VARIABLE defaults to
+# PKG_REQUIRES_PRIVATE. Both variables are AC_SUBST-ed by this macro.
+#
+# For example:
+#
+# PKG_CHECK_MODULES_SUBST([GLIB],[gthread-2.0],[glib-2.0 gio-2.0])
+# PKG_CHECK_MODULES_SUBST([DBUS],[dbus-glib-1 >= 0.98 dbus-1],[])
+#
+# results in the substitutions:
+#
+# PKG_REQUIRES_PRIVATE="gthread-2.0 dbus-glib-1 >= 0.98 dbus-1"
+# PKG_REQUIRES="glib-2.0 gio-2.0"
+#
+# and can be used with a template pkg-config file (.pc.in) using:
+#
+# Requires: @PKG_REQUIRES@
+# Requires.private: @PKG_REQUIRES_PRIVATE@
+AC_DEFUN([PKG_CHECK_MODULES_SUBST],[
+ m4_define([pkg_requires_private],
+ [m4_default_quoted([$6],[PKG_REQUIRES_PRIVATE])])
+ m4_define([pkg_requires],
+ [m4_default_quoted([$7],[PKG_REQUIRES])])
+
+ pkg_requires_private="$[]pkg_requires_private $2"
+ pkg_requires="$[]pkg_requires $3"
+
+ PKG_CHECK_MODULES([$1],[$2 $3],[$4],[$5])
+
+ # Substitute output.
+ AC_SUBST(pkg_requires_private)
+ AC_SUBST(pkg_requires)
+])
+
+
# PKG_INSTALLDIR(DIRECTORY)
# -------------------------
# Substitutes the variable pkgconfigdir as the location where a module
--
1.9.3