rustgn

11 commits
Updated 2026-05-09 17:23:41
third_party/rust
third_party/rust/build.rs
//! Takes a 'cargo build script-like' executable and parse its output
//! cmd is <output_dir> <build_script>

fn main() {
    let args: Vec<String> = std::env::args().collect();

    if args.len() != 3 {
        eprintln!("Usage: <output_file> <build_script>");
        std::process::exit(1);
    }

    let output_file = &args[1];
    let build_script = &args[2];

    let build_script_path = if std::path::Path::new(build_script).is_absolute() {
        std::path::PathBuf::from(build_script)
    } else {
        std::env::current_dir().unwrap().join(build_script)
    };

    let output = std::process::Command::new(&build_script_path)
        .output()
        .expect(&format!(
            "Failed to run build script {}",
            build_script_path.to_string_lossy()
        ));

    if !output.status.success() {
        eprintln!("Build script failed");
        let stdout = String::from_utf8_lossy(&output.stdout);
        let stderr = String::from_utf8_lossy(&output.stderr);
        eprintln!("stdout: {}", stdout);
        eprintln!("stderr: {}", stderr);
        std::process::exit(1);
    }

    let stdout = String::from_utf8_lossy(&output.stdout);
    let lines: Vec<&str> = stdout.lines().collect();
    let mut flags: Vec<String> = Vec::new();

    for line in lines {
        if line.starts_with("cargo:rustc-cfg") {
            let flag = line["cargo:rustc-cfg=".len()..].to_string();
            flags.push(format!("--cfg={}", flag));
        }
    }

    let flags: String = flags.join("\n");
    std::fs::write(output_file, flags).expect("Failed to write flags");
}