about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAlex Crichton <alex@alexcrichton.com>2016-03-08 13:42:32 -0800
committerAlex Crichton <alex@alexcrichton.com>2016-03-08 13:44:14 -0800
commit3e6fed3a7a3f783bf967f6c73455743848f31167 (patch)
tree6baf0a53c21e5e239f64138adce104c422a1da5e
parente9cb96a56ab6dc883703928825ec7587db74dc1e (diff)
downloadrust-3e6fed3a7a3f783bf967f6c73455743848f31167.tar.gz
rust-3e6fed3a7a3f783bf967f6c73455743848f31167.zip
rustbuild: Add the error-index-generator
This adds a step and a rule for building the error index as part of rustbuild.
-rw-r--r--mk/crates.mk2
-rw-r--r--src/bootstrap/build/doc.rs13
-rw-r--r--src/bootstrap/build/mod.rs7
-rw-r--r--src/bootstrap/build/step.rs9
-rw-r--r--src/tools/error_index_generator/Cargo.lock4
-rw-r--r--src/tools/error_index_generator/Cargo.toml8
-rw-r--r--src/tools/error_index_generator/main.rs (renamed from src/error_index_generator/main.rs)35
7 files changed, 61 insertions, 17 deletions
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
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<T: Formatter>(err_map: &ErrorMetadataMap, output_path: &Pat
     formatter.footer(&mut output_file)
 }
 
-fn main_with_result(format: OutputFormat) -> Result<(), Box<Error>> {
+fn main_with_result(format: OutputFormat, dst: &Path) -> Result<(), Box<Error>> {
     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("<nul>"),
+        }
+    });
+    (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());
     }
 }