Skip to content

build: Generate better pkg-config file for SYSROOT and static-only builds

James Le Cuirot requested to merge chewi/libxml2:pkg-config into master

The -I and -L flags you use to build should not necessarily be the same ones you bake into installed files. If you are building with dependencies located under a SYSROOT then the installed files should have no knowledge of that SYSROOT. For example, if the build requires -L/path/to/sysroot/usr/lib/foo then only -L/usr/lib/foo should be baked into the installed files.

pkg-config is SYSROOT-aware, so this issue can be sidestepped by using the Requires field rather than the Libs and Cflags fields. This is easily resolved if you rely solely on pkg-config, but this project falls back to standard Autoconf checks, so a little more effort is required.

Unfortunately, this issue cannot feasibly be resolved for CMake. find_package is used rather than pkg_check_modules, so we cannot tell whether a pkg-config file for each dependency is present or not, even if find_package uses pkg-config behind the scenes. The CMake build does not record any dependency -I or -L flags into the pkg-config file anyway. This is a problem in itself, although these dependencies are most likely installed to standard locations.

Meson is very much better at handling this, as it generates the pkg-config file automatically using the correct logic.


pkg-config supports Requires.private and Libs.private fields for static linking. However, if you're building a dynamic binary, then pkg-config will use the non-private fields, even if just the static libxml2 is available. This will result in libxml2 being underlinked, causing the build to fail. The solution is to fold the private fields into the non-private fields when the shared libxml2 is not being built.

This works for Autotools and CMake. Meson also knows how to handle this when it automatically generates pkg-config files.

Edited by James Le Cuirot

Merge request reports