99// except according to those terms.
1010
1111use std:: env;
12+ use std:: io;
13+ use std:: process:: Command ;
14+ use std:: str;
1215
13- use target:: { LinkArgs , TargetOptions } ;
16+ use target:: TargetOptions ;
17+
18+ pub fn xcrun ( print_arg : & str , sdk_name : & str ) -> io:: Result < String > {
19+ Command :: new ( "xcrun" ) . arg ( print_arg) . arg ( "--sdk" ) . arg ( sdk_name) . output ( ) . and_then ( |output| {
20+ if output. status . success ( ) {
21+ Ok ( str:: from_utf8 ( & output. stdout [ ..] ) . unwrap ( ) . trim ( ) . to_string ( ) )
22+ } else {
23+ let error = format ! (
24+ "process exit with error: {}" ,
25+ str :: from_utf8( & output. stderr[ ..] ) . unwrap( ) ,
26+ ) ;
27+ Err ( io:: Error :: new ( io:: ErrorKind :: Other , & error[ ..] ) )
28+ }
29+ } )
30+ }
31+
32+ pub fn get_sdk_root ( sdk_name : & str ) -> Result < String , String > {
33+ xcrun ( "--show-sdk-path" , sdk_name) . map_err ( |e| {
34+ format ! ( "failed to get {} SDK path: {}" , sdk_name, e)
35+ } )
36+ }
37+
38+ pub fn get_sdk_version ( sdk_name : & str ) -> Result < String , String > {
39+ xcrun ( "--show-sdk-version" , sdk_name) . map_err ( |e| {
40+ format ! ( "failed to get {} SDK version: {}" , sdk_name, e)
41+ } )
42+ }
43+
44+ pub fn get_deployment_target ( ) -> String {
45+ env:: var ( "MACOSX_DEPLOYMENT_TARGET" ) . or_else ( |_e| {
46+ get_sdk_version ( "macosx" )
47+ } ) . unwrap_or ( "10.7" . to_string ( ) )
48+ }
1449
1550pub fn opts ( ) -> TargetOptions {
1651 // ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6
@@ -22,15 +57,11 @@ pub fn opts() -> TargetOptions {
2257 // MACOSX_DEPLOYMENT_TARGET set to 10.6 will cause the linker to generate
2358 // warnings about the usage of ELF TLS.
2459 //
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 ) ) ;
60+ // Here we detect what version is being requested. ELF TLS is flagged as
61+ // enabled if it looks to be supported.
62+ let deployment_target = get_deployment_target ( ) ;
63+ let mut i = deployment_target. splitn ( 2 , '.' ) . map ( |s| s. parse :: < u32 > ( ) . unwrap ( ) ) ;
64+ let version = ( i. next ( ) . unwrap ( ) , i. next ( ) . unwrap ( ) ) ;
3465
3566 TargetOptions {
3667 // macOS has -dead_strip, which doesn't rely on function_sections
@@ -43,9 +74,9 @@ pub fn opts() -> TargetOptions {
4374 dll_prefix : "lib" . to_string ( ) ,
4475 dll_suffix : ".dylib" . to_string ( ) ,
4576 archive_format : "bsd" . to_string ( ) ,
46- pre_link_args : LinkArgs :: new ( ) ,
4777 exe_allocation_crate : super :: maybe_jemalloc ( ) ,
4878 has_elf_tls : version >= ( 10 , 7 ) ,
79+ linker : "ld" . to_string ( ) ,
4980 .. Default :: default ( )
5081 }
5182}
0 commit comments