@@ -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,58 @@ 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
532+ . push ( "-DCMAKE_CXX_FLAGS=\" -U_FORTIFY_SOURCE\" -D_FILE_OFFSET_BITS=32" . to_string ( ) ) ;
533+ }
534+
535+ if target. contains ( "android" ) {
536+ let android_abi = match target {
537+ "aarch64-linux-android" => "arm64-v8a" ,
538+ "armv7-linux-androideabi" => "armeabi-v7a" ,
539+ "i686-linux-android" => "x86" ,
540+ "x86_64-linux-android" => "x86_64" ,
541+ _ => panic ! ( "Unsupported Android target: {}" , target) ,
542+ } ;
543+ let android_platform = std:: env:: var ( "ANDROID_PLATFORM" )
544+ . expect ( "ANDROID_PLATFORM environment variable must be set" ) ;
545+
546+ cmake_opts. push ( cmake_toolchain_opt) ;
547+ cmake_opts. push ( format ! ( "-DANDROID_ABI={}" , android_abi) ) ;
548+ cmake_opts. push ( format ! ( "-DANDROID_PLATFORM=android-{}" , android_platform) ) ;
549+ }
550+
551+ if target. contains ( "ios" ) {
552+ cmake_opts. push ( "-DCMAKE_SYSTEM_NAME=iOS" . to_string ( ) ) ;
553+
554+ let ( arch, processor, sysroot) = if target. contains ( "x86_64" ) {
555+ ( "x86_64" , "x86_64" , "iphonesimulator" )
556+ } else if target. contains ( "aarch64" ) {
557+ let sysroot = if target. contains ( "sim" ) {
558+ "iphonesimulator"
559+ } else {
560+ "iphoneos"
561+ } ;
562+ ( "arm64" , "arm64" , sysroot)
563+ } else {
564+ panic ! ( "Unsupported iOS target: {}" , target) ;
565+ } ;
566+
567+ cmake_opts. push ( format ! ( "-DCMAKE_OSX_ARCHITECTURES={}" , arch) ) ;
568+ cmake_opts. push ( format ! ( "-DCMAKE_SYSTEM_PROCESSOR={}" , processor) ) ;
569+ cmake_opts. push ( format ! ( "-DCMAKE_OSX_SYSROOT={}" , sysroot) ) ;
525570 }
526571
527572 let mut cmake = Command :: new ( "cmake" ) ;
0 commit comments