@@ -141,72 +141,91 @@ const BORING_SSL_PATH: &str = "deps/boringssl";
141141fn get_boringssl_cmake_config ( ) -> cmake:: Config {
142142 let arch = std:: env:: var ( "CARGO_CFG_TARGET_ARCH" ) . unwrap ( ) ;
143143 let os = std:: env:: var ( "CARGO_CFG_TARGET_OS" ) . unwrap ( ) ;
144+ let host = std:: env:: var ( "HOST" ) . unwrap ( ) ;
145+ let target = std:: env:: var ( "TARGET" ) . unwrap ( ) ;
144146 let pwd = std:: env:: current_dir ( ) . unwrap ( ) ;
145147
146148 let mut boringssl_cmake = cmake:: Config :: new ( BORING_SSL_PATH ) ;
147-
148- // Add platform-specific parameters.
149- match os. as_ref ( ) {
150- "android" => {
151- // We need ANDROID_NDK_HOME to be set properly.
152- println ! ( "cargo:rerun-if-env-changed=ANDROID_NDK_HOME" ) ;
153- let android_ndk_home = std:: env:: var ( "ANDROID_NDK_HOME" )
154- . expect ( "Please set ANDROID_NDK_HOME for Android build" ) ;
155- let android_ndk_home = std:: path:: Path :: new ( & android_ndk_home) ;
156- for ( name, value) in cmake_params_android ( ) {
157- eprintln ! ( "android arch={} add {}={}" , arch, name, value) ;
158- boringssl_cmake. define ( name, value) ;
159- }
160- let toolchain_file = android_ndk_home. join ( "build/cmake/android.toolchain.cmake" ) ;
161- let toolchain_file = toolchain_file. to_str ( ) . unwrap ( ) ;
162- eprintln ! ( "android toolchain={}" , toolchain_file) ;
163- boringssl_cmake. define ( "CMAKE_TOOLCHAIN_FILE" , toolchain_file) ;
164-
165- // 21 is the minimum level tested. You can give higher value.
166- boringssl_cmake. define ( "ANDROID_NATIVE_API_LEVEL" , "21" ) ;
167- boringssl_cmake. define ( "ANDROID_STL" , "c++_shared" ) ;
168-
169- boringssl_cmake
170- }
171-
172- "ios" => {
173- for ( name, value) in cmake_params_ios ( ) {
174- eprintln ! ( "ios arch={} add {}={}" , arch, name, value) ;
175- boringssl_cmake. define ( name, value) ;
149+ if host != target {
150+ // Add platform-specific parameters for cross-compilation.
151+ match os. as_ref ( ) {
152+ "android" => {
153+ // We need ANDROID_NDK_HOME to be set properly.
154+ println ! ( "cargo:rerun-if-env-changed=ANDROID_NDK_HOME" ) ;
155+ let android_ndk_home = std:: env:: var ( "ANDROID_NDK_HOME" )
156+ . expect ( "Please set ANDROID_NDK_HOME for Android build" ) ;
157+ let android_ndk_home = std:: path:: Path :: new ( & android_ndk_home) ;
158+ for ( name, value) in cmake_params_android ( ) {
159+ eprintln ! ( "android arch={} add {}={}" , arch, name, value) ;
160+ boringssl_cmake. define ( name, value) ;
161+ }
162+ let toolchain_file = android_ndk_home. join ( "build/cmake/android.toolchain.cmake" ) ;
163+ let toolchain_file = toolchain_file. to_str ( ) . unwrap ( ) ;
164+ eprintln ! ( "android toolchain={}" , toolchain_file) ;
165+ boringssl_cmake. define ( "CMAKE_TOOLCHAIN_FILE" , toolchain_file) ;
166+
167+ // 21 is the minimum level tested. You can give higher value.
168+ boringssl_cmake. define ( "ANDROID_NATIVE_API_LEVEL" , "21" ) ;
169+ boringssl_cmake. define ( "ANDROID_STL" , "c++_shared" ) ;
176170 }
177171
178- // Bitcode is always on.
179- let bitcode_cflag = "-fembed-bitcode" ;
180-
181- // Hack for Xcode 10.1.
182- let target_cflag = if arch == "x86_64" {
183- "-target x86_64-apple-ios-simulator"
184- } else {
185- ""
186- } ;
172+ "ios" => {
173+ for ( name, value) in cmake_params_ios ( ) {
174+ eprintln ! ( "ios arch={} add {}={}" , arch, name, value) ;
175+ boringssl_cmake. define ( name, value) ;
176+ }
187177
188- let cflag = format ! ( "{} {}" , bitcode_cflag, target_cflag) ;
178+ // Bitcode is always on.
179+ let bitcode_cflag = "-fembed-bitcode" ;
189180
190- boringssl_cmake. define ( "CMAKE_ASM_FLAGS" , & cflag) ;
191- boringssl_cmake. cflag ( & cflag) ;
181+ // Hack for Xcode 10.1.
182+ let target_cflag = if arch == "x86_64" {
183+ "-target x86_64-apple-ios-simulator"
184+ } else {
185+ ""
186+ } ;
192187
193- boringssl_cmake
194- }
188+ let cflag = format ! ( "{} {}" , bitcode_cflag, target_cflag) ;
189+ boringssl_cmake. define ( "CMAKE_ASM_FLAGS" , & cflag) ;
190+ boringssl_cmake. cflag ( & cflag) ;
191+ }
195192
196- _ => {
197- // Configure BoringSSL for building on 32-bit non-windows platforms.
198- if arch == "x86" && os != "windows" {
199- boringssl_cmake. define (
200- "CMAKE_TOOLCHAIN_FILE" ,
201- pwd. join ( BORING_SSL_PATH )
202- . join ( "src/util/32-bit-toolchain.cmake" )
203- . as_os_str ( ) ,
204- ) ;
193+ "windows" => {
194+ if host. contains ( "windows" ) {
195+ // BoringSSL's CMakeLists.txt isn't set up for cross-compiling using Visual Studio.
196+ // Disable assembly support so that it at least builds.
197+ boringssl_cmake. define ( "OPENSSL_NO_ASM" , "YES" ) ;
198+ }
205199 }
206200
207- boringssl_cmake
201+ "linux" => match arch. as_str ( ) {
202+ "x86" => {
203+ boringssl_cmake. define (
204+ "CMAKE_TOOLCHAIN_FILE" ,
205+ pwd. join ( BORING_SSL_PATH )
206+ . join ( "src/util/32-bit-toolchain.cmake" )
207+ . as_os_str ( ) ,
208+ ) ;
209+ }
210+ "aarch64" => {
211+ boringssl_cmake. define (
212+ "CMAKE_TOOLCHAIN_FILE" ,
213+ pwd. join ( "cmake/aarch64-linux.cmake" ) . as_os_str ( ) ,
214+ ) ;
215+ }
216+ _ => {
217+ eprintln ! (
218+ "warning: no toolchain file configured by boring-sys for {}" ,
219+ target
220+ ) ;
221+ }
222+ } ,
223+
224+ _ => { }
208225 }
209226 }
227+
228+ boringssl_cmake
210229}
211230
212231/// Verify that the toolchains match https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp3678.pdf
0 commit comments