rustbuild: Add crate documentation generation

Run `cargo doc` to generate all documentation for the standard library, and also
add a target which generates documentation for the compiler as well (but don't
enable it by default).
This commit is contained in:
Alex Crichton 2016-03-07 22:36:21 -08:00
parent 063e68b0b6
commit 6a541937dc
4 changed files with 59 additions and 4 deletions

View File

@ -13,7 +13,7 @@
use std::io::prelude::*;
use build::{Build, Compiler};
use build::util::up_to_date;
use build::util::{up_to_date, cp_r};
pub fn rustbook(build: &Build, stage: u32, host: &str, name: &str, out: &Path) {
t!(fs::create_dir_all(out));
@ -102,3 +102,40 @@ pub fn standalone(build: &Build, stage: u32, host: &str, out: &Path) {
build.run(&mut cmd);
}
}
pub fn std(build: &Build, stage: u32, host: &str, out: &Path) {
println!("Documenting stage{} std ({})", stage, host);
let compiler = Compiler::new(stage, host);
let out_dir = build.stage_out(stage, host, true)
.join(host).join("doc");
let rustdoc = build.tool(&compiler, "rustdoc");
if !up_to_date(&rustdoc, &out_dir.join("std/index.html")) {
t!(fs::remove_dir_all(&out_dir));
}
let mut cargo = build.cargo(stage, &compiler, true, host,
"doc");
cargo.arg("--manifest-path")
.arg(build.src.join("src/rustc/std_shim/Cargo.toml"))
.arg("--features").arg(build.std_features());
build.run(&mut cargo);
cp_r(&out_dir, out)
}
pub fn rustc(build: &Build, stage: u32, host: &str, out: &Path) {
println!("Documenting stage{} compiler ({})", stage, host);
let compiler = Compiler::new(stage, host);
let out_dir = build.stage_out(stage, host, false)
.join(host).join("doc");
let rustdoc = build.tool(&compiler, "rustdoc");
if !up_to_date(&rustdoc, &out_dir.join("rustc/index.html")) {
t!(fs::remove_dir_all(&out_dir));
}
let mut cargo = build.cargo(stage, &compiler, false, host,
"doc");
cargo.arg("--manifest-path")
.arg(build.src.join("src/rustc/Cargo.toml"))
.arg("--features").arg(build.rustc_features(stage));
build.run(&mut cargo);
cp_r(&out_dir, out)
}

View File

@ -179,7 +179,15 @@ pub fn build(&mut self) {
DocStandalone { stage } => {
doc::standalone(self, stage, target.target, &doc_out);
}
Doc { .. } => {} // pseudo-step
DocStd { stage } => {
doc::std(self, stage, target.target, &doc_out);
}
DocRustc { stage } => {
doc::rustc(self, stage, target.target, &doc_out);
}
Doc { .. } | // pseudo-steps
Check { .. } => {}
}
}
}

View File

@ -62,6 +62,8 @@ macro_rules! targets {
(doc_nomicon, DocNomicon { stage: u32 }),
(doc_style, DocStyle { stage: u32 }),
(doc_standalone, DocStandalone { stage: u32 }),
(doc_std, DocStd { stage: u32 }),
(doc_rustc, DocRustc { stage: u32 }),
// Steps for running tests. The 'check' target is just a pseudo
// target to depend on a bunch of others.
@ -182,6 +184,8 @@ fn add_steps<'a>(build: &'a Build,
"doc-standalone" => targets.push(host.doc_standalone(stage)),
"doc-nomicon" => targets.push(host.doc_nomicon(stage)),
"doc-book" => targets.push(host.doc_book(stage)),
"doc-std" => targets.push(host.doc_std(stage)),
"doc-rustc" => targets.push(host.doc_rustc(stage)),
"doc" => targets.push(host.doc(stage)),
"check" => targets.push(host.check(stage, compiler)),
_ => panic!("unknown build target: `{}`", step),
@ -239,15 +243,22 @@ pub fn deps(&self, build: &'a Build) -> Vec<Step<'a>> {
vec![self.llvm(()).target(&build.config.build)]
}
Source::Llvm { _dummy } => Vec::new(),
Source::DocStd { stage } => {
vec![self.libstd(stage, self.compiler(stage))]
}
Source::DocBook { stage } |
Source::DocNomicon { stage } |
Source::DocStyle { stage } |
Source::DocStandalone { stage } => {
vec![self.rustc(stage)]
}
Source::DocRustc { stage } => {
vec![self.doc_std(stage)]
}
Source::Doc { stage } => {
vec![self.doc_book(stage), self.doc_nomicon(stage),
self.doc_style(stage), self.doc_standalone(stage)]
self.doc_style(stage), self.doc_standalone(stage),
self.doc_std(stage)]
}
Source::Check { stage, compiler: _ } => {
vec![]

View File

@ -30,7 +30,6 @@ pub fn mtime(path: &Path) -> FileTime {
}).unwrap_or(FileTime::zero())
}
#[allow(dead_code)] // this will be used soon
pub fn cp_r(src: &Path, dst: &Path) {
for f in t!(fs::read_dir(src)) {
let f = t!(f);