about summary refs log tree commit diff
path: root/pkgs/test/pkg-config-packages.nix
blob: 8cb6cc57753f2ac99c2b13154e0fa8b509d559a0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{ lib, pkg-config, defaultPkgConfigPackages, runCommand }:
let
  inherit (lib.strings) escapeNixIdentifier;

  allTests = lib.mapAttrs (k: v: if v == null then null else makePkgConfigTestMaybe k v) defaultPkgConfigPackages;

  # nix-build rejects attribute names with periods
  # This will build those regardless.
  tests-combined = runCommand "pkg-config-checks" {
    allTests = lib.attrValues allTests;
  } ''
    touch $out
  '';

  makePkgConfigTestMaybe = moduleName: pkg:
    if ! lib.isDerivation pkg
    then
      throw "pkg-config module `${escapeNixIdentifier moduleName}` is not defined to be a derivation. Please check the attribute value for `${escapeNixIdentifier moduleName}` in `pkgs/top-level/pkg-config-packages.nix` in Nixpkgs."

    else if ! pkg?meta.unsupported
    then
      throw "pkg-config module `${escapeNixIdentifier moduleName}` does not have a `meta.unsupported` attribute. This can't be right. Please check the attribute value for `${escapeNixIdentifier moduleName}` in `pkgs/top-level/pkg-config-packages.nix` in Nixpkgs."

    else if pkg.meta.unsupported
    then
      # We return `null` instead of doing a `filterAttrs`, because with
      # `filterAttrs` the evaluator would not be able to return the attribute
      # set without first evaluating all of the attribute _values_. This would
      # be rather expensive, and severly slow down the use case of getting a
      # single test, which we want to do in `passthru.tests`, or interactively.
      null

    else if ! pkg?meta.broken
    then
      throw "pkg-config module `${escapeNixIdentifier moduleName}` does not have a `meta.broken` attribute. This can't be right. Please check the attribute value for `${escapeNixIdentifier moduleName}` in `pkgs/top-level/pkg-config.packages.nix` in Nixpkgs."

    else if pkg.meta.broken
    then null

    else makePkgConfigTest moduleName pkg;

  makePkgConfigTest = moduleName: pkg: runCommand "check-pkg-config-${moduleName}" {
    nativeBuildInputs = [ pkg-config ];
    buildInputs = [ pkg ];
    inherit moduleName;
    meta = {
      description = "Test whether ${pkg.name} exposes pkg-config module ${moduleName}";
    }
    # Make sure licensing info etc is preserved, as this is a concern for e.g. cache.nixos.org,
    # as hydra can't check this meta info in dependencies.
    # The test itself is just Nixpkgs, with MIT license.
    // builtins.intersectAttrs
        {
          available = throw "unused";
          broken = throw "unused";
          insecure = throw "unused";
          license = throw "unused";
          maintainers = throw "unused";
          platforms = throw "unused";
          unfree = throw "unused";
          unsupported = throw "unused";
        }
        pkg.meta;
  } ''
    echo "checking pkg-config module $moduleName in $buildInputs"
    set +e
    version="$(pkg-config --modversion $moduleName)"
    r=$?
    set -e
    if [[ $r = 0 ]]; then
      echo "✅ pkg-config module $moduleName exists and has version $version"
      echo "$version" > $out
    else
      echo "These modules were available in the input propagation closure:"
      pkg-config --list-all
      echo "❌ pkg-config module $moduleName was not found"
      false
    fi
  '';
in
  allTests // { inherit tests-combined; }