@@ -7,6 +7,7 @@ pub fn print_linker_args() {
77 println ! ( "cargo:rerun-if-env-changed=BLDSHARED_EXE" ) ;
88 println ! ( "cargo:rerun-if-env-changed=BLDSHARED_ARGS" ) ;
99 println ! ( "cargo:rerun-if-env-changed=LIBPYTHON" ) ;
10+ println ! ( "cargo:rerun-if-env-changed=PY_CC" ) ;
1011 println ! ( "cargo:rerun-if-env-changed=PYTHON_BUILD_DIR" ) ;
1112 println ! ( "cargo:rerun-if-env-changed=CARGO_CFG_TARGET_OS" ) ;
1213
@@ -60,8 +61,8 @@ pub fn print_linker_args() {
6061
6162fn print_link_args ( raw : & str , skip_first : bool ) {
6263 let mut args = shlex:: split ( raw) . expect ( "Invalid linker args" ) ;
63- if skip_first && !args . is_empty ( ) {
64- args. remove ( 0 ) ;
64+ if skip_first {
65+ args = strip_linker_executable ( args , env :: var ( "PY_CC" ) . ok ( ) . as_deref ( ) ) ;
6566 }
6667
6768 let build_dir = env:: var ( "PYTHON_BUILD_DIR" ) . ok ( ) ;
@@ -98,3 +99,26 @@ fn print_link_args(raw: &str, skip_first: bool) {
9899 }
99100 }
100101}
102+
103+ // BLDSHARED_EXE may start with a wrapper/compiler command such as
104+ // "xcrun --sdk iphoneos clang" or "ccache clang". Strip that prefix so only
105+ // linker flags are forwarded to rustc.
106+ fn strip_linker_executable ( args : Vec < String > , compiler : Option < & str > ) -> Vec < String > {
107+ if let Some ( compiler) = compiler
108+ && let Some ( prefix) = compiler_command_prefix ( compiler)
109+ && args. as_slice ( ) . starts_with ( prefix. as_slice ( ) )
110+ {
111+ return args[ prefix. len ( ) ..] . to_vec ( ) ;
112+ }
113+
114+ if args. is_empty ( ) {
115+ return args;
116+ }
117+ args[ 1 ..] . to_vec ( )
118+ }
119+
120+ fn compiler_command_prefix ( raw : & str ) -> Option < Vec < String > > {
121+ let tokens = shlex:: split ( raw) ?;
122+ let last_non_flag = tokens. iter ( ) . rposition ( |token| !token. starts_with ( '-' ) ) ?;
123+ Some ( tokens. into_iter ( ) . take ( last_non_flag + 1 ) . collect ( ) )
124+ }
0 commit comments