cc/target/
apple.rs

1use super::TargetInfo;
2
3impl TargetInfo<'_> {
4    pub(crate) fn apple_sdk_name(&self) -> &'static str {
5        match (self.os, self.abi) {
6            ("macos", "") => "macosx",
7            ("ios", "") => "iphoneos",
8            ("ios", "sim") => "iphonesimulator",
9            ("ios", "macabi") => "macosx",
10            ("tvos", "") => "appletvos",
11            ("tvos", "sim") => "appletvsimulator",
12            ("watchos", "") => "watchos",
13            ("watchos", "sim") => "watchsimulator",
14            ("visionos", "") => "xros",
15            ("visionos", "sim") => "xrsimulator",
16            (os, _) => panic!("invalid Apple target OS {}", os),
17        }
18    }
19
20    pub(crate) fn apple_version_flag(&self, min_version: &str) -> String {
21        // There are many aliases for these, and `-mtargetos=` is preferred on Clang nowadays, but
22        // for compatibility with older Clang, we use the earliest supported name here.
23        //
24        // NOTE: GCC does not support `-miphoneos-version-min=` etc. (because it does not support
25        // iOS in general), but we specify them anyhow in case we actually have a Clang-like
26        // compiler disguised as a GNU-like compiler, or in case GCC adds support for these in the
27        // future.
28        //
29        // See also:
30        // https://clang.llvm.org/docs/ClangCommandLineReference.html#cmdoption-clang-mmacos-version-min
31        // https://clang.llvm.org/docs/AttributeReference.html#availability
32        // https://gcc.gnu.org/onlinedocs/gcc/Darwin-Options.html#index-mmacosx-version-min
33        match (self.os, self.abi) {
34            ("macos", "") => format!("-mmacosx-version-min={min_version}"),
35            ("ios", "") => format!("-miphoneos-version-min={min_version}"),
36            ("ios", "sim") => format!("-mios-simulator-version-min={min_version}"),
37            ("ios", "macabi") => format!("-mtargetos=ios{min_version}-macabi"),
38            ("tvos", "") => format!("-mappletvos-version-min={min_version}"),
39            ("tvos", "sim") => format!("-mappletvsimulator-version-min={min_version}"),
40            ("watchos", "") => format!("-mwatchos-version-min={min_version}"),
41            ("watchos", "sim") => format!("-mwatchsimulator-version-min={min_version}"),
42            // `-mxros-version-min` does not exist
43            // https://github.com/llvm/llvm-project/issues/88271
44            ("visionos", "") => format!("-mtargetos=xros{min_version}"),
45            ("visionos", "sim") => format!("-mtargetos=xros{min_version}-simulator"),
46            (os, _) => panic!("invalid Apple target OS {}", os),
47        }
48    }
49}