nixpkgs-suyu/doc/languages-frameworks/pkg-config.section.md
pennae 052bb41410 doc: assign ids to many headings
without stable ids on headings we cannot generate stable links to these
headings. nrd complains about this, but the current docbook workflow
does not.

a few generated ids remain, mostly in examples and footnotes. most of
the examples are generated by nixdoc (which has since gained MD export
functions, and the MD export does generate IDs).
2023-03-27 22:39:11 +02:00

1.9 KiB

pkg-config

pkg-config is a unified interface for declaring and querying built C/C++ libraries.

Nixpkgs provides a couple of facilities for working with this tool.

Writing packages providing pkg-config modules

Packages should set meta.pkgConfigModules with the list of package config modules they provide. They should also use testers.testMetaPkgConfig to check that the final built package matches that list. Additionally, the validatePkgConfig setup hook, will do extra checks on to-be-installed pkg-config modules.

A good example of all these things is zlib:

{ pkg-config, testers, ... }:

stdenv.mkDerivation (finalAttrs: {
  ...

  nativeBuildInputs = [ pkg-config validatePkgConfig ];

  passthru.tests.pkg-config = testers.testMetaPkgConfig finalAttrs.finalPackage;

  meta = {
    ...
    pkgConfigModules = [ "zlib" ];
  };
})

Accessing packages via pkg-config module name

Within Nixpkgs

A setup hook is bundled in the pkg-config package to bring a derivation's declared build inputs into the environment. This will populate environment variables like PKG_CONFIG_PATH, PKG_CONFIG_PATH_FOR_BUILD, and PKG_CONFIG_PATH_HOST based on:

  • how pkg-config itself is depended upon

  • how other dependencies are depended upon

For more details see the section on specifying dependencies in general.

Normal pkg-config commands to look up dependencies by name will then work with those environment variables defined by the hook.

Externally

The defaultPkgConfigPackages package set is a set of aliases, named after the modules they provide. This is meant to be used by language-to-nix integrations. Hand-written packages should use the normal Nixpkgs attribute name instead.