snix_eval/
systems.rs

1/// true iff the argument is recognized by cppnix as the second
2/// coordinate of a "nix double"
3fn is_second_coordinate(x: &str) -> bool {
4    matches!(x, "linux" | "darwin" | "netbsd" | "openbsd" | "freebsd")
5}
6
7/// This function takes an llvm triple (which may have three or four
8/// components, separated by dashes) and returns the "best"
9/// approximation as a nix double, where "best" is currently defined
10/// as "however cppnix handles it".
11pub fn llvm_triple_to_nix_double(llvm_triple: &str) -> String {
12    let parts: Vec<&str> = llvm_triple.split('-').collect();
13    let cpu = match parts[0] {
14        "armv6" => "armv6l", // cppnix appends an "l" to armv6
15        "armv7" => "armv7l", // cppnix appends an "l" to armv7
16        x => match x.as_bytes() {
17            [b'i', _, b'8', b'6'] => "i686", // cppnix glob-matches against i*86
18            _ => x,
19        },
20    };
21    let os = match parts[1..] {
22        [_vendor, kernel, _environment] if is_second_coordinate(kernel) => kernel,
23        [_vendor, kernel] if is_second_coordinate(kernel) => kernel,
24        [kernel, _environment] if is_second_coordinate(kernel) => kernel,
25
26        // Rustc uses wasm32-unknown-unknown, which is rejected by
27        // config.sub, for wasm-in-the-browser environments.  Rustc
28        // should be using wasm32-unknown-none, which config.sub
29        // accepts.  Hopefully the rustc people will change their
30        // triple before stabilising this triple.  In the meantime,
31        // we fix it here in order to unbreak snixbolt.
32        //
33        // https://doc.rust-lang.org/beta/nightly-rustc/rustc_target/spec/wasm32_unknown_unknown/index.html
34        ["unknown", "unknown"] if cpu == "wasm32" => "none",
35
36        _ => panic!("unrecognized triple {llvm_triple}"),
37    };
38    format!("{cpu}-{os}")
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    #[test]
45    fn test_systems() {
46        assert_eq!(
47            llvm_triple_to_nix_double("aarch64-unknown-linux-gnu"),
48            "aarch64-linux"
49        );
50        assert_eq!(
51            llvm_triple_to_nix_double("i686-unknown-linux-gnu"),
52            "i686-linux"
53        );
54        assert_eq!(
55            llvm_triple_to_nix_double("x86_64-apple-darwin"),
56            "x86_64-darwin"
57        );
58        assert_eq!(
59            llvm_triple_to_nix_double("x86_64-unknown-linux-gnu"),
60            "x86_64-linux"
61        );
62        assert_eq!(
63            llvm_triple_to_nix_double("aarch64-apple-darwin"),
64            "aarch64-darwin"
65        );
66        assert_eq!(
67            llvm_triple_to_nix_double("aarch64-unknown-linux-musl"),
68            "aarch64-linux"
69        );
70        assert_eq!(
71            llvm_triple_to_nix_double("arm-unknown-linux-gnueabi"),
72            "arm-linux"
73        );
74        assert_eq!(
75            llvm_triple_to_nix_double("arm-unknown-linux-gnueabihf"),
76            "arm-linux"
77        );
78        assert_eq!(
79            llvm_triple_to_nix_double("armv7-unknown-linux-gnueabihf"),
80            "armv7l-linux"
81        );
82        assert_eq!(
83            llvm_triple_to_nix_double("mips-unknown-linux-gnu"),
84            "mips-linux"
85        );
86        assert_eq!(
87            llvm_triple_to_nix_double("mips64-unknown-linux-gnuabi64"),
88            "mips64-linux"
89        );
90        assert_eq!(
91            llvm_triple_to_nix_double("mips64-unknown-linux-gnuabin32"),
92            "mips64-linux"
93        );
94        assert_eq!(
95            llvm_triple_to_nix_double("mips64el-unknown-linux-gnuabi64"),
96            "mips64el-linux"
97        );
98        assert_eq!(
99            llvm_triple_to_nix_double("mips64el-unknown-linux-gnuabin32"),
100            "mips64el-linux"
101        );
102        assert_eq!(
103            llvm_triple_to_nix_double("mipsel-unknown-linux-gnu"),
104            "mipsel-linux"
105        );
106        assert_eq!(
107            llvm_triple_to_nix_double("powerpc-unknown-linux-gnu"),
108            "powerpc-linux"
109        );
110        assert_eq!(
111            llvm_triple_to_nix_double("powerpc64-unknown-linux-gnu"),
112            "powerpc64-linux"
113        );
114        assert_eq!(
115            llvm_triple_to_nix_double("powerpc64le-unknown-linux-gnu"),
116            "powerpc64le-linux"
117        );
118        assert_eq!(
119            llvm_triple_to_nix_double("s390x-unknown-linux-gnu"),
120            "s390x-linux"
121        );
122        assert_eq!(
123            llvm_triple_to_nix_double("x86_64-unknown-linux-musl"),
124            "x86_64-linux"
125        );
126        assert_eq!(
127            llvm_triple_to_nix_double("x86_64-unknown-netbsd"),
128            "x86_64-netbsd"
129        );
130        assert_eq!(
131            llvm_triple_to_nix_double("aarch64-linux-android"),
132            "aarch64-linux"
133        );
134        assert_eq!(
135            llvm_triple_to_nix_double("arm-linux-androideabi"),
136            "arm-linux"
137        );
138        assert_eq!(
139            llvm_triple_to_nix_double("arm-unknown-linux-musleabi"),
140            "arm-linux"
141        );
142        assert_eq!(
143            llvm_triple_to_nix_double("arm-unknown-linux-musleabihf"),
144            "arm-linux"
145        );
146        assert_eq!(
147            llvm_triple_to_nix_double("armv5te-unknown-linux-gnueabi"),
148            "armv5te-linux"
149        );
150        assert_eq!(
151            llvm_triple_to_nix_double("armv5te-unknown-linux-musleabi"),
152            "armv5te-linux"
153        );
154        assert_eq!(
155            llvm_triple_to_nix_double("armv7-linux-androideabi"),
156            "armv7l-linux"
157        );
158        assert_eq!(
159            llvm_triple_to_nix_double("armv7-unknown-linux-gnueabi"),
160            "armv7l-linux"
161        );
162        assert_eq!(
163            llvm_triple_to_nix_double("armv7-unknown-linux-musleabi"),
164            "armv7l-linux"
165        );
166        assert_eq!(
167            llvm_triple_to_nix_double("armv7-unknown-linux-musleabihf"),
168            "armv7l-linux"
169        );
170        assert_eq!(
171            llvm_triple_to_nix_double("i586-unknown-linux-gnu"),
172            "i686-linux"
173        );
174        assert_eq!(
175            llvm_triple_to_nix_double("i586-unknown-linux-musl"),
176            "i686-linux"
177        );
178        assert_eq!(
179            llvm_triple_to_nix_double("i686-linux-android"),
180            "i686-linux"
181        );
182        assert_eq!(
183            llvm_triple_to_nix_double("i686-unknown-linux-musl"),
184            "i686-linux"
185        );
186        assert_eq!(
187            llvm_triple_to_nix_double("mips-unknown-linux-musl"),
188            "mips-linux"
189        );
190        assert_eq!(
191            llvm_triple_to_nix_double("mips64-unknown-linux-muslabi64"),
192            "mips64-linux"
193        );
194        assert_eq!(
195            llvm_triple_to_nix_double("mips64el-unknown-linux-muslabi64"),
196            "mips64el-linux"
197        );
198        assert_eq!(
199            llvm_triple_to_nix_double("mipsel-unknown-linux-musl"),
200            "mipsel-linux"
201        );
202        assert_eq!(
203            llvm_triple_to_nix_double("sparc64-unknown-linux-gnu"),
204            "sparc64-linux"
205        );
206        assert_eq!(
207            llvm_triple_to_nix_double("thumbv7neon-linux-androideabi"),
208            "thumbv7neon-linux"
209        );
210        assert_eq!(
211            llvm_triple_to_nix_double("thumbv7neon-unknown-linux-gnueabihf"),
212            "thumbv7neon-linux"
213        );
214        assert_eq!(
215            llvm_triple_to_nix_double("x86_64-linux-android"),
216            "x86_64-linux"
217        );
218        assert_eq!(
219            llvm_triple_to_nix_double("x86_64-unknown-linux-gnux32"),
220            "x86_64-linux"
221        );
222        assert_eq!(
223            llvm_triple_to_nix_double("aarch64-unknown-linux-gnu_ilp32"),
224            "aarch64-linux"
225        );
226        assert_eq!(
227            llvm_triple_to_nix_double("aarch64-unknown-netbsd"),
228            "aarch64-netbsd"
229        );
230        assert_eq!(
231            llvm_triple_to_nix_double("aarch64_be-unknown-linux-gnu_ilp32"),
232            "aarch64_be-linux"
233        );
234        assert_eq!(
235            llvm_triple_to_nix_double("aarch64_be-unknown-linux-gnu"),
236            "aarch64_be-linux"
237        );
238        assert_eq!(
239            llvm_triple_to_nix_double("armeb-unknown-linux-gnueabi"),
240            "armeb-linux"
241        );
242        assert_eq!(
243            llvm_triple_to_nix_double("armv4t-unknown-linux-gnueabi"),
244            "armv4t-linux"
245        );
246        assert_eq!(
247            llvm_triple_to_nix_double("armv6-unknown-netbsd-eabihf"),
248            "armv6l-netbsd"
249        );
250        assert_eq!(
251            llvm_triple_to_nix_double("armv7-unknown-linux-uclibceabi"),
252            "armv7l-linux"
253        );
254        assert_eq!(
255            llvm_triple_to_nix_double("armv7-unknown-linux-uclibceabihf"),
256            "armv7l-linux"
257        );
258        assert_eq!(
259            llvm_triple_to_nix_double("armv7-unknown-netbsd-eabihf"),
260            "armv7l-netbsd"
261        );
262        assert_eq!(
263            llvm_triple_to_nix_double("hexagon-unknown-linux-musl"),
264            "hexagon-linux"
265        );
266        assert_eq!(
267            llvm_triple_to_nix_double("i686-unknown-netbsd"),
268            "i686-netbsd"
269        );
270        assert_eq!(
271            llvm_triple_to_nix_double("m68k-unknown-linux-gnu"),
272            "m68k-linux"
273        );
274        assert_eq!(
275            llvm_triple_to_nix_double("mips-unknown-linux-uclibc"),
276            "mips-linux"
277        );
278        assert_eq!(
279            llvm_triple_to_nix_double("mips64-openwrt-linux-musl"),
280            "mips64-linux"
281        );
282        assert_eq!(
283            llvm_triple_to_nix_double("mipsel-unknown-linux-uclibc"),
284            "mipsel-linux"
285        );
286        assert_eq!(
287            llvm_triple_to_nix_double("mipsisa32r6-unknown-linux-gnu"),
288            "mipsisa32r6-linux"
289        );
290        assert_eq!(
291            llvm_triple_to_nix_double("mipsisa32r6el-unknown-linux-gnu"),
292            "mipsisa32r6el-linux"
293        );
294        assert_eq!(
295            llvm_triple_to_nix_double("mipsisa64r6-unknown-linux-gnuabi64"),
296            "mipsisa64r6-linux"
297        );
298        assert_eq!(
299            llvm_triple_to_nix_double("mipsisa64r6el-unknown-linux-gnuabi64"),
300            "mipsisa64r6el-linux"
301        );
302        assert_eq!(
303            llvm_triple_to_nix_double("powerpc-unknown-linux-gnuspe"),
304            "powerpc-linux"
305        );
306        assert_eq!(
307            llvm_triple_to_nix_double("powerpc-unknown-linux-musl"),
308            "powerpc-linux"
309        );
310        assert_eq!(
311            llvm_triple_to_nix_double("powerpc-unknown-netbsd"),
312            "powerpc-netbsd"
313        );
314        assert_eq!(
315            llvm_triple_to_nix_double("powerpc64-unknown-linux-musl"),
316            "powerpc64-linux"
317        );
318        assert_eq!(
319            llvm_triple_to_nix_double("powerpc64le-unknown-linux-musl"),
320            "powerpc64le-linux"
321        );
322        assert_eq!(
323            llvm_triple_to_nix_double("riscv32gc-unknown-linux-gnu"),
324            "riscv32gc-linux"
325        );
326        assert_eq!(
327            llvm_triple_to_nix_double("riscv32gc-unknown-linux-musl"),
328            "riscv32gc-linux"
329        );
330        assert_eq!(
331            llvm_triple_to_nix_double("riscv64gc-unknown-linux-musl"),
332            "riscv64gc-linux"
333        );
334        assert_eq!(
335            llvm_triple_to_nix_double("s390x-unknown-linux-musl"),
336            "s390x-linux"
337        );
338        assert_eq!(
339            llvm_triple_to_nix_double("sparc-unknown-linux-gnu"),
340            "sparc-linux"
341        );
342        assert_eq!(
343            llvm_triple_to_nix_double("sparc64-unknown-netbsd"),
344            "sparc64-netbsd"
345        );
346        assert_eq!(
347            llvm_triple_to_nix_double("thumbv7neon-unknown-linux-musleabihf"),
348            "thumbv7neon-linux"
349        );
350    }
351}