about summary refs log tree commit diff
diff options
context:
space:
mode:
authorjyn <github@jyn.dev>2023-05-25 15:14:56 -0500
committerjyn <github@jyn.dev>2023-05-29 13:26:44 -0500
commitc28ee603c8ddc2f171bee4ba02336fb6a3479010 (patch)
tree56e98ebbeb14854987c6aa569adbecf88b7b0e43
parent71770d5e6e5c6d77777e7f9c86f7c9533882c449 (diff)
downloadrust-c28ee603c8ddc2f171bee4ba02336fb6a3479010.tar.gz
rust-c28ee603c8ddc2f171bee4ba02336fb6a3479010.zip
Fix bugs in `doc` refactor
- Switch from `cargo rustdoc` to `cargo doc`

  This allows passing `-p` to multiple packages.

- Remove `OsStr` support

  It doesn't work with RUSTDOCFLAGS, and we don't support non-utf8 paths
  anyway.

- Pass `-p std` for each crate in the standard library

  By default cargo only documents the top-level crate, which is
  `sysroot` and has no docs.
-rw-r--r--src/bootstrap/doc.rs65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs
index 357cd778b6c..3de85c91516 100644
--- a/src/bootstrap/doc.rs
+++ b/src/bootstrap/doc.rs
@@ -7,7 +7,6 @@
 //! Everything here is basically just a shim around calling either `rustbook` or
 //! `rustdoc`.
 
-use std::ffi::OsStr;
 use std::fs;
 use std::io;
 use std::path::{Path, PathBuf};
@@ -471,20 +470,21 @@ impl Step for Std {
             builder.ensure(SharedAssets { target: self.target });
         }
 
-        let index_page = builder.src.join("src/doc/index.md").into_os_string();
+        let index_page = builder
+            .src
+            .join("src/doc/index.md")
+            .into_os_string()
+            .into_string()
+            .expect("non-utf8 paths are unsupported");
         let mut extra_args = match self.format {
-            DocumentationFormat::HTML => vec![
-                OsStr::new("--markdown-css"),
-                OsStr::new("rust.css"),
-                OsStr::new("--markdown-no-toc"),
-                OsStr::new("--index-page"),
-                &index_page,
-            ],
-            DocumentationFormat::JSON => vec![OsStr::new("--output-format"), OsStr::new("json")],
+            DocumentationFormat::HTML => {
+                vec!["--markdown-css", "rust.css", "--markdown-no-toc", "--index-page", &index_page]
+            }
+            DocumentationFormat::JSON => vec!["--output-format", "json"],
         };
 
         if !builder.config.docs_minification {
-            extra_args.push(OsStr::new("--disable-minification"));
+            extra_args.push("--disable-minification");
         }
 
         doc_std(builder, self.format, stage, target, &out, &extra_args, &self.crates);
@@ -549,7 +549,7 @@ fn doc_std(
     stage: u32,
     target: TargetSelection,
     out: &Path,
-    extra_args: &[&OsStr],
+    extra_args: &[&str],
     requested_crates: &[String],
 ) {
     if builder.no_std(target) == Some(true) {
@@ -574,24 +574,39 @@ fn doc_std(
     // as a function parameter.
     let out_dir = target_dir.join(target.triple).join("doc");
 
-    let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "rustdoc");
+    let mut cargo = builder.cargo(compiler, Mode::Std, SourceType::InTree, target, "doc");
     compile::std_cargo(builder, target, compiler.stage, &mut cargo);
-    cargo.arg("--target-dir").arg(&*target_dir.to_string_lossy()).arg("-Zskip-rustdoc-fingerprint");
+    cargo
+        .arg("--no-deps")
+        .arg("--target-dir")
+        .arg(&*target_dir.to_string_lossy())
+        .arg("-Zskip-rustdoc-fingerprint")
+        .rustdocflag("-Z")
+        .rustdocflag("unstable-options")
+        .rustdocflag("--resource-suffix")
+        .rustdocflag(&builder.version);
+    for arg in extra_args {
+        cargo.rustdocflag(arg);
+    }
 
-    for krate in requested_crates {
-        cargo.arg("-p").arg(krate);
+    if builder.config.library_docs_private_items {
+        cargo.rustdocflag("--document-private-items").rustdocflag("--document-hidden-items");
     }
 
-    cargo
-        .arg("--")
-        .arg("-Z")
-        .arg("unstable-options")
-        .arg("--resource-suffix")
-        .arg(&builder.version)
-        .args(extra_args);
+    // HACK: because we use `--manifest-path library/sysroot/Cargo.toml`, cargo thinks we only want to document that specific crate, not its dependencies.
+    // Override its default.
+    let built_crates = if requested_crates.is_empty() {
+        builder
+            .in_tree_crates("sysroot", None)
+            .into_iter()
+            .map(|krate| krate.name.to_string())
+            .collect()
+    } else {
+        requested_crates.to_vec()
+    };
 
-    if builder.config.library_docs_private_items {
-        cargo.arg("--document-private-items").arg("--document-hidden-items");
+    for krate in built_crates {
+        cargo.arg("-p").arg(krate);
     }
 
     builder.run(&mut cargo.into());