From 7434e35faa2a86987c78e5d2a86a6a06788d7de1 Mon Sep 17 00:00:00 2001 From: Anthony Ramine Date: Mon, 16 Oct 2023 10:36:57 +0200 Subject: [PATCH] Introduce BORING_BSSL_SYSROOT and BORING_BSSL_EXTERNAL_TOOLCHAIN These variables let us configure CMAKE_SYSROOT and CMAKE_{C,CXX,ASM}_EXTERNAL_TOOLCHAIN from env variables without needing an error-prone custom toolchain file. Most users won't need BORING_BSSL_EXTERNAL_TOOLCHAIN, but some packages (such as Homebrew package messense/macos-cross-toolchains/x86_64-unknown-linux-gnu) don't install the sysroot at the root of the GCC installation, so clang-12 cannot find crt1.o and crti.o. Finally, we also set up CMAKE_CROSSCOMPILING and CMAKE_{C,CXX,ASM}_COMPILER_TARGET to make cross compilation work with compilers that have cross-compiling drivers (i.e. clang). We can now cross build boring-sys from macOS to Linux with fips feature turned on: brew tap nox/misc brew install llvm@12.0.0 export PATH="$(brew --prefix llvm@12.0.0)/bin:$PATH" brew tap messense/macos-cross-toolchains brew install x86_64-unknown-linux-gnu export BORING_BSSL_FIPS_EXTERNAL_TOOLCHAIN="$(brew --prefix x86_64-unknown-linux-gnu)/toolchain" export BORING_BSSL_FIPS_SYSROOT="$BORING_BSSL_FIPS_EXTERNAL_TOOLCHAIN/x86_unknown-linux-gnu/sysroot" cargo build --target x86_64-unknown-linux-gnu -p boring-sys --features fips --- boring-sys/build/config.rs | 5 +++++ boring-sys/build/main.rs | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/boring-sys/build/config.rs b/boring-sys/build/config.rs index 588ec8d6..12e89ffa 100644 --- a/boring-sys/build/config.rs +++ b/boring-sys/build/config.rs @@ -27,6 +27,8 @@ pub(crate) struct Env { pub(crate) source_path: Option, pub(crate) precompiled_bcm_o: Option, pub(crate) assume_patched: bool, + pub(crate) sysroot: Option, + pub(crate) compiler_external_toolchain: Option, pub(crate) debug: Option, pub(crate) opt_level: Option, pub(crate) android_ndk_home: Option, @@ -145,6 +147,9 @@ impl Env { precompiled_bcm_o: boringssl_var("BORING_BSSL_PRECOMPILED_BCM_O").map(PathBuf::from), assume_patched: boringssl_var("BORING_BSSL_ASSUME_PATCHED") .is_some_and(|v| !v.is_empty()), + sysroot: boringssl_var("BORING_BSSL_SYSROOT").map(PathBuf::from), + compiler_external_toolchain: boringssl_var("BORING_BSSL_COMPILER_EXTERNAL_TOOLCHAIN") + .map(PathBuf::from), debug: target_var("DEBUG"), opt_level: target_var("OPT_LEVEL"), android_ndk_home: target_var("ANDROID_NDK_HOME").map(Into::into), diff --git a/boring-sys/build/main.rs b/boring-sys/build/main.rs index 9adf9a45..8ddf7ff1 100644 --- a/boring-sys/build/main.rs +++ b/boring-sys/build/main.rs @@ -193,6 +193,23 @@ fn get_boringssl_cmake_config(config: &Config) -> cmake::Config { return boringssl_cmake; } + boringssl_cmake + .define("CMAKE_CROSSCOMPILING", "true") + .define("CMAKE_C_COMPILER_TARGET", &config.target) + .define("CMAKE_CXX_COMPILER_TARGET", &config.target) + .define("CMAKE_ASM_COMPILER_TARGET", &config.target); + + if let Some(sysroot) = &config.env.sysroot { + boringssl_cmake.define("CMAKE_SYSROOT", sysroot); + } + + if let Some(toolchain) = &config.env.compiler_external_toolchain { + boringssl_cmake + .define("CMAKE_C_COMPILER_EXTERNAL_TOOLCHAIN", toolchain) + .define("CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN", toolchain) + .define("CMAKE_ASM_COMPILER_EXTERNAL_TOOLCHAIN", toolchain); + } + // Add platform-specific parameters for cross-compilation. match &*config.target_os { "android" => { @@ -647,6 +664,12 @@ fn main() { .clang_arg("-I") .clang_arg(include_path.display().to_string()); + if let Some(sysroot) = &config.env.sysroot { + builder = builder + .clang_arg("--sysroot") + .clang_arg(&sysroot.display().to_string()); + } + match &*config.target { // bindgen produces alignment tests that cause undefined behavior [1] // when applied to explicitly unaligned types like OSUnalignedU64.