mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-03 22:49:17 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
use std::env;
 | 
						|
#[cfg(unix)]
 | 
						|
use std::os::unix::process::CommandExt;
 | 
						|
use std::process::Command;
 | 
						|
 | 
						|
include!("../build_system/shared_utils.rs");
 | 
						|
 | 
						|
fn main() {
 | 
						|
    let current_exe = env::current_exe().unwrap();
 | 
						|
    let mut sysroot = current_exe.parent().unwrap();
 | 
						|
    if sysroot.file_name().unwrap().to_str().unwrap() == "bin" {
 | 
						|
        sysroot = sysroot.parent().unwrap();
 | 
						|
    }
 | 
						|
 | 
						|
    let mut rustflags = vec!["-Cpanic=abort".to_owned(), "-Zpanic-abort-tests".to_owned()];
 | 
						|
    if let Some(name) = option_env!("BUILTIN_BACKEND") {
 | 
						|
        rustflags.push(format!("-Zcodegen-backend={name}"));
 | 
						|
    } else {
 | 
						|
        let dylib = sysroot.join(if cfg!(windows) { "bin" } else { "lib" }).join(
 | 
						|
            env::consts::DLL_PREFIX.to_string()
 | 
						|
                + "rustc_codegen_cranelift"
 | 
						|
                + env::consts::DLL_SUFFIX,
 | 
						|
        );
 | 
						|
        rustflags.push(format!("-Zcodegen-backend={}", dylib.to_str().unwrap()));
 | 
						|
    }
 | 
						|
    rustflags.push("--sysroot".to_owned());
 | 
						|
    rustflags.push(sysroot.to_str().unwrap().to_owned());
 | 
						|
 | 
						|
    let cargo = if let Some(cargo) = option_env!("CARGO") {
 | 
						|
        cargo
 | 
						|
    } else {
 | 
						|
        // Ensure that the right toolchain is used
 | 
						|
        env::set_var("RUSTUP_TOOLCHAIN", option_env!("TOOLCHAIN_NAME").expect("TOOLCHAIN_NAME"));
 | 
						|
        "cargo"
 | 
						|
    };
 | 
						|
 | 
						|
    let mut args = env::args().skip(1).collect::<Vec<_>>();
 | 
						|
    if args.get(0).map(|arg| &**arg) == Some("clif") {
 | 
						|
        // Avoid infinite recursion when invoking `cargo-clif` as cargo subcommand using
 | 
						|
        // `cargo clif`.
 | 
						|
        args.remove(0);
 | 
						|
    }
 | 
						|
 | 
						|
    let args: Vec<_> = match args.get(0).map(|arg| &**arg) {
 | 
						|
        Some("jit") => {
 | 
						|
            rustflags.push("-Cprefer-dynamic".to_owned());
 | 
						|
            args.remove(0);
 | 
						|
            IntoIterator::into_iter(["rustc".to_string()])
 | 
						|
                .chain(args)
 | 
						|
                .chain([
 | 
						|
                    "--".to_string(),
 | 
						|
                    "-Zunstable-options".to_string(),
 | 
						|
                    "-Cllvm-args=mode=jit".to_string(),
 | 
						|
                ])
 | 
						|
                .collect()
 | 
						|
        }
 | 
						|
        Some("lazy-jit") => {
 | 
						|
            rustflags.push("-Cprefer-dynamic".to_owned());
 | 
						|
            args.remove(0);
 | 
						|
            IntoIterator::into_iter(["rustc".to_string()])
 | 
						|
                .chain(args)
 | 
						|
                .chain([
 | 
						|
                    "--".to_string(),
 | 
						|
                    "-Zunstable-options".to_string(),
 | 
						|
                    "-Cllvm-args=mode=jit-lazy".to_string(),
 | 
						|
                ])
 | 
						|
                .collect()
 | 
						|
        }
 | 
						|
        _ => args,
 | 
						|
    };
 | 
						|
 | 
						|
    let mut cmd = Command::new(cargo);
 | 
						|
    cmd.args(args);
 | 
						|
    rustflags_to_cmd_env(
 | 
						|
        &mut cmd,
 | 
						|
        "RUSTFLAGS",
 | 
						|
        &rustflags_from_env("RUSTFLAGS")
 | 
						|
            .into_iter()
 | 
						|
            .chain(rustflags.iter().map(|flag| flag.clone()))
 | 
						|
            .collect::<Vec<_>>(),
 | 
						|
    );
 | 
						|
    rustflags_to_cmd_env(
 | 
						|
        &mut cmd,
 | 
						|
        "RUSTDOCFLAGS",
 | 
						|
        &rustflags_from_env("RUSTDOCFLAGS")
 | 
						|
            .into_iter()
 | 
						|
            .chain(rustflags.iter().map(|flag| flag.clone()))
 | 
						|
            .collect::<Vec<_>>(),
 | 
						|
    );
 | 
						|
 | 
						|
    #[cfg(unix)]
 | 
						|
    panic!("Failed to spawn cargo: {}", cmd.exec());
 | 
						|
 | 
						|
    #[cfg(not(unix))]
 | 
						|
    std::process::exit(cmd.spawn().unwrap().wait().unwrap().code().unwrap_or(1));
 | 
						|
}
 |