From 3e6fed3a7a3f783bf967f6c73455743848f31167 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 8 Mar 2016 13:42:32 -0800 Subject: [PATCH] rustbuild: Add the error-index-generator This adds a step and a rule for building the error index as part of rustbuild. --- mk/crates.mk | 2 +- src/bootstrap/build/doc.rs | 13 +++++++ src/bootstrap/build/mod.rs | 7 ++++ src/bootstrap/build/step.rs | 9 ++++- src/tools/error_index_generator/Cargo.lock | 4 +++ src/tools/error_index_generator/Cargo.toml | 8 +++++ src/{ => tools}/error_index_generator/main.rs | 35 +++++++++++-------- 7 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 src/tools/error_index_generator/Cargo.lock create mode 100644 src/tools/error_index_generator/Cargo.toml rename src/{ => tools}/error_index_generator/main.rs (88%) diff --git a/mk/crates.mk b/mk/crates.mk index f7fd74e8c9f..4099da59893 100644 --- a/mk/crates.mk +++ b/mk/crates.mk @@ -126,7 +126,7 @@ TOOL_SOURCE_compiletest := $(S)src/compiletest/compiletest.rs TOOL_SOURCE_rustdoc := $(S)src/driver/driver.rs TOOL_SOURCE_rustc := $(S)src/driver/driver.rs TOOL_SOURCE_rustbook := $(S)src/tools/rustbook/main.rs -TOOL_SOURCE_error_index_generator := $(S)src/error_index_generator/main.rs +TOOL_SOURCE_error_index_generator := $(S)src/tools/error_index_generator/main.rs ONLY_RLIB_core := 1 ONLY_RLIB_libc := 1 diff --git a/src/bootstrap/build/doc.rs b/src/bootstrap/build/doc.rs index ce79a605259..51bf752e06d 100644 --- a/src/bootstrap/build/doc.rs +++ b/src/bootstrap/build/doc.rs @@ -139,3 +139,16 @@ pub fn rustc(build: &Build, stage: u32, host: &str, out: &Path) { build.run(&mut cargo); cp_r(&out_dir, out) } + +pub fn error_index(build: &Build, stage: u32, host: &str, out: &Path) { + println!("Documenting stage{} error index ({})", stage, host); + let compiler = Compiler::new(stage, host); + let mut index = Command::new(build.tool(&compiler, "error_index_generator")); + index.arg("html"); + index.arg(out.join("error-index.html")); + + // FIXME: shouldn't have to pass this env var + index.env("CFG_BUILD", &build.config.build); + + build.run(&mut index); +} diff --git a/src/bootstrap/build/mod.rs b/src/bootstrap/build/mod.rs index b4fb67beaf9..058f27c33f6 100644 --- a/src/bootstrap/build/mod.rs +++ b/src/bootstrap/build/mod.rs @@ -178,6 +178,10 @@ impl Build { ToolRustbook { stage } => { compile::tool(self, stage, target.target, "rustbook"); } + ToolErrorIndex { stage } => { + compile::tool(self, stage, target.target, + "error_index_generator"); + } DocBook { stage } => { doc::rustbook(self, stage, target.target, "book", &doc_out); } @@ -198,6 +202,9 @@ impl Build { DocRustc { stage } => { doc::rustc(self, stage, target.target, &doc_out); } + DocErrorIndex { stage } => { + doc::error_index(self, stage, target.target, &doc_out); + } CheckLinkcheck { stage } => { check::linkcheck(self, stage, target.target); diff --git a/src/bootstrap/build/step.rs b/src/bootstrap/build/step.rs index 7921edcff55..720ba4fd209 100644 --- a/src/bootstrap/build/step.rs +++ b/src/bootstrap/build/step.rs @@ -48,6 +48,7 @@ macro_rules! targets { // Various tools that we can build as part of the build. (tool_linkchecker, ToolLinkchecker { stage: u32 }), (tool_rustbook, ToolRustbook { stage: u32 }), + (tool_error_index, ToolErrorIndex { stage: u32 }), // Steps for long-running native builds. Ideally these wouldn't // actually exist and would be part of build scripts, but for now @@ -68,6 +69,7 @@ macro_rules! targets { (doc_standalone, DocStandalone { stage: u32 }), (doc_std, DocStd { stage: u32 }), (doc_rustc, DocRustc { stage: u32 }), + (doc_error_index, DocErrorIndex { stage: u32 }), // Steps for running tests. The 'check' target is just a pseudo // target to depend on a bunch of others. @@ -265,6 +267,9 @@ impl<'a> Step<'a> { Source::DocStyle { stage } => { vec![self.tool_rustbook(stage)] } + Source::DocErrorIndex { stage } => { + vec![self.tool_error_index(stage)] + } Source::DocStandalone { stage } => { vec![self.rustc(stage)] } @@ -274,7 +279,8 @@ impl<'a> Step<'a> { Source::Doc { stage } => { vec![self.doc_book(stage), self.doc_nomicon(stage), self.doc_style(stage), self.doc_standalone(stage), - self.doc_std(stage)] + self.doc_std(stage), + self.doc_error_index(stage)] } Source::Check { stage, compiler: _ } => { vec![self.check_linkcheck(stage)] @@ -286,6 +292,7 @@ impl<'a> Step<'a> { Source::ToolLinkchecker { stage } => { vec![self.libstd(stage, self.compiler(stage))] } + Source::ToolErrorIndex { stage } | Source::ToolRustbook { stage } => { vec![self.librustc(stage, self.compiler(stage))] } diff --git a/src/tools/error_index_generator/Cargo.lock b/src/tools/error_index_generator/Cargo.lock new file mode 100644 index 00000000000..b7d2cfcaaa1 --- /dev/null +++ b/src/tools/error_index_generator/Cargo.lock @@ -0,0 +1,4 @@ +[root] +name = "error_index_generator" +version = "0.0.0" + diff --git a/src/tools/error_index_generator/Cargo.toml b/src/tools/error_index_generator/Cargo.toml new file mode 100644 index 00000000000..5c5ca273e9c --- /dev/null +++ b/src/tools/error_index_generator/Cargo.toml @@ -0,0 +1,8 @@ +[package] +authors = ["The Rust Project Developers"] +name = "error_index_generator" +version = "0.0.0" + +[[bin]] +name = "error_index_generator" +path = "main.rs" diff --git a/src/error_index_generator/main.rs b/src/tools/error_index_generator/main.rs similarity index 88% rename from src/error_index_generator/main.rs rename to src/tools/error_index_generator/main.rs index db9dd006f3c..4343aef00a9 100644 --- a/src/error_index_generator/main.rs +++ b/src/tools/error_index_generator/main.rs @@ -15,11 +15,12 @@ extern crate rustdoc; extern crate serialize as rustc_serialize; use std::collections::BTreeMap; +use std::env; +use std::error::Error; use std::fs::{read_dir, File}; use std::io::{Read, Write}; -use std::env; use std::path::Path; -use std::error::Error; +use std::path::PathBuf; use syntax::diagnostics::metadata::{get_metadata_dir, ErrorMetadataMap, ErrorMetadata}; @@ -173,31 +174,35 @@ fn render_error_page(err_map: &ErrorMetadataMap, output_path: &Pat formatter.footer(&mut output_file) } -fn main_with_result(format: OutputFormat) -> Result<(), Box> { +fn main_with_result(format: OutputFormat, dst: &Path) -> Result<(), Box> { let build_arch = try!(env::var("CFG_BUILD")); let metadata_dir = get_metadata_dir(&build_arch); let err_map = try!(load_all_errors(&metadata_dir)); match format { OutputFormat::Unknown(s) => panic!("Unknown output format: {}", s), - OutputFormat::HTML(h) => try!(render_error_page(&err_map, - Path::new("doc/error-index.html"), - h)), - OutputFormat::Markdown(m) => try!(render_error_page(&err_map, - Path::new("doc/error-index.md"), - m)), + OutputFormat::HTML(h) => try!(render_error_page(&err_map, dst, h)), + OutputFormat::Markdown(m) => try!(render_error_page(&err_map, dst, m)), } Ok(()) } -fn parse_args() -> OutputFormat { - for arg in env::args().skip(1) { - return OutputFormat::from(&arg); - } - OutputFormat::from("html") +fn parse_args() -> (OutputFormat, PathBuf) { + let mut args = env::args().skip(1); + let format = args.next().map(|a| OutputFormat::from(&a)) + .unwrap_or(OutputFormat::from("html")); + let dst = args.next().map(PathBuf::from).unwrap_or_else(|| { + match format { + OutputFormat::HTML(..) => PathBuf::from("doc/error-index.html"), + OutputFormat::Markdown(..) => PathBuf::from("doc/error-index.md"), + OutputFormat::Unknown(..) => PathBuf::from(""), + } + }); + (format, dst) } fn main() { - if let Err(e) = main_with_result(parse_args()) { + let (format, dst) = parse_args(); + if let Err(e) = main_with_result(format, &dst) { panic!("{}", e.description()); } }