Skip to content

Commit aeb85a9

Browse files
committed
Auto merge of #32133 - alexcrichton:linkchecker, r=brson
Add a link validator to rustbuild This commit was originally targeted at just adding a link checking script to the rustbuild system. This ended up snowballing a bit to extend rustbuild to be amenable to various tools we have as part of the build system in general. There's a new `src/tools` directory which has a number of scripts/programs that are purely intended to be used as part of the build system and CI of this repository. This is currently inhabited by rustbook, the error index generator, and a new linkchecker script added as part of this PR. I suspect that more tools like compiletest, tidy scripts, snapshot scripts, etc will migrate their way into this directory over time. The commit which adds the error index generator shows the steps necessary to add new tools to the build system, namely: 1. New steps are defined for building the tool and running the tool 2. The dependencies are configured 3. The steps are implemented In terms of the link checker, these commits do a few things: * A new `src/tools/linkchecker` script is added. This will read an entire documentation tree looking for broken relative links (HTTP links aren't followed yet). * A large number of broken links throughout the documentation were fixed. Many of these were just broken when viewed from core as opposed to std, but were easily fixed. * A few rustdoc bugs here and there were fixed
2 parents 40c85cd + 3e6fed3 commit aeb85a9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

62 files changed

+813
-301
lines changed

mk/crates.mk

+2-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ TOOL_DEPS_error_index_generator := rustdoc syntax serialize
126126
TOOL_SOURCE_compiletest := $(S)src/compiletest/compiletest.rs
127127
TOOL_SOURCE_rustdoc := $(S)src/driver/driver.rs
128128
TOOL_SOURCE_rustc := $(S)src/driver/driver.rs
129-
TOOL_SOURCE_rustbook := $(S)src/rustbook/main.rs
130-
TOOL_SOURCE_error_index_generator := $(S)src/error_index_generator/main.rs
129+
TOOL_SOURCE_rustbook := $(S)src/tools/rustbook/main.rs
130+
TOOL_SOURCE_error_index_generator := $(S)src/tools/error_index_generator/main.rs
131131

132132
ONLY_RLIB_core := 1
133133
ONLY_RLIB_libc := 1

src/bootstrap/Cargo.toml

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ path = "main.rs"
1515
name = "rustc"
1616
path = "rustc.rs"
1717

18+
[[bin]]
19+
name = "rustdoc"
20+
path = "rustdoc.rs"
21+
1822
[dependencies]
1923
build_helper = { path = "../build_helper" }
2024
cmake = "0.1.10"

src/bootstrap/build/check.rs

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
use std::process::Command;
12+
13+
use build::{Build, Compiler};
14+
15+
pub fn linkcheck(build: &Build, stage: u32, host: &str) {
16+
println!("Linkcheck stage{} ({})", stage, host);
17+
let compiler = Compiler::new(stage, host);
18+
let linkchecker = build.tool(&compiler, "linkchecker");
19+
build.run(Command::new(&linkchecker)
20+
.arg(build.out.join(host).join("doc")));
21+
}

src/bootstrap/build/compile.rs

+37-15
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::process::Command;
1616
use build_helper::output;
1717

1818
use build::util::{exe, staticlib, libdir, mtime, is_dylib};
19-
use build::{Build, Compiler};
19+
use build::{Build, Compiler, Mode};
2020

2121
/// Build the standard library.
2222
///
@@ -39,9 +39,10 @@ pub fn std<'a>(build: &'a Build, stage: u32, target: &str,
3939

4040
build_startup_objects(build, target, &libdir);
4141

