Fixes cfg with target from env (#516)

* Fixes cfg with target from env

* Derive cleanup

* Default to curve25519_dalek_bits="32" on unknown target

* Give out warning (thanks @jcape)

Co-authored-by: ryan <ryankurte@users.noreply.github.com>
Co-authored-by: James Cape <james@mobilecoin.com>
This commit is contained in:
pinkforest(she/her) 2023-03-18 19:34:47 +11:00 committed by GitHub
parent a63e14f4de
commit 99c0520aa7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -4,21 +4,16 @@
#[allow(non_camel_case_types)] #[allow(non_camel_case_types)]
enum DalekBits { enum DalekBits {
#[cfg_attr(curve25519_dalek_bits = "64", allow(dead_code))]
Dalek32, Dalek32,
#[cfg_attr(curve25519_dalek_bits = "32", allow(dead_code))]
Dalek64, Dalek64,
} }
fn main() { fn main() {
#[cfg(curve25519_dalek_bits = "32")] let curve25519_dalek_bits = match std::env::var("CARGO_CFG_CURVE25519_DALEK_BITS").as_deref() {
let curve25519_dalek_bits = DalekBits::Dalek32; Ok("32") => DalekBits::Dalek32,
Ok("64") => DalekBits::Dalek64,
#[cfg(curve25519_dalek_bits = "64")] _ => deterministic::determine_curve25519_dalek_bits(),
let curve25519_dalek_bits = DalekBits::Dalek64; };
#[cfg(all(not(curve25519_dalek_bits = "64"), not(curve25519_dalek_bits = "32")))]
let curve25519_dalek_bits = deterministic::determine_curve25519_dalek_bits();
match curve25519_dalek_bits { match curve25519_dalek_bits {
DalekBits::Dalek64 => println!("cargo:rustc-cfg=curve25519_dalek_bits=\"64\""), DalekBits::Dalek64 => println!("cargo:rustc-cfg=curve25519_dalek_bits=\"64\""),
@ -27,22 +22,19 @@ fn main() {
} }
// Deterministic cfg(curve25519_dalek_bits) when this is not explicitly set. // Deterministic cfg(curve25519_dalek_bits) when this is not explicitly set.
#[cfg(all(not(curve25519_dalek_bits = "64"), not(curve25519_dalek_bits = "32")))]
mod deterministic { mod deterministic {
use super::*; use super::*;
// Standard Cargo TARGET environment variable of triplet is required // Standard Cargo TARGET environment variable of triplet is required
static ERR_MSG_NO_TARGET: &str = "Standard Cargo TARGET environment variable is not set."; static ERR_MSG_NO_TARGET: &str = "Standard Cargo TARGET environment variable is not set";
// Custom Non-Rust standard target platforms require explicit settings. // Custom Non-Rust standard target platforms require explicit settings.
static ERR_MSG_NO_PLATFORM: &str = "Unknown Rust target platform."; static ERR_MSG_NO_PLATFORM: &str = "Unknown Rust target platform.";
// Error handling when the bits setting cannot be determined // Warning when the curve25519_dalek_bits cannot be determined
fn determine_curve25519_dalek_bits_error(cause: &str) -> ! { fn determine_curve25519_dalek_bits_warning(cause: &str) {
eprintln!("Error: {cause}"); println!("cargo:warning=\"Defaulting to curve25519_dalek_bits=32: {cause}\"");
eprintln!("Please set cfg(curve25519_dalek_bits) explicitly either as 32 or 64.");
std::process::exit(1)
} }
// Determine the curve25519_dalek_bits based on Rust standard TARGET triplet // Determine the curve25519_dalek_bits based on Rust standard TARGET triplet
@ -53,13 +45,19 @@ mod deterministic {
// https://doc.rust-lang.org/cargo/reference/environment-variables.html // https://doc.rust-lang.org/cargo/reference/environment-variables.html
let target_triplet = match std::env::var("TARGET") { let target_triplet = match std::env::var("TARGET") {
Ok(t) => t, Ok(t) => t,
Err(_) => determine_curve25519_dalek_bits_error(ERR_MSG_NO_TARGET), Err(_) => {
determine_curve25519_dalek_bits_warning(ERR_MSG_NO_TARGET);
return DalekBits::Dalek32;
}
}; };
// platforms crate is the source of truth used to determine the platform // platforms crate is the source of truth used to determine the platform
let platform = match platforms::Platform::find(&target_triplet) { let platform = match platforms::Platform::find(&target_triplet) {
Some(p) => p, Some(p) => p,
None => determine_curve25519_dalek_bits_error(ERR_MSG_NO_PLATFORM), None => {
determine_curve25519_dalek_bits_warning(ERR_MSG_NO_PLATFORM);
return DalekBits::Dalek32;
}
}; };
#[allow(clippy::match_single_binding)] #[allow(clippy::match_single_binding)]