@@ -112,7 +112,7 @@ pub struct ConfigInfo {
112
112
pub sysroot_panic_abort : bool ,
113
113
pub cg_backend_path : String ,
114
114
pub sysroot_path : String ,
115
- pub gcc_path : String ,
115
+ pub gcc_path : Option < String > ,
116
116
config_file : Option < String > ,
117
117
// This is used in particular in rust compiler bootstrap because it doesn't run at the root
118
118
// of the `cg_gcc` folder, making it complicated for us to get access to local files we need
@@ -173,6 +173,14 @@ impl ConfigInfo {
173
173
"--release-sysroot" => self . sysroot_release_channel = true ,
174
174
"--release" => self . channel = Channel :: Release ,
175
175
"--sysroot-panic-abort" => self . sysroot_panic_abort = true ,
176
+ "--gcc-path" => match args. next ( ) {
177
+ Some ( arg) if !arg. is_empty ( ) => {
178
+ self . gcc_path = Some ( arg. into ( ) ) ;
179
+ }
180
+ _ => {
181
+ return Err ( "Expected a value after `--gcc-path`, found nothing" . to_string ( ) ) ;
182
+ }
183
+ } ,
176
184
"--cg_gcc-path" => match args. next ( ) {
177
185
Some ( arg) if !arg. is_empty ( ) => {
178
186
self . cg_gcc_path = Some ( arg. into ( ) ) ;
@@ -260,8 +268,9 @@ impl ConfigInfo {
260
268
create_symlink ( & libgccjit_so, output_dir. join ( & format ! ( "{}.0" , libgccjit_so_name) ) ) ?;
261
269
}
262
270
263
- self . gcc_path = output_dir. display ( ) . to_string ( ) ;
264
- println ! ( "Using `{}` as path for libgccjit" , self . gcc_path) ;
271
+ let gcc_path = output_dir. display ( ) . to_string ( ) ;
272
+ println ! ( "Using `{}` as path for libgccjit" , gcc_path) ;
273
+ self . gcc_path = Some ( gcc_path) ;
265
274
Ok ( ( ) )
266
275
}
267
276
@@ -273,6 +282,15 @@ impl ConfigInfo {
273
282
}
274
283
275
284
pub fn setup_gcc_path ( & mut self ) -> Result < ( ) , String > {
285
+ // If the user used the `--gcc-path` option, no need to look at `config.toml` content
286
+ // since we already have everything we need.
287
+ if let Some ( gcc_path) = & self . gcc_path {
288
+ println ! (
289
+ "`--gcc-path` was provided, ignoring config file. Using `{}` as path for libgccjit" ,
290
+ gcc_path
291
+ ) ;
292
+ return Ok ( ( ) ) ;
293
+ }
276
294
let config_file = match self . config_file . as_deref ( ) {
277
295
Some ( config_file) => config_file. into ( ) ,
278
296
None => self . compute_path ( "config.toml" ) ,
@@ -283,12 +301,15 @@ impl ConfigInfo {
283
301
self . download_gccjit_if_needed ( ) ?;
284
302
return Ok ( ( ) ) ;
285
303
}
286
- self . gcc_path = match gcc_path {
287
- Some ( path) => path,
288
- None => {
289
- return Err ( format ! ( "missing `gcc-path` value from `{}`" , config_file. display( ) , ) ) ;
290
- }
304
+ let Some ( gcc_path) = gcc_path else {
305
+ return Err ( format ! ( "missing `gcc-path` value from `{}`" , config_file. display( ) ) ) ;
291
306
} ;
307
+ println ! (
308
+ "GCC path retrieved from `{}`. Using `{}` as path for libgccjit" ,
309
+ config_file. display( ) ,
310
+ gcc_path
311
+ ) ;
312
+ self . gcc_path = Some ( gcc_path) ;
292
313
Ok ( ( ) )
293
314
}
294
315
@@ -299,10 +320,17 @@ impl ConfigInfo {
299
320
) -> Result < ( ) , String > {
300
321
env. insert ( "CARGO_INCREMENTAL" . to_string ( ) , "0" . to_string ( ) ) ;
301
322
302
- if self . gcc_path . is_empty ( ) && !use_system_gcc {
303
- self . setup_gcc_path ( ) ?;
304
- }
305
- env. insert ( "GCC_PATH" . to_string ( ) , self . gcc_path . clone ( ) ) ;
323
+ let gcc_path = if !use_system_gcc {
324
+ if self . gcc_path . is_none ( ) {
325
+ self . setup_gcc_path ( ) ?;
326
+ }
327
+ self . gcc_path . clone ( ) . expect (
328
+ "The config module should have emitted an error if the GCC path wasn't provided" ,
329
+ )
330
+ } else {
331
+ String :: new ( )
332
+ } ;
333
+ env. insert ( "GCC_PATH" . to_string ( ) , gcc_path. clone ( ) ) ;
306
334
307
335
if self . cargo_target_dir . is_empty ( ) {
308
336
match env. get ( "CARGO_TARGET_DIR" ) . filter ( |dir| !dir. is_empty ( ) ) {
@@ -381,6 +409,8 @@ impl ConfigInfo {
381
409
}
382
410
383
411
// This environment variable is useful in case we want to change options of rustc commands.
412
+ // We have a different environment variable than RUSTFLAGS to make sure those flags are
413
+ // only sent to rustc_codegen_gcc and not the LLVM backend.
384
414
if let Some ( cg_rustflags) = env. get ( "CG_RUSTFLAGS" ) {
385
415
rustflags. extend_from_slice ( & split_args ( & cg_rustflags) ?) ;
386
416
}
@@ -414,7 +444,7 @@ impl ConfigInfo {
414
444
"{target}:{sysroot}:{gcc_path}" ,
415
445
target = self . cargo_target_dir,
416
446
sysroot = sysroot. display( ) ,
417
- gcc_path = self . gcc_path,
447
+ gcc_path = gcc_path,
418
448
) ;
419
449
env. insert ( "LIBRARY_PATH" . to_string ( ) , ld_library_path. clone ( ) ) ;
420
450
env. insert ( "LD_LIBRARY_PATH" . to_string ( ) , ld_library_path. clone ( ) ) ;
@@ -459,6 +489,7 @@ impl ConfigInfo {
459
489
--release-sysroot : Build sysroot in release mode
460
490
--sysroot-panic-abort : Build the sysroot without unwinding support
461
491
--config-file : Location of the config file to be used
492
+ --gcc-path : Location of the GCC root folder
462
493
--cg_gcc-path : Location of the rustc_codegen_gcc root folder (used
463
494
when ran from another directory)
464
495
--no-default-features : Add `--no-default-features` flag to cargo commands
0 commit comments