use std::{env, ffi::OsString, path::PathBuf};
macro_rules! export {
() => {};
($(#[$meta:meta])* $f:ident -> String = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> String {
env::var_os(stringify!($var))
.expect(concat!("cargo buildscript env var $", stringify!($var), " not found"))
.into_string()
.expect(concat!("cargo buildscript env var $", stringify!($var), " contained invalid UTF-8"))
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> Option<String> = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> Option<String> {
env::var_os(stringify!($var)).map(|it| it
.into_string()
.expect(concat!("cargo buildscript env var $", stringify!($var), " contained invalid UTF-8"))
)
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> usize = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> usize {
env::var_os(stringify!($var))
.expect(concat!("cargo buildscript env var $", stringify!($var), " not found"))
.into_string()
.expect(concat!("cargo buildscript env var $", stringify!($var), " contained invalid UTF-8"))
.parse()
.expect(concat!("cargo buildscript env var $", stringify!($var), " did not parse as `usize`"))
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> Vec<String> = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> Vec<String> {
env::var_os(stringify!($var))
.expect(concat!("cargo buildscript env var $", stringify!($var), " not found"))
.into_string()
.expect(concat!("cargo buildscript env var $", stringify!($var), " contained invalid UTF-8"))
.split(',')
.map(Into::into)
.collect()
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> bool = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> bool {
env::var_os(stringify!($var))
.is_some()
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> PathBuf = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> PathBuf {
env::var_os(stringify!($var))
.expect(concat!("cargo buildscript env var $", stringify!($var), " not found"))
.into()
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> Option<PathBuf> = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> Option<PathBuf> {
env::var_os(stringify!($var))
.map(Into::into)
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> OsString = $var:ident $(; $($rest:tt)*)? ) => {
$(#[$meta])*
pub fn $f() -> OsString {
env::var_os(stringify!($var))
.expect(concat!("cargo buildscript env var $", stringify!($var), " not found"))
}
$(export! {
$($rest)*
})?
};
($(#[$meta:meta])* $f:ident -> $out:ty = $var:ident $(; $($rest:tt)*)? ) => {
compile_error!(concat!("Provided unknown output type ", stringify!($out), " to export!"));
$(export! {
$($rest)*
})?
};
}
export! {
cargo -> PathBuf = CARGO;
cargo_manifest_dir -> PathBuf = CARGO_MANIFEST_DIR;
cargo_manifest_links -> String = CARGO_MANIFEST_LINKS;
cargo_makeflags -> OsString = CARGO_MAKEFLAGS;
cargo_cfg_unix -> bool = CARGO_CFG_UNIX;
cargo_cfg_windows -> bool = CARGO_CFG_WINDOWS;
cargo_cfg_target_family -> Vec<String> = CARGO_CFG_TARGET_FAMILY;
cargo_cfg_target_os -> String = CARGO_CFG_TARGET_OS;
cargo_cfg_target_arch -> String = CARGO_CFG_TARGET_ARCH;
cargo_cfg_target_vendor -> String = CARGO_CFG_TARGET_VENDOR;
cargo_cfg_target_env -> String = CARGO_CFG_TARGET_ENV;
cargo_cfg_pointer_width -> usize = CARGO_CFG_TARGET_POINTER_WIDTH;
cargo_cfg_target_endian -> String = CARGO_CFG_TARGET_ENDIAN;
cargo_cfg_target_feature -> Vec<String> = CARGO_CFG_TARGET_FEATURE;
out_dir -> PathBuf = OUT_DIR;
target -> String = TARGET;
host -> String = HOST;
num_jobs -> String = NUM_JOBS;
opt_level -> String = OPT_LEVEL;
debug -> String = DEBUG;
profile -> String = PROFILE;
rustc -> PathBuf = RUSTC;
rustdoc -> PathBuf = RUSTDOC;
rustc_wrapper -> Option<PathBuf> = RUSTC_WRAPPER;
rustc_workspace_wrapper -> Option<PathBuf> = RUSTC_WORKSPACE_WRAPPER;
rustc_linker -> Option<PathBuf> = RUSTC_LINKER;
cargo_pkg_version -> String = CARGO_PKG_VERSION;
cargo_pkg_version_major -> usize = CARGO_PKG_VERSION_MAJOR;
cargo_pkg_version_minor -> usize = CARGO_PKG_VERSION_MINOR;
cargo_pkg_version_patch -> usize = CARGO_PKG_VERSION_PATCH;
cargo_pkg_version_pre -> String = CARGO_PKG_VERSION_PRE;
cargo_pkg_name -> String = CARGO_PKG_NAME;
cargo_pkg_description -> String = CARGO_PKG_DESCRIPTION;
cargo_pkg_homepage -> String = CARGO_PKG_HOMEPAGE;
cargo_pkg_repository -> String = CARGO_PKG_REPOSITORY;
cargo_pkg_license -> String = CARGO_PKG_LICENSE;
cargo_pkg_license_file -> String = CARGO_PKG_LICENSE_FILE;
}
pub fn cargo_feature(name: &str) -> bool {
let key = format!("CARGO_FEATURE_{}", name.to_uppercase().replace('-', "_"));
env::var_os(key).is_some()
}
pub fn cargo_cfg(cfg: &str) -> Option<Vec<String>> {
let key = format!("CARGO_CFG_{}", cfg.to_uppercase().replace('-', "_"));
let val = env::var_os(&key)?.into_string().unwrap_or_else(|_| {
panic!("cargo buildscript env var ${key} contained invalid UTF-8");
});
Some(val.split(',').map(Into::into).collect())
}
pub fn dep(name: &str, key: &str) -> Option<String> {
let key = format!(
"DEP_{}_{}",
name.to_uppercase().replace('-', "_"),
key.to_uppercase().replace('-', "_")
);
let val = env::var_os(&key)?.into_string().unwrap_or_else(|_| {
panic!("cargo buildscript env var ${key} contained invalid UTF-8");
});
Some(val)
}
pub fn cargo_encoded_rustflags() -> Vec<String> {
let val = env::var_os("CARGO_ENCODED_RUSTFLAGS")
.expect("cargo buildscript env var $CARGO_ENCODED_RUSTFLAGS")
.into_string()
.expect("cargo buildscript env var $CARGO_ENCODED_RUSTFLAGS contained invalid UTF-8");
val.split('\x1f').map(Into::into).collect()
}
pub fn cargo_pkg_authors() -> Vec<String> {
let val = env::var_os("CARGO_PKG_AUTHORS")
.expect("cargo buildscript env var $CARGO_PKG_AUTHORS")
.into_string()
.expect("cargo buildscript env var $CARGO_PKG_AUTHORS contained invalid UTF-8");
val.split(':').map(Into::into).collect()
}