cargo / aws-lc-rs / audit
cargo : aws-lc-rs @ 1.17.0
PE Patrick Elsen signed 2026-05-28 published 2026-05-28

build.rs

127 lines · rust

// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.// SPDX-License-Identifier: Apache-2.0 OR ISCuse 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}");    }}