42-
let out_dir = build.cargo_out(stage, &host, true, target);
42+
let out_dir = build.cargo_out(stage, &host, Mode::Libstd, target);
4343
build.clear_if_dirty(&out_dir, &build.compiler_path(compiler));
44-
let mut cargo = build.cargo(stage, compiler, true, target, "build");
44+
let mut cargo = build.cargo(stage, compiler, Mode::Libstd, Some(target),
45+
"build");
4546
cargo.arg("--features").arg(build.std_features())
4647
.arg("--manifest-path")
4748
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"));
@@ -71,7 +72,7 @@ pub fn std_link(build: &Build,
7172
compiler: &Compiler,
7273
host: &str) {
7374
let libdir = build.sysroot_libdir(stage, host, target);
74-
let out_dir = build.cargo_out(stage, compiler.host, true, target);
75+
let out_dir = build.cargo_out(stage, compiler.host, Mode::Libstd, target);
7576

7677
// If we're linking one compiler host's output into another, then we weren't
7778
// called from the `std` method above. In that case we clean out what's
@@ -135,19 +136,15 @@ pub fn rustc<'a>(build: &'a Build, stage: u32, target: &str,
135136
println!("Building stage{} compiler artifacts ({} -> {})", stage,
136137
host, target);
137138

138-
let out_dir = build.cargo_out(stage, &host, false, target);
139+
let out_dir = build.cargo_out(stage, &host, Mode::Librustc, target);
139140
build.clear_if_dirty(&out_dir, &libstd_shim(build, stage, &host, target));
140141

141-
let mut cargo = build.cargo(stage, compiler, false, target, "build");
142-
cargo.arg("--features").arg(build.rustc_features(stage))
142+
let mut cargo = build.cargo(stage, compiler, Mode::Librustc, Some(target),
143+
"build");
144+
cargo.arg("--features").arg(build.rustc_features())
143145
.arg("--manifest-path")
144146
.arg(build.src.join("src/rustc/Cargo.toml"));
145147

146-
// In stage0 we may not need to build as many executables
147-
if stage == 0 {
148-
cargo.arg("--bin").arg("rustc");
149-
}
150-
151148
// Set some configuration variables picked up by build scripts and
152149
// the compiler alike
153150
cargo.env("CFG_RELEASE", &build.release)
@@ -200,14 +197,14 @@ pub fn rustc_link(build: &Build,
200197
compiler: &Compiler,
201198
host: &str) {
202199
let libdir = build.sysroot_libdir(stage, host, target);
203-
let out_dir = build.cargo_out(stage, compiler.host, false, target);
200+
let out_dir = build.cargo_out(stage, compiler.host, Mode::Librustc, target);
204201
add_to_sysroot(&out_dir, &libdir);
205202
}
206203

207204
/// Cargo's output path for the standard library in a given stage, compiled
208205
/// by a particular compiler for the specified target.
209206
fn libstd_shim(build: &Build, stage: u32, host: &str, target: &str) -> PathBuf {
210-
build.cargo_out(stage, host, true, target).join("libstd_shim.rlib")
207+
build.cargo_out(stage, host, Mode::Libstd, target).join("libstd_shim.rlib")
211208
}
212209

213210
fn compiler_file(compiler: &Path, file: &str) -> String {
@@ -239,7 +236,8 @@ pub fn assemble_rustc(build: &Build, stage: u32, host: &str) {
239236
}
240237
}
241238

242-
let out_dir = build.cargo_out(stage - 1, &build.config.build, false, host);
239+
let out_dir = build.cargo_out(stage - 1, &build.config.build,
240+
Mode::Librustc, host);
243241

244242
// Link the compiler binary itself into place
245243
let rustc = out_dir.join(exe("rustc", host));
@@ -298,3 +296,27 @@ fn add_to_sysroot(out_dir: &Path, sysroot_dst: &Path) {
298296
sysroot_dst.join(path.file_name().unwrap())));
299297
}
300298
}
299+
300+
/// Build a tool in `src/tools`
301+
///
302+
/// This will build the specified tool with the specified `host` compiler in
303+
/// `stage` into the normal cargo output directory.
304+
pub fn tool(build: &Build, stage: u32, host: &str, tool: &str) {
305+
println!("Building stage{} tool {} ({})", stage, tool, host);
306+
307+
let compiler = Compiler::new(stage, host);
308+
309+
// FIXME: need to clear out previous tool and ideally deps, may require
310+
// isolating output directories or require a pseudo shim step to
311+
// clear out all the info.
312+
//
313+
// Maybe when libstd is compiled it should clear out the rustc of the
314+
// corresponding stage?
315+
// let out_dir = build.cargo_out(stage, &host, Mode::Librustc, target);
316+
// build.clear_if_dirty(&out_dir, &libstd_shim(build, stage, &host, target));
317+
318+
let mut cargo = build.cargo(stage, &compiler, Mode::Tool, None, "build");
319+
cargo.arg("--manifest-path")
320+
.arg(build.src.join(format!("src/tools/{}/Cargo.toml", tool)));
321+
build.run(&mut cargo);
322+
}

