< spin-rss 1.23 | Russ Allbery > Eagle's Path > October 2010 | pkg-config and Autoconf > |
A little while back, as part of a discussion on debian-devel, I spent some time bad-mouthing pkg-config, and then later realized (with the help of an IRC conversation) that I was doing so unfairly. So as penance here is some documentation for how to add a pkg-config configuration file to a typical Automake project.
This information is also in my build system coding style and will be maintained there (so if you see this some time after I wrote it, check that page for more up-to-date information).
pkg-config is
a tool to provide the flags required to compile or link against a shared
library. It's a replacement for complex Autoconf probes and for all of
the incompatible and occasionally buggy *-config
scripts.
To install a pkg-config configuration file, provide a template pkg-config
configuration in a file named after the library but with a .pc.in
extension. Here is an example:
prefix=@prefix@ exec_prefix=@exec_prefix@ includedir=@includedir@ libdir=@libdir@ Name: <library> Description: <short description> URL: <upstream url> Version: @PACKAGE_VERSION@ Cflags: -I${includedir} Libs: -L${libdir} -l<library> Libs.private: @KRB5_LDFLAGS@ @KRB5_LIBS@
Replace <library> with the official name of the library (which isn't
necessarily the library name with lib
removed). This is only
informational, may contain spaces, and isn't used to locate the file. Its
filename is used for that.
Replace <short description> with a short description of the purpose of the library. Often the short description of the package from the start of the README file works well here. Replace <upstream url> with the URL of the package's distribution page.
Normally, all Cflags
needs to contain is what's indicated above,
which lets the compiler find the header files if installed in a
non-standard location. For Libs
, note that pkg-config
distinguishes between the shared libraries that must be linked against on
a system with proper transitive dependency support and the libraries that
must be linked for a static build or on a system with poor support for
shared libraries. For a well-designed shared library, one should rarely
need anything in Libs
other than what's listed above.
Libs.private
, on the other hand, needs all the LDFLAGS and LIBS of
everything the library itself links with external to this package. In
this example, the shared library is linked with the Kerberos libraries and
therefore needs the Kerberos LDFLAGS and LIBS; modify as needed for your
example.
If the dependencies of the shared library also use pkg-config, just list
the other pkg-config file names in Requires
or
Requires.private
instead of using Libs
or
Libs.private
for them.
Finally, add the Automake code to build and install the pkg-config configuration file. It should look like this:
pkgconfigdir = $(libdir)/pkgconfig nodist_pkgconfig_DATA = lib/libfoo.pc lib/libfoo.pc: $(srcdir)/lib/libfoo.pc.in sed -e 's![@]prefix[@]!$(prefix)!g' \ -e 's![@]exec_prefix[@]!$(exec_prefix)!g' \ -e 's![@]includedir[@]!$(includedir)!g' \ -e 's![@]libdir[@]!$(libdir)!g' \ -e 's![@]PACKAGE_VERSION[@]!$(PACKAGE_VERSION)!g' \ -e 's![@]KRB5_LDFLAGS[@]!$(KRB5_LDFLAGS)!g' \ -e 's![@]KRB5_LIBS[@]!$(KRB5_LIBS)!g' \ $(srcdir)/lib/libfoo.pc.in > $@
Replace libfoo
with the actual name of the library and change its
path in the source package as needed. Note the pattern above and use it
for any Autoconf substitution variables that you need to replace in the
pkg-config template. The above example adds KRB5_LDFLAGS and KRB5_LIBS to
the variables; you may have other ones you need, particularly to construct
Libs.private
.
The above installs the pkg-config configuration file under
$(libdir)/pkgconfig
. $(datadir)/pkgconfig
is appropriate
instead if one is certain that the flags required to link with this
library will never vary by architecture, but that's not the case for most
libraries due to Libs.private
.
Note that the Automake documentation recommends using comma as the sed delimiter for doing this sort of trick, but LDFLAGS frequently contains a comma since it's the separator for parts of a linker-specific option. I use an exclamation point instead.
Posted: 2010-10-13 17:03 — Why no comments?
< spin-rss 1.23 | Russ Allbery > Eagle's Path > October 2010 | pkg-config and Autoconf > |