Unverified Commit 6d0b3086 authored by John Ericson's avatar John Ericson Committed by GitHub
Browse files

Merge pull request #214304 from obsidiansystems/pkg-config-meta

meta.pkgConfigModules: Init convention
parents 4e99dc56 6e4a1b18
Loading
Loading
Loading
Loading
+45 −3
Original line number Diff line number Diff line
@@ -4,6 +4,48 @@

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

 - A [setup hook](#setup-hook-pkg-config) bundled with in the `pkg-config` package, to bring a derivation's declared build inputs into the environment.
 - The [`validatePkgConfig` setup hook](https://nixos.org/manual/nixpkgs/stable/#validatepkgconfig), for packages that provide pkg-config modules.
 - The `defaultPkgConfigPackages` package set: 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.
## Writing packages providing pkg-config modules

Packages should set `meta.pkgConfigProvides` 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](https://nixos.org/manual/nixpkgs/stable/#validatepkgconfig), 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](#setup-hook-pkg-config) 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](#ssec-stdenv-dependencies).

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.
+1 −0
Original line number Diff line number Diff line
@@ -123,4 +123,5 @@

  hasPkgConfigModule = callPackage ./hasPkgConfigModule/tester.nix { };

  testMetaPkgConfig = callPackage ./testMetaPkgConfig/tester.nix { };
}
+14 −0
Original line number Diff line number Diff line
{ lib, runCommand, testers }:

package:

runCommand "check-meta-pkg-config-modules-for-${package.name}" {
  meta = {
    description = "Test whether ${package.name} exposes all pkg-config modules ${toString package.meta.pkgConfigModules}";
  };
  dependsOn = map
    (moduleName: testers.hasPkgConfigModule { inherit package moduleName; })
    package.meta.pkgConfigModules;
} ''
  echo "found all of ${toString package.meta.pkgConfigModules}" > "$out"
''
+9 −3
Original line number Diff line number Diff line
@@ -8,6 +8,7 @@
# the `.pc` file lists only the main output's lib dir.
# If false, and if `{ static = true; }`, the .a stays in the main output.
, splitStaticOutput ? shared && static
, testers
}:

# Without either the build will actually still succeed because the build
@@ -21,11 +22,13 @@ assert shared || static;

assert splitStaticOutput -> static;

stdenv.mkDerivation rec {
stdenv.mkDerivation (finalAttrs: {
  pname = "zlib";
  version = "1.2.13";

  src = fetchurl {
  src = let
    inherit (finalAttrs) version;
  in fetchurl {
    urls = [
      # This URL works for 1.2.13 only; hopefully also for future releases.
      "https://github.com/madler/zlib/releases/download/v${version}/zlib-${version}.tar.gz"
@@ -125,10 +128,13 @@ stdenv.mkDerivation rec {
    "SHARED_MODE=1"
  ];

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

  meta = with lib; {
    homepage = "https://zlib.net";
    description = "Lossless data-compression library";
    license = licenses.zlib;
    platforms = platforms.all;
    pkgConfigModules = [ "zlib" ];
  };
}
})
+1 −0
Original line number Diff line number Diff line
@@ -271,6 +271,7 @@ let
    sourceProvenance = listOf lib.types.attrs;
    maintainers = listOf (attrsOf anything); # TODO use the maintainer type from lib/tests/maintainer-module.nix
    priority = int;
    pkgConfigModules = listOf str;
    platforms = listOf (either str (attrsOf anything));   # see lib.meta.platformMatch
    hydraPlatforms = listOf str;
    broken = bool;