127 lines
4.8 KiB
Rust
127 lines
4.8 KiB
Rust
|
|
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||
|
|
// SPDX-License-Identifier: Apache-2.0 OR ISC
|
||
|
|
|
||
|
|
use std::env;
|
||
|
|
|
||
|
|
fn main() {
|
||
|
|
let has_mutually_exclusive_features = cfg!(feature = "non-fips") && cfg!(feature = "fips");
|
||
|
|
assert!(
|
||
|
|
!has_mutually_exclusive_features,
|
||
|
|
"`fips` and `non-fips` are mutually exclusive crate features."
|
||
|
|
);
|
||
|
|
|
||
|
|
println!("cargo:rustc-check-cfg=cfg(aws_lc_rs_docsrs)");
|
||
|
|
println!("cargo:rustc-check-cfg=cfg(disable_slow_tests)");
|
||
|
|
println!("cargo:rustc-check-cfg=cfg(dev_tests_only)");
|
||
|
|
if let Ok(disable) = env::var("AWS_LC_RS_DISABLE_SLOW_TESTS") {
|
||
|
|
if disable == "1" {
|
||
|
|
println!("cargo:warning=### Slow tests will be disabled! ###");
|
||
|
|
println!("cargo:rustc-cfg=disable_slow_tests");
|
||
|
|
} else {
|
||
|
|
println!("cargo:warning=### Slow tests are enabled: {disable}! ###");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
println!("cargo:rerun-if-env-changed=AWS_LC_RS_DISABLE_SLOW_TESTS");
|
||
|
|
|
||
|
|
let mut enable_dev_test_only = None;
|
||
|
|
if cfg!(feature = "dev-tests-only") {
|
||
|
|
enable_dev_test_only = Some(true);
|
||
|
|
}
|
||
|
|
// Environment variable can override
|
||
|
|
if let Ok(dev_tests) = env::var("AWS_LC_RS_DEV_TESTS_ONLY") {
|
||
|
|
println!("cargo:warning=### AWS_LC_RS_DEV_TESTS_ONLY: '{dev_tests}' ###");
|
||
|
|
enable_dev_test_only = Some(dev_tests == "1");
|
||
|
|
}
|
||
|
|
println!("cargo:rerun-if-env-changed=AWS_LC_RS_DEV_TESTS_ONLY");
|
||
|
|
|
||
|
|
if let Some(dev_test_only) = enable_dev_test_only {
|
||
|
|
if dev_test_only {
|
||
|
|
let profile = env::var("PROFILE").unwrap();
|
||
|
|
if !profile.contains("dev") && !profile.contains("debug") && !profile.contains("test") {
|
||
|
|
println!("cargo:warning=### PROFILE: '{profile}' ###");
|
||
|
|
panic!("dev-tests-only feature only allowed for dev profile builds");
|
||
|
|
}
|
||
|
|
println!("cargo:warning=### Enabling public testing functions! ###");
|
||
|
|
println!("cargo:rustc-cfg=dev_tests_only");
|
||
|
|
} else {
|
||
|
|
println!("cargo:warning=### AWS_LC_RS_DEV_TESTS_ONLY: Public testing functions not enabled! ###");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// This appears asymmetric, but it reflects the `cfg` statements in lib.rs that
|
||
|
|
// require `aws-lc-sys` to be present when "fips" is not enabled.
|
||
|
|
// if `fips` is enabled, then use that
|
||
|
|
let sys_crate = if cfg!(feature = "fips") {
|
||
|
|
"aws-lc-fips-sys"
|
||
|
|
} else if cfg!(feature = "aws-lc-sys") {
|
||
|
|
"aws-lc-sys"
|
||
|
|
} else {
|
||
|
|
panic!(
|
||
|
|
"one of the following features must be specified: `aws-lc-sys`, `non-fips`, or `fips`."
|
||
|
|
);
|
||
|
|
};
|
||
|
|
|
||
|
|
// When using static CRT on Windows MSVC, ignore missing PDB file warnings
|
||
|
|
// The static CRT libraries reference PDB files from Microsoft's build servers
|
||
|
|
// which are not available during linking
|
||
|
|
if env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows")
|
||
|
|
&& env::var("CARGO_CFG_TARGET_ENV").as_deref() == Ok("msvc")
|
||
|
|
&& env::var("CARGO_CFG_TARGET_FEATURE")
|
||
|
|
.is_ok_and(|features| features.contains("crt-static"))
|
||
|
|
{
|
||
|
|
println!("cargo:rustc-link-arg=/ignore:4099");
|
||
|
|
}
|
||
|
|
|
||
|
|
export_sys_vars(sys_crate);
|
||
|
|
}
|
||
|
|
|
||
|
|
fn export_sys_vars(sys_crate: &str) {
|
||
|
|
let prefix = if sys_crate == "aws-lc-fips-sys" {
|
||
|
|
"DEP_AWS_LC_FIPS_"
|
||
|
|
} else {
|
||
|
|
"DEP_AWS_LC_"
|
||
|
|
};
|
||
|
|
|
||
|
|
let mut selected = String::default();
|
||
|
|
let mut candidates = vec![];
|
||
|
|
|
||
|
|
// search through the DEP vars and find the selected sys crate version
|
||
|
|
for (name, value) in std::env::vars() {
|
||
|
|
// if we've selected a prefix then we can go straight to exporting it
|
||
|
|
if !selected.is_empty() {
|
||
|
|
try_export_var(&selected, &name, &value);
|
||
|
|
continue;
|
||
|
|
}
|
||
|
|
|
||
|
|
// we're still looking for a selected prefix
|
||
|
|
if let Some(version) = name.strip_prefix(prefix) {
|
||
|
|
if let Some(version) = version.strip_suffix("_INCLUDE") {
|
||
|
|
// we've found the selected version so update it and export it
|
||
|
|
selected = format!("{prefix}{version}_");
|
||
|
|
try_export_var(&selected, &name, &value);
|
||
|
|
} else {
|
||
|
|
// it started with the expected prefix, but we don't know what the version is yet
|
||
|
|
// so save it for later
|
||
|
|
candidates.push((name, value));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
assert!(!selected.is_empty(), "missing {prefix} include");
|
||
|
|
|
||
|
|
// process all of the remaining candidates
|
||
|
|
for (name, value) in candidates {
|
||
|
|
try_export_var(&selected, &name, &value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
fn try_export_var(selected: &str, name: &str, value: &str) {
|
||
|
|
assert!(!selected.is_empty(), "missing selected prefix");
|
||
|
|
|
||
|
|
if let Some(var) = name.strip_prefix(selected) {
|
||
|
|
eprintln!("cargo:rerun-if-env-changed={name}");
|
||
|
|
let var = var.to_lowercase();
|
||
|
|
println!("cargo:{var}={value}");
|
||
|
|
}
|
||
|
|
}
|