@@ -8,7 +8,7 @@ use std::{
88} ;
99
1010use anyhow:: { Context , Result } ;
11- use cargo_metadata:: { Artifact , Message , camino :: Utf8PathBuf , semver:: Version } ;
11+ use cargo_metadata:: { Artifact , Message , semver:: Version } ;
1212
1313use crate :: shell:: Shell ;
1414
@@ -86,10 +86,35 @@ fn cc_env(var_base: &str, triple: &str) -> (String, Option<String>) {
8686 . unwrap_or_else ( || ( most_specific_key, None ) )
8787}
8888
89+ #[ inline]
90+ // {}/toolchains/llvm/prebuilt/{ARCH}/lib/clang/{clang_version}/lib/linux
91+ fn clang_lib_path ( ndk_home : & Path ) -> PathBuf {
92+ let clang_folder: PathBuf = ndk_home
93+ . join ( "toolchains" )
94+ . join ( "llvm" )
95+ . join ( "prebuilt" )
96+ . join ( ARCH )
97+ . join ( "lib" )
98+ . join ( "clang" ) ;
99+
100+ let clang_lib_version = std:: fs:: read_dir ( & clang_folder)
101+ . expect ( "Unable to get clang target directory" )
102+ . filter_map ( |a| a. ok ( ) )
103+ . max_by ( |a, b| a. file_name ( ) . cmp ( & b. file_name ( ) ) )
104+ . expect ( "Unable to get clang target" )
105+ . path ( ) ;
106+
107+ clang_folder
108+ . join ( clang_lib_version)
109+ . join ( "lib" )
110+ . join ( "linux" )
111+ }
112+
89113pub ( crate ) fn build_env (
90114 triple : & str ,
91115 ndk_home : & Path ,
92116 clang_target : & str ,
117+ link_builtins : bool ,
93118) -> BTreeMap < String , OsString > {
94119 let self_path = std:: fs:: canonicalize ( env:: args ( ) . next ( ) . unwrap ( ) )
95120 . expect ( "Failed to canonicalize absolute path to cargo-ndk" )
@@ -168,6 +193,11 @@ pub(crate) fn build_env(
168193 . into_iter ( )
169194 . collect :: < BTreeMap < String , OsString > > ( ) ;
170195
196+ if link_builtins {
197+ let builtins_path = clang_lib_path ( ndk_home) ;
198+ envs. insert ( "_CARGO_NDK_LINK_BUILTINS" . to_string ( ) , builtins_path. into ( ) ) ;
199+ }
200+
171201 if env:: var ( "MSYSTEM" ) . is_ok ( ) || env:: var ( "CYGWIN" ) . is_ok ( ) {
172202 envs = envs
173203 . into_iter ( )
@@ -214,9 +244,9 @@ pub(crate) fn run(
214244 version : & Version ,
215245 triple : & str ,
216246 platform : u8 ,
247+ link_builtins : bool ,
217248 cargo_args : & [ String ] ,
218249 cargo_manifest : & Path ,
219- #[ allow( unused_variables) ] out_dir : & Utf8PathBuf ,
220250) -> Result < ( std:: process:: ExitStatus , Vec < Artifact > ) > {
221251 if version. major < 23 {
222252 shell. error ( "NDK versions less than r23 are not supported. Install an up-to-date version of the NDK." ) . unwrap ( ) ;
@@ -235,7 +265,7 @@ pub(crate) fn run(
235265 let clang_target = clang_target ( triple, platform) ;
236266 let cargo_bin = env:: var ( "CARGO" ) . unwrap_or_else ( |_| "cargo" . into ( ) ) ;
237267 let mut cargo_cmd = Command :: new ( & cargo_bin) ;
238- let envs = build_env ( triple, ndk_home, & clang_target) ;
268+ let envs = build_env ( triple, ndk_home, & clang_target, link_builtins ) ;
239269
240270 shell
241271 . very_verbose ( |shell| {
0 commit comments