1
- # Define the list of system with their properties.
2
- #
3
- # See https://clang.llvm.org/docs/CrossCompilation.html and
4
- # http://llvm.org/docs/doxygen/html/Triple_8cpp_source.html especially
5
- # Triple::normalize. Parsing should essentially act as a more conservative
6
- # version of that last function.
1
+ # Define the list of system with their properties. Only systems tested for
2
+ # Nixpkgs are listed below
7
3
8
4
with import ../lists.nix ;
9
5
with import ../types.nix ;
13
9
lib = import ../default.nix ;
14
10
setTypesAssert = type : pred :
15
11
mapAttrs ( name : value :
16
- assert pred value ;
12
+ # assert pred value;
17
13
setType type ( { inherit name ; } // value ) ) ;
18
14
setTypes = type : setTypesAssert type ( _ : true ) ;
19
15
27
23
littleEndian = { } ;
28
24
} ;
29
25
26
+
30
27
isCpuType = isType "cpu-type" ;
31
28
cpuTypes = with significantBytes ; setTypesAssert "cpu-type"
32
29
( x : elem x . bits [ 8 16 32 64 128 ]
50
47
vendors = setTypes "vendor" {
51
48
apple = { } ;
52
49
pc = { } ;
53
-
54
50
unknown = { } ;
55
51
} ;
56
52
@@ -60,42 +56,41 @@ rec {
60
56
elf = { } ;
61
57
macho = { } ;
62
58
pe = { } ;
63
-
64
59
unknown = { } ;
65
60
} ;
66
61
67
62
isKernelFamily = isType "kernel-family" ;
68
63
kernelFamilies = setTypes "kernel-family" {
69
64
bsd = { } ;
70
65
unix = { } ;
66
+ windows-nt = { } ;
67
+ dos = { } ;
71
68
} ;
72
69
73
70
isKernel = x : isType "kernel" x ;
74
71
kernels = with execFormats ; with kernelFamilies ; setTypesAssert "kernel"
75
72
( x : isExecFormat x . execFormat && all isKernelFamily ( attrValues x . families ) )
76
73
{
74
+ cygwin = { execFormat = pe ; families = { inherit /*unix*/ windows-nt ; } ; } ;
77
75
darwin = { execFormat = macho ; families = { inherit unix ; } ; } ;
78
76
freebsd = { execFormat = elf ; families = { inherit unix bsd ; } ; } ;
79
77
linux = { execFormat = elf ; families = { inherit unix ; } ; } ;
80
78
netbsd = { execFormat = elf ; families = { inherit unix bsd ; } ; } ;
81
79
none = { execFormat = unknown ; families = { inherit unix ; } ; } ;
82
80
openbsd = { execFormat = elf ; families = { inherit unix bsd ; } ; } ;
83
81
solaris = { execFormat = elf ; families = { inherit unix ; } ; } ;
84
- windows = { execFormat = pe ; families = { } ; } ;
85
- } // { # aliases
86
- win32 = kernels . windows ;
82
+ win32 = { execFormat = pe ; families = { inherit dos ; } ; } ;
87
83
} ;
88
84
85
+
89
86
isAbi = isType "abi" ;
90
87
abis = setTypes "abi" {
91
- cygnus = { } ;
92
88
gnu = { } ;
93
89
msvc = { } ;
94
90
eabi = { } ;
95
91
androideabi = { } ;
96
92
gnueabi = { } ;
97
93
gnueabihf = { } ;
98
-
99
94
unknown = { } ;
100
95
} ;
101
96
@@ -114,25 +109,19 @@ rec {
114
109
isDarwin = matchAttrs { kernel = kernels . darwin ; } ;
115
110
isLinux = matchAttrs { kernel = kernels . linux ; } ;
116
111
isUnix = matchAttrs { kernel = { families = { inherit ( kernelFamilies ) unix ; } ; } ; } ;
117
- isWindows = matchAttrs { kernel = kernels . windows ; } ;
118
- isCygwin = matchAttrs { kernel = kernels . windows ; abi = abis . cygnus ; } ;
119
- isMinGW = matchAttrs { kernel = kernels . windows ; abi = abis . gnu ; } ;
112
+ isWindows = s : matchAttrs { kernel = { families = { inherit ( kernelFamilies ) windows-nt ; } ; } ; } s
113
+ || matchAttrs { kernel = { families = { inherit ( kernelFamilies ) dos ; } ; } ; } s ;
120
114
121
115
122
116
mkSkeletonFromList = l : {
123
- "2" = # We only do 2-part hacks for things Nix already supports
124
- if elemAt l 1 == "cygwin"
125
- then { cpu = elemAt l 0 ; kernel = "windows" ; abi = "cygnus" ; }
126
- else { cpu = elemAt l 0 ; kernel = elemAt l 1 ; } ;
117
+ "2" = { cpu = elemAt l 0 ; kernel = elemAt l 1 ; } ;
118
+ "4" = { cpu = elemAt l 0 ; vendor = elemAt l 1 ; kernel = elemAt l 2 ; abi = elemAt l 3 ; } ;
127
119
"3" = # Awkwards hacks, beware!
128
120
if elemAt l 1 == "apple"
129
121
then { cpu = elemAt l 0 ; vendor = "apple" ; kernel = elemAt l 2 ; }
130
122
else if ( elemAt l 1 == "linux" ) || ( elemAt l 2 == "gnu" )
131
123
then { cpu = elemAt l 0 ; kernel = elemAt l 1 ; abi = elemAt l 2 ; }
132
- else if ( elemAt l 2 == "mingw32" ) # autotools breaks on -gnu for window
133
- then { cpu = elemAt l 0 ; vendor = elemAt l 1 ; kernel = "windows" ; abi = "gnu" ; }
134
124
else throw "Target specification with 3 components is ambiguous" ;
135
- "4" = { cpu = elemAt l 0 ; vendor = elemAt l 1 ; kernel = elemAt l 2 ; abi = elemAt l 3 ; } ;
136
125
} . ${ toString ( length l ) }
137
126
or ( throw "system string has invalid number of hyphen-separated components" ) ;
138
127
@@ -145,10 +134,18 @@ rec {
145
134
, # Also inferred below
146
135
abi ? assert false ; null
147
136
} @ args : let
148
- getCpu = name : cpuTypes . ${ name } or ( throw "Unknown CPU type: ${ name } " ) ;
149
- getVendor = name : vendors . ${ name } or ( throw "Unknown vendor: ${ name } " ) ;
150
- getKernel = name : kernels . ${ name } or ( throw "Unknown kernel: ${ name } " ) ;
151
- getAbi = name : abis . ${ name } or ( throw "Unknown ABI: ${ name } " ) ;
137
+ getCpu = name :
138
+ attrByPath [ name ] ( throw "Unknown CPU type: ${ name } " )
139
+ cpuTypes ;
140
+ getVendor = name :
141
+ attrByPath [ name ] ( throw "Unknown vendor: ${ name } " )
142
+ vendors ;
143
+ getKernel = name :
144
+ attrByPath [ name ] ( throw "Unknown kernel: ${ name } " )
145
+ kernels ;
146
+ getAbi = name :
147
+ attrByPath [ name ] ( throw "Unknown ABI: ${ name } " )
148
+ abis ;
152
149
153
150
system = rec {
154
151
cpu = getCpu args . cpu ;
@@ -169,10 +166,7 @@ rec {
169
166
170
167
mkSystemFromString = s : mkSystemFromSkeleton ( mkSkeletonFromList ( lib . splitString "-" s ) ) ;
171
168
172
- doubleFromSystem = { cpu , vendor , kernel , abi , ... } :
173
- if vendor == kernels . windows && abi == abis . cygnus
174
- then "${ cpu . name } -cygwin"
175
- else "${ cpu . name } -${ kernel . name } " ;
169
+ doubleFromSystem = { cpu , vendor , kernel , abi , ... } : "${ cpu . name } -${ kernel . name } " ;
176
170
177
171
tripleFromSystem = { cpu , vendor , kernel , abi , ... } @ sys : assert isSystem sys ; let
178
172
optAbi = lib . optionalString ( abi != abis . unknown ) "-${ abi . name } " ;
0 commit comments