Skip to content

Commit 3059ba6

Browse files
authored
Merge pull request #78 from signalapp/aarch64-cross-compilation
Add minimal cross-compilation support for Windows and AArch64 Linux
2 parents 3492992 + 3bbb1b9 commit 3059ba6

2 files changed

Lines changed: 75 additions & 53 deletions

File tree

boring-sys/build.rs

Lines changed: 72 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -141,72 +141,91 @@ const BORING_SSL_PATH: &str = "deps/boringssl";
141141
fn 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
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
set(CMAKE_SYSTEM_NAME Linux)
2+
set(CMAKE_SYSTEM_PROCESSOR aarch64)
3+
# Rely on environment variables to set the compiler and include paths.

0 commit comments

Comments
 (0)