Skip to main content

uv_configuration/
target_triple.rs

1use tracing::debug;
2
3use uv_pep508::MarkerEnvironment;
4use uv_platform_tags::{Arch, Os, Platform};
5use uv_static::EnvVars;
6
7/// The supported target triples. Each triple consists of an architecture, vendor, and operating
8/// system.
9///
10/// See: <https://doc.rust-lang.org/nightly/rustc/platform-support.html>
11#[derive(Debug, Clone, Copy, Eq, PartialEq, serde::Deserialize)]
12#[serde(deny_unknown_fields, rename_all = "kebab-case")]
13#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
14#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
15pub enum TargetTriple {
16    /// An alias for `x86_64-pc-windows-msvc`, the default target for Windows.
17    Windows,
18
19    /// An alias for `x86_64-unknown-linux-gnu`, the default target for Linux.
20    Linux,
21
22    /// An alias for `aarch64-apple-darwin`, the default target for macOS.
23    Macos,
24
25    /// A 64-bit x86 Windows target.
26    #[cfg_attr(feature = "clap", value(name = "x86_64-pc-windows-msvc"))]
27    #[serde(rename = "x86_64-pc-windows-msvc")]
28    #[serde(alias = "x8664-pc-windows-msvc")]
29    X8664PcWindowsMsvc,
30
31    /// An ARM64 Windows target.
32    #[cfg_attr(feature = "clap", value(name = "aarch64-pc-windows-msvc"))]
33    #[serde(rename = "aarch64-pc-windows-msvc")]
34    #[serde(alias = "arm64-pc-windows-msvc")]
35    Aarch64PcWindowsMsvc,
36
37    /// A 32-bit x86 Windows target.
38    #[cfg_attr(feature = "clap", value(name = "i686-pc-windows-msvc"))]
39    #[serde(rename = "i686-pc-windows-msvc")]
40    I686PcWindowsMsvc,
41
42    /// An x86 Linux target. Equivalent to `x86_64-manylinux_2_28`.
43    #[cfg_attr(feature = "clap", value(name = "x86_64-unknown-linux-gnu"))]
44    #[serde(rename = "x86_64-unknown-linux-gnu")]
45    #[serde(alias = "x8664-unknown-linux-gnu")]
46    X8664UnknownLinuxGnu,
47
48    /// An ARM-based macOS target, as seen on Apple Silicon devices
49    ///
50    /// By default, assumes the least-recent, non-EOL macOS version (13.0), but respects
51    /// the `MACOSX_DEPLOYMENT_TARGET` environment variable if set.
52    #[cfg_attr(feature = "clap", value(name = "aarch64-apple-darwin"))]
53    #[serde(rename = "aarch64-apple-darwin")]
54    Aarch64AppleDarwin,
55
56    /// An x86 macOS target.
57    ///
58    /// By default, assumes the least-recent, non-EOL macOS version (13.0), but respects
59    /// the `MACOSX_DEPLOYMENT_TARGET` environment variable if set.
60    #[cfg_attr(feature = "clap", value(name = "x86_64-apple-darwin"))]
61    #[serde(rename = "x86_64-apple-darwin")]
62    #[serde(alias = "x8664-apple-darwin")]
63    X8664AppleDarwin,
64
65    /// An ARM64 Linux target. Equivalent to `aarch64-manylinux_2_28`.
66    #[cfg_attr(feature = "clap", value(name = "aarch64-unknown-linux-gnu"))]
67    #[serde(rename = "aarch64-unknown-linux-gnu")]
68    Aarch64UnknownLinuxGnu,
69
70    /// An ARM64 Linux target.
71    #[cfg_attr(feature = "clap", value(name = "aarch64-unknown-linux-musl"))]
72    #[serde(rename = "aarch64-unknown-linux-musl")]
73    Aarch64UnknownLinuxMusl,
74
75    /// An `x86_64` Linux target.
76    #[cfg_attr(feature = "clap", value(name = "x86_64-unknown-linux-musl"))]
77    #[serde(rename = "x86_64-unknown-linux-musl")]
78    #[serde(alias = "x8664-unknown-linux-musl")]
79    X8664UnknownLinuxMusl,
80
81    /// A RISCV64 Linux target.
82    #[cfg_attr(feature = "clap", value(name = "riscv64-unknown-linux"))]
83    #[serde(rename = "riscv64-unknown-linux")]
84    Riscv64UnknownLinuxGnu,
85
86    /// An `x86_64` target for the `manylinux2014` platform. Equivalent to `x86_64-manylinux_2_17`.
87    #[cfg_attr(
88        feature = "clap",
89        value(name = "x86_64-manylinux2014", alias = "manylinux2014_x86_64")
90    )]
91    #[serde(rename = "x86_64-manylinux2014")]
92    #[serde(alias = "x8664-manylinux2014")]
93    #[serde(alias = "manylinux2014_x86_64")]
94    X8664Manylinux2014,
95
96    /// An `x86_64` target for the `manylinux_2_17` platform.
97    #[cfg_attr(
98        feature = "clap",
99        value(name = "x86_64-manylinux_2_17", alias = "manylinux_2_17_x86_64")
100    )]
101    #[serde(rename = "x86_64-manylinux_2_17")]
102    #[serde(alias = "x8664-manylinux217")]
103    #[serde(alias = "manylinux_2_17_x86_64")]
104    X8664Manylinux217,
105
106    /// An `x86_64` target for the `manylinux_2_28` platform.
107    #[cfg_attr(
108        feature = "clap",
109        value(name = "x86_64-manylinux_2_28", alias = "manylinux_2_28_x86_64")
110    )]
111    #[serde(rename = "x86_64-manylinux_2_28")]
112    #[serde(alias = "x8664-manylinux228")]
113    #[serde(alias = "manylinux_2_28_x86_64")]
114    X8664Manylinux228,
115
116    /// An `x86_64` target for the `manylinux_2_31` platform.
117    #[cfg_attr(
118        feature = "clap",
119        value(name = "x86_64-manylinux_2_31", alias = "manylinux_2_31_x86_64")
120    )]
121    #[serde(rename = "x86_64-manylinux_2_31")]
122    #[serde(alias = "x8664-manylinux231")]
123    #[serde(alias = "manylinux_2_31_x86_64")]
124    X8664Manylinux231,
125
126    /// An `x86_64` target for the `manylinux_2_32` platform.
127    #[cfg_attr(
128        feature = "clap",
129        value(name = "x86_64-manylinux_2_32", alias = "manylinux_2_32_x86_64")
130    )]
131    #[serde(rename = "x86_64-manylinux_2_32")]
132    #[serde(alias = "x8664-manylinux232")]
133    #[serde(alias = "manylinux_2_32_x86_64")]
134    X8664Manylinux232,
135
136    /// An `x86_64` target for the `manylinux_2_33` platform.
137    #[cfg_attr(
138        feature = "clap",
139        value(name = "x86_64-manylinux_2_33", alias = "manylinux_2_33_x86_64")
140    )]
141    #[serde(rename = "x86_64-manylinux_2_33")]
142    #[serde(alias = "x8664-manylinux233")]
143    #[serde(alias = "manylinux_2_33_x86_64")]
144    X8664Manylinux233,
145
146    /// An `x86_64` target for the `manylinux_2_34` platform.
147    #[cfg_attr(
148        feature = "clap",
149        value(name = "x86_64-manylinux_2_34", alias = "manylinux_2_34_x86_64")
150    )]
151    #[serde(rename = "x86_64-manylinux_2_34")]
152    #[serde(alias = "x8664-manylinux234")]
153    #[serde(alias = "manylinux_2_34_x86_64")]
154    X8664Manylinux234,
155
156    /// An `x86_64` target for the `manylinux_2_35` platform.
157    #[cfg_attr(
158        feature = "clap",
159        value(name = "x86_64-manylinux_2_35", alias = "manylinux_2_35_x86_64")
160    )]
161    #[serde(rename = "x86_64-manylinux_2_35")]
162    #[serde(alias = "x8664-manylinux235")]
163    #[serde(alias = "manylinux_2_35_x86_64")]
164    X8664Manylinux235,
165
166    /// An `x86_64` target for the `manylinux_2_36` platform.
167    #[cfg_attr(
168        feature = "clap",
169        value(name = "x86_64-manylinux_2_36", alias = "manylinux_2_36_x86_64")
170    )]
171    #[serde(rename = "x86_64-manylinux_2_36")]
172    #[serde(alias = "x8664-manylinux236")]
173    #[serde(alias = "manylinux_2_36_x86_64")]
174    X8664Manylinux236,
175
176    /// An `x86_64` target for the `manylinux_2_37` platform.
177    #[cfg_attr(
178        feature = "clap",
179        value(name = "x86_64-manylinux_2_37", alias = "manylinux_2_37_x86_64")
180    )]
181    #[serde(rename = "x86_64-manylinux_2_37")]
182    #[serde(alias = "x8664-manylinux237")]
183    #[serde(alias = "manylinux_2_37_x86_64")]
184    X8664Manylinux237,
185
186    /// An `x86_64` target for the `manylinux_2_38` platform.
187    #[cfg_attr(
188        feature = "clap",
189        value(name = "x86_64-manylinux_2_38", alias = "manylinux_2_38_x86_64")
190    )]
191    #[serde(rename = "x86_64-manylinux_2_38")]
192    #[serde(alias = "x8664-manylinux238")]
193    #[serde(alias = "manylinux_2_38_x86_64")]
194    X8664Manylinux238,
195
196    /// An `x86_64` target for the `manylinux_2_39` platform.
197    #[cfg_attr(
198        feature = "clap",
199        value(name = "x86_64-manylinux_2_39", alias = "manylinux_2_39_x86_64")
200    )]
201    #[serde(rename = "x86_64-manylinux_2_39")]
202    #[serde(alias = "x8664-manylinux239")]
203    #[serde(alias = "manylinux_2_39_x86_64")]
204    X8664Manylinux239,
205
206    /// An `x86_64` target for the `manylinux_2_40` platform.
207    #[cfg_attr(
208        feature = "clap",
209        value(name = "x86_64-manylinux_2_40", alias = "manylinux_2_40_x86_64")
210    )]
211    #[serde(rename = "x86_64-manylinux_2_40")]
212    #[serde(alias = "x8664-manylinux240")]
213    #[serde(alias = "manylinux_2_40_x86_64")]
214    X8664Manylinux240,
215
216    /// An ARM64 target for the `manylinux2014` platform. Equivalent to `aarch64-manylinux_2_17`.
217    #[cfg_attr(
218        feature = "clap",
219        value(name = "aarch64-manylinux2014", alias = "manylinux2014_aarch64")
220    )]
221    #[serde(rename = "aarch64-manylinux2014")]
222    #[serde(alias = "manylinux2014_aarch64")]
223    Aarch64Manylinux2014,
224
225    /// An ARM64 target for the `manylinux_2_17` platform.
226    #[cfg_attr(
227        feature = "clap",
228        value(name = "aarch64-manylinux_2_17", alias = "manylinux_2_17_aarch64")
229    )]
230    #[serde(rename = "aarch64-manylinux_2_17")]
231    #[serde(alias = "aarch64-manylinux217")]
232    #[serde(alias = "manylinux_2_17_aarch64")]
233    Aarch64Manylinux217,
234
235    /// An ARM64 target for the `manylinux_2_28` platform.
236    #[cfg_attr(
237        feature = "clap",
238        value(name = "aarch64-manylinux_2_28", alias = "manylinux_2_28_aarch64")
239    )]
240    #[serde(rename = "aarch64-manylinux_2_28")]
241    #[serde(alias = "aarch64-manylinux228")]
242    #[serde(alias = "manylinux_2_28_aarch64")]
243    Aarch64Manylinux228,
244
245    /// An ARM64 target for the `manylinux_2_31` platform.
246    #[cfg_attr(
247        feature = "clap",
248        value(name = "aarch64-manylinux_2_31", alias = "manylinux_2_31_aarch64")
249    )]
250    #[serde(rename = "aarch64-manylinux_2_31")]
251    #[serde(alias = "aarch64-manylinux231")]
252    #[serde(alias = "manylinux_2_31_aarch64")]
253    Aarch64Manylinux231,
254
255    /// An ARM64 target for the `manylinux_2_32` platform.
256    #[cfg_attr(
257        feature = "clap",
258        value(name = "aarch64-manylinux_2_32", alias = "manylinux_2_32_aarch64")
259    )]
260    #[serde(rename = "aarch64-manylinux_2_32")]
261    #[serde(alias = "aarch64-manylinux232")]
262    #[serde(alias = "manylinux_2_32_aarch64")]
263    Aarch64Manylinux232,
264
265    /// An ARM64 target for the `manylinux_2_33` platform.
266    #[cfg_attr(
267        feature = "clap",
268        value(name = "aarch64-manylinux_2_33", alias = "manylinux_2_33_aarch64")
269    )]
270    #[serde(rename = "aarch64-manylinux_2_33")]
271    #[serde(alias = "aarch64-manylinux233")]
272    #[serde(alias = "manylinux_2_33_aarch64")]
273    Aarch64Manylinux233,
274
275    /// An ARM64 target for the `manylinux_2_34` platform.
276    #[cfg_attr(
277        feature = "clap",
278        value(name = "aarch64-manylinux_2_34", alias = "manylinux_2_34_aarch64")
279    )]
280    #[serde(rename = "aarch64-manylinux_2_34")]
281    #[serde(alias = "aarch64-manylinux234")]
282    #[serde(alias = "manylinux_2_34_aarch64")]
283    Aarch64Manylinux234,
284
285    /// An ARM64 target for the `manylinux_2_35` platform.
286    #[cfg_attr(
287        feature = "clap",
288        value(name = "aarch64-manylinux_2_35", alias = "manylinux_2_35_aarch64")
289    )]
290    #[serde(rename = "aarch64-manylinux_2_35")]
291    #[serde(alias = "aarch64-manylinux235")]
292    #[serde(alias = "manylinux_2_35_aarch64")]
293    Aarch64Manylinux235,
294
295    /// An ARM64 target for the `manylinux_2_36` platform.
296    #[cfg_attr(
297        feature = "clap",
298        value(name = "aarch64-manylinux_2_36", alias = "manylinux_2_36_aarch64")
299    )]
300    #[serde(rename = "aarch64-manylinux_2_36")]
301    #[serde(alias = "aarch64-manylinux236")]
302    #[serde(alias = "manylinux_2_36_aarch64")]
303    Aarch64Manylinux236,
304
305    /// An ARM64 target for the `manylinux_2_37` platform.
306    #[cfg_attr(
307        feature = "clap",
308        value(name = "aarch64-manylinux_2_37", alias = "manylinux_2_37_aarch64")
309    )]
310    #[serde(rename = "aarch64-manylinux_2_37")]
311    #[serde(alias = "aarch64-manylinux237")]
312    #[serde(alias = "manylinux_2_37_aarch64")]
313    Aarch64Manylinux237,
314
315    /// An ARM64 target for the `manylinux_2_38` platform.
316    #[cfg_attr(
317        feature = "clap",
318        value(name = "aarch64-manylinux_2_38", alias = "manylinux_2_38_aarch64")
319    )]
320    #[serde(rename = "aarch64-manylinux_2_38")]
321    #[serde(alias = "aarch64-manylinux238")]
322    #[serde(alias = "manylinux_2_38_aarch64")]
323    Aarch64Manylinux238,
324
325    /// An ARM64 target for the `manylinux_2_39` platform.
326    #[cfg_attr(
327        feature = "clap",
328        value(name = "aarch64-manylinux_2_39", alias = "manylinux_2_39_aarch64")
329    )]
330    #[serde(rename = "aarch64-manylinux_2_39")]
331    #[serde(alias = "aarch64-manylinux239")]
332    #[serde(alias = "manylinux_2_39_aarch64")]
333    Aarch64Manylinux239,
334
335    /// An ARM64 target for the `manylinux_2_40` platform.
336    #[cfg_attr(
337        feature = "clap",
338        value(name = "aarch64-manylinux_2_40", alias = "manylinux_2_40_aarch64")
339    )]
340    #[serde(rename = "aarch64-manylinux_2_40")]
341    #[serde(alias = "aarch64-manylinux240")]
342    #[serde(alias = "manylinux_2_40_aarch64")]
343    Aarch64Manylinux240,
344
345    /// An ARM64 Android target.
346    ///
347    /// By default uses Android API level 24, but respects
348    /// the `ANDROID_API_LEVEL` environment variable if set.
349    #[cfg_attr(feature = "clap", value(name = "aarch64-linux-android"))]
350    #[serde(rename = "aarch64-linux-android")]
351    Aarch64LinuxAndroid,
352
353    /// An `x86_64` Android target.
354    ///
355    /// By default uses Android API level 24, but respects
356    /// the `ANDROID_API_LEVEL` environment variable if set.
357    #[cfg_attr(feature = "clap", value(name = "x86_64-linux-android"))]
358    #[serde(rename = "x86_64-linux-android")]
359    X8664LinuxAndroid,
360
361    /// A wasm32 target using the Pyodide 2024 platform. Meant for use with Python 3.12.
362    #[cfg_attr(feature = "clap", value(name = "wasm32-pyodide2024"))]
363    Wasm32Pyodide2024,
364
365    /// An ARM64 target for iOS device
366    ///
367    /// By default, iOS 13.0 is used, but respects the `IPHONEOS_DEPLOYMENT_TARGET`
368    /// environment variable if set.
369    #[cfg_attr(feature = "clap", value(name = "arm64-apple-ios"))]
370    #[serde(rename = "arm64-apple-ios")]
371    Arm64Ios,
372
373    /// An ARM64 target for iOS simulator
374    ///
375    /// By default, iOS 13.0 is used, but respects the `IPHONEOS_DEPLOYMENT_TARGET`
376    /// environment variable if set.
377    #[cfg_attr(feature = "clap", value(name = "arm64-apple-ios-simulator"))]
378    #[serde(rename = "arm64-apple-ios-simulator")]
379    Arm64IosSimulator,
380
381    /// An `x86_64` target for iOS simulator
382    ///
383    /// By default, iOS 13.0 is used, but respects the `IPHONEOS_DEPLOYMENT_TARGET`
384    /// environment variable if set.
385    #[cfg_attr(feature = "clap", value(name = "x86_64-apple-ios-simulator"))]
386    #[serde(rename = "x86_64-apple-ios-simulator")]
387    X8664IosSimulator,
388}
389
390impl TargetTriple {
391    /// Return the [`Platform`] for the target.
392    pub fn platform(self) -> Platform {
393        match self {
394            Self::Windows | Self::X8664PcWindowsMsvc => Platform::new(Os::Windows, Arch::X86_64),
395            Self::Aarch64PcWindowsMsvc => Platform::new(Os::Windows, Arch::Aarch64),
396            Self::Linux | Self::X8664UnknownLinuxGnu => Platform::new(
397                Os::Manylinux {
398                    major: 2,
399                    minor: 28,
400                },
401                Arch::X86_64,
402            ),
403            Self::Macos | Self::Aarch64AppleDarwin => {
404                let (major, minor) = macos_deployment_target().map_or((13, 0), |(major, minor)| {
405                    debug!("Found macOS deployment target: {}.{}", major, minor);
406                    (major, minor)
407                });
408                Platform::new(Os::Macos { major, minor }, Arch::Aarch64)
409            }
410            Self::I686PcWindowsMsvc => Platform::new(Os::Windows, Arch::X86),
411            Self::X8664AppleDarwin => {
412                let (major, minor) = macos_deployment_target().map_or((13, 0), |(major, minor)| {
413                    debug!("Found macOS deployment target: {}.{}", major, minor);
414                    (major, minor)
415                });
416                Platform::new(Os::Macos { major, minor }, Arch::X86_64)
417            }
418            Self::Aarch64UnknownLinuxGnu => Platform::new(
419                Os::Manylinux {
420                    major: 2,
421                    minor: 28,
422                },
423                Arch::Aarch64,
424            ),
425            Self::Riscv64UnknownLinuxGnu => Platform::new(
426                Os::Manylinux {
427                    major: 2,
428                    minor: 39,
429                },
430                Arch::Riscv64,
431            ),
432            Self::Aarch64UnknownLinuxMusl => {
433                Platform::new(Os::Musllinux { major: 1, minor: 2 }, Arch::Aarch64)
434            }
435            Self::X8664UnknownLinuxMusl => {
436                Platform::new(Os::Musllinux { major: 1, minor: 2 }, Arch::X86_64)
437            }
438            Self::X8664Manylinux2014 => Platform::new(
439                Os::Manylinux {
440                    major: 2,
441                    minor: 17,
442                },
443                Arch::X86_64,
444            ),
445            Self::X8664Manylinux217 => Platform::new(
446                Os::Manylinux {
447                    major: 2,
448                    minor: 17,
449                },
450                Arch::X86_64,
451            ),
452            Self::X8664Manylinux228 => Platform::new(
453                Os::Manylinux {
454                    major: 2,
455                    minor: 28,
456                },
457                Arch::X86_64,
458            ),
459            Self::X8664Manylinux231 => Platform::new(
460                Os::Manylinux {
461                    major: 2,
462                    minor: 31,
463                },
464                Arch::X86_64,
465            ),
466            Self::X8664Manylinux232 => Platform::new(
467                Os::Manylinux {
468                    major: 2,
469                    minor: 32,
470                },
471                Arch::X86_64,
472            ),
473            Self::X8664Manylinux233 => Platform::new(
474                Os::Manylinux {
475                    major: 2,
476                    minor: 33,
477                },
478                Arch::X86_64,
479            ),
480            Self::X8664Manylinux234 => Platform::new(
481                Os::Manylinux {
482                    major: 2,
483                    minor: 34,
484                },
485                Arch::X86_64,
486            ),
487            Self::X8664Manylinux235 => Platform::new(
488                Os::Manylinux {
489                    major: 2,
490                    minor: 35,
491                },
492                Arch::X86_64,
493            ),
494            Self::X8664Manylinux236 => Platform::new(
495                Os::Manylinux {
496                    major: 2,
497                    minor: 36,
498                },
499                Arch::X86_64,
500            ),
501            Self::X8664Manylinux237 => Platform::new(
502                Os::Manylinux {
503                    major: 2,
504                    minor: 37,
505                },
506                Arch::X86_64,
507            ),
508            Self::X8664Manylinux238 => Platform::new(
509                Os::Manylinux {
510                    major: 2,
511                    minor: 38,
512                },
513                Arch::X86_64,
514            ),
515            Self::X8664Manylinux239 => Platform::new(
516                Os::Manylinux {
517                    major: 2,
518                    minor: 39,
519                },
520                Arch::X86_64,
521            ),
522            Self::X8664Manylinux240 => Platform::new(
523                Os::Manylinux {
524                    major: 2,
525                    minor: 40,
526                },
527                Arch::X86_64,
528            ),
529            Self::Aarch64Manylinux2014 => Platform::new(
530                Os::Manylinux {
531                    major: 2,
532                    minor: 17,
533                },
534                Arch::Aarch64,
535            ),
536            Self::Aarch64Manylinux217 => Platform::new(
537                Os::Manylinux {
538                    major: 2,
539                    minor: 17,
540                },
541                Arch::Aarch64,
542            ),
543            Self::Aarch64Manylinux228 => Platform::new(
544                Os::Manylinux {
545                    major: 2,
546                    minor: 28,
547                },
548                Arch::Aarch64,
549            ),
550            Self::Aarch64Manylinux231 => Platform::new(
551                Os::Manylinux {
552                    major: 2,
553                    minor: 31,
554                },
555                Arch::Aarch64,
556            ),
557            Self::Aarch64Manylinux232 => Platform::new(
558                Os::Manylinux {
559                    major: 2,
560                    minor: 32,
561                },
562                Arch::Aarch64,
563            ),
564            Self::Aarch64Manylinux233 => Platform::new(
565                Os::Manylinux {
566                    major: 2,
567                    minor: 33,
568                },
569                Arch::Aarch64,
570            ),
571            Self::Aarch64Manylinux234 => Platform::new(
572                Os::Manylinux {
573                    major: 2,
574                    minor: 34,
575                },
576                Arch::Aarch64,
577            ),
578            Self::Aarch64Manylinux235 => Platform::new(
579                Os::Manylinux {
580                    major: 2,
581                    minor: 35,
582                },
583                Arch::Aarch64,
584            ),
585            Self::Aarch64Manylinux236 => Platform::new(
586                Os::Manylinux {
587                    major: 2,
588                    minor: 36,
589                },
590                Arch::Aarch64,
591            ),
592            Self::Aarch64Manylinux237 => Platform::new(
593                Os::Manylinux {
594                    major: 2,
595                    minor: 37,
596                },
597                Arch::Aarch64,
598            ),
599            Self::Aarch64Manylinux238 => Platform::new(
600                Os::Manylinux {
601                    major: 2,
602                    minor: 38,
603                },
604                Arch::Aarch64,
605            ),
606            Self::Aarch64Manylinux239 => Platform::new(
607                Os::Manylinux {
608                    major: 2,
609                    minor: 39,
610                },
611                Arch::Aarch64,
612            ),
613            Self::Aarch64Manylinux240 => Platform::new(
614                Os::Manylinux {
615                    major: 2,
616                    minor: 40,
617                },
618                Arch::Aarch64,
619            ),
620            Self::Wasm32Pyodide2024 => Platform::new(
621                Os::Pyodide {
622                    major: 2024,
623                    minor: 0,
624                },
625                Arch::Wasm32,
626            ),
627            Self::Aarch64LinuxAndroid => {
628                let api_level = android_api_level().map_or(24, |api_level| {
629                    debug!("Found Android API level: {}", api_level);
630                    api_level
631                });
632                Platform::new(Os::Android { api_level }, Arch::Aarch64)
633            }
634            Self::X8664LinuxAndroid => {
635                let api_level = android_api_level().map_or(24, |api_level| {
636                    debug!("Found Android API level: {}", api_level);
637                    api_level
638                });
639                Platform::new(Os::Android { api_level }, Arch::X86_64)
640            }
641            Self::Arm64Ios => {
642                let (major, minor) = ios_deployment_target().map_or((13, 0), |(major, minor)| {
643                    debug!("Found iOS deployment target: {}.{}", major, minor);
644                    (major, minor)
645                });
646                Platform::new(
647                    Os::Ios {
648                        major,
649                        minor,
650                        simulator: false,
651                    },
652                    Arch::Aarch64,
653                )
654            }
655            Self::Arm64IosSimulator => {
656                let (major, minor) = ios_deployment_target().map_or((13, 0), |(major, minor)| {
657                    debug!("Found iOS deployment target: {}.{}", major, minor);
658                    (major, minor)
659                });
660                Platform::new(
661                    Os::Ios {
662                        major,
663                        minor,
664                        simulator: true,
665                    },
666                    Arch::Aarch64,
667                )
668            }
669            Self::X8664IosSimulator => {
670                let (major, minor) = ios_deployment_target().map_or((13, 0), |(major, minor)| {
671                    debug!("Found iOS deployment target: {}.{}", major, minor);
672                    (major, minor)
673                });
674                Platform::new(
675                    Os::Ios {
676                        major,
677                        minor,
678                        simulator: true,
679                    },
680                    Arch::X86_64,
681                )
682            }
683        }
684    }
685
686    /// Return the `platform_machine` value for the target.
687    pub fn platform_machine(self) -> &'static str {
688        match self {
689            Self::Windows | Self::X8664PcWindowsMsvc => "x86_64",
690            Self::Aarch64PcWindowsMsvc => "ARM64",
691            Self::Linux | Self::X8664UnknownLinuxGnu => "x86_64",
692            Self::Macos | Self::Aarch64AppleDarwin => "arm64",
693            Self::I686PcWindowsMsvc => "x86",
694            Self::X8664AppleDarwin => "x86_64",
695            Self::Aarch64UnknownLinuxGnu => "aarch64",
696            Self::Aarch64UnknownLinuxMusl => "aarch64",
697            Self::X8664UnknownLinuxMusl => "x86_64",
698            Self::Riscv64UnknownLinuxGnu => "riscv64",
699            Self::X8664Manylinux2014 => "x86_64",
700            Self::X8664Manylinux217 => "x86_64",
701            Self::X8664Manylinux228 => "x86_64",
702            Self::X8664Manylinux231 => "x86_64",
703            Self::X8664Manylinux232 => "x86_64",
704            Self::X8664Manylinux233 => "x86_64",
705            Self::X8664Manylinux234 => "x86_64",
706            Self::X8664Manylinux235 => "x86_64",
707            Self::X8664Manylinux236 => "x86_64",
708            Self::X8664Manylinux237 => "x86_64",
709            Self::X8664Manylinux238 => "x86_64",
710            Self::X8664Manylinux239 => "x86_64",
711            Self::X8664Manylinux240 => "x86_64",
712            Self::Aarch64Manylinux2014 => "aarch64",
713            Self::Aarch64Manylinux217 => "aarch64",
714            Self::Aarch64Manylinux228 => "aarch64",
715            Self::Aarch64Manylinux231 => "aarch64",
716            Self::Aarch64Manylinux232 => "aarch64",
717            Self::Aarch64Manylinux233 => "aarch64",
718            Self::Aarch64Manylinux234 => "aarch64",
719            Self::Aarch64Manylinux235 => "aarch64",
720            Self::Aarch64Manylinux236 => "aarch64",
721            Self::Aarch64Manylinux237 => "aarch64",
722            Self::Aarch64Manylinux238 => "aarch64",
723            Self::Aarch64Manylinux239 => "aarch64",
724            Self::Aarch64Manylinux240 => "aarch64",
725            Self::Aarch64LinuxAndroid => "aarch64",
726            Self::X8664LinuxAndroid => "x86_64",
727            Self::Wasm32Pyodide2024 => "wasm32",
728            Self::Arm64Ios => "arm64",
729            Self::Arm64IosSimulator => "arm64",
730            Self::X8664IosSimulator => "x86_64",
731        }
732    }
733
734    /// Return the `platform_system` value for the target.
735    pub fn platform_system(self) -> &'static str {
736        match self {
737            Self::Windows | Self::X8664PcWindowsMsvc => "Windows",
738            Self::Aarch64PcWindowsMsvc => "Windows",
739            Self::Linux | Self::X8664UnknownLinuxGnu => "Linux",
740            Self::Macos | Self::Aarch64AppleDarwin => "Darwin",
741            Self::I686PcWindowsMsvc => "Windows",
742            Self::X8664AppleDarwin => "Darwin",
743            Self::Aarch64UnknownLinuxGnu => "Linux",
744            Self::Aarch64UnknownLinuxMusl => "Linux",
745            Self::X8664UnknownLinuxMusl => "Linux",
746            Self::Riscv64UnknownLinuxGnu => "Linux",
747            Self::X8664Manylinux2014 => "Linux",
748            Self::X8664Manylinux217 => "Linux",
749            Self::X8664Manylinux228 => "Linux",
750            Self::X8664Manylinux231 => "Linux",
751            Self::X8664Manylinux232 => "Linux",
752            Self::X8664Manylinux233 => "Linux",
753            Self::X8664Manylinux234 => "Linux",
754            Self::X8664Manylinux235 => "Linux",
755            Self::X8664Manylinux236 => "Linux",
756            Self::X8664Manylinux237 => "Linux",
757            Self::X8664Manylinux238 => "Linux",
758            Self::X8664Manylinux239 => "Linux",
759            Self::X8664Manylinux240 => "Linux",
760            Self::Aarch64Manylinux2014 => "Linux",
761            Self::Aarch64Manylinux217 => "Linux",
762            Self::Aarch64Manylinux228 => "Linux",
763            Self::Aarch64Manylinux231 => "Linux",
764            Self::Aarch64Manylinux232 => "Linux",
765            Self::Aarch64Manylinux233 => "Linux",
766            Self::Aarch64Manylinux234 => "Linux",
767            Self::Aarch64Manylinux235 => "Linux",
768            Self::Aarch64Manylinux236 => "Linux",
769            Self::Aarch64Manylinux237 => "Linux",
770            Self::Aarch64Manylinux238 => "Linux",
771            Self::Aarch64Manylinux239 => "Linux",
772            Self::Aarch64Manylinux240 => "Linux",
773            Self::Aarch64LinuxAndroid => "Android",
774            Self::X8664LinuxAndroid => "Android",
775            Self::Wasm32Pyodide2024 => "Emscripten",
776            Self::Arm64Ios => "iOS",
777            Self::Arm64IosSimulator => "iOS",
778            Self::X8664IosSimulator => "iOS",
779        }
780    }
781
782    /// Return the `platform_version` value for the target.
783    pub fn platform_version(self) -> &'static str {
784        match self {
785            Self::Windows | Self::X8664PcWindowsMsvc => "",
786            Self::Aarch64PcWindowsMsvc => "",
787            Self::Linux | Self::X8664UnknownLinuxGnu => "",
788            Self::Macos | Self::Aarch64AppleDarwin => "",
789            Self::I686PcWindowsMsvc => "",
790            Self::X8664AppleDarwin => "",
791            Self::Aarch64UnknownLinuxGnu => "",
792            Self::Aarch64UnknownLinuxMusl => "",
793            Self::X8664UnknownLinuxMusl => "",
794            Self::Riscv64UnknownLinuxGnu => "",
795            Self::X8664Manylinux2014 => "",
796            Self::X8664Manylinux217 => "",
797            Self::X8664Manylinux228 => "",
798            Self::X8664Manylinux231 => "",
799            Self::X8664Manylinux232 => "",
800            Self::X8664Manylinux233 => "",
801            Self::X8664Manylinux234 => "",
802            Self::X8664Manylinux235 => "",
803            Self::X8664Manylinux236 => "",
804            Self::X8664Manylinux237 => "",
805            Self::X8664Manylinux238 => "",
806            Self::X8664Manylinux239 => "",
807            Self::X8664Manylinux240 => "",
808            Self::Aarch64Manylinux2014 => "",
809            Self::Aarch64Manylinux217 => "",
810            Self::Aarch64Manylinux228 => "",
811            Self::Aarch64Manylinux231 => "",
812            Self::Aarch64Manylinux232 => "",
813            Self::Aarch64Manylinux233 => "",
814            Self::Aarch64Manylinux234 => "",
815            Self::Aarch64Manylinux235 => "",
816            Self::Aarch64Manylinux236 => "",
817            Self::Aarch64Manylinux237 => "",
818            Self::Aarch64Manylinux238 => "",
819            Self::Aarch64Manylinux239 => "",
820            Self::Aarch64Manylinux240 => "",
821            Self::Aarch64LinuxAndroid => "",
822            Self::X8664LinuxAndroid => "",
823            // This is the value Emscripten gives for its version:
824            // https://github.com/emscripten-core/emscripten/blob/4.0.8/system/lib/libc/emscripten_syscall_stubs.c#L63
825            // It doesn't really seem to mean anything? But for completeness we include it here.
826            Self::Wasm32Pyodide2024 => "#1",
827            Self::Arm64Ios => "",
828            Self::Arm64IosSimulator => "",
829            Self::X8664IosSimulator => "",
830        }
831    }
832
833    /// Return the `platform_release` value for the target.
834    pub fn platform_release(self) -> &'static str {
835        match self {
836            Self::Windows | Self::X8664PcWindowsMsvc => "",
837            Self::Aarch64PcWindowsMsvc => "",
838            Self::Linux | Self::X8664UnknownLinuxGnu => "",
839            Self::Macos | Self::Aarch64AppleDarwin => "",
840            Self::I686PcWindowsMsvc => "",
841            Self::X8664AppleDarwin => "",
842            Self::Aarch64UnknownLinuxGnu => "",
843            Self::Aarch64UnknownLinuxMusl => "",
844            Self::X8664UnknownLinuxMusl => "",
845            Self::Riscv64UnknownLinuxGnu => "",
846            Self::X8664Manylinux2014 => "",
847            Self::X8664Manylinux217 => "",
848            Self::X8664Manylinux228 => "",
849            Self::X8664Manylinux231 => "",
850            Self::X8664Manylinux232 => "",
851            Self::X8664Manylinux233 => "",
852            Self::X8664Manylinux234 => "",
853            Self::X8664Manylinux235 => "",
854            Self::X8664Manylinux236 => "",
855            Self::X8664Manylinux237 => "",
856            Self::X8664Manylinux238 => "",
857            Self::X8664Manylinux239 => "",
858            Self::X8664Manylinux240 => "",
859            Self::Aarch64Manylinux2014 => "",
860            Self::Aarch64Manylinux217 => "",
861            Self::Aarch64Manylinux228 => "",
862            Self::Aarch64Manylinux231 => "",
863            Self::Aarch64Manylinux232 => "",
864            Self::Aarch64Manylinux233 => "",
865            Self::Aarch64Manylinux234 => "",
866            Self::Aarch64Manylinux235 => "",
867            Self::Aarch64Manylinux236 => "",
868            Self::Aarch64Manylinux237 => "",
869            Self::Aarch64Manylinux238 => "",
870            Self::Aarch64Manylinux239 => "",
871            Self::Aarch64Manylinux240 => "",
872            Self::Aarch64LinuxAndroid => "",
873            Self::X8664LinuxAndroid => "",
874            // This is the Emscripten compiler version for Pyodide 2024.
875            // See https://pyodide.org/en/stable/development/abi.html#pyodide-2024-0
876            Self::Wasm32Pyodide2024 => "3.1.58",
877            Self::Arm64Ios => "",
878            Self::Arm64IosSimulator => "",
879            Self::X8664IosSimulator => "",
880        }
881    }
882
883    /// Return the `os_name` value for the target.
884    pub fn os_name(self) -> &'static str {
885        match self {
886            Self::Windows | Self::X8664PcWindowsMsvc => "nt",
887            Self::Aarch64PcWindowsMsvc => "nt",
888            Self::Linux | Self::X8664UnknownLinuxGnu => "posix",
889            Self::Macos | Self::Aarch64AppleDarwin => "posix",
890            Self::I686PcWindowsMsvc => "nt",
891            Self::X8664AppleDarwin => "posix",
892            Self::Aarch64UnknownLinuxGnu => "posix",
893            Self::Aarch64UnknownLinuxMusl => "posix",
894            Self::X8664UnknownLinuxMusl => "posix",
895            Self::Riscv64UnknownLinuxGnu => "posix",
896            Self::X8664Manylinux2014 => "posix",
897            Self::X8664Manylinux217 => "posix",
898            Self::X8664Manylinux228 => "posix",
899            Self::X8664Manylinux231 => "posix",
900            Self::X8664Manylinux232 => "posix",
901            Self::X8664Manylinux233 => "posix",
902            Self::X8664Manylinux234 => "posix",
903            Self::X8664Manylinux235 => "posix",
904            Self::X8664Manylinux236 => "posix",
905            Self::X8664Manylinux237 => "posix",
906            Self::X8664Manylinux238 => "posix",
907            Self::X8664Manylinux239 => "posix",
908            Self::X8664Manylinux240 => "posix",
909            Self::Aarch64Manylinux2014 => "posix",
910            Self::Aarch64Manylinux217 => "posix",
911            Self::Aarch64Manylinux228 => "posix",
912            Self::Aarch64Manylinux231 => "posix",
913            Self::Aarch64Manylinux232 => "posix",
914            Self::Aarch64Manylinux233 => "posix",
915            Self::Aarch64Manylinux234 => "posix",
916            Self::Aarch64Manylinux235 => "posix",
917            Self::Aarch64Manylinux236 => "posix",
918            Self::Aarch64Manylinux237 => "posix",
919            Self::Aarch64Manylinux238 => "posix",
920            Self::Aarch64Manylinux239 => "posix",
921            Self::Aarch64Manylinux240 => "posix",
922            Self::Aarch64LinuxAndroid => "posix",
923            Self::X8664LinuxAndroid => "posix",
924            Self::Wasm32Pyodide2024 => "posix",
925            Self::Arm64Ios => "posix",
926            Self::Arm64IosSimulator => "posix",
927            Self::X8664IosSimulator => "posix",
928        }
929    }
930
931    /// Return the `sys_platform` value for the target.
932    pub fn sys_platform(self) -> &'static str {
933        match self {
934            Self::Windows | Self::X8664PcWindowsMsvc => "win32",
935            Self::Aarch64PcWindowsMsvc => "win32",
936            Self::Linux | Self::X8664UnknownLinuxGnu => "linux",
937            Self::Macos | Self::Aarch64AppleDarwin => "darwin",
938            Self::I686PcWindowsMsvc => "win32",
939            Self::X8664AppleDarwin => "darwin",
940            Self::Aarch64UnknownLinuxGnu => "linux",
941            Self::Aarch64UnknownLinuxMusl => "linux",
942            Self::X8664UnknownLinuxMusl => "linux",
943            Self::Riscv64UnknownLinuxGnu => "linux",
944            Self::X8664Manylinux2014 => "linux",
945            Self::X8664Manylinux217 => "linux",
946            Self::X8664Manylinux228 => "linux",
947            Self::X8664Manylinux231 => "linux",
948            Self::X8664Manylinux232 => "linux",
949            Self::X8664Manylinux233 => "linux",
950            Self::X8664Manylinux234 => "linux",
951            Self::X8664Manylinux235 => "linux",
952            Self::X8664Manylinux236 => "linux",
953            Self::X8664Manylinux237 => "linux",
954            Self::X8664Manylinux238 => "linux",
955            Self::X8664Manylinux239 => "linux",
956            Self::X8664Manylinux240 => "linux",
957            Self::Aarch64Manylinux2014 => "linux",
958            Self::Aarch64Manylinux217 => "linux",
959            Self::Aarch64Manylinux228 => "linux",
960            Self::Aarch64Manylinux231 => "linux",
961            Self::Aarch64Manylinux232 => "linux",
962            Self::Aarch64Manylinux233 => "linux",
963            Self::Aarch64Manylinux234 => "linux",
964            Self::Aarch64Manylinux235 => "linux",
965            Self::Aarch64Manylinux236 => "linux",
966            Self::Aarch64Manylinux237 => "linux",
967            Self::Aarch64Manylinux238 => "linux",
968            Self::Aarch64Manylinux239 => "linux",
969            Self::Aarch64Manylinux240 => "linux",
970            Self::Aarch64LinuxAndroid => "android",
971            Self::X8664LinuxAndroid => "android",
972            Self::Wasm32Pyodide2024 => "emscripten",
973            Self::Arm64Ios => "ios",
974            Self::Arm64IosSimulator => "ios",
975            Self::X8664IosSimulator => "ios",
976        }
977    }
978
979    /// Return `true` if the platform is compatible with manylinux.
980    pub fn manylinux_compatible(self) -> bool {
981        match self {
982            Self::Windows | Self::X8664PcWindowsMsvc => false,
983            Self::Aarch64PcWindowsMsvc => false,
984            Self::Linux | Self::X8664UnknownLinuxGnu => true,
985            Self::Macos | Self::Aarch64AppleDarwin => false,
986            Self::I686PcWindowsMsvc => false,
987            Self::X8664AppleDarwin => false,
988            Self::Aarch64UnknownLinuxGnu => true,
989            Self::Aarch64UnknownLinuxMusl => true,
990            Self::X8664UnknownLinuxMusl => true,
991            Self::Riscv64UnknownLinuxGnu => true,
992            Self::X8664Manylinux2014 => true,
993            Self::X8664Manylinux217 => true,
994            Self::X8664Manylinux228 => true,
995            Self::X8664Manylinux231 => true,
996            Self::X8664Manylinux232 => true,
997            Self::X8664Manylinux233 => true,
998            Self::X8664Manylinux234 => true,
999            Self::X8664Manylinux235 => true,
1000            Self::X8664Manylinux236 => true,
1001            Self::X8664Manylinux237 => true,
1002            Self::X8664Manylinux238 => true,
1003            Self::X8664Manylinux239 => true,
1004            Self::X8664Manylinux240 => true,
1005            Self::Aarch64Manylinux2014 => true,
1006            Self::Aarch64Manylinux217 => true,
1007            Self::Aarch64Manylinux228 => true,
1008            Self::Aarch64Manylinux231 => true,
1009            Self::Aarch64Manylinux232 => true,
1010            Self::Aarch64Manylinux233 => true,
1011            Self::Aarch64Manylinux234 => true,
1012            Self::Aarch64Manylinux235 => true,
1013            Self::Aarch64Manylinux236 => true,
1014            Self::Aarch64Manylinux237 => true,
1015            Self::Aarch64Manylinux238 => true,
1016            Self::Aarch64Manylinux239 => true,
1017            Self::Aarch64Manylinux240 => true,
1018            Self::Aarch64LinuxAndroid => false,
1019            Self::X8664LinuxAndroid => false,
1020            Self::Wasm32Pyodide2024 => false,
1021            Self::Arm64Ios => false,
1022            Self::Arm64IosSimulator => false,
1023            Self::X8664IosSimulator => false,
1024        }
1025    }
1026
1027    /// Return a [`MarkerEnvironment`] compatible with the given [`TargetTriple`], based on
1028    /// a base [`MarkerEnvironment`].
1029    ///
1030    /// The returned [`MarkerEnvironment`] will preserve the base environment's Python version
1031    /// markers, but override its platform markers.
1032    pub fn markers(self, base: &MarkerEnvironment) -> MarkerEnvironment {
1033        base.clone()
1034            .with_os_name(self.os_name())
1035            .with_platform_machine(self.platform_machine())
1036            .with_platform_system(self.platform_system())
1037            .with_sys_platform(self.sys_platform())
1038            .with_platform_release(self.platform_release())
1039            .with_platform_version(self.platform_version())
1040    }
1041}
1042
1043/// Return the macOS deployment target as parsed from the environment.
1044fn macos_deployment_target() -> Option<(u16, u16)> {
1045    let version = std::env::var(EnvVars::MACOSX_DEPLOYMENT_TARGET).ok()?;
1046    let mut parts = version.split('.');
1047
1048    // Parse the major version (e.g., `12` in `12.0`).
1049    let major = parts.next()?.parse::<u16>().ok()?;
1050
1051    // Parse the minor version (e.g., `0` in `12.0`), with a default of `0`.
1052    let minor = parts.next().unwrap_or("0").parse::<u16>().ok()?;
1053
1054    Some((major, minor))
1055}
1056
1057/// Return the iOS deployment target as parsed from the environment.
1058fn ios_deployment_target() -> Option<(u16, u16)> {
1059    let version = std::env::var(EnvVars::IPHONEOS_DEPLOYMENT_TARGET).ok()?;
1060    let mut parts = version.split('.');
1061
1062    // Parse the major version (e.g., `12` in `12.0`).
1063    let major = parts.next()?.parse::<u16>().ok()?;
1064
1065    // Parse the minor version (e.g., `0` in `12.0`), with a default of `0`.
1066    let minor = parts.next().unwrap_or("0").parse::<u16>().ok()?;
1067
1068    Some((major, minor))
1069}
1070
1071/// Return the Android API level as parsed from the environment.
1072fn android_api_level() -> Option<u16> {
1073    let api_level_str = std::env::var(EnvVars::ANDROID_API_LEVEL).ok()?;
1074
1075    // Parse the api level.
1076    let api_level = api_level_str.parse::<u16>().ok()?;
1077
1078    Some(api_level)
1079}