Skip to content

Commit c8b8eb1

Browse files
committed
Auto merge of #32544 - alexcrichton:rustbuild-dist-libtest, r=brson
rustbuild: Fix dist for non-host targets The `rust-std` package that we produce is expected to have not only the standard library but also libtest for compiling unit tests. Unfortunately this does not currently happen due to the way rustbuild is structured. There are currently two main stages of compilation in rustbuild, one for the standard library and one for the compiler. This is primarily done to allow us to fill in the sysroot right after the standard library has finished compiling to continue compiling the rest of the crates. Consequently the entire compiler does not have to explicitly depend on the standard library, and this also should allow us to pull in crates.io dependencies into the build in the future because they'll just naturally build against the std we just produced. These phases, however, do not represent a cross-compiled build. Target-only builds also require libtest, and libtest is currently part of the all-encompassing "compiler build". There's unfortunately no way to learn about just libtest and its dependencies (in a great and robust fashion) so to ensure that we can copy the right artifacts over this commit introduces a new build step, libtest. The new libtest build step has documentation, dist, and link steps as std/rustc already do. The compiler now depends on libtest instead of libstd, and all compiler crates can now assume that test and its dependencies are implicitly part of the sysroot (hence explicit dependencies being removed). This makes the build a tad less parallel as in theory many rustc crates can be compiled in parallel with libtest, but this likely isn't where we really need parallelism either (all the time is still spent in the compiler). All in all this allows the `dist-std` step to depend on both libstd and libtest, so `rust-std` packages produced by rustbuild should start having both the standard library and libtest. Closes #32523
2 parents b0d3170 + 3d6340f commit c8b8eb1

File tree

14 files changed

+169
-42
lines changed

14 files changed

+169
-42
lines changed

src/bootstrap/build/compile.rs

+39-1
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,38 @@ fn build_startup_objects(build: &Build, target: &str, into: &Path) {
123123
}
124124
}
125125

126+
/// Build libtest.
127+
///
128+
/// This will build libtest and supporting libraries for a particular stage of
129+
/// the build using the `compiler` targeting the `target` architecture. The
130+
/// artifacts created will also be linked into the sysroot directory.
131+
pub fn test<'a>(build: &'a Build, target: &str, compiler: &Compiler<'a>) {
132+
println!("Building stage{} test artifacts ({} -> {})", compiler.stage,
133+
compiler.host, target);
134+
let out_dir = build.cargo_out(compiler, Mode::Libtest, target);
135+
build.clear_if_dirty(&out_dir, &libstd_shim(build, compiler, target));
136+
let mut cargo = build.cargo(compiler, Mode::Libtest, target, "build");
137+
cargo.arg("--manifest-path")
138+
.arg(build.src.join("src/rustc/test_shim/Cargo.toml"));
139+
build.run(&mut cargo);
140+
test_link(build, target, compiler, compiler.host);
141+
}
142+
143+
/// Link all libtest rlibs/dylibs into the sysroot location.
144+
///
145+
/// Links those artifacts generated in the given `stage` for `target` produced
146+
/// by `compiler` into `host`'s sysroot.
147+
pub fn test_link(build: &Build,
148+
target: &str,
149+
compiler: &Compiler,
150+
host: &str) {
151+
let target_compiler = Compiler::new(compiler.stage, host);
152+
let libdir = build.sysroot_libdir(&target_compiler, target);
153+
let out_dir = build.cargo_out(compiler, Mode::Libtest, target);
154+
add_to_sysroot(&out_dir, &libdir);
155+
}
156+
157+
126158
/// Build the compiler.
127159
///
128160
/// This will build the compiler for a particular stage of the build using
@@ -133,7 +165,7 @@ pub fn rustc<'a>(build: &'a Build, target: &str, compiler: &Compiler<'a>) {
133165
compiler.stage, compiler.host, target);
134166

