use std::env;
fn main() {
let timestamp = chrono::Utc::now().to_rfc3339();
println!("cargo:rustc-env=VERGEN_BUILD_TIMESTAMP={timestamp}");
if let Ok(output) = std::process::Command::new("git")
.args(["rev-parse", "HEAD"])
.output()
{
if output.status.success() {
let git_hash = String::from_utf8_lossy(&output.stdout);
println!("cargo:rustc-env=VERGEN_GIT_SHA={}", git_hash.trim());
}
}
if let Ok(output) = std::process::Command::new("git")
.args(["rev-parse", "--abbrev-ref", "HEAD"])
.output()
{
if output.status.success() {
let git_branch = String::from_utf8_lossy(&output.stdout);
println!("cargo:rustc-env=VERGEN_GIT_BRANCH={}", git_branch.trim());
}
}
let rustc_version = rustc_version::version().unwrap();
println!("cargo:rustc-env=VERGEN_RUSTC_SEMVER={rustc_version}");
let target = env::var("TARGET").unwrap();
println!("cargo:rustc-env=VERGEN_CARGO_TARGET_TRIPLE={target}");
let profile = env::var("PROFILE").unwrap();
println!("cargo:rustc-env=VERGEN_CARGO_PROFILE={profile}");
println!("cargo:rerun-if-changed=.git/HEAD");
validate_features();
validate_scirs2_dependencies();
}
fn validate_scirs2_dependencies() {
const EXPECTED_SCIRS2_VERSION: &str = "0.1.0-rc.2";
println!("cargo:rustc-env=EXPECTED_SCIRS2_VERSION={EXPECTED_SCIRS2_VERSION}");
let deprecated_deps = [
"num-complex",
"ndarray",
"rand",
"rand_distr",
"num-traits",
"num-integer",
"rayon",
];
println!("cargo:warning=QuantRS2 SciRS2 Policy: Using scirs2-core v{EXPECTED_SCIRS2_VERSION}");
println!(
"cargo:warning=Deprecated dependencies to avoid: {}",
deprecated_deps.join(", ")
);
}
fn validate_features() {
let mut warnings: Vec<&str> = Vec::new();
let mut errors: Vec<&str> = Vec::new();
let mut info: Vec<String> = Vec::new();
let mut feature_count = 0;
#[cfg(feature = "circuit")]
{
feature_count += 1;
}
#[cfg(feature = "sim")]
{
feature_count += 1;
}
#[cfg(feature = "ml")]
{
feature_count += 1;
}
#[cfg(feature = "device")]
{
feature_count += 1;
}
#[cfg(feature = "anneal")]
{
feature_count += 1;
}
#[cfg(feature = "tytan")]
{
feature_count += 1;
}
#[cfg(feature = "symengine")]
{
feature_count += 1;
}
info.push(format!("Enabled features: {feature_count}/7"));
#[cfg(all(feature = "sim", not(feature = "circuit")))]
{
errors.push("Feature 'sim' requires 'circuit' to be enabled. Please enable both features or use 'sim' feature which includes 'circuit'.");
}
#[cfg(all(feature = "ml", not(feature = "sim")))]
{
errors.push("Feature 'ml' requires 'sim' to be enabled. Please enable both features.");
}
#[cfg(all(feature = "ml", not(feature = "anneal")))]
{
errors.push("Feature 'ml' requires 'anneal' to be enabled. Please enable both features.");
}
#[cfg(all(feature = "tytan", not(feature = "anneal")))]
{
errors
.push("Feature 'tytan' requires 'anneal' to be enabled. Please enable both features.");
}
#[cfg(all(feature = "device", not(feature = "circuit")))]
{
warnings.push("Feature 'device' works best with 'circuit' feature enabled.");
}
#[cfg(all(feature = "ml", not(feature = "device")))]
{
warnings.push("You have enabled 'ml' but not 'device'. Consider enabling 'device' for hardware execution of ML algorithms.");
}
#[cfg(all(feature = "anneal", not(feature = "tytan")))]
{
info.push(
"Consider enabling 'tytan' for high-level annealing DSL alongside 'anneal'".to_string(),
);
}
#[cfg(feature = "full")]
{
info.push("Full feature set enabled - all QuantRS2 modules available".to_string());
info.push("Note: This increases compilation time significantly".to_string());
}
if feature_count == 1 {
#[cfg(feature = "circuit")]
{
info.push(
"Tip: Enable 'sim' feature to add quantum simulation capabilities".to_string(),
);
}
#[cfg(feature = "anneal")]
{
info.push("Tip: Enable 'tytan' for high-level annealing interface".to_string());
}
}
#[cfg(target_os = "macos")]
{
info.push("Platform: macOS (Metal GPU support available)".to_string());
}
#[cfg(target_os = "linux")]
{
info.push("Platform: Linux (CUDA/OpenCL GPU support available)".to_string());
}
#[cfg(target_os = "windows")]
{
info.push("Platform: Windows (CUDA/DirectX GPU support available)".to_string());
}
#[cfg(target_arch = "x86_64")]
{
info.push("Architecture: x86_64 (AVX2/AVX-512 SIMD available)".to_string());
}
#[cfg(target_arch = "aarch64")]
{
info.push("Architecture: aarch64 (NEON SIMD available)".to_string());
}
if feature_count == 0 {
warnings.push("No optional features enabled. Consider enabling 'circuit' for basic functionality or 'full' for all features.");
}
if std::env::var("CARGO_TERM_VERBOSE").is_ok() {
for msg in &info {
println!("cargo:warning=QuantRS2 Info: {msg}");
}
}
let _ = &info;
for warning in &warnings {
println!("cargo:warning=QuantRS2 Feature Warning: {warning}");
}
if !errors.is_empty() {
eprintln!("\n╔════════════════════════════════════════════════════════════╗");
eprintln!("║ QuantRS2 Build Configuration Errors ║");
eprintln!("╚════════════════════════════════════════════════════════════╝\n");
for error in &errors {
eprintln!(" ❌ {error}\n");
}
eprintln!("╔════════════════════════════════════════════════════════════╗");
eprintln!("║ Recommended Feature Configurations: ║");
eprintln!("╠════════════════════════════════════════════════════════════╣");
eprintln!("║ • Basic quantum circuits: ║");
eprintln!("║ features = [\"circuit\"] ║");
eprintln!("║ ║");
eprintln!("║ • Quantum simulation: ║");
eprintln!("║ features = [\"sim\"] (automatically includes circuit) ║");
eprintln!("║ ║");
eprintln!("║ • Quantum machine learning: ║");
eprintln!("║ features = [\"ml\"] (includes sim, anneal, circuit) ║");
eprintln!("║ ║");
eprintln!("║ • Full features: ║");
eprintln!("║ features = [\"full\"] ║");
eprintln!("╚════════════════════════════════════════════════════════════╝\n");
panic!("Build failed due to invalid feature configuration");
}
if warnings.is_empty() {
println!("cargo:warning=✅ QuantRS2 feature configuration validated successfully");
}
}