From 02af015d1c85474b8213868be3febc342927a3b6 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sun, 27 Mar 2022 12:09:06 -0500 Subject: [PATCH 1/2] [error index] Move some logic from build.rs to main.rs --- src/tools/error_index_generator/build.rs | 32 ------------------------ src/tools/error_index_generator/main.rs | 24 +++++++++++++++++- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/src/tools/error_index_generator/build.rs b/src/tools/error_index_generator/build.rs index caae8c611780b..70b00b36cf175 100644 --- a/src/tools/error_index_generator/build.rs +++ b/src/tools/error_index_generator/build.rs @@ -7,7 +7,6 @@ fn main() { // Note that we could skip one of the .. but this ensures we at least loosely find the right // directory. let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap()); - let dest = out_dir.join("error_codes.rs"); let error_codes_path = "../../../compiler/rustc_error_codes/src/error_codes.rs"; @@ -29,35 +28,4 @@ fn main() { let md_content = fs::read_to_string(entry.path()).unwrap(); fs::write(&out_dir.join(entry.file_name()), &md_content).unwrap(); } - - let mut all = String::new(); - all.push_str( - r###" -fn register_all() -> Vec<(&'static str, Option<&'static str>)> { - let mut long_codes: Vec<(&'static str, Option<&'static str>)> = Vec::new(); - macro_rules! register_diagnostics { - ($($ecode:ident: $message:expr,)*) => ( - register_diagnostics!{$($ecode:$message,)* ;} - ); - - ($($ecode:ident: $message:expr,)* ; $($code:ident,)*) => ( - $( - {long_codes.extend([ - (stringify!($ecode), Some($message)), - ].iter());} - )* - $( - {long_codes.extend([ - stringify!($code), - ].iter().cloned().map(|s| (s, None)).collect::>());} - )* - ) - } -"###, - ); - all.push_str(r#"include!(concat!(env!("OUT_DIR"), "/all_error_codes.rs"));"#); - all.push_str("\nlong_codes\n"); - all.push_str("}\n"); - - fs::write(&dest, all).unwrap(); } diff --git a/src/tools/error_index_generator/main.rs b/src/tools/error_index_generator/main.rs index 39498c99e64d6..51ed1b5a61cbe 100644 --- a/src/tools/error_index_generator/main.rs +++ b/src/tools/error_index_generator/main.rs @@ -277,4 +277,26 @@ fn main() { } } -include!(concat!(env!("OUT_DIR"), "/error_codes.rs")); +fn register_all() -> Vec<(&'static str, Option<&'static str>)> { + let mut long_codes: Vec<(&'static str, Option<&'static str>)> = Vec::new(); + macro_rules! register_diagnostics { + ($($ecode:ident: $message:expr,)*) => ( + register_diagnostics!{$($ecode:$message,)* ;} + ); + + ($($ecode:ident: $message:expr,)* ; $($code:ident,)*) => ( + $( + {long_codes.extend([ + (stringify!($ecode), Some($message)), + ].iter());} + )* + $( + {long_codes.extend([ + stringify!($code), + ].iter().cloned().map(|s| (s, None)).collect::>());} + )* + ) + } + include!(concat!(env!("OUT_DIR"), "/all_error_codes.rs")); + long_codes +} From 7470592d0ba8a7be88d5d897fe4f0796fdbfa318 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Sun, 27 Mar 2022 17:04:21 -0500 Subject: [PATCH 2/2] Fix `x test src/tools/error_index_generator --stage {0,1}` There were two fixes needed: 1. Use `top_stage` instead of `top_stage - 1`. There was a long and torturous comment about trying to match rustdoc's version, but it works better without the hard-coding than with. 2. Make sure that `ci-llvm/lib` is added to LD_LIBRARY_PATH. Previously the error index would be unable to load LLVM for stage0 builds. At some point we should probably have a discussion about how rustdoc stages should be numbered; confusion between 0/1/2 has come up several times in bootstrap now. Note that this is still broken when using `download-rustc = true` and `--stage 1`, but that's *really* a corner case and should affect almost no one. `--stage {0,2}` work fine with download-rustc. --- src/bootstrap/builder.rs | 22 +++++++++++++--------- src/bootstrap/tool.rs | 22 +++++++--------------- src/bootstrap/util.rs | 2 +- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 32ccca8bcdd2c..f8f2676e10b74 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -835,6 +835,18 @@ impl<'a> Builder<'a> { } } + pub fn rustc_lib_paths(&self, compiler: Compiler) -> Vec { + let mut dylib_dirs = vec![self.rustc_libdir(compiler)]; + + // Ensure that the downloaded LLVM libraries can be found. + if self.config.llvm_from_ci { + let ci_llvm_lib = self.out.join(&*compiler.host.triple).join("ci-llvm").join("lib"); + dylib_dirs.push(ci_llvm_lib); + } + + dylib_dirs + } + /// Adds the compiler's directory of dynamic libraries to `cmd`'s dynamic /// library lookup path. pub fn add_rustc_lib_path(&self, compiler: Compiler, cmd: &mut Command) { @@ -845,15 +857,7 @@ impl<'a> Builder<'a> { return; } - let mut dylib_dirs = vec![self.rustc_libdir(compiler)]; - - // Ensure that the downloaded LLVM libraries can be found. - if self.config.llvm_from_ci { - let ci_llvm_lib = self.out.join(&*compiler.host.triple).join("ci-llvm").join("lib"); - dylib_dirs.push(ci_llvm_lib); - } - - add_dylib_path(dylib_dirs, cmd); + add_dylib_path(self.rustc_lib_paths(compiler), cmd); } /// Gets a path to the compiler specified. diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index a9ca89bdea1ce..fc1c2f04fabff 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -379,22 +379,14 @@ pub struct ErrorIndex { impl ErrorIndex { pub fn command(builder: &Builder<'_>) -> Command { - // This uses stage-1 to match the behavior of building rustdoc. - // Error-index-generator links with the rustdoc library, so we want to - // use the same librustdoc to avoid building rustdoc twice (and to - // avoid building the compiler an extra time). This uses - // saturating_sub to deal with building with stage 0. (Using stage 0 - // isn't recommended, since it will fail if any new error index tests - // use new syntax, but it should work otherwise.) - let compiler = builder.compiler(builder.top_stage.saturating_sub(1), builder.config.build); + // Error-index-generator links with the rustdoc library, so we need to add `rustc_lib_paths` + // for rustc_private and libLLVM.so, and `sysroot_lib` for libstd, etc. + let host = builder.config.build; + let compiler = builder.compiler_for(builder.top_stage, host, host); let mut cmd = Command::new(builder.ensure(ErrorIndex { compiler })); - add_dylib_path( - vec![ - PathBuf::from(&builder.sysroot_libdir(compiler, compiler.host)), - builder.rustc_libdir(compiler), - ], - &mut cmd, - ); + let mut dylib_paths = builder.rustc_lib_paths(compiler); + dylib_paths.push(PathBuf::from(&builder.sysroot_libdir(compiler, compiler.host))); + add_dylib_path(dylib_paths, &mut cmd); cmd } } diff --git a/src/bootstrap/util.rs b/src/bootstrap/util.rs index 30d9665dd0f4a..2da30dfa765e5 100644 --- a/src/bootstrap/util.rs +++ b/src/bootstrap/util.rs @@ -63,7 +63,7 @@ pub fn libdir(target: TargetSelection) -> &'static str { } /// Adds a list of lookup paths to `cmd`'s dynamic library lookup path. -/// If The dylib_path_par is already set for this cmd, the old value will be overwritten! +/// If the dylib_path_var is already set for this cmd, the old value will be overwritten! pub fn add_dylib_path(path: Vec, cmd: &mut Command) { let mut list = dylib_path(); for path in path {