9
9
// except according to those terms.
10
10
11
11
use std:: env;
12
+ use std:: io;
13
+ use std:: process:: Command ;
14
+ use std:: str;
12
15
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 ( )
48
+ }
14
49
15
50
pub fn opts ( ) -> TargetOptions {
16
51
// ELF TLS is only available in macOS 10.7+. If you try to compile for 10.6
@@ -24,13 +59,9 @@ pub fn opts() -> TargetOptions {
24
59
//
25
60
// Here we detect what version is being requested, defaulting to 10.7. ELF
26
61
// 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 ) ) ;
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 ( ) ) ;
34
65
35
66
TargetOptions {
36
67
// macOS has -dead_strip, which doesn't rely on function_sections
@@ -43,9 +74,9 @@ pub fn opts() -> TargetOptions {
43
74
dll_prefix : "lib" . to_string ( ) ,
44
75
dll_suffix : ".dylib" . to_string ( ) ,
45
76
archive_format : "bsd" . to_string ( ) ,
46
- pre_link_args : LinkArgs :: new ( ) ,
47
77
exe_allocation_crate : super :: maybe_jemalloc ( ) ,
48
78
has_elf_tls : version >= ( 10 , 7 ) ,
79
+ linker : "ld" . to_string ( ) ,
49
80
.. Default :: default ( )
50
81
}
51
82
}
0 commit comments