in bindings/rust/extended/s2n-tls-sys/build.rs [85:162]
fn build_vendored() {
let libcrypto = Libcrypto::default();
let mut build = builder(&libcrypto);
build.files(include!("./files.rs"));
// https://doc.rust-lang.org/cargo/reference/environment-variables.html
// * OPT_LEVEL, DEBUG — values of the corresponding variables for the profile currently being built.
// * PROFILE — release for release builds, debug for other builds. This is determined based on if
// the profile inherits from the dev or release profile. Using this environment variable is not
// recommended. Using other environment variables like OPT_LEVEL provide a more correct view of
// the actual settings being used.
if env("OPT_LEVEL") != "0" {
build.define("S2N_BUILD_RELEASE", "1");
build.define("NDEBUG", "1");
// build s2n-tls with LTO if supported
if build.get_compiler().is_like_gnu() {
build
.flag_if_supported("-flto")
.flag_if_supported("-ffat-lto-objects");
}
}
let out_dir = PathBuf::from(env("OUT_DIR"));
let features = FeatureDetector::new(&out_dir, &libcrypto);
let mut feature_names = std::fs::read_dir("lib/tests/features")
.expect("missing features directory")
.flatten()
.filter(|file| {
let file = file.path();
file.extension().map_or(false, |ext| ext == "c")
})
.map(|file| {
file.path()
.file_stem()
.unwrap()
.to_str()
.unwrap()
.to_string()
})
.collect::<Vec<_>>();
feature_names.sort();
for name in &feature_names {
let is_supported = features.supports(name);
eprintln!("{name}: {is_supported}");
if is_supported {
build.define(name, "1");
// stacktraces are only available if execinfo is
if name == "S2N_EXECINFO_AVAILABLE" && option_env("CARGO_FEATURE_STACKTRACE").is_some()
{
build.define("S2N_STACKTRACE", "1");
}
}
}
// don't spit out a bunch of warnings to the end user, since they won't really be able
// to do anything with it
build.warnings(false);
build.compile("s2n-tls");
// linking to the libcrypto is handled by the rust compiler through the
// `extern crate aws_lc_rs as _;` statement included in the generated source
// files. This is less brittle than manually linking the libcrypto artifact.
// let consumers know where to find our header files
let include_dir = out_dir.join("include");
std::fs::create_dir_all(&include_dir).unwrap();
std::fs::copy("lib/api/s2n.h", include_dir.join("s2n.h")).unwrap();
println!("cargo:include={}", include_dir.display());
}