use crate::spec::{cvs, LinkArgs, LinkerFlavor, LldFlavor, TargetOptions}; use std::borrow::Cow; use Arch::*; #[allow(non_camel_case_types)] #[derive(Copy, Clone)] pub enum Arch { Armv7, Armv7k, Armv7s, Arm64, Arm64_32, I386, X86_64, X86_64_macabi, Arm64_macabi, Arm64_sim, } fn target_arch_name(arch: Arch) -> &'static str { match arch { Armv7 => "armv7", Armv7k => "armv7k", Armv7s => "armv7s", Arm64 | Arm64_macabi | Arm64_sim => "arm64", Arm64_32 => "arm64_32", I386 => "i386", X86_64 | X86_64_macabi => "x86_64", } } fn target_abi(arch: Arch) -> &'static str { match arch { Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 => "", X86_64_macabi | Arm64_macabi => "macabi", Arm64_sim => "sim", } } fn target_cpu(arch: Arch) -> &'static str { match arch { Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher Armv7k => "cortex-a8", Armv7s => "cortex-a9", Arm64 => "apple-a7", Arm64_32 => "apple-s4", I386 => "yonah", X86_64 => "core2", X86_64_macabi => "core2", Arm64_macabi => "apple-a12", Arm64_sim => "apple-a12", } } fn link_env_remove(arch: Arch) -> Cow<'static, [Cow<'static, str>]> { match arch { Armv7 | Armv7k | Armv7s | Arm64 | Arm64_32 | I386 | X86_64 | Arm64_sim => { cvs!["MACOSX_DEPLOYMENT_TARGET"] } X86_64_macabi | Arm64_macabi => cvs!["IPHONEOS_DEPLOYMENT_TARGET"], } } fn pre_link_args(os: &'static str, arch: Arch) -> LinkArgs { let mut args = LinkArgs::new(); let target_abi = target_abi(arch); let platform_name = match target_abi { "sim" => format!("{}-simulator", os), "macabi" => "mac-catalyst".to_string(), _ => os.to_string(), }; let platform_version = match os.as_ref() { "ios" => super::apple_base::ios_lld_platform_version(), "tvos" => super::apple_base::tvos_lld_platform_version(), "watchos" => super::apple_base::watchos_lld_platform_version(), _ => unreachable!(), }; let arch_str = target_arch_name(arch); if target_abi != "macabi" { args.insert(LinkerFlavor::Gcc, vec!["-arch".into(), arch_str.into()]); } args.insert( LinkerFlavor::Lld(LldFlavor::Ld64), vec![ "-arch".into(), arch_str.into(), "-platform_version".into(), platform_name.into(), platform_version.clone().into(), platform_version.into(), ], ); args } pub fn opts(os: &'static str, arch: Arch) -> TargetOptions { TargetOptions { abi: target_abi(arch).into(), cpu: target_cpu(arch).into(), dynamic_linking: false, pre_link_args: pre_link_args(os, arch), link_env_remove: link_env_remove(arch), has_thread_local: false, ..super::apple_base::opts(os) } }