2 use std::process::Command;
3 use crate::spec::{LinkArgs, LinkerFlavor, TargetOptions};
7 #[allow(non_camel_case_types)]
18 pub fn to_string(self) -> &'static str {
29 pub fn get_sdk_root(sdk_name: &str) -> Result<String, String> {
30 let res = Command::new("xcrun")
31 .arg("--show-sdk-path")
36 if output.status.success() {
37 Ok(String::from_utf8(output.stdout).unwrap())
39 let error = String::from_utf8(output.stderr);
40 let error = format!("process exit with error: {}",
42 Err(io::Error::new(io::ErrorKind::Other,
48 Ok(output) => Ok(output.trim().to_string()),
49 Err(e) => Err(format!("failed to get {} SDK path: {}", sdk_name, e))
53 fn build_pre_link_args(arch: Arch) -> Result<LinkArgs, String> {
54 let sdk_name = match arch {
55 Armv7 | Armv7s | Arm64 => "iphoneos",
56 I386 | X86_64 => "iphonesimulator"
59 let arch_name = arch.to_string();
61 let sdk_root = get_sdk_root(sdk_name)?;
63 let mut args = LinkArgs::new();
64 args.insert(LinkerFlavor::Gcc,
65 vec!["-arch".to_string(),
66 arch_name.to_string(),
67 "-isysroot".to_string(),
69 "-Wl,-syslibroot".to_string(),
75 fn target_cpu(arch: Arch) -> String {
77 Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
78 Armv7s => "cortex-a9",
85 pub fn opts(arch: Arch) -> Result<TargetOptions, String> {
86 let pre_link_args = build_pre_link_args(arch)?;
88 cpu: target_cpu(arch),
89 dynamic_linking: false,
93 eliminate_frame_pointer: false,
94 .. super::apple_base::opts()