]> git.lizzy.rs Git - rust.git/blob - src/librustc_back/target/apple_base.rs
Rollup merge of #40521 - TimNN:panic-free-shift, r=alexcrichton
[rust.git] / src / librustc_back / target / apple_base.rs
1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
4 //
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
10
11 use std::env;
12
13 use target::TargetOptions;
14
15 pub fn opts() -> TargetOptions {
16     // ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6
17     // either the linker will complain if it is used or the binary will end up
18     // segfaulting at runtime when run on 10.6. Rust by default supports macOS
19     // 10.7+, but there is a standard environment variable,
20     // MACOSX_DEPLOYMENT_TARGET, which is used to signal targeting older
21     // versions of macOS. For example compiling on 10.10 with
22     // MACOSX_DEPLOYMENT_TARGET set to 10.6 will cause the linker to generate
23     // warnings about the usage of ELF TLS.
24     //
25     // Here we detect what version is being requested, defaulting to 10.7. ELF
26     // TLS is flagged as enabled if it looks to be supported.
27     let deployment_target = env::var("MACOSX_DEPLOYMENT_TARGET").ok();
28     let version = deployment_target.as_ref().and_then(|s| {
29         let mut i = s.splitn(2, ".");
30         i.next().and_then(|a| i.next().map(|b| (a, b)))
31     }).and_then(|(a, b)| {
32         a.parse::<u32>().and_then(|a| b.parse::<u32>().map(|b| (a, b))).ok()
33     }).unwrap_or((10, 7));
34
35     TargetOptions {
36         // macOS has -dead_strip, which doesn't rely on function_sections
37         function_sections: false,
38         dynamic_linking: true,
39         executables: true,
40         target_family: Some("unix".to_string()),
41         is_like_osx: true,
42         has_rpath: true,
43         dll_prefix: "lib".to_string(),
44         dll_suffix: ".dylib".to_string(),
45         archive_format: "bsd".to_string(),
46         pre_link_args: Vec::new(),
47         exe_allocation_crate: super::maybe_jemalloc(),
48         has_elf_tls: version >= (10, 7),
49         .. Default::default()
50     }
51 }