@@ -452,7 +452,7 @@ fn build_multiple_ciphers(target: &str, out_path: &Path) {
452452 let bundled_dir = format ! ( "{out_dir}/sqlite3mc" ) ;
453453 let sqlite3mc_build_dir = env:: current_dir ( ) . unwrap ( ) . join ( out_dir) . join ( "sqlite3mc" ) ;
454454
455- let mut cmake_opts: Vec < & str > = vec ! [ ] ;
455+ let mut cmake_opts: Vec < String > = vec ! [ ] ;
456456
457457 let target_postfix = target. to_string ( ) . replace ( "-" , "_" ) ;
458458 let cross_cc_var_name = format ! ( "CC_{}" , target_postfix) ;
@@ -462,8 +462,15 @@ fn build_multiple_ciphers(target: &str, out_path: &Path) {
462462 let cross_cxx_var_name = format ! ( "CXX_{}" , target_postfix) ;
463463 let cross_cxx = env:: var ( & cross_cxx_var_name) . ok ( ) ;
464464
465- let toolchain_path = sqlite3mc_build_dir. join ( "toolchain.cmake" ) ;
466- let cmake_toolchain_opt = "-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake" . to_string ( ) ;
465+ let ndk_cmake_toolchain_path = env:: var ( "CARGO_NDK_CMAKE_TOOLCHAIN_PATH" ) . ok ( ) ;
466+ let toolchain_path = ndk_cmake_toolchain_path
467+ . clone ( )
468+ . map ( PathBuf :: from)
469+ . unwrap_or_else ( || sqlite3mc_build_dir. join ( "toolchain.cmake" ) ) ;
470+ let cmake_toolchain_opt = ndk_cmake_toolchain_path
471+ . clone ( )
472+ . map ( |path| format ! ( "-DCMAKE_TOOLCHAIN_FILE={}" , path) )
473+ . unwrap_or_else ( || "-DCMAKE_TOOLCHAIN_FILE=toolchain.cmake" . to_string ( ) ) ;
467474
468475 let mut toolchain_file = OpenOptions :: new ( )
469476 . create ( true )
@@ -493,7 +500,7 @@ fn build_multiple_ciphers(target: &str, out_path: &Path) {
493500 panic ! ( "Unsupported cross target {}" , cc)
494501 } ;
495502
496- cmake_opts. push ( & cmake_toolchain_opt) ;
503+ cmake_opts. push ( cmake_toolchain_opt. clone ( ) ) ;
497504 writeln ! ( toolchain_file, "set(CMAKE_SYSTEM_NAME \" {}\" )" , system_name) . unwrap ( ) ;
498505 writeln ! (
499506 toolchain_file,
@@ -508,20 +515,57 @@ fn build_multiple_ciphers(target: &str, out_path: &Path) {
508515 writeln ! ( toolchain_file, "set(CMAKE_CXX_COMPILER {})" , cxx) . unwrap ( ) ;
509516 }
510517
511- cmake_opts. push ( "-DCMAKE_BUILD_TYPE=Release" ) ;
512- cmake_opts. push ( "-DSQLITE3MC_STATIC=ON" ) ;
513- cmake_opts. push ( "-DCODEC_TYPE=AES256" ) ;
514- cmake_opts. push ( "-DSQLITE3MC_BUILD_SHELL=OFF" ) ;
515- cmake_opts. push ( "-DSQLITE_SHELL_IS_UTF8=OFF" ) ;
516- cmake_opts. push ( "-DSQLITE_USER_AUTHENTICATION=OFF" ) ;
517- cmake_opts. push ( "-DSQLITE_SECURE_DELETE=OFF" ) ;
518- cmake_opts. push ( "-DSQLITE_ENABLE_COLUMN_METADATA=ON" ) ;
519- cmake_opts. push ( "-DSQLITE_USE_URI=ON" ) ;
520- cmake_opts. push ( "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" ) ;
518+ cmake_opts. push ( "-DCMAKE_BUILD_TYPE=Release" . to_string ( ) ) ;
519+ cmake_opts. push ( "-DSQLITE3MC_STATIC=ON" . to_string ( ) ) ;
520+ cmake_opts. push ( "-DCODEC_TYPE=AES256" . to_string ( ) ) ;
521+ cmake_opts. push ( "-DSQLITE3MC_BUILD_SHELL=OFF" . to_string ( ) ) ;
522+ cmake_opts. push ( "-DSQLITE_SHELL_IS_UTF8=OFF" . to_string ( ) ) ;
523+ cmake_opts. push ( "-DSQLITE_USER_AUTHENTICATION=OFF" . to_string ( ) ) ;
524+ cmake_opts. push ( "-DSQLITE_SECURE_DELETE=OFF" . to_string ( ) ) ;
525+ cmake_opts. push ( "-DSQLITE_ENABLE_COLUMN_METADATA=ON" . to_string ( ) ) ;
526+ cmake_opts. push ( "-DSQLITE_USE_URI=ON" . to_string ( ) ) ;
527+ cmake_opts. push ( "-DCMAKE_POSITION_INDEPENDENT_CODE=ON" . to_string ( ) ) ;
521528
522529 if target. contains ( "musl" ) {
523- cmake_opts. push ( "-DCMAKE_C_FLAGS=\" -U_FORTIFY_SOURCE\" -D_FILE_OFFSET_BITS=32" ) ;
524- cmake_opts. push ( "-DCMAKE_CXX_FLAGS=\" -U_FORTIFY_SOURCE\" -D_FILE_OFFSET_BITS=32" ) ;
530+ cmake_opts. push ( "-DCMAKE_C_FLAGS=\" -U_FORTIFY_SOURCE\" -D_FILE_OFFSET_BITS=32" . to_string ( ) ) ;
531+ cmake_opts. push ( "-DCMAKE_CXX_FLAGS=\" -U_FORTIFY_SOURCE\" -D_FILE_OFFSET_BITS=32" . to_string ( ) ) ;
532+ }
533+
534+ if target. contains ( "android" ) {
535+ let android_abi = match target {
536+ "aarch64-linux-android" => "arm64-v8a" ,
537+ "armv7-linux-androideabi" => "armeabi-v7a" ,
538+ "i686-linux-android" => "x86" ,
539+ "x86_64-linux-android" => "x86_64" ,
540+ _ => panic ! ( "Unsupported Android target: {}" , target) ,
541+ } ;
542+ let android_platform = std:: env:: var ( "ANDROID_PLATFORM" )
543+ . expect ( "ANDROID_PLATFORM environment variable must be set" ) ;
544+
545+ cmake_opts. push ( cmake_toolchain_opt) ;
546+ cmake_opts. push ( format ! ( "-DANDROID_ABI={}" , android_abi) ) ;
547+ cmake_opts. push ( format ! ( "-DANDROID_PLATFORM=android-{}" , android_platform) ) ;
548+ }
549+
550+ if target. contains ( "ios" ) {
551+ cmake_opts. push ( "-DCMAKE_SYSTEM_NAME=iOS" . to_string ( ) ) ;
552+
553+ let ( arch, processor, sysroot) = if target. contains ( "x86_64" ) {
554+ ( "x86_64" , "x86_64" , "iphonesimulator" )
555+ } else if target. contains ( "aarch64" ) {
556+ let sysroot = if target. contains ( "sim" ) {
557+ "iphonesimulator"
558+ } else {
559+ "iphoneos"
560+ } ;
561+ ( "arm64" , "arm64" , sysroot)
562+ } else {
563+ panic ! ( "Unsupported iOS target: {}" , target) ;
564+ } ;
565+
566+ cmake_opts. push ( format ! ( "-DCMAKE_OSX_ARCHITECTURES={}" , arch) ) ;
567+ cmake_opts. push ( format ! ( "-DCMAKE_SYSTEM_PROCESSOR={}" , processor) ) ;
568+ cmake_opts. push ( format ! ( "-DCMAKE_OSX_SYSROOT={}" , sysroot) ) ;
525569 }
526570
527571 let mut cmake = Command :: new ( "cmake" ) ;
0 commit comments