Skip to content

Commit 6c7de31

Browse files
committed
Auto merge of rust-lang#117574 - onur-ozkan:fix-compiler-crate-linking, r=Mark-Simulacrum
improve compiler&tool documenting and re-enable cranelift on CI First commit addresses the linking issue with compiler crates. Second one ensures that compiler crates are linked correctly (with later commits we added this check for tools as well), allowing us to detect these hard-to-catch bugs on CI. Following three commits cherry-picked from rust-lang#117328 to re-enable the Cranelift backend on CI. More info: rust-lang#117430 cc `@bjorn3` `@RalfJung`
2 parents 992943d + b0df821 commit 6c7de31

File tree

4 files changed

+73
-57
lines changed

4 files changed

+73
-57
lines changed

src/bootstrap/src/core/build_steps/compile.rs

-5
Original file line numberDiff line numberDiff line change
@@ -413,11 +413,6 @@ pub fn std_cargo(builder: &Builder<'_>, target: TargetSelection, stage: u32, car
413413

414414
let mut features = String::new();
415415

416-
// Cranelift doesn't support `asm`.
417-
if stage != 0 && builder.config.default_codegen_backend().unwrap_or_default() == "cranelift" {
418-
features += " compiler-builtins-no-asm";
419-
}
420-
421416
if builder.no_std(target) == Some(true) {
422417
features += " compiler-builtins-mem";
423418
if !target.starts_with("bpf") {

src/bootstrap/src/core/build_steps/dist.rs

+11
Original file line numberDiff line numberDiff line change
@@ -1298,13 +1298,21 @@ impl Step for CodegenBackend {
12981298
}
12991299

13001300
fn run(self, builder: &Builder<'_>) -> Option<GeneratedTarball> {
1301+
if builder.config.dry_run() {
1302+
return None;
1303+
}
1304+
13011305
// This prevents rustc_codegen_cranelift from being built for "dist"
13021306
// or "install" on the stable/beta channels. It is not yet stable and
13031307
// should not be included.
13041308
if !builder.build.unstable_features() {
13051309
return None;
13061310
}
13071311

1312+
if !builder.config.rust_codegen_backends.contains(&self.backend) {
1313+
return None;
1314+
}
1315+
13081316
if self.backend == "cranelift" {
13091317
if !target_supports_cranelift_backend(self.compiler.host) {
13101318
builder.info("target not supported by rustc_codegen_cranelift. skipping");
@@ -1343,12 +1351,15 @@ impl Step for CodegenBackend {
13431351
let backends_dst = PathBuf::from("lib").join(&backends_rel);
13441352

13451353
let backend_name = format!("rustc_codegen_{}", backend);
1354+
let mut found_backend = false;
13461355
for backend in fs::read_dir(&backends_src).unwrap() {
13471356
let file_name = backend.unwrap().file_name();
13481357
if file_name.to_str().unwrap().contains(&backend_name) {
13491358
tarball.add_file(backends_src.join(file_name), &backends_dst, 0o644);
1359+
found_backend = true;
13501360
}
13511361
}
1362+
assert!(found_backend);
13521363

13531364
Some(tarball.generate())
13541365
}

src/bootstrap/src/core/build_steps/doc.rs

+61-52
Original file line numberDiff line numberDiff line change
@@ -685,19 +685,6 @@ impl Step for Rustc {
685685
target,
686686
);
687687

688-
// This uses a shared directory so that librustdoc documentation gets
689-
// correctly built and merged with the rustc documentation. This is
690-
// needed because rustdoc is built in a different directory from
691-
// rustc. rustdoc needs to be able to see everything, for example when
692-
// merging the search index, or generating local (relative) links.
693-
let out_dir = builder.stage_out(compiler, Mode::Rustc).join(target.triple).join("doc");
694-
t!(fs::create_dir_all(out_dir.parent().unwrap()));
695-
symlink_dir_force(&builder.config, &out, &out_dir);
696-
// Cargo puts proc macros in `target/doc` even if you pass `--target`
697-
// explicitly (https://github.com/rust-lang/cargo/issues/7677).
698-
let proc_macro_out_dir = builder.stage_out(compiler, Mode::Rustc).join("doc");
699-
symlink_dir_force(&builder.config, &out, &proc_macro_out_dir);
700-
701688
// Build cargo command.
702689
let mut cargo = builder.cargo(compiler, Mode::Rustc, SourceType::InTree, target, "doc");
703690
cargo.rustdocflag("--document-private-items");
@@ -724,6 +711,7 @@ impl Step for Rustc {
724711

725712
let mut to_open = None;
726713

714+
let out_dir = builder.stage_out(compiler, Mode::Rustc).join(target.triple).join("doc");
727715
for krate in &*self.crates {
728716
// Create all crate output directories first to make sure rustdoc uses
729717
// relative links.
@@ -736,8 +724,29 @@ impl Step for Rustc {
736724
}
737725
}
738726

727+
// This uses a shared directory so that librustdoc documentation gets
728+
// correctly built and merged with the rustc documentation.
729+
//
730+
// This is needed because rustdoc is built in a different directory from
731+
// rustc. rustdoc needs to be able to see everything, for example when
732+
// merging the search index, or generating local (relative) links.
733+
symlink_dir_force(&builder.config, &out, &out_dir);
734+
// Cargo puts proc macros in `target/doc` even if you pass `--target`
735+
// explicitly (https://github.com/rust-lang/cargo/issues/7677).
736+
let proc_macro_out_dir = builder.stage_out(compiler, Mode::Rustc).join("doc");
737+
symlink_dir_force(&builder.config, &out, &proc_macro_out_dir);
738+
739739
builder.run(&mut cargo.into());
740740

741+
if !builder.config.dry_run() {
742+
// Sanity check on linked compiler crates
743+
for krate in &*self.crates {
744+
let dir_name = krate.replace("-", "_");
745+
// Making sure the directory exists and is not empty.
746+
assert!(out.join(&*dir_name).read_dir().unwrap().next().is_some());
747+
}
748+
}
749+
741750
if builder.paths.iter().any(|path| path.ends_with("compiler")) {
742751
// For `x.py doc compiler --open`, open `rustc_middle` by default.
743752
let index = out.join("rustc_middle").join("index.html");
@@ -756,10 +765,10 @@ macro_rules! tool_doc {
756765
$should_run: literal,
757766
$path: literal,
758767
$(rustc_tool = $rustc_tool:literal, )?
759-
$(in_tree = $in_tree:literal, )?
760-
[$($extra_arg: literal),+ $(,)?]
761-
$(,)?
762-
) => {
768+
$(in_tree = $in_tree:literal ,)?
769+
$(is_library = $is_library:expr,)?
770+
$(crates = $crates:expr)?
771+
) => {
763772
#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
764773
pub struct $tool {
765774
target: TargetSelection,
@@ -812,17 +821,6 @@ macro_rules! tool_doc {
812821
SourceType::Submodule
813822
};
814823

815-
// Symlink compiler docs to the output directory of rustdoc documentation.
816-
let out_dirs = [
817-
builder.stage_out(compiler, Mode::ToolRustc).join(target.triple).join("doc"),
818-
// Cargo uses a different directory for proc macros.
819-
builder.stage_out(compiler, Mode::ToolRustc).join("doc"),
820-
];
821-
for out_dir in out_dirs {
822-
t!(fs::create_dir_all(&out_dir));
823-
symlink_dir_force(&builder.config, &out, &out_dir);
824-
}
825-
826824
// Build cargo command.
827825
let mut cargo = prepare_tool_cargo(
828826
builder,
@@ -839,9 +837,13 @@ macro_rules! tool_doc {
839837
// Only include compiler crates, no dependencies of those, such as `libc`.
840838
cargo.arg("--no-deps");
841839

842-
$(
843-
cargo.arg($extra_arg);
844-
)+
840+
if false $(|| $is_library)? {
841+
cargo.arg("--lib");
842+
}
843+
844+
$(for krate in $crates {
845+
cargo.arg("-p").arg(krate);
846+
})?
845847

846848
cargo.rustdocflag("--document-private-items");
847849
// Since we always pass --document-private-items, there's no need to warn about linking to private items.
@@ -851,62 +853,69 @@ macro_rules! tool_doc {
851853
cargo.rustdocflag("--generate-link-to-definition");
852854
cargo.rustdocflag("-Zunstable-options");
853855

856+
let out_dir = builder.stage_out(compiler, Mode::ToolRustc).join(target.triple).join("doc");
857+
$(for krate in $crates {
858+
let dir_name = krate.replace("-", "_");
859+
t!(fs::create_dir_all(out_dir.join(&*dir_name)));
860+
})?
861+
862+
// Symlink compiler docs to the output directory of rustdoc documentation.
863+
symlink_dir_force(&builder.config, &out, &out_dir);
864+
let proc_macro_out_dir = builder.stage_out(compiler, Mode::ToolRustc).join("doc");
865+
symlink_dir_force(&builder.config, &out, &proc_macro_out_dir);
866+
854867
let _guard = builder.msg_doc(compiler, stringify!($tool).to_lowercase(), target);
855868
builder.run(&mut cargo.into());
869+
870+
if !builder.config.dry_run() {
871+
// Sanity check on linked doc directories
872+
$(for krate in $crates {
873+
let dir_name = krate.replace("-", "_");
874+
// Making sure the directory exists and is not empty.
875+
assert!(out.join(&*dir_name).read_dir().unwrap().next().is_some());
876+
})?
877+
}
856878
}
857879
}
858880
}
859881
}
860882

861-
tool_doc!(
862-
Rustdoc,
863-
"rustdoc-tool",
864-
"src/tools/rustdoc",
865-
["-p", "rustdoc", "-p", "rustdoc-json-types"]
866-
);
883+
tool_doc!(Rustdoc, "rustdoc-tool", "src/tools/rustdoc", crates = ["rustdoc", "rustdoc-json-types"]);
867884
tool_doc!(
868885
Rustfmt,
869886
"rustfmt-nightly",
870887
"src/tools/rustfmt",
871-
["-p", "rustfmt-nightly", "-p", "rustfmt-config_proc_macro"],
888+
crates = ["rustfmt-nightly", "rustfmt-config_proc_macro"]
872889
);
873-
tool_doc!(Clippy, "clippy", "src/tools/clippy", ["-p", "clippy_utils"]);
874-
tool_doc!(Miri, "miri", "src/tools/miri", ["-p", "miri"]);
890+
tool_doc!(Clippy, "clippy", "src/tools/clippy", crates = ["clippy_utils"]);
891+
tool_doc!(Miri, "miri", "src/tools/miri", crates = ["miri"]);
875892
tool_doc!(
876893
Cargo,
877894
"cargo",
878895
"src/tools/cargo",
879896
rustc_tool = false,
880897
in_tree = false,
881-
[
882-
"-p",
898+
crates = [
883899
"cargo",
884-
"-p",
885900
"cargo-platform",
886-
"-p",
887901
"cargo-util",
888-
"-p",
889902
"crates-io",
890-
"-p",
891903
"cargo-test-macro",
892-
"-p",
893904
"cargo-test-support",
894-
"-p",
895905
"cargo-credential",
896-
"-p",
897906
"mdman",
898907
// FIXME: this trips a license check in tidy.
899-
// "-p",
900908
// "resolver-tests",
901909
]
902910
);
903-
tool_doc!(Tidy, "tidy", "src/tools/tidy", rustc_tool = false, ["-p", "tidy"]);
911+
tool_doc!(Tidy, "tidy", "src/tools/tidy", rustc_tool = false, crates = ["tidy"]);
904912
tool_doc!(
905913
Bootstrap,
906914
"bootstrap",
907915
"src/bootstrap",
908916
rustc_tool = false,
909-
["--lib", "-p", "bootstrap"]
917+
is_library = true,
918+
crates = ["bootstrap"]
910919
);
911920

912921
#[derive(Ord, PartialOrd, Debug, Copy, Clone, Hash, PartialEq, Eq)]

src/ci/docker/run.sh

+1
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ docker \
302302
--env DIST_TRY_BUILD \
303303
--env PR_CI_JOB \
304304
--env OBJDIR_ON_HOST="$objdir" \
305+
--env CODEGEN_BACKENDS \
305306
--init \
306307
--rm \
307308
rust-ci \

0 commit comments

Comments
 (0)