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
This commit is contained in:
Anthony Ramine 2023-10-16 10:36:57 +02:00 committed by Alessandro Ghedini
parent ba0ea33ab4
commit 7434e35faa
2 changed files with 28 additions and 0 deletions

View File

@ -27,6 +27,8 @@ pub(crate) struct Env {
pub(crate) source_path: Option<PathBuf>, pub(crate) source_path: Option<PathBuf>,
pub(crate) precompiled_bcm_o: Option<PathBuf>, pub(crate) precompiled_bcm_o: Option<PathBuf>,
pub(crate) assume_patched: bool, pub(crate) assume_patched: bool,
pub(crate) sysroot: Option<PathBuf>,
pub(crate) compiler_external_toolchain: Option<PathBuf>,
pub(crate) debug: Option<OsString>, pub(crate) debug: Option<OsString>,
pub(crate) opt_level: Option<OsString>, pub(crate) opt_level: Option<OsString>,
pub(crate) android_ndk_home: Option<PathBuf>, pub(crate) android_ndk_home: Option<PathBuf>,
@ -145,6 +147,9 @@ impl Env {
precompiled_bcm_o: boringssl_var("BORING_BSSL_PRECOMPILED_BCM_O").map(PathBuf::from), precompiled_bcm_o: boringssl_var("BORING_BSSL_PRECOMPILED_BCM_O").map(PathBuf::from),
assume_patched: boringssl_var("BORING_BSSL_ASSUME_PATCHED") assume_patched: boringssl_var("BORING_BSSL_ASSUME_PATCHED")
.is_some_and(|v| !v.is_empty()), .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"), debug: target_var("DEBUG"),
opt_level: target_var("OPT_LEVEL"), opt_level: target_var("OPT_LEVEL"),
android_ndk_home: target_var("ANDROID_NDK_HOME").map(Into::into), android_ndk_home: target_var("ANDROID_NDK_HOME").map(Into::into),

View File

@ -193,6 +193,23 @@ fn get_boringssl_cmake_config(config: &Config) -> cmake::Config {
return boringssl_cmake; 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. // Add platform-specific parameters for cross-compilation.
match &*config.target_os { match &*config.target_os {
"android" => { "android" => {
@ -647,6 +664,12 @@ fn main() {
.clang_arg("-I") .clang_arg("-I")
.clang_arg(include_path.display().to_string()); .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 { match &*config.target {
// bindgen produces alignment tests that cause undefined behavior [1] // bindgen produces alignment tests that cause undefined behavior [1]
// when applied to explicitly unaligned types like OSUnalignedU64. // when applied to explicitly unaligned types like OSUnalignedU64.