]> git.lizzy.rs Git - rust.git/blob - src/librustc_target/spec/apple_ios_base.rs
Rollup merge of #61629 - petrochenkov:stdmac, r=alexcrichton
[rust.git] / src / librustc_target / spec / apple_ios_base.rs
1 use std::io;
2 use std::process::Command;
3 use crate::spec::{LinkArgs, LinkerFlavor, TargetOptions};
4
5 use Arch::*;
6
7 #[allow(non_camel_case_types)]
8 #[derive(Copy, Clone)]
9 pub enum Arch {
10     Armv7,
11     Armv7s,
12     Arm64,
13     I386,
14     X86_64
15 }
16
17 impl Arch {
18     pub fn to_string(self) -> &'static str {
19         match self {
20             Armv7 => "armv7",
21             Armv7s => "armv7s",
22             Arm64 => "arm64",
23             I386 => "i386",
24             X86_64 => "x86_64"
25         }
26     }
27 }
28
29 pub fn get_sdk_root(sdk_name: &str) -> Result<String, String> {
30     let res = Command::new("xcrun")
31                       .arg("--show-sdk-path")
32                       .arg("-sdk")
33                       .arg(sdk_name)
34                       .output()
35                       .and_then(|output| {
36                           if output.status.success() {
37                               Ok(String::from_utf8(output.stdout).unwrap())
38                           } else {
39                               let error = String::from_utf8(output.stderr);
40                               let error = format!("process exit with error: {}",
41                                                   error.unwrap());
42                               Err(io::Error::new(io::ErrorKind::Other,
43                                                  &error[..]))
44                           }
45                       });
46
47     match res {
48         Ok(output) => Ok(output.trim().to_string()),
49         Err(e) => Err(format!("failed to get {} SDK path: {}", sdk_name, e))
50     }
51 }
52
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"
57     };
58
59     let arch_name = arch.to_string();
60
61     let sdk_root = get_sdk_root(sdk_name)?;
62
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(),
68                      sdk_root.clone(),
69                      "-Wl,-syslibroot".to_string(),
70                      sdk_root]);
71
72     Ok(args)
73 }
74
75 fn target_cpu(arch: Arch) -> String {
76     match arch {
77         Armv7 => "cortex-a8", // iOS7 is supported on iPhone 4 and higher
78         Armv7s => "cortex-a9",
79         Arm64 => "cyclone",
80         I386 => "yonah",
81         X86_64 => "core2",
82     }.to_string()
83 }
84
85 pub fn opts(arch: Arch) -> Result<TargetOptions, String> {
86     let pre_link_args = build_pre_link_args(arch)?;
87     Ok(TargetOptions {
88         cpu: target_cpu(arch),
89         dynamic_linking: false,
90         executables: true,
91         pre_link_args,
92         has_elf_tls: false,
93         eliminate_frame_pointer: false,
94         .. super::apple_base::opts()
95     })
96 }