@@ -16,7 +16,7 @@ use xwin::util::ProgressTarget;
1616use crate :: cache:: prepare_xwin_cache_dir;
1717use crate :: compiler:: common:: {
1818 adjust_canonicalization, default_build_target_from_config, get_rustflags, http_agent,
19- is_static_crt_enabled, setup_cmake_env, setup_env_path, setup_llvm_tools,
19+ is_static_crt_enabled, resolve_target_info , setup_cmake_env, setup_env_path, setup_llvm_tools,
2020 setup_target_compiler_and_linker_env,
2121} ;
2222use crate :: options:: XWinOptions ;
@@ -58,10 +58,12 @@ impl<'a> ClangCl<'a> {
5858 }
5959
6060 for target in & targets {
61- if target. contains ( "msvc" ) {
61+ let ( cargo_target_name, llvm_target, is_custom_target) = resolve_target_info ( target) ?;
62+
63+ if llvm_target. contains ( "msvc" ) {
6264 self . setup_msvc_crt_with_retry ( xwin_cache_dir. clone ( ) )
6365 . context ( "Failed to setup MSVC CRT" ) ?;
64- let env_target = target . to_lowercase ( ) . replace ( '-' , "_" ) ;
66+ let env_target = cargo_target_name . to_lowercase ( ) . replace ( '-' , "_" ) ;
6567
6668 setup_clang_cl_symlink ( & env_path, & cache_dir)
6769 . context ( "Failed to setup clang-cl symlink" ) ?;
@@ -72,7 +74,7 @@ impl<'a> ClangCl<'a> {
7274 let user_set_c_flags = env:: var ( "CFLAGS" ) . unwrap_or_default ( ) ;
7375 let user_set_cxx_flags = env:: var ( "CXXFLAGS" ) . unwrap_or_default ( ) ;
7476
75- let target_arch = target
77+ let target_arch = llvm_target
7678 . split_once ( '-' )
7779 . map ( |( x, _) | x)
7880 . context ( "invalid target triple" ) ?;
@@ -83,7 +85,7 @@ impl<'a> ClangCl<'a> {
8385
8486 let xwin_dir = adjust_canonicalization ( xwin_cache_dir. to_slash_lossy ( ) . to_string ( ) ) ;
8587 let mut cl_flags = vec ! [
86- format!( "--target={target }" ) ,
88+ format!( "--target={llvm_target }" ) ,
8789 "-Wno-unused-command-line-argument" . to_string( ) ,
8890 "-fuse-ld=lld-link" . to_string( ) ,
8991 format!( "/imsvc {dir}/crt/include" , dir = xwin_dir) ,
@@ -140,13 +142,26 @@ impl<'a> ClangCl<'a> {
140142 } ;
141143 cmd. env ( "LIB" , lib_value) ;
142144
143- let mut rustflags = get_rustflags ( & workdir, target) ?. unwrap_or_default ( ) ;
145+ let mut rustflags =
146+ get_rustflags ( & workdir, & cargo_target_name) ?. unwrap_or_default ( ) ;
147+ if is_custom_target {
148+ rustflags. flags . push ( "-Zunstable-options" . to_string ( ) ) ;
149+
150+ let mut paths = std:: env:: var_os ( "RUST_TARGET_PATH" )
151+ . map ( |v| std:: env:: split_paths ( & v) . collect :: < Vec < _ > > ( ) )
152+ . unwrap_or_default ( ) ;
153+
154+ if !paths. contains ( & workdir) {
155+ paths. insert ( 0 , workdir. clone ( ) ) ;
156+ cmd. env ( "RUST_TARGET_PATH" , std:: env:: join_paths ( paths) ?) ;
157+ }
158+ }
144159 rustflags
145160 . flags
146161 . extend ( [ "-C" . to_string ( ) , "linker-flavor=lld-link" . to_string ( ) ] ) ;
147162
148163 // Check if static CRT is enabled
149- let is_static_crt = is_static_crt_enabled ( & workdir, target ) ?;
164+ let is_static_crt = is_static_crt_enabled ( & workdir, & cargo_target_name ) ?;
150165 if is_static_crt {
151166 // When using static CRT, we need to link against the static version of libucrt
152167 // instead of the import library. This resolves issues with symbols like
@@ -190,7 +205,7 @@ impl<'a> ClangCl<'a> {
190205
191206 // CMake support
192207 let cmake_toolchain = self
193- . setup_cmake_toolchain ( target , & xwin_cache_dir, is_static_crt)
208+ . setup_cmake_toolchain ( & llvm_target , & xwin_cache_dir, is_static_crt)
194209 . with_context ( || format ! ( "Failed to setup CMake toolchain for {}" , target) ) ?;
195210 setup_cmake_env ( cmd, target, cmake_toolchain) ;
196211 }
0 commit comments