use cmake;
const CMAKE_PARAMS_ANDROID: &[(&str, &[(&str, &str)])] = &[
("aarch64", &[
("ANDROID_TOOLCHAIN_NAME", "aarch64-linux-android-4.9"),
("ANDROID_NATIVE_API_LEVEL", "21"),
(
"CMAKE_TOOLCHAIN_FILE",
"${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake",
),
]),
("arm", &[
("ANDROID_TOOLCHAIN_NAME", "arm-linux-androideabi-4.9"),
("ANDROID_NATIVE_API_LEVEL", "21"),
(
"CMAKE_TOOLCHAIN_FILE",
"${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake",
),
]),
("x86", &[
("ANDROID_TOOLCHAIN_NAME", "x86-linux-android-4.9"),
("ANDROID_NATIVE_API_LEVEL", "21"),
(
"CMAKE_TOOLCHAIN_FILE",
"${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake",
),
]),
("x86_64", &[
("ANDROID_TOOLCHAIN_NAME", "x86_64-linux-android-4.9"),
("ANDROID_NATIVE_API_LEVEL", "21"),
(
"CMAKE_TOOLCHAIN_FILE",
"${ANDROID_NDK_HOME}/build/cmake/android.toolchain.cmake",
),
]),
];
const CMAKE_PARAMS_IOS: &[(&str, &[(&str, &str)])] = &[
("aarch64", &[
("CMAKE_OSX_ARCHITECTURES", "arm64"),
("CMAKE_OSX_SYSROOT", "iphoneos"),
]),
("arm", &[
("CMAKE_OSX_ARCHITECTURES", "arm"),
("CMAKE_OSX_SYSROOT", "iphoneos"),
]),
("x86", &[
("CMAKE_OSX_ARCHITECTURES", "x86"),
("CMAKE_OSX_SYSROOT", "iphonesimulator"),
]),
("x86_64", &[
("CMAKE_OSX_ARCHITECTURES", "x86_64"),
("CMAKE_OSX_SYSROOT", "iphonesimulator"),
]),
];
fn platform_output_path(lib: &str) -> String {
if cfg!(windows) {
if cfg!(debug_assertions) {
return format!("{}/Debug", lib);
} else {
return format!("{}/RelWithDebInfo", lib);
}
} else {
return format!("{}", lib);
};
}
fn get_boringssl_cmake_config() -> cmake::Config {
let arch = std::env::var("CARGO_CFG_TARGET_ARCH").unwrap();
let os = std::env::var("CARGO_CFG_TARGET_OS").unwrap();
let mut boringssl_cmake = cmake::Config::new("deps/boringssl");
return match os.as_ref() {
"android" => {
let android_ndk_home = std::env::var("ANDROID_NDK_HOME")
.expect("Please set ANDROID_NDK_HOME for Android build");
for (android_arch, params) in CMAKE_PARAMS_ANDROID {
if *android_arch == arch {
for (name, value) in *params {
let value = value
.replace("${ANDROID_NDK_HOME}", &android_ndk_home);
eprintln!("android arch={} add {}={}", arch, name, value);
boringssl_cmake.define(name, value);
}
}
}
boringssl_cmake
},
"ios" => {
for (ios_arch, params) in CMAKE_PARAMS_IOS {
if *ios_arch == arch {
for (name, value) in *params {
eprintln!("ios arch={} add {}={}", arch, name, value);
boringssl_cmake.define(name, value);
}
}
}
boringssl_cmake.define("CMAKE_ASM_FLAGS", "-fembed-bitcode");
boringssl_cmake.cflag("-fembed-bitcode");
boringssl_cmake
},
_ => boringssl_cmake,
};
}
fn main() {
#[cfg(feature = "no_bssl")]
return;
let bssl_dir = std::env::var("QUICHE_BSSL_PATH").unwrap_or_else(|_| {
get_boringssl_cmake_config()
.cflag("-fPIC")
.build_target("bssl")
.build()
.display()
.to_string()
});
let crypto_dir =
format!("{}/build/{}", bssl_dir, platform_output_path("crypto"));
println!("cargo:rustc-link-search=native={}", crypto_dir);
println!("cargo:rustc-link-lib=static=crypto");
let ssl_dir = format!("{}/build/{}", bssl_dir, platform_output_path("ssl"));
println!("cargo:rustc-link-search=native={}", ssl_dir);
println!("cargo:rustc-link-lib=static=ssl");
}