about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorDylan DPC <dylan.dpc@gmail.com>2021-02-19 02:49:12 +0100
committerGitHub <noreply@github.com>2021-02-19 02:49:12 +0100
commitd9bc16cf368f1a8701295ed83f0337461acd6963 (patch)
treef488908a9af717c89d066768b94c05feb42df380 /src
parentcc01bbe8f0cf7b19053c5f0578992cb7d2f4bba8 (diff)
parent755b3fc722c36d9761bf49c246b5f7c85a62380d (diff)
Rollup merge of #82261 - ojeda:rustdoc-argfile, r=jyn514
rustdoc: Support argument files

Factors out the `rustc_driver` logic that handles argument files so that rustdoc supports them as well, e.g.:

    rustdoc `@argfile`

This is needed to be able to generate docs for projects that already use argument files when compiling them, e.g. projects that pass a huge number of `--cfg` arguments.

The feature was stabilized for `rustc` in #66172.
Diffstat (limited to 'src')
-rw-r--r--src/doc/rustdoc/src/command-line-arguments.md7
-rw-r--r--src/librustdoc/lib.rs5
-rw-r--r--src/test/rustdoc-ui/commandline-argfile-badutf8.args2
-rw-r--r--src/test/rustdoc-ui/commandline-argfile-badutf8.rs12
-rw-r--r--src/test/rustdoc-ui/commandline-argfile-badutf8.stderr2
-rw-r--r--src/test/rustdoc-ui/commandline-argfile-missing.rs15
-rw-r--r--src/test/rustdoc-ui/commandline-argfile-missing.stderr2
-rw-r--r--src/test/rustdoc-ui/commandline-argfile.args2
-rw-r--r--src/test/rustdoc-ui/commandline-argfile.rs13
9 files changed, 59 insertions, 1 deletions
diff --git a/src/doc/rustdoc/src/command-line-arguments.md b/src/doc/rustdoc/src/command-line-arguments.md
index 80f7851debf..0302fbecb6e 100644
--- a/src/doc/rustdoc/src/command-line-arguments.md
+++ b/src/doc/rustdoc/src/command-line-arguments.md
@@ -422,3 +422,10 @@ $ rustdoc src/lib.rs --crate-version 1.3.37
 When `rustdoc` receives this flag, it will print an extra "Version (version)" into the sidebar of
 the crate root's docs. You can use this flag to differentiate between different versions of your
 library's documentation.
+
+## `@path`: load command-line flags from a path
+
+If you specify `@path` on the command-line, then it will open `path` and read
+command line options from it. These options are one per line; a blank line indicates
+an empty option. The file can use Unix or Windows style line endings, and must be
+encoded as UTF-8.
diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs
index 18bc275572f..d7978c4a022 100644
--- a/src/librustdoc/lib.rs
+++ b/src/librustdoc/lib.rs
@@ -432,13 +432,16 @@ fn usage(argv0: &str) {
         (option.apply)(&mut options);
     }
     println!("{}", options.usage(&format!("{} [options] <input>", argv0)));
+    println!("    @path               Read newline separated options from `path`\n");
     println!("More information available at https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html")
 }
 
 /// A result type used by several functions under `main()`.
 type MainResult = Result<(), ErrorReported>;
 
-fn main_args(args: &[String]) -> MainResult {
+fn main_args(at_args: &[String]) -> MainResult {
+    let args = rustc_driver::args::arg_expand_all(at_args);
+
     let mut options = getopts::Options::new();
     for option in opts() {
         (option.apply)(&mut options);
diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.args b/src/test/rustdoc-ui/commandline-argfile-badutf8.args
new file mode 100644
index 00000000000..c070b0c2400
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.args
@@ -0,0 +1,2 @@
+--cfg
+unbroken€
\ No newline at end of file
diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.rs b/src/test/rustdoc-ui/commandline-argfile-badutf8.rs
new file mode 100644
index 00000000000..e2984e3ca97
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.rs
@@ -0,0 +1,12 @@
+// Check to see if we can get parameters from an @argsfile file
+//
+// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-badutf8.args
+
+#[cfg(not(cmdline_set))]
+compile_error!("cmdline_set not set");
+
+#[cfg(not(unbroken))]
+compile_error!("unbroken not set");
+
+fn main() {
+}
diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr b/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr
new file mode 100644
index 00000000000..9af6fc0a518
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr
@@ -0,0 +1,2 @@
+error: Failed to load argument file: Utf8 error in $DIR/commandline-argfile-badutf8.args
+
diff --git a/src/test/rustdoc-ui/commandline-argfile-missing.rs b/src/test/rustdoc-ui/commandline-argfile-missing.rs
new file mode 100644
index 00000000000..020c3ff3c7e
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile-missing.rs
@@ -0,0 +1,15 @@
+// Check to see if we can get parameters from an @argsfile file
+//
+// ignore-tidy-linelength
+// normalize-stderr-test: "os error \d+" -> "os error $$ERR"
+// normalize-stderr-test: "commandline-argfile-missing.args:[^(]*" -> "commandline-argfile-missing.args: $$FILE_MISSING "
+// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-missing.args
+
+#[cfg(not(cmdline_set))]
+compile_error!("cmdline_set not set");
+
+#[cfg(not(unbroken))]
+compile_error!("unbroken not set");
+
+fn main() {
+}
diff --git a/src/test/rustdoc-ui/commandline-argfile-missing.stderr b/src/test/rustdoc-ui/commandline-argfile-missing.stderr
new file mode 100644
index 00000000000..179ad831004
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile-missing.stderr
@@ -0,0 +1,2 @@
+error: Failed to load argument file: IO Error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR)
+
diff --git a/src/test/rustdoc-ui/commandline-argfile.args b/src/test/rustdoc-ui/commandline-argfile.args
new file mode 100644
index 00000000000..972938bf6c8
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile.args
@@ -0,0 +1,2 @@
+--cfg
+unbroken
\ No newline at end of file
diff --git a/src/test/rustdoc-ui/commandline-argfile.rs b/src/test/rustdoc-ui/commandline-argfile.rs
new file mode 100644
index 00000000000..cc8c8722c1c
--- /dev/null
+++ b/src/test/rustdoc-ui/commandline-argfile.rs
@@ -0,0 +1,13 @@
+// Check to see if we can get parameters from an @argsfile file
+//
+// check-pass
+// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile.args
+
+#[cfg(not(cmdline_set))]
+compile_error!("cmdline_set not set");
+
+#[cfg(not(unbroken))]
+compile_error!("unbroken not set");
+
+fn main() {
+}