135167
let out_dir = build.cargo_out(compiler, Mode::Librustc, target);
136-
build.clear_if_dirty(&out_dir, &libstd_shim(build, compiler, target));
168+
build.clear_if_dirty(&out_dir, &libtest_shim(build, compiler, target));
137169

138170
let mut cargo = build.cargo(compiler, Mode::Librustc, target, "build");
139171
cargo.arg("--features").arg(build.rustc_features())
@@ -202,6 +234,12 @@ fn libstd_shim(build: &Build, compiler: &Compiler, target: &str) -> PathBuf {
202234
build.cargo_out(compiler, Mode::Libstd, target).join("libstd_shim.rlib")
203235
}
204236

237+
/// Cargo's output path for libtest in a given stage, compiled by a particular
238+
/// compiler for the specified target.
239+
fn libtest_shim(build: &Build, compiler: &Compiler, target: &str) -> PathBuf {
240+
build.cargo_out(compiler, Mode::Libtest, target).join("libtest_shim.rlib")
241+
}
242+
205243
fn compiler_file(compiler: &Path, file: &str) -> String {
206244
output(Command::new(compiler)
207245
.arg(format!("-print-file-name={}", file))).trim().to_string()

src/bootstrap/build/doc.rs

+16
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,22 @@ pub fn std(build: &Build, stage: u32, host: &str, out: &Path) {
122122
cp_r(&out_dir, out)
123123
}
124124

125+
pub fn test(build: &Build, stage: u32, host: &str, out: &Path) {
126+
println!("Documenting stage{} test ({})", stage, host);
127+
let compiler = Compiler::new(stage, host);
128+
let out_dir = build.stage_out(&compiler, Mode::Libtest)
129+
.join(host).join("doc");
130+
let rustdoc = build.rustdoc(&compiler);
131+
132+
build.clear_if_dirty(&out_dir, &rustdoc);
133+
134+
let mut cargo = build.cargo(&compiler, Mode::Libtest, host, "doc");
135+
cargo.arg("--manifest-path")
136+
.arg(build.src.join("src/rustc/test_shim/Cargo.toml"));
137+
build.run(&mut cargo);
138+
cp_r(&out_dir, out)
139+
}
140+
125141
pub fn rustc(build: &Build, stage: u32, host: &str, out: &Path) {
126142
println!("Documenting stage{} compiler ({})", stage, host);
127143
let compiler = Compiler::new(stage, host);

src/bootstrap/build/mod.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ pub struct Build {
8888

8989
pub enum Mode {
9090
Libstd,
91+
Libtest,
9192
Librustc,
9293
Tool,
9394
}
@@ -141,9 +142,13 @@ impl Build {
141142
return clean::clean(self);
142143
}
143144

145+
self.verbose("finding compilers");
144146
cc::find(self);
147+
self.verbose("running sanity check");
145148
sanity::check(self);
149+
self.verbose("collecting channel variables");
146150
channel::collect(self);
151+
self.verbose("updating submodules");
147152
self.update_submodules();
148153

149154
for target in step::all(self) {
@@ -158,12 +163,18 @@ impl Build {
158163
Libstd { compiler } => {
159164
compile::std(self, target.target, &compiler);
160165
}
166+
Libtest { compiler } => {
167+
compile::test(self, target.target, &compiler);
168+
}
161169
Librustc { compiler } => {
162170
compile::rustc(self, target.target, &compiler);
163171
}
164172
LibstdLink { compiler, host } => {
165173
compile::std_link(self, target.target, &compiler, host);
166174
}
175+
LibtestLink { compiler, host } => {
176+
compile::test_link(self, target.target, &compiler, host);
177+
}
167178
LibrustcLink { compiler, host } => {
168179
compile::rustc_link(self, target.target, &compiler, host);
169180
}
@@ -203,6 +214,9 @@ impl Build {
203214
DocStd { stage } => {
204215
doc::std(self, stage, target.target, &doc_out);
205216
}
217+
DocTest { stage } => {
218+
doc::test(self, stage, target.target, &doc_out);
219+
}
206220
DocRustc { stage } => {
207221
doc::rustc(self, stage, target.target, &doc_out);
208222
}
@@ -360,6 +374,7 @@ impl Build {
360374
let host = compiler.host;
361375
let paths = vec![
362376
self.cargo_out(compiler, Mode::Libstd, host).join("deps"),
377+
self.cargo_out(compiler, Mode::Libtest, host).join("deps"),
363378
self.cargo_out(compiler, Mode::Librustc, host).join("deps"),
364379
];
365380
add_lib_path(paths, &mut cmd);
@@ -414,7 +429,8 @@ impl Build {
414429
fn stage_out(&self, compiler: &Compiler, mode: Mode) -> PathBuf {
415430
let suffix = match mode {
416431
Mode::Libstd => "-std",
417-
_ => "-rustc",
432+
Mode::Libtest => "-test",
433+
Mode::Tool | Mode::Librustc => "-rustc",
418434
};
419435
self.out.join(compiler.host)
420436
.join(format!("stage{}{}", compiler.stage, suffix))

src/bootstrap/build/step.rs

+25-12
Original file line numberDiff line numberDiff line change
@@ -25,19 +25,22 @@ macro_rules! targets {
2525
// compiler executable itself, not any of the support libraries
2626
(rustc, Rustc { stage: u32 }),
2727

28-
// Steps for the two main cargo builds, one for the standard library
29-
// and one for the compiler itself. These are parameterized over the
30-
// stage output they're going to be placed in along with the
31-
// compiler which is producing the copy of libstd or librustc
28+
// Steps for the two main cargo builds. These are parameterized over
29+
// the compiler which is producing the artifact.
3230
(libstd, Libstd { compiler: Compiler<'a> }),
31+
(libtest, Libtest { compiler: Compiler<'a> }),
3332
(librustc, Librustc { compiler: Compiler<'a> }),
3433

35-
// Links the standard library/librustc produced by the compiler
36-
// provided into the host's directory also provided.
34+
// Links the target produced by the compiler provided into the
35+
// host's directory also provided.
3736
(libstd_link, LibstdLink {
3837
compiler: Compiler<'a>,
3938
host: &'a str
4039
}),
40+
(libtest_link, LibtestLink {
41+
compiler: Compiler<'a>,
42+
host: &'a str
43+
}),
4144
(librustc_link, LibrustcLink {
4245
compiler: Compiler<'a>,
4346
host: &'a str
@@ -67,6 +70,7 @@ macro_rules! targets {
6770
(doc_style, DocStyle { stage: u32 }),
6871
(doc_standalone, DocStandalone { stage: u32 }),
6972
(doc_std, DocStd { stage: u32 }),
73+
(doc_test, DocTest { stage: u32 }),
7074
(doc_rustc, DocRustc { stage: u32 }),
7175
(doc_error_index, DocErrorIndex { stage: u32 }),
7276

@@ -162,10 +166,10 @@ fn top_level(build: &Build) -> Vec<Step> {
162166

163167
if host.target == build.config.build {
164168
targets.push(host.target(target)
165-
.libstd(host.compiler(stage)));
169+
.libtest(host.compiler(stage)));
166170
} else {
167171
targets.push(host.target(target)
168-
.libstd_link(t.compiler(stage), host.target));
172+
.libtest_link(t.compiler(stage), host.target));
169173
}
170174
}
171175
}
@@ -246,15 +250,21 @@ impl<'a> Step<'a> {
246250
vec![self.librustc(compiler)]
247251
}
248252
Source::Librustc { compiler } => {
249-
vec![self.libstd(compiler), self.llvm(())]
253+
vec![self.libtest(compiler), self.llvm(())]
254+
}
255+
Source::Libtest { compiler } => {
256+
vec![self.libstd(compiler)]
250257
}
251258
Source::Libstd { compiler } => {
252259
vec![self.compiler_rt(()),
253260
self.rustc(compiler.stage).target(compiler.host)]
254261
}
255262
Source::LibrustcLink { compiler, host } => {
256263
vec![self.librustc(compiler),
257-
self.libstd_link(compiler, host)]
264+
self.libtest_link(compiler, host)]
265+
}
266+
Source::LibtestLink { compiler, host } => {
267+
vec![self.libtest(compiler), self.libstd_link(compiler, host)]
258268
}
259269
Source::LibstdLink { compiler, host } => {
260270
vec![self.libstd(compiler),
@@ -267,6 +277,9 @@ impl<'a> Step<'a> {
267277
Source::DocStd { stage } => {
268278
vec![self.libstd(self.compiler(stage))]
269279
}
280+
Source::DocTest { stage } => {
281+
vec![self.libtest(self.compiler(stage))]
282+
}
270283
Source::DocBook { stage } |
271284
Source::DocNomicon { stage } |
272285
Source::DocStyle { stage } => {
@@ -279,7 +292,7 @@ impl<'a> Step<'a> {
279292
vec![self.rustc(stage)]
280293
}
281294
Source::DocRustc { stage } => {
282-
vec![self.doc_std(stage)]
295+
vec![self.doc_test(stage)]
283296
}
284297
Source::Doc { stage } => {
285298
vec![self.doc_book(stage), self.doc_nomicon(stage),
@@ -315,7 +328,7 @@ impl<'a> Step<'a> {
315328
vec![self.rustc(stage)]
316329
}
317330
Source::DistStd { compiler } => {
318-
vec![self.libstd(compiler)]
331+
vec![self.libtest(compiler)]
319332
}
320333

321334
Source::Dist { stage } => {

src/etc/tidy.py

+1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
'src/libcore',
3232
'src/libstd',
3333
'src/rustc/std_shim',
34+
'src/rustc/test_shim',
3435
'src/test'
3536
}
3637

src/librustc/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ crate-type = ["dylib"]
1212
arena = { path = "../libarena" }
1313
flate = { path = "../libflate" }
1414
fmt_macros = { path = "../libfmt_macros" }
15-
getopts = { path = "../libgetopts" }
1615
graphviz = { path = "../libgraphviz" }
1716
log = { path = "../liblog" }
1817
rbml = { path = "../librbml" }

src/librustc_driver/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ crate-type = ["dylib"]
1111
[dependencies]
1212
arena = { path = "../libarena" }
1313
flate = { path = "../libflate" }
14-
getopts = { path = "../libgetopts" }
1514
graphviz = { path = "../libgraphviz" }
1615
log = { path = "../liblog" }
1716
rustc = { path = "../librustc" }

src/librustc_trans/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ crate-type = ["dylib"]
1111
[dependencies]
1212
arena = { path = "../libarena" }
1313
flate = { path = "../libflate" }
14-
getopts = { path = "../libgetopts" }
1514
graphviz = { path = "../libgraphviz" }
1615
log = { path = "../liblog" }
1716
rustc = { path = "../librustc" }

src/librustdoc/Cargo.toml

-2
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ crate-type = ["dylib"]
1111

1212
[dependencies]
1313
arena = { path = "../libarena" }
14-
getopts = { path = "../libgetopts" }
1514
rustc = { path = "../librustc" }
1615
rustc_back = { path = "../librustc_back" }
1716
rustc_const_eval = { path = "../librustc_const_eval" }
@@ -23,7 +22,6 @@ rustc_resolve = { path = "../librustc_resolve" }
2322
rustc_trans = { path = "../librustc_trans" }
2423
serialize = { path = "../libserialize" }
2524
syntax = { path = "../libsyntax" }
26-
test = { path = "../libtest" }
2725
log = { path = "../liblog" }
2826

2927
[build-dependencies]

src/libsyntax/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,5 @@ crate-type = ["dylib"]
1010

1111
[dependencies]
1212
serialize = { path = "../libserialize" }
13-
term = { path = "../libterm" }
1413
log = { path = "../liblog" }
1514
rustc_bitflags = { path = "../librustc_bitflags" }

0 commit comments

Comments
 (0)