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