-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of #63175 - jsgf:argsfile, r=jsgf
rustc: implement argsfiles for command line Many tools, such as gcc and gnu-ld, support "args files" - that is, being able to specify @file on the command line. This causes `file` to be opened and parsed for command line options. They're separated with whitespace; whitespace can be quoted with double or single quotes, and everything can be \\-escaped. Args files may recursively include other args files via `@file2`. See https://sourceware.org/binutils/docs/ld/Options.html#Options for the documentation of gnu-ld's @file parameters. This is useful for very large command lines, or when command lines are being generated into files by other tooling.
- Loading branch information
Showing
10 changed files
with
139 additions
and
8 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
use std::error; | ||
use std::fmt; | ||
use std::fs; | ||
use std::io; | ||
use std::str; | ||
use std::sync::atomic::{AtomicBool, Ordering}; | ||
|
||
static USED_ARGSFILE_FEATURE: AtomicBool = AtomicBool::new(false); | ||
|
||
pub fn used_unstable_argsfile() -> bool { | ||
USED_ARGSFILE_FEATURE.load(Ordering::Relaxed) | ||
} | ||
|
||
pub fn arg_expand(arg: String) -> Result<Vec<String>, Error> { | ||
if arg.starts_with("@") { | ||
let path = &arg[1..]; | ||
let file = match fs::read_to_string(path) { | ||
Ok(file) => { | ||
USED_ARGSFILE_FEATURE.store(true, Ordering::Relaxed); | ||
file | ||
} | ||
Err(ref err) if err.kind() == io::ErrorKind::InvalidData => { | ||
return Err(Error::Utf8Error(Some(path.to_string()))); | ||
} | ||
Err(err) => return Err(Error::IOError(path.to_string(), err)), | ||
}; | ||
Ok(file.lines().map(ToString::to_string).collect()) | ||
} else { | ||
Ok(vec![arg]) | ||
} | ||
} | ||
|
||
#[derive(Debug)] | ||
pub enum Error { | ||
Utf8Error(Option<String>), | ||
IOError(String, io::Error), | ||
} | ||
|
||
impl fmt::Display for Error { | ||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { | ||
match self { | ||
Error::Utf8Error(None) => write!(fmt, "Utf8 error"), | ||
Error::Utf8Error(Some(path)) => write!(fmt, "Utf8 error in {}", path), | ||
Error::IOError(path, err) => write!(fmt, "IO Error: {}: {}", path, err), | ||
} | ||
} | ||
} | ||
|
||
impl error::Error for Error { | ||
fn description(&self) -> &'static str { | ||
"argument error" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
--cfg | ||
unbroken� |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Check to see if we can get parameters from an @argsfile file | ||
// | ||
// build-fail | ||
// 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() { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
error: Failed to load argument file: Utf8 error in $DIR/commandline-argfile-badutf8.args | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
// Check to see if we can get parameters from an @argsfile file | ||
// | ||
// ignore-tidy-linelength | ||
// build-fail | ||
// 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() { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
error: Failed to load argument file: IO Error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
--cfg | ||
unbroken |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
// Check to see if we can get parameters from an @argsfile file | ||
// | ||
// build-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() { | ||
} |