src/bootstrap/build/doc.rs

+55-5
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use std::path::Path;
1211
use std::fs::{self, File};
1312
use std::io::prelude::*;
13+
use std::path::Path;
14+
use std::process::Command;
1415

15-
use build::{Build, Compiler};
16-
use build::util::up_to_date;
16+
use build::{Build, Compiler, Mode};
17+
use build::util::{up_to_date, cp_r};
1718

1819
pub fn rustbook(build: &Build, stage: u32, host: &str, name: &str, out: &Path) {
1920
t!(fs::create_dir_all(out));
@@ -69,7 +70,7 @@ pub fn standalone(build: &Build, stage: u32, host: &str, out: &Path) {
6970
}
7071

7172
let html = out.join(filename).with_extension("html");
72-
let rustdoc = build.tool(&compiler, "rustdoc");
73+
let rustdoc = build.rustdoc(&compiler);
7374
if up_to_date(&path, &html) &&
7475
up_to_date(&footer, &html) &&
7576
up_to_date(&favicon, &html) &&
@@ -79,7 +80,7 @@ pub fn standalone(build: &Build, stage: u32, host: &str, out: &Path) {
7980
continue
8081
}
8182

82-
let mut cmd = build.tool_cmd(&compiler, "rustdoc");
83+
let mut cmd = Command::new(&rustdoc);
8384
cmd.arg("--html-after-content").arg(&footer)
8485
.arg("--html-before-content").arg(&version_info)
8586
.arg("--html-in-header").arg(&favicon)
@@ -102,3 +103,52 @@ pub fn standalone(build: &Build, stage: u32, host: &str, out: &Path) {
102103
build.run(&mut cmd);
103104
}
104105
}
106+
107+
pub fn std(build: &Build, stage: u32, host: &str, out: &Path) {
108+
println!("Documenting stage{} std ({})", stage, host);
109+
let compiler = Compiler::new(stage, host);
110+
let out_dir = build.stage_out(stage, host, Mode::Libstd)
111+
.join(host).join("doc");
112+
let rustdoc = build.rustdoc(&compiler);
113+
114+
build.clear_if_dirty(&out_dir, &rustdoc);
115+
116+
let mut cargo = build.cargo(stage, &compiler, Mode::Libstd, Some(host),
117+
"doc");
118+
cargo.arg("--manifest-path")
119+
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"))
120+
.arg("--features").arg(build.std_features());
121+
build.run(&mut cargo);
122+
cp_r(&out_dir, out)
123+
}
124+
125+
pub fn rustc(build: &Build, stage: u32, host: &str, out: &Path) {
126+
println!("Documenting stage{} compiler ({})", stage, host);
127+
let compiler = Compiler::new(stage, host);
128+
let out_dir = build.stage_out(stage, host, Mode::Librustc)
129+
.join(host).join("doc");
130+
let rustdoc = build.rustdoc(&compiler);
131+
if !up_to_date(&rustdoc, &out_dir.join("rustc/index.html")) {
132+
t!(fs::remove_dir_all(&out_dir));
133+
}
134+
let mut cargo = build.cargo(stage, &compiler, Mode::Librustc, Some(host),
135+
"doc");
136+
cargo.arg("--manifest-path")
137+
.arg(build.src.join("src/rustc/Cargo.toml"))
138+
.arg("--features").arg(build.rustc_features());
139+
build.run(&mut cargo);
140+
cp_r(&out_dir, out)
141+
}
142+
143+
pub fn error_index(build: &Build, stage: u32, host: &str, out: &Path) {
144+
println!("Documenting stage{} error index ({})", stage, host);
145+
let compiler = Compiler::new(stage, host);
146+
let mut index = Command::new(build.tool(&compiler, "error_index_generator"));
147+
index.arg("html");
148+
index.arg(out.join("error-index.html"));
149+
150+
// FIXME: shouldn't have to pass this env var
151+
index.env("CFG_BUILD", &build.config.build);
152+
153+
build.run(&mut index);
154+
}

0 commit comments

Comments
 (0)