summaryrefslogtreecommitdiff
path: root/lib.nix
blob: 7d0c0abde0c77ce2113356b95a9e2be204a4d453 (plain)
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
lib: {platforms ? null}: let
  defaultPlatforms = {
    x86_64-linux = {
      os = "ubuntu-latest";
      arch = "x64";
    };

    aarch64-linux = {
      os = "ubuntu-latest";
      arch = "aarch64";
    };

    x86_64-darwin = {
      os = "macos-latest";
      arch = "x64";
    };
  };

  platforms' =
    if platforms != null
    then platforms
    else defaultPlatforms;

  fallback = lib.warn "an output in the job matrix is not supported!" {
    os = null;
    arch = null;
  };

  platformNames = lib.attrNames platforms';

  findSystem = deriv: deriv.system or deriv.pkgs.system or deriv.activationPackage.system;
in {
  mkMatrix = {
    root,
    output,
    systems ? platformNames,
  }:
    lib.flatten (
      lib.mapAttrsToList (
        system:
          lib.mapAttrsToList (
            attr: _: {
              inherit (platforms'.${system} or fallback) arch os;
              attr = "${output}.${system}.${attr}";
            }
          )
      )
      (lib.filterAttrs (system: _: lib.elem system systems) root.${output})
    );

  mkMatrix' = {
    root,
    output,
    systems ? platformNames,
  }:
    lib.flatten (
      lib.mapAttrsToList (
        attr: deriv: let
          system = findSystem deriv;
        in {
          inherit (platforms'.${system} or fallback) arch os;
          attr = "${output}.${attr}";
        }
      )
      (
        lib.filterAttrs (
          _: deriv: builtins.elem (findSystem deriv) systems
        )
        root.${output}
      )
    );
}