aboutsummaryrefslogtreecommitdiffstats
path: root/tests/indent/nix/conds.nix
blob: 4307fc84e60ef7a9c11771293352d0fe0ba07bfe (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
{ lib }:
with lib.lists;
with lib.types;
with lib.attrsets;
with lib.strings; {
  doubleFromSystem = { cpu, kernel, abi, ... }:
    if abi == abis.cygnus then
      "${cpu.name}-cygwin"
    else if kernel.families ? darwin then
      "${cpu.name}-darwin"
    else
      "${cpu.name}-${kernelName kernel}";

  tripleFromSystem = { cpu, vendor, kernel, abi, ... }@sys:
    assert isSystem sys;
    let
      optExecFormat = lib.optionalString (kernel.name == "netbsd"
        && gnuNetBSDDefaultExecFormat cpu != kernel.execFormat)
        kernel.execFormat.name;
      optAbi = lib.optionalString (abi != abis.unknown) "-${abi.name}";
    in "${cpu.name}-${vendor.name}-${
      kernelName kernel
    }${optExecFormat}${optAbi}";

  mkSystemFromSkeleton = { cpu,
    # Optional, but fallback too complex for here.
    # Inferred below instead.
    vendor ? assert false; null, kernel,
    # Also inferred below
    abi ? assert false; null, }@args:
    let
      getCpu = name: cpuTypes.${name} or (throw "Unknown CPU type: ${name}");
      getVendor = name: vendors.${name} or (throw "Unknown vendor: ${name}");
      getKernel = name: kernels.${name} or (throw "Unknown kernel: ${name}");
      getAbi = name: abis.${name} or (throw "Unknown ABI: ${name}");

      parsed = {
        cpu = getCpu args.cpu;
        vendor = if args ? vendor then
          getVendor args.vendor
        else if isDarwin parsed then
          vendors.apple
        else if isWindows parsed then
          vendors.pc
        else
          vendors.unknown;
        kernel = if hasPrefix "darwin" args.kernel then
          getKernel "darwin"
        else if hasPrefix "netbsd" args.kernel then
          getKernel "netbsd"
        else
          getKernel args.kernel;
        abi = if args ? abi then
          getAbi args.abi
        else if isLinux parsed || isWindows parsed then
          if isAarch32 parsed then
            if lib.versionAtLeast (parsed.cpu.version or "0") "6" then
              abis.gnueabihf
            else
              abis.gnueabi
          else if isPower64 parsed && isBigEndian parsed then
            abis.gnuabielfv2
          else
            abis.gnu
        else
          abis.unknown;
      };
    in mkSystem parsed;

  mkSkeletonFromList = l:
    {
      "1" = if elemAt l 0 == "avr" then {
        cpu = elemAt l 0;
        kernel = "none";
        abi = "unknown";
      } else
        throw "Target specification with 1 components is ambiguous";
      "2" = # We only do 2-part hacks for things Nix already supports
        if elemAt l 1 == "cygwin" then {
          cpu = elemAt l 0;
          kernel = "windows";
          abi = "cygnus";
        } else if elemAt l 1 == "windows" then {
          cpu = elemAt l 0;
          kernel = "windows";
          abi = "msvc";
        } else if (elemAt l 1) == "elf" then {
          cpu = elemAt l 0;
          vendor = "unknown";
          kernel = "none";
          abi = elemAt l 1;
        } else {
          cpu = elemAt l 0;
          kernel = elemAt l 1;
        };
      "3" =
        # cpu-kernel-environment
        if elemAt l 1 == "linux"
        || elem (elemAt l 2) [ "eabi" "eabihf" "elf" "gnu" ] then {
          cpu = elemAt l 0;
          kernel = elemAt l 1;
          abi = elemAt l 2;
          vendor = "unknown";
        } else if elemAt l 1 == "apple"
        || elem (elemAt l 2) [ "wasi" "redox" "mmixware" "ghcjs" "mingw32" ]
        || hasPrefix "freebsd" (elemAt l 2) || hasPrefix "netbsd" (elemAt l 2)
        || hasPrefix "genode" (elemAt l 2) then {
          cpu = elemAt l 0;
          vendor = elemAt l 1;
          kernel = if elemAt l 2 == "mingw32" then
            "windows" # autotools breaks on -gnu for window
          else
            elemAt l 2;
        } else
          throw "Target specification with 3 components is ambiguous";
      "4" = {
        cpu = elemAt l 0;
        vendor = elemAt l 1;
        kernel = elemAt l 2;
        abi = elemAt l 3;
      };
    }.${toString (length l)} or (throw
      "system string has invalid number of hyphen-separated components");

  # GNU build systems assume that older NetBSD architectures are using a.out.
  gnuNetBSDDefaultExecFormat = cpu:
    if (cpu.family == "arm" && cpu.bits == 32)
    || (cpu.family == "sparc" && cpu.bits == 32)
    || (cpu.family == "m68k" && cpu.bits == 32)
    || (cpu.family == "x86" && cpu.bits == 32) then
      execFormats.aout
    else
      execFormats.elf;
}