Merge commit '9f33f846dd
'
This commit is contained in:
commit
7c177d5e6c
12 changed files with 85 additions and 41 deletions
|
@ -150,6 +150,8 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
|
|||
"debug"
|
||||
};
|
||||
|
||||
// We have a different environment variable than RUSTFLAGS to make sure those flags are only
|
||||
// sent to rustc_codegen_gcc and not the LLVM backend.
|
||||
if let Ok(cg_rustflags) = std::env::var("CG_RUSTFLAGS") {
|
||||
rustflags.push(' ');
|
||||
rustflags.push_str(&cg_rustflags);
|
||||
|
@ -184,8 +186,12 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
|
|||
fn build_codegen(args: &mut BuildArg) -> Result<(), String> {
|
||||
let mut env = HashMap::new();
|
||||
|
||||
env.insert("LD_LIBRARY_PATH".to_string(), args.config_info.gcc_path.clone());
|
||||
env.insert("LIBRARY_PATH".to_string(), args.config_info.gcc_path.clone());
|
||||
let gcc_path =
|
||||
args.config_info.gcc_path.clone().expect(
|
||||
"The config module should have emitted an error if the GCC path wasn't provided",
|
||||
);
|
||||
env.insert("LD_LIBRARY_PATH".to_string(), gcc_path.clone());
|
||||
env.insert("LIBRARY_PATH".to_string(), gcc_path);
|
||||
|
||||
if args.config_info.no_default_features {
|
||||
env.insert("RUSTFLAGS".to_string(), "-Csymbol-mangling-version=v0".to_string());
|
||||
|
|
|
@ -112,7 +112,7 @@ pub struct ConfigInfo {
|
|||
pub sysroot_panic_abort: bool,
|
||||
pub cg_backend_path: String,
|
||||
pub sysroot_path: String,
|
||||
pub gcc_path: String,
|
||||
pub gcc_path: Option<String>,
|
||||
config_file: Option<String>,
|
||||
// This is used in particular in rust compiler bootstrap because it doesn't run at the root
|
||||
// of the `cg_gcc` folder, making it complicated for us to get access to local files we need
|
||||
|
@ -173,6 +173,14 @@ impl ConfigInfo {
|
|||
"--release-sysroot" => self.sysroot_release_channel = true,
|
||||
"--release" => self.channel = Channel::Release,
|
||||
"--sysroot-panic-abort" => self.sysroot_panic_abort = true,
|
||||
"--gcc-path" => match args.next() {
|
||||
Some(arg) if !arg.is_empty() => {
|
||||
self.gcc_path = Some(arg.into());
|
||||
}
|
||||
_ => {
|
||||
return Err("Expected a value after `--gcc-path`, found nothing".to_string());
|
||||
}
|
||||
},
|
||||
"--cg_gcc-path" => match args.next() {
|
||||
Some(arg) if !arg.is_empty() => {
|
||||
self.cg_gcc_path = Some(arg.into());
|
||||
|
@ -260,8 +268,9 @@ impl ConfigInfo {
|
|||
create_symlink(&libgccjit_so, output_dir.join(&format!("{}.0", libgccjit_so_name)))?;
|
||||
}
|
||||
|
||||
self.gcc_path = output_dir.display().to_string();
|
||||
println!("Using `{}` as path for libgccjit", self.gcc_path);
|
||||
let gcc_path = output_dir.display().to_string();
|
||||
println!("Using `{}` as path for libgccjit", gcc_path);
|
||||
self.gcc_path = Some(gcc_path);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -273,6 +282,15 @@ impl ConfigInfo {
|
|||
}
|
||||
|
||||
pub fn setup_gcc_path(&mut self) -> Result<(), String> {
|
||||
// If the user used the `--gcc-path` option, no need to look at `config.toml` content
|
||||
// since we already have everything we need.
|
||||
if let Some(gcc_path) = &self.gcc_path {
|
||||
println!(
|
||||
"`--gcc-path` was provided, ignoring config file. Using `{}` as path for libgccjit",
|
||||
gcc_path
|
||||
);
|
||||
return Ok(());
|
||||
}
|
||||
let config_file = match self.config_file.as_deref() {
|
||||
Some(config_file) => config_file.into(),
|
||||
None => self.compute_path("config.toml"),
|
||||
|
@ -283,12 +301,15 @@ impl ConfigInfo {
|
|||
self.download_gccjit_if_needed()?;
|
||||
return Ok(());
|
||||
}
|
||||
self.gcc_path = match gcc_path {
|
||||
Some(path) => path,
|
||||
None => {
|
||||
return Err(format!("missing `gcc-path` value from `{}`", config_file.display(),));
|
||||
}
|
||||
let Some(gcc_path) = gcc_path else {
|
||||
return Err(format!("missing `gcc-path` value from `{}`", config_file.display()));
|
||||
};
|
||||
println!(
|
||||
"GCC path retrieved from `{}`. Using `{}` as path for libgccjit",
|
||||
config_file.display(),
|
||||
gcc_path
|
||||
);
|
||||
self.gcc_path = Some(gcc_path);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
@ -299,10 +320,17 @@ impl ConfigInfo {
|
|||
) -> Result<(), String> {
|
||||
env.insert("CARGO_INCREMENTAL".to_string(), "0".to_string());
|
||||
|
||||
if self.gcc_path.is_empty() && !use_system_gcc {
|
||||
self.setup_gcc_path()?;
|
||||
}
|
||||
env.insert("GCC_PATH".to_string(), self.gcc_path.clone());
|
||||
let gcc_path = if !use_system_gcc {
|
||||
if self.gcc_path.is_none() {
|
||||
self.setup_gcc_path()?;
|
||||
}
|
||||
self.gcc_path.clone().expect(
|
||||
"The config module should have emitted an error if the GCC path wasn't provided",
|
||||
)
|
||||
} else {
|
||||
String::new()
|
||||
};
|
||||
env.insert("GCC_PATH".to_string(), gcc_path.clone());
|
||||
|
||||
if self.cargo_target_dir.is_empty() {
|
||||
match env.get("CARGO_TARGET_DIR").filter(|dir| !dir.is_empty()) {
|
||||
|
@ -381,6 +409,8 @@ impl ConfigInfo {
|
|||
}
|
||||
|
||||
// This environment variable is useful in case we want to change options of rustc commands.
|
||||
// We have a different environment variable than RUSTFLAGS to make sure those flags are
|
||||
// only sent to rustc_codegen_gcc and not the LLVM backend.
|
||||
if let Some(cg_rustflags) = env.get("CG_RUSTFLAGS") {
|
||||
rustflags.extend_from_slice(&split_args(&cg_rustflags)?);
|
||||
}
|
||||
|
@ -414,7 +444,7 @@ impl ConfigInfo {
|
|||
"{target}:{sysroot}:{gcc_path}",
|
||||
target = self.cargo_target_dir,
|
||||
sysroot = sysroot.display(),
|
||||
gcc_path = self.gcc_path,
|
||||
gcc_path = gcc_path,
|
||||
);
|
||||
env.insert("LIBRARY_PATH".to_string(), ld_library_path.clone());
|
||||
env.insert("LD_LIBRARY_PATH".to_string(), ld_library_path.clone());
|
||||
|
@ -459,6 +489,7 @@ impl ConfigInfo {
|
|||
--release-sysroot : Build sysroot in release mode
|
||||
--sysroot-panic-abort : Build the sysroot without unwinding support
|
||||
--config-file : Location of the config file to be used
|
||||
--gcc-path : Location of the GCC root folder
|
||||
--cg_gcc-path : Location of the rustc_codegen_gcc root folder (used
|
||||
when ran from another directory)
|
||||
--no-default-features : Add `--no-default-features` flag to cargo commands
|
||||
|
|
|
@ -14,6 +14,8 @@ pub fn run() -> Result<(), String> {
|
|||
}
|
||||
config.no_download = true;
|
||||
config.setup_gcc_path()?;
|
||||
println!("{}", config.gcc_path);
|
||||
if let Some(gcc_path) = config.gcc_path {
|
||||
println!("{}", gcc_path);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -34,11 +34,11 @@ Options:
|
|||
--help : Displays this help message.
|
||||
|
||||
Commands:
|
||||
cargo : Executes a cargo command.
|
||||
cargo : Executes a cargo command.
|
||||
rustc : Compiles the program using the GCC compiler.
|
||||
clean : Cleans the build directory, removing all compiled files and artifacts.
|
||||
prepare : Prepares the environment for building, including fetching dependencies and setting up configurations.
|
||||
build : Compiles the project.
|
||||
build : Compiles the project.
|
||||
test : Runs tests for the project.
|
||||
info : Displays information about the build environment and project configuration.
|
||||
clone-gcc : Clones the GCC compiler from a specified source.
|
||||
|
|
|
@ -1229,8 +1229,11 @@ pub fn run() -> Result<(), String> {
|
|||
|
||||
if !args.use_system_gcc {
|
||||
args.config_info.setup_gcc_path()?;
|
||||
env.insert("LIBRARY_PATH".to_string(), args.config_info.gcc_path.clone());
|
||||
env.insert("LD_LIBRARY_PATH".to_string(), args.config_info.gcc_path.clone());
|
||||
let gcc_path = args.config_info.gcc_path.clone().expect(
|
||||
"The config module should have emitted an error if the GCC path wasn't provided",
|
||||
);
|
||||
env.insert("LIBRARY_PATH".to_string(), gcc_path.clone());
|
||||
env.insert("LD_LIBRARY_PATH".to_string(), gcc_path);
|
||||
}
|
||||
|
||||
build_if_no_backend(&env, &args)?;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue