Merge pull request #608 from GuillaumeGomez/gcc-path
Add `--gcc-path` option
diff --git a/build_system/src/build.rs b/build_system/src/build.rs
index a027c82..e98377f 100644
--- a/build_system/src/build.rs
+++ b/build_system/src/build.rs
@@ -186,8 +186,12 @@
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());
diff --git a/build_system/src/config.rs b/build_system/src/config.rs
index f10eee2..0904ea8 100644
--- a/build_system/src/config.rs
+++ b/build_system/src/config.rs
@@ -112,7 +112,7 @@
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 @@
"--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 @@
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 @@
}
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 @@
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,13 @@
) -> Result<(), String> {
env.insert("CARGO_INCREMENTAL".to_string(), "0".to_string());
- if self.gcc_path.is_empty() && !use_system_gcc {
+ if self.gcc_path.is_none() && !use_system_gcc {
self.setup_gcc_path()?;
}
- env.insert("GCC_PATH".to_string(), self.gcc_path.clone());
+ let gcc_path = self.gcc_path.clone().expect(
+ "The config module should have emitted an error if the GCC path wasn't provided",
+ );
+ 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()) {
@@ -416,7 +440,7 @@
"{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());
@@ -461,6 +485,7 @@
--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
diff --git a/build_system/src/info.rs b/build_system/src/info.rs
index ea38791..bd891de 100644
--- a/build_system/src/info.rs
+++ b/build_system/src/info.rs
@@ -14,6 +14,8 @@
}
config.no_download = true;
config.setup_gcc_path()?;
- println!("{}", config.gcc_path);
+ if let Some(gcc_path) = config.gcc_path {
+ println!("{}", gcc_path);
+ }
Ok(())
}
diff --git a/build_system/src/test.rs b/build_system/src/test.rs
index 7cc7336..efd7b2b 100644
--- a/build_system/src/test.rs
+++ b/build_system/src/test.rs
@@ -1255,8 +1255,11 @@
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)?;