Auto merge of #126121 - Kobzol:runmake-cmd-wrapper, r=jieyouxu
Add a custom Command wrapper to `run-make-support` This should make it easier to make sure that we check process exit codes, and it should also make checking of stdout/stderr less verbose and more explicit in run-make tests. I prefer the `run()/run_fail().assert(...)` style to something like `run_fail_assert_exit_code`, because the former is more composable. Regarding https://github.com/rust-lang/rust/issues/125747, I'm not sure if we really need a custom trait, I think that we can get far enough with just `Deref` on the `Cc/Clang/Rustc/Rustdoc/...` structs. But now that these structs don't even need `command_output` anymore, I think that they are fine-ish as they are with the macro. Related issues: https://github.com/rust-lang/rust/issues/125617, https://github.com/rust-lang/rust/issues/125747 Fixes: https://github.com/rust-lang/rust/issues/125617 (because `command_output` is no longer a public method) r? `@jieyouxu`
This commit is contained in:
commit
f21554f7f0
@ -1,7 +1,7 @@
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
|
||||||
|
|
||||||
use crate::{bin_name, cygpath_windows, env_var, handle_failed_output, is_msvc, is_windows, uname};
|
use crate::command::Command;
|
||||||
|
use crate::{bin_name, cygpath_windows, env_var, is_msvc, is_windows, uname};
|
||||||
|
|
||||||
/// Construct a new platform-specific C compiler invocation.
|
/// Construct a new platform-specific C compiler invocation.
|
||||||
///
|
///
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::Command;
|
|
||||||
|
|
||||||
use crate::{bin_name, env_var, handle_failed_output};
|
use crate::command::Command;
|
||||||
|
use crate::{bin_name, env_var};
|
||||||
|
|
||||||
/// Construct a new `clang` invocation. `clang` is not always available for all targets.
|
/// Construct a new `clang` invocation. `clang` is not always available for all targets.
|
||||||
pub fn clang() -> Clang {
|
pub fn clang() -> Clang {
|
||||||
@ -68,9 +68,4 @@ pub fn use_ld(&mut self, ld: &str) -> &mut Self {
|
|||||||
self.cmd.arg(format!("-fuse-ld={ld}"));
|
self.cmd.arg(format!("-fuse-ld={ld}"));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the [`Output`][::std::process::Output] of the finished process.
|
|
||||||
pub fn command_output(&mut self) -> ::std::process::Output {
|
|
||||||
self.cmd.output().expect("failed to get output of finished process")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
151
src/tools/run-make-support/src/command.rs
Normal file
151
src/tools/run-make-support/src/command.rs
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
use crate::{assert_not_contains, handle_failed_output};
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
use std::io::Write;
|
||||||
|
use std::ops::{Deref, DerefMut};
|
||||||
|
use std::process::{Command as StdCommand, ExitStatus, Output, Stdio};
|
||||||
|
|
||||||
|
/// This is a custom command wrapper that simplifies working with commands
|
||||||
|
/// and makes it easier to ensure that we check the exit status of executed
|
||||||
|
/// processes.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Command {
|
||||||
|
cmd: StdCommand,
|
||||||
|
stdin: Option<Box<[u8]>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Command {
|
||||||
|
pub fn new<S: AsRef<OsStr>>(program: S) -> Self {
|
||||||
|
Self { cmd: StdCommand::new(program), stdin: None }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_stdin(&mut self, stdin: Box<[u8]>) {
|
||||||
|
self.stdin = Some(stdin);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Run the constructed command and assert that it is successfully run.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn run(&mut self) -> CompletedProcess {
|
||||||
|
let caller_location = std::panic::Location::caller();
|
||||||
|
let caller_line_number = caller_location.line();
|
||||||
|
|
||||||
|
let output = self.command_output();
|
||||||
|
if !output.status().success() {
|
||||||
|
handle_failed_output(&self, output, caller_line_number);
|
||||||
|
}
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Run the constructed command and assert that it does not successfully run.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn run_fail(&mut self) -> CompletedProcess {
|
||||||
|
let caller_location = std::panic::Location::caller();
|
||||||
|
let caller_line_number = caller_location.line();
|
||||||
|
|
||||||
|
let output = self.command_output();
|
||||||
|
if output.status().success() {
|
||||||
|
handle_failed_output(&self, output, caller_line_number);
|
||||||
|
}
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub(crate) fn command_output(&mut self) -> CompletedProcess {
|
||||||
|
// let's make sure we piped all the input and outputs
|
||||||
|
self.cmd.stdin(Stdio::piped());
|
||||||
|
self.cmd.stdout(Stdio::piped());
|
||||||
|
self.cmd.stderr(Stdio::piped());
|
||||||
|
|
||||||
|
let output = if let Some(input) = &self.stdin {
|
||||||
|
let mut child = self.cmd.spawn().unwrap();
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut stdin = child.stdin.take().unwrap();
|
||||||
|
stdin.write_all(input.as_ref()).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
child.wait_with_output().expect("failed to get output of finished process")
|
||||||
|
} else {
|
||||||
|
self.cmd.output().expect("failed to get output of finished process")
|
||||||
|
};
|
||||||
|
output.into()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Deref for Command {
|
||||||
|
type Target = StdCommand;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.cmd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DerefMut for Command {
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
&mut self.cmd
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Represents the result of an executed process.
|
||||||
|
/// The various `assert_` helper methods should preferably be used for
|
||||||
|
/// checking the contents of stdout/stderr.
|
||||||
|
pub struct CompletedProcess {
|
||||||
|
output: Output,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl CompletedProcess {
|
||||||
|
pub fn stdout_utf8(&self) -> String {
|
||||||
|
String::from_utf8(self.output.stdout.clone()).expect("stdout is not valid UTF-8")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn stderr_utf8(&self) -> String {
|
||||||
|
String::from_utf8(self.output.stderr.clone()).expect("stderr is not valid UTF-8")
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn status(&self) -> ExitStatus {
|
||||||
|
self.output.status
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks that trimmed `stdout` matches trimmed `content`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stdout_equals<S: AsRef<str>>(self, content: S) -> Self {
|
||||||
|
assert_eq!(self.stdout_utf8().trim(), content.as_ref().trim());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stdout_not_contains<S: AsRef<str>>(self, needle: S) -> Self {
|
||||||
|
assert_not_contains(&self.stdout_utf8(), needle.as_ref());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Checks that trimmed `stderr` matches trimmed `content`.
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stderr_equals<S: AsRef<str>>(self, content: S) -> Self {
|
||||||
|
assert_eq!(self.stderr_utf8().trim(), content.as_ref().trim());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stderr_contains<S: AsRef<str>>(self, needle: S) -> Self {
|
||||||
|
assert!(self.stderr_utf8().contains(needle.as_ref()));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_stderr_not_contains<S: AsRef<str>>(self, needle: S) -> Self {
|
||||||
|
assert_not_contains(&self.stdout_utf8(), needle.as_ref());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
#[track_caller]
|
||||||
|
pub fn assert_exit_code(self, code: i32) -> Self {
|
||||||
|
assert!(self.output.status.code() == Some(code));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<Output> for CompletedProcess {
|
||||||
|
fn from(output: Output) -> Self {
|
||||||
|
Self { output }
|
||||||
|
}
|
||||||
|
}
|
@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
pub mod cc;
|
pub mod cc;
|
||||||
pub mod clang;
|
pub mod clang;
|
||||||
|
mod command;
|
||||||
pub mod diff;
|
pub mod diff;
|
||||||
pub mod llvm_readobj;
|
pub mod llvm_readobj;
|
||||||
pub mod run;
|
pub mod run;
|
||||||
@ -16,7 +17,6 @@
|
|||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::process::{Command, Output};
|
|
||||||
|
|
||||||
pub use gimli;
|
pub use gimli;
|
||||||
pub use object;
|
pub use object;
|
||||||
@ -27,7 +27,7 @@
|
|||||||
pub use clang::{clang, Clang};
|
pub use clang::{clang, Clang};
|
||||||
pub use diff::{diff, Diff};
|
pub use diff::{diff, Diff};
|
||||||
pub use llvm_readobj::{llvm_readobj, LlvmReadobj};
|
pub use llvm_readobj::{llvm_readobj, LlvmReadobj};
|
||||||
pub use run::{run, run_fail};
|
pub use run::{cmd, run, run_fail};
|
||||||
pub use rustc::{aux_build, rustc, Rustc};
|
pub use rustc::{aux_build, rustc, Rustc};
|
||||||
pub use rustdoc::{bare_rustdoc, rustdoc, Rustdoc};
|
pub use rustdoc::{bare_rustdoc, rustdoc, Rustdoc};
|
||||||
|
|
||||||
@ -167,13 +167,12 @@ pub fn cygpath_windows<P: AsRef<Path>>(path: P) -> String {
|
|||||||
let mut cygpath = Command::new("cygpath");
|
let mut cygpath = Command::new("cygpath");
|
||||||
cygpath.arg("-w");
|
cygpath.arg("-w");
|
||||||
cygpath.arg(path.as_ref());
|
cygpath.arg(path.as_ref());
|
||||||
let output = cygpath.output().unwrap();
|
let output = cygpath.command_output();
|
||||||
if !output.status.success() {
|
if !output.status().success() {
|
||||||
handle_failed_output(&cygpath, output, caller_line_number);
|
handle_failed_output(&cygpath, output, caller_line_number);
|
||||||
}
|
}
|
||||||
let s = String::from_utf8(output.stdout).unwrap();
|
|
||||||
// cygpath -w can attach a newline
|
// cygpath -w can attach a newline
|
||||||
s.trim().to_string()
|
output.stdout_utf8().trim().to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Run `uname`. This assumes that `uname` is available on the platform!
|
/// Run `uname`. This assumes that `uname` is available on the platform!
|
||||||
@ -183,23 +182,23 @@ pub fn uname() -> String {
|
|||||||
let caller_line_number = caller_location.line();
|
let caller_line_number = caller_location.line();
|
||||||
|
|
||||||
let mut uname = Command::new("uname");
|
let mut uname = Command::new("uname");
|
||||||
let output = uname.output().unwrap();
|
let output = uname.command_output();
|
||||||
if !output.status.success() {
|
if !output.status().success() {
|
||||||
handle_failed_output(&uname, output, caller_line_number);
|
handle_failed_output(&uname, output, caller_line_number);
|
||||||
}
|
}
|
||||||
String::from_utf8(output.stdout).unwrap()
|
output.stdout_utf8()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_failed_output(cmd: &Command, output: Output, caller_line_number: u32) -> ! {
|
fn handle_failed_output(cmd: &Command, output: CompletedProcess, caller_line_number: u32) -> ! {
|
||||||
if output.status.success() {
|
if output.status().success() {
|
||||||
eprintln!("command unexpectedly succeeded at line {caller_line_number}");
|
eprintln!("command unexpectedly succeeded at line {caller_line_number}");
|
||||||
} else {
|
} else {
|
||||||
eprintln!("command failed at line {caller_line_number}");
|
eprintln!("command failed at line {caller_line_number}");
|
||||||
}
|
}
|
||||||
eprintln!("{cmd:?}");
|
eprintln!("{cmd:?}");
|
||||||
eprintln!("output status: `{}`", output.status);
|
eprintln!("output status: `{}`", output.status());
|
||||||
eprintln!("=== STDOUT ===\n{}\n\n", String::from_utf8(output.stdout).unwrap());
|
eprintln!("=== STDOUT ===\n{}\n\n", output.stdout_utf8());
|
||||||
eprintln!("=== STDERR ===\n{}\n\n", String::from_utf8(output.stderr).unwrap());
|
eprintln!("=== STDERR ===\n{}\n\n", output.stderr_utf8());
|
||||||
std::process::exit(1)
|
std::process::exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -286,6 +285,7 @@ pub fn read_dir<F: Fn(&Path)>(dir: impl AsRef<Path>, callback: F) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Check that `haystack` does not contain `needle`. Panic otherwise.
|
/// Check that `haystack` does not contain `needle`. Panic otherwise.
|
||||||
|
#[track_caller]
|
||||||
pub fn assert_not_contains(haystack: &str, needle: &str) {
|
pub fn assert_not_contains(haystack: &str, needle: &str) {
|
||||||
if haystack.contains(needle) {
|
if haystack.contains(needle) {
|
||||||
eprintln!("=== HAYSTACK ===");
|
eprintln!("=== HAYSTACK ===");
|
||||||
@ -412,28 +412,14 @@ pub fn inspect<I>(&mut self, inspector: I) -> &mut Self
|
|||||||
|
|
||||||
/// Run the constructed command and assert that it is successfully run.
|
/// Run the constructed command and assert that it is successfully run.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn run(&mut self) -> ::std::process::Output {
|
pub fn run(&mut self) -> crate::command::CompletedProcess {
|
||||||
let caller_location = ::std::panic::Location::caller();
|
self.cmd.run()
|
||||||
let caller_line_number = caller_location.line();
|
|
||||||
|
|
||||||
let output = self.command_output();
|
|
||||||
if !output.status.success() {
|
|
||||||
handle_failed_output(&self.cmd, output, caller_line_number);
|
|
||||||
}
|
|
||||||
output
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Run the constructed command and assert that it does not successfully run.
|
/// Run the constructed command and assert that it does not successfully run.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn run_fail(&mut self) -> ::std::process::Output {
|
pub fn run_fail(&mut self) -> crate::command::CompletedProcess {
|
||||||
let caller_location = ::std::panic::Location::caller();
|
self.cmd.run_fail()
|
||||||
let caller_line_number = caller_location.line();
|
|
||||||
|
|
||||||
let output = self.command_output();
|
|
||||||
if output.status.success() {
|
|
||||||
handle_failed_output(&self.cmd, output, caller_line_number);
|
|
||||||
}
|
|
||||||
output
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the path where the command will be run.
|
/// Set the path where the command will be run.
|
||||||
@ -445,4 +431,5 @@ pub fn current_dir<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use crate::command::{Command, CompletedProcess};
|
||||||
pub(crate) use impl_common_helpers;
|
pub(crate) use impl_common_helpers;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::process::Command;
|
|
||||||
|
|
||||||
use crate::{env_var, handle_failed_output};
|
use crate::command::Command;
|
||||||
|
use crate::env_var;
|
||||||
|
|
||||||
/// Construct a new `llvm-readobj` invocation. This assumes that `llvm-readobj` is available
|
/// Construct a new `llvm-readobj` invocation. This assumes that `llvm-readobj` is available
|
||||||
/// at `$LLVM_BIN_DIR/llvm-readobj`.
|
/// at `$LLVM_BIN_DIR/llvm-readobj`.
|
||||||
@ -39,10 +39,4 @@ pub fn file_header(&mut self) -> &mut Self {
|
|||||||
self.cmd.arg("--file-header");
|
self.cmd.arg("--file-header");
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the [`Output`][::std::process::Output] of the finished process.
|
|
||||||
#[track_caller]
|
|
||||||
pub fn command_output(&mut self) -> ::std::process::Output {
|
|
||||||
self.cmd.output().expect("failed to get output of finished process")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,13 @@
|
|||||||
use std::env;
|
use std::env;
|
||||||
|
use std::ffi::OsStr;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::process::{Command, Output};
|
|
||||||
|
|
||||||
use crate::{cwd, env_var, is_windows};
|
use crate::command::{Command, CompletedProcess};
|
||||||
|
use crate::{cwd, env_var, is_windows, set_host_rpath};
|
||||||
|
|
||||||
use super::handle_failed_output;
|
use super::handle_failed_output;
|
||||||
|
|
||||||
fn run_common(name: &str) -> (Command, Output) {
|
fn run_common(name: &str) -> (Command, CompletedProcess) {
|
||||||
let mut bin_path = PathBuf::new();
|
let mut bin_path = PathBuf::new();
|
||||||
bin_path.push(cwd());
|
bin_path.push(cwd());
|
||||||
bin_path.push(name);
|
bin_path.push(name);
|
||||||
@ -33,18 +34,18 @@ fn run_common(name: &str) -> (Command, Output) {
|
|||||||
cmd.env("PATH", env::join_paths(paths.iter()).unwrap());
|
cmd.env("PATH", env::join_paths(paths.iter()).unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
let output = cmd.output().unwrap();
|
let output = cmd.command_output();
|
||||||
(cmd, output)
|
(cmd, output)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Run a built binary and make sure it succeeds.
|
/// Run a built binary and make sure it succeeds.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn run(name: &str) -> Output {
|
pub fn run(name: &str) -> CompletedProcess {
|
||||||
let caller_location = std::panic::Location::caller();
|
let caller_location = std::panic::Location::caller();
|
||||||
let caller_line_number = caller_location.line();
|
let caller_line_number = caller_location.line();
|
||||||
|
|
||||||
let (cmd, output) = run_common(name);
|
let (cmd, output) = run_common(name);
|
||||||
if !output.status.success() {
|
if !output.status().success() {
|
||||||
handle_failed_output(&cmd, output, caller_line_number);
|
handle_failed_output(&cmd, output, caller_line_number);
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
@ -52,13 +53,21 @@ pub fn run(name: &str) -> Output {
|
|||||||
|
|
||||||
/// Run a built binary and make sure it fails.
|
/// Run a built binary and make sure it fails.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn run_fail(name: &str) -> Output {
|
pub fn run_fail(name: &str) -> CompletedProcess {
|
||||||
let caller_location = std::panic::Location::caller();
|
let caller_location = std::panic::Location::caller();
|
||||||
let caller_line_number = caller_location.line();
|
let caller_line_number = caller_location.line();
|
||||||
|
|
||||||
let (cmd, output) = run_common(name);
|
let (cmd, output) = run_common(name);
|
||||||
if output.status.success() {
|
if output.status().success() {
|
||||||
handle_failed_output(&cmd, output, caller_line_number);
|
handle_failed_output(&cmd, output, caller_line_number);
|
||||||
}
|
}
|
||||||
output
|
output
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Create a new custom Command.
|
||||||
|
/// This should be preferred to creating `std::process::Command` directly.
|
||||||
|
pub fn cmd<S: AsRef<OsStr>>(program: S) -> Command {
|
||||||
|
let mut command = Command::new(program);
|
||||||
|
set_host_rpath(&mut command);
|
||||||
|
command
|
||||||
|
}
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
|
use command::Command;
|
||||||
use std::ffi::{OsStr, OsString};
|
use std::ffi::{OsStr, OsString};
|
||||||
use std::io::Write;
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::{Command, Output, Stdio};
|
|
||||||
|
|
||||||
use crate::{cwd, env_var, handle_failed_output, set_host_rpath};
|
use crate::{command, cwd, env_var, set_host_rpath};
|
||||||
|
|
||||||
/// Construct a new `rustc` invocation.
|
/// Construct a new `rustc` invocation.
|
||||||
pub fn rustc() -> Rustc {
|
pub fn rustc() -> Rustc {
|
||||||
@ -19,7 +18,6 @@ pub fn aux_build() -> Rustc {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Rustc {
|
pub struct Rustc {
|
||||||
cmd: Command,
|
cmd: Command,
|
||||||
stdin: Option<Box<[u8]>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
crate::impl_common_helpers!(Rustc);
|
crate::impl_common_helpers!(Rustc);
|
||||||
@ -38,14 +36,14 @@ impl Rustc {
|
|||||||
/// Construct a new `rustc` invocation.
|
/// Construct a new `rustc` invocation.
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
let cmd = setup_common();
|
let cmd = setup_common();
|
||||||
Self { cmd, stdin: None }
|
Self { cmd }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct a new `rustc` invocation with `aux_build` preset (setting `--crate-type=lib`).
|
/// Construct a new `rustc` invocation with `aux_build` preset (setting `--crate-type=lib`).
|
||||||
pub fn new_aux_build() -> Self {
|
pub fn new_aux_build() -> Self {
|
||||||
let mut cmd = setup_common();
|
let mut cmd = setup_common();
|
||||||
cmd.arg("--crate-type=lib");
|
cmd.arg("--crate-type=lib");
|
||||||
Self { cmd, stdin: None }
|
Self { cmd }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Argument provider methods
|
// Argument provider methods
|
||||||
@ -197,7 +195,7 @@ pub fn link_arg(&mut self, link_arg: &str) -> &mut Self {
|
|||||||
|
|
||||||
/// Specify a stdin input
|
/// Specify a stdin input
|
||||||
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
|
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
|
||||||
self.stdin = Some(input.as_ref().to_vec().into_boxed_slice());
|
self.cmd.set_stdin(input.as_ref().to_vec().into_boxed_slice());
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,38 +211,4 @@ pub fn linker(&mut self, linker: &str) -> &mut Self {
|
|||||||
self.cmd.arg(format!("-Clinker={linker}"));
|
self.cmd.arg(format!("-Clinker={linker}"));
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the [`Output`] of the finished process.
|
|
||||||
#[track_caller]
|
|
||||||
pub fn command_output(&mut self) -> Output {
|
|
||||||
// let's make sure we piped all the input and outputs
|
|
||||||
self.cmd.stdin(Stdio::piped());
|
|
||||||
self.cmd.stdout(Stdio::piped());
|
|
||||||
self.cmd.stderr(Stdio::piped());
|
|
||||||
|
|
||||||
if let Some(input) = &self.stdin {
|
|
||||||
let mut child = self.cmd.spawn().unwrap();
|
|
||||||
|
|
||||||
{
|
|
||||||
let mut stdin = child.stdin.take().unwrap();
|
|
||||||
stdin.write_all(input.as_ref()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
child.wait_with_output().expect("failed to get output of finished process")
|
|
||||||
} else {
|
|
||||||
self.cmd.output().expect("failed to get output of finished process")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[track_caller]
|
|
||||||
pub fn run_fail_assert_exit_code(&mut self, code: i32) -> Output {
|
|
||||||
let caller_location = std::panic::Location::caller();
|
|
||||||
let caller_line_number = caller_location.line();
|
|
||||||
|
|
||||||
let output = self.command_output();
|
|
||||||
if output.status.code().unwrap() != code {
|
|
||||||
handle_failed_output(&self.cmd, output, caller_line_number);
|
|
||||||
}
|
|
||||||
output
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
use std::ffi::OsStr;
|
use std::ffi::OsStr;
|
||||||
use std::io::Write;
|
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use std::process::{Command, Output, Stdio};
|
|
||||||
|
|
||||||
use crate::{env_var, env_var_os, handle_failed_output, set_host_rpath};
|
use crate::command::Command;
|
||||||
|
use crate::{env_var, env_var_os, set_host_rpath};
|
||||||
|
|
||||||
/// Construct a plain `rustdoc` invocation with no flags set.
|
/// Construct a plain `rustdoc` invocation with no flags set.
|
||||||
pub fn bare_rustdoc() -> Rustdoc {
|
pub fn bare_rustdoc() -> Rustdoc {
|
||||||
@ -18,7 +17,6 @@ pub fn rustdoc() -> Rustdoc {
|
|||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct Rustdoc {
|
pub struct Rustdoc {
|
||||||
cmd: Command,
|
cmd: Command,
|
||||||
stdin: Option<Box<[u8]>>,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
crate::impl_common_helpers!(Rustdoc);
|
crate::impl_common_helpers!(Rustdoc);
|
||||||
@ -34,7 +32,7 @@ impl Rustdoc {
|
|||||||
/// Construct a bare `rustdoc` invocation.
|
/// Construct a bare `rustdoc` invocation.
|
||||||
pub fn bare() -> Self {
|
pub fn bare() -> Self {
|
||||||
let cmd = setup_common();
|
let cmd = setup_common();
|
||||||
Self { cmd, stdin: None }
|
Self { cmd }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Construct a `rustdoc` invocation with `-L $(TARGET_RPATH_DIR)` set.
|
/// Construct a `rustdoc` invocation with `-L $(TARGET_RPATH_DIR)` set.
|
||||||
@ -42,7 +40,7 @@ pub fn new() -> Self {
|
|||||||
let mut cmd = setup_common();
|
let mut cmd = setup_common();
|
||||||
let target_rpath_dir = env_var_os("TARGET_RPATH_DIR");
|
let target_rpath_dir = env_var_os("TARGET_RPATH_DIR");
|
||||||
cmd.arg(format!("-L{}", target_rpath_dir.to_string_lossy()));
|
cmd.arg(format!("-L{}", target_rpath_dir.to_string_lossy()));
|
||||||
Self { cmd, stdin: None }
|
Self { cmd }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specify where an external library is located.
|
/// Specify where an external library is located.
|
||||||
@ -88,33 +86,10 @@ pub fn arg_file<P: AsRef<Path>>(&mut self, path: P) -> &mut Self {
|
|||||||
|
|
||||||
/// Specify a stdin input
|
/// Specify a stdin input
|
||||||
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
|
pub fn stdin<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
|
||||||
self.cmd.stdin(Stdio::piped());
|
self.cmd.set_stdin(input.as_ref().to_vec().into_boxed_slice());
|
||||||
self.stdin = Some(input.as_ref().to_vec().into_boxed_slice());
|
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the [`Output`] of the finished process.
|
|
||||||
#[track_caller]
|
|
||||||
pub fn command_output(&mut self) -> ::std::process::Output {
|
|
||||||
// let's make sure we piped all the input and outputs
|
|
||||||
self.cmd.stdin(Stdio::piped());
|
|
||||||
self.cmd.stdout(Stdio::piped());
|
|
||||||
self.cmd.stderr(Stdio::piped());
|
|
||||||
|
|
||||||
if let Some(input) = &self.stdin {
|
|
||||||
let mut child = self.cmd.spawn().unwrap();
|
|
||||||
|
|
||||||
{
|
|
||||||
let mut stdin = child.stdin.take().unwrap();
|
|
||||||
stdin.write_all(input.as_ref()).unwrap();
|
|
||||||
}
|
|
||||||
|
|
||||||
child.wait_with_output().expect("failed to get output of finished process")
|
|
||||||
} else {
|
|
||||||
self.cmd.output().expect("failed to get output of finished process")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Specify the edition year.
|
/// Specify the edition year.
|
||||||
pub fn edition(&mut self, edition: &str) -> &mut Self {
|
pub fn edition(&mut self, edition: &str) -> &mut Self {
|
||||||
self.cmd.arg("--edition");
|
self.cmd.arg("--edition");
|
||||||
@ -156,16 +131,4 @@ pub fn output_format(&mut self, format: &str) -> &mut Self {
|
|||||||
self.cmd.arg(format);
|
self.cmd.arg(format);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
#[track_caller]
|
|
||||||
pub fn run_fail_assert_exit_code(&mut self, code: i32) -> Output {
|
|
||||||
let caller_location = std::panic::Location::caller();
|
|
||||||
let caller_line_number = caller_location.line();
|
|
||||||
|
|
||||||
let output = self.command_output();
|
|
||||||
if output.status.code().unwrap() != code {
|
|
||||||
handle_failed_output(&self.cmd, output, caller_line_number);
|
|
||||||
}
|
|
||||||
output
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -10,14 +10,10 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
aux_build().input("stable.rs").emit("metadata").run();
|
aux_build().input("stable.rs").emit("metadata").run();
|
||||||
|
|
||||||
let output = rustc()
|
let output =
|
||||||
.input("main.rs")
|
rustc().input("main.rs").emit("metadata").extern_("stable", "libstable.rmeta").run();
|
||||||
.emit("metadata")
|
|
||||||
.extern_("stable", "libstable.rmeta")
|
|
||||||
.command_output();
|
|
||||||
|
|
||||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
|
||||||
let version = std::fs::read_to_string(source_root().join("src/version")).unwrap();
|
let version = std::fs::read_to_string(source_root().join("src/version")).unwrap();
|
||||||
let expected_string = format!("stable since {}", version.trim());
|
let expected_string = format!("stable since {}", version.trim());
|
||||||
assert!(stderr.contains(&expected_string));
|
output.assert_stderr_contains(expected_string);
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
// Test that `-Awarnings` suppresses warnings for unstable APIs.
|
// Test that `-Awarnings` suppresses warnings for unstable APIs.
|
||||||
|
|
||||||
use run_make_support::{assert_not_contains, rustc};
|
use run_make_support::rustc;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
rustc().input("bar.rs").run();
|
rustc().input("bar.rs").run();
|
||||||
let output = rustc().input("foo.rs").arg("-Awarnings").run();
|
rustc()
|
||||||
|
.input("foo.rs")
|
||||||
assert_not_contains(&String::from_utf8(output.stdout).unwrap(), "warning");
|
.arg("-Awarnings")
|
||||||
assert_not_contains(&String::from_utf8(output.stderr).unwrap(), "warning");
|
.run()
|
||||||
|
.assert_stdout_not_contains("warning")
|
||||||
|
.assert_stderr_not_contains("warning");
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,7 @@
|
|||||||
use run_make_support::object::ObjectSection;
|
use run_make_support::object::ObjectSection;
|
||||||
use run_make_support::object::ObjectSymbol;
|
use run_make_support::object::ObjectSymbol;
|
||||||
use run_make_support::object::RelocationTarget;
|
use run_make_support::object::RelocationTarget;
|
||||||
use run_make_support::set_host_rpath;
|
use run_make_support::{cmd, env_var, object};
|
||||||
use run_make_support::{env_var, object};
|
|
||||||
use std::collections::HashSet;
|
use std::collections::HashSet;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
@ -35,7 +34,7 @@ fn main() {
|
|||||||
let path = env_var("PATH");
|
let path = env_var("PATH");
|
||||||
let rustc = env_var("RUSTC");
|
let rustc = env_var("RUSTC");
|
||||||
let bootstrap_cargo = env_var("BOOTSTRAP_CARGO");
|
let bootstrap_cargo = env_var("BOOTSTRAP_CARGO");
|
||||||
let mut cmd = std::process::Command::new(bootstrap_cargo);
|
let mut cmd = cmd(bootstrap_cargo);
|
||||||
cmd.args([
|
cmd.args([
|
||||||
"build",
|
"build",
|
||||||
"--manifest-path",
|
"--manifest-path",
|
||||||
@ -52,10 +51,8 @@ fn main() {
|
|||||||
// Visual Studio 2022 requires that the LIB env var be set so it can
|
// Visual Studio 2022 requires that the LIB env var be set so it can
|
||||||
// find the Windows SDK.
|
// find the Windows SDK.
|
||||||
.env("LIB", std::env::var("LIB").unwrap_or_default());
|
.env("LIB", std::env::var("LIB").unwrap_or_default());
|
||||||
set_host_rpath(&mut cmd);
|
|
||||||
|
|
||||||
let status = cmd.status().unwrap();
|
cmd.run();
|
||||||
assert!(status.success());
|
|
||||||
|
|
||||||
let rlibs_path = target_dir.join(target).join("debug").join("deps");
|
let rlibs_path = target_dir.join(target).join("debug").join("deps");
|
||||||
let compiler_builtins_rlib = std::fs::read_dir(rlibs_path)
|
let compiler_builtins_rlib = std::fs::read_dir(rlibs_path)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
use run_make_support::{cwd, rustc};
|
use run_make_support::{cwd, rustc};
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
rustc().input("input.rs").run_fail_assert_exit_code(1);
|
rustc().input("input.rs").run_fail().assert_exit_code(1);
|
||||||
|
|
||||||
for entry in fs::read_dir(cwd()).unwrap() {
|
for entry in fs::read_dir(cwd()).unwrap() {
|
||||||
let entry = entry.unwrap();
|
let entry = entry.unwrap();
|
||||||
|
@ -1,22 +1,21 @@
|
|||||||
use std::process::Output;
|
|
||||||
|
|
||||||
use run_make_support::{bin_name, rust_lib_name, rustc};
|
use run_make_support::{bin_name, rust_lib_name, rustc};
|
||||||
|
|
||||||
fn compare_stdout<S: AsRef<str>>(output: Output, expected: S) {
|
|
||||||
assert_eq!(String::from_utf8(output.stdout).unwrap().trim(), expected.as_ref());
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
compare_stdout(rustc().print("crate-name").input("crate.rs").run(), "foo");
|
rustc().print("crate-name").input("crate.rs").run().assert_stdout_equals("foo");
|
||||||
compare_stdout(rustc().print("file-names").input("crate.rs").run(), bin_name("foo"));
|
rustc().print("file-names").input("crate.rs").run().assert_stdout_equals(bin_name("foo"));
|
||||||
compare_stdout(
|
rustc()
|
||||||
rustc().print("file-names").crate_type("lib").arg("--test").input("crate.rs").run(),
|
.print("file-names")
|
||||||
bin_name("foo"),
|
.crate_type("lib")
|
||||||
);
|
.arg("--test")
|
||||||
compare_stdout(
|
.input("crate.rs")
|
||||||
rustc().print("file-names").arg("--test").input("lib.rs").run(),
|
.run()
|
||||||
bin_name("mylib"),
|
.assert_stdout_equals(bin_name("foo"));
|
||||||
);
|
rustc()
|
||||||
compare_stdout(rustc().print("file-names").input("lib.rs").run(), rust_lib_name("mylib"));
|
.print("file-names")
|
||||||
compare_stdout(rustc().print("file-names").input("rlib.rs").run(), rust_lib_name("mylib"));
|
.arg("--test")
|
||||||
|
.input("lib.rs")
|
||||||
|
.run()
|
||||||
|
.assert_stdout_equals(bin_name("mylib"));
|
||||||
|
rustc().print("file-names").input("lib.rs").run().assert_stdout_equals(rust_lib_name("mylib"));
|
||||||
|
rustc().print("file-names").input("rlib.rs").run().assert_stdout_equals(rust_lib_name("mylib"));
|
||||||
}
|
}
|
||||||
|
@ -5,21 +5,22 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
rustc().arg("success.rs").run();
|
rustc().arg("success.rs").run();
|
||||||
|
|
||||||
rustc().arg("--invalid-arg-foo").run_fail_assert_exit_code(1);
|
rustc().arg("--invalid-arg-foo").run_fail().assert_exit_code(1);
|
||||||
|
|
||||||
rustc().arg("compile-error.rs").run_fail_assert_exit_code(1);
|
rustc().arg("compile-error.rs").run_fail().assert_exit_code(1);
|
||||||
|
|
||||||
rustc()
|
rustc()
|
||||||
.env("RUSTC_ICE", "0")
|
.env("RUSTC_ICE", "0")
|
||||||
.arg("-Ztreat-err-as-bug")
|
.arg("-Ztreat-err-as-bug")
|
||||||
.arg("compile-error.rs")
|
.arg("compile-error.rs")
|
||||||
.run_fail_assert_exit_code(101);
|
.run_fail()
|
||||||
|
.assert_exit_code(101);
|
||||||
|
|
||||||
rustdoc().arg("success.rs").output("exit-code").run();
|
rustdoc().arg("success.rs").output("exit-code").run();
|
||||||
|
|
||||||
rustdoc().arg("--invalid-arg-foo").run_fail_assert_exit_code(1);
|
rustdoc().arg("--invalid-arg-foo").run_fail().assert_exit_code(1);
|
||||||
|
|
||||||
rustdoc().arg("compile-error.rs").run_fail_assert_exit_code(1);
|
rustdoc().arg("compile-error.rs").run_fail().assert_exit_code(1);
|
||||||
|
|
||||||
rustdoc().arg("lint-failure.rs").run_fail_assert_exit_code(1);
|
rustdoc().arg("lint-failure.rs").run_fail().assert_exit_code(1);
|
||||||
}
|
}
|
||||||
|
@ -34,8 +34,8 @@ fn main() {
|
|||||||
rustc().crate_type("rlib").input("foo.rs").run();
|
rustc().crate_type("rlib").input("foo.rs").run();
|
||||||
rustc().crate_type("dylib").input("bar1.rs").arg("-Cprefer-dynamic").run();
|
rustc().crate_type("dylib").input("bar1.rs").arg("-Cprefer-dynamic").run();
|
||||||
rustc().crate_type("dylib").input("bar2.rs").arg("-Cprefer-dynamic").run();
|
rustc().crate_type("dylib").input("bar2.rs").arg("-Cprefer-dynamic").run();
|
||||||
rustc().crate_type("dylib").input("baz2.rs").run_fail_assert_exit_code(1);
|
rustc().crate_type("dylib").input("baz2.rs").run_fail().assert_exit_code(1);
|
||||||
rustc().crate_type("bin").input("baz2.rs").run_fail_assert_exit_code(1);
|
rustc().crate_type("bin").input("baz2.rs").run_fail().assert_exit_code(1);
|
||||||
});
|
});
|
||||||
run_in_tmpdir(|| {
|
run_in_tmpdir(|| {
|
||||||
rustc().crate_type("rlib").input("foo.rs").run();
|
rustc().crate_type("rlib").input("foo.rs").run();
|
||||||
|
@ -1,2 +0,0 @@
|
|||||||
error: no input filename given
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
|||||||
use run_make_support::{diff, rustc};
|
use run_make_support::rustc;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let output = rustc().print("crate-name").run_fail_assert_exit_code(1);
|
rustc()
|
||||||
|
.print("crate-name")
|
||||||
diff().expected_file("no-input-file.stderr").actual_text("output", output.stderr).run();
|
.run_fail()
|
||||||
|
.assert_exit_code(1)
|
||||||
|
.assert_stderr_equals("error: no input filename given");
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,6 @@ fn main() {
|
|||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
let non_unicode: std::ffi::OsString = std::os::windows::ffi::OsStringExt::from_wide(&[0xD800]);
|
let non_unicode: std::ffi::OsString = std::os::windows::ffi::OsStringExt::from_wide(&[0xD800]);
|
||||||
let output = rustc().input("non_unicode_env.rs").env("NON_UNICODE_VAR", non_unicode).run_fail();
|
let output = rustc().input("non_unicode_env.rs").env("NON_UNICODE_VAR", non_unicode).run_fail();
|
||||||
let actual = std::str::from_utf8(&output.stderr).unwrap();
|
|
||||||
let expected = std::fs::read_to_string("non_unicode_env.stderr").unwrap();
|
let expected = std::fs::read_to_string("non_unicode_env.stderr").unwrap();
|
||||||
assert_eq!(actual, expected);
|
output.assert_stderr_equals(expected);
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ fn main() {
|
|||||||
.error_format("json")
|
.error_format("json")
|
||||||
.incremental(cwd())
|
.incremental(cwd())
|
||||||
.run();
|
.run();
|
||||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
let stderr = output.stderr_utf8();
|
||||||
for file in &["lib.o", "lib.ll", "lib.bc", "lib.s"] {
|
for file in &["lib.o", "lib.ll", "lib.bc", "lib.s"] {
|
||||||
assert!(stderr.contains(file), "No {:?} in {:?}", file, stderr);
|
assert!(stderr.contains(file), "No {:?} in {:?}", file, stderr);
|
||||||
}
|
}
|
||||||
@ -35,7 +35,7 @@ fn main() {
|
|||||||
.error_format("json")
|
.error_format("json")
|
||||||
.incremental(cwd())
|
.incremental(cwd())
|
||||||
.run();
|
.run();
|
||||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
let stderr = output.stderr_utf8();
|
||||||
for file in &["rcgu.o", "rcgu.ll", "rcgu.bc", "rcgu.s"] {
|
for file in &["rcgu.o", "rcgu.ll", "rcgu.bc", "rcgu.s"] {
|
||||||
assert!(stderr.contains(file), "No {:?} in {:?}", file, stderr);
|
assert!(stderr.contains(file), "No {:?} in {:?}", file, stderr);
|
||||||
}
|
}
|
||||||
|
@ -83,8 +83,7 @@ fn check_(output: &str, includes: &[&str], disallow: &[&str]) {
|
|||||||
// --print=cfg
|
// --print=cfg
|
||||||
{
|
{
|
||||||
let output = rustc().target(target).print("cfg").run();
|
let output = rustc().target(target).print("cfg").run();
|
||||||
|
let stdout = output.stdout_utf8();
|
||||||
let stdout = String::from_utf8(output.stdout).unwrap();
|
|
||||||
|
|
||||||
check_(&stdout, includes, disallow);
|
check_(&stdout, includes, disallow);
|
||||||
}
|
}
|
||||||
@ -95,7 +94,7 @@ fn check_(output: &str, includes: &[&str], disallow: &[&str]) {
|
|||||||
let mut print_arg = OsString::from("--print=cfg=");
|
let mut print_arg = OsString::from("--print=cfg=");
|
||||||
print_arg.push(tmp_path.as_os_str());
|
print_arg.push(tmp_path.as_os_str());
|
||||||
|
|
||||||
let output = rustc().target(target).arg(print_arg).run();
|
rustc().target(target).arg(print_arg).run();
|
||||||
|
|
||||||
let output = std::fs::read_to_string(&tmp_path).unwrap();
|
let output = std::fs::read_to_string(&tmp_path).unwrap();
|
||||||
|
|
||||||
|
@ -93,7 +93,7 @@ fn check(CheckCfg { args, contains }: CheckCfg) {
|
|||||||
.args(&*args)
|
.args(&*args)
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
let stdout = String::from_utf8(output.stdout).unwrap();
|
let stdout = output.stdout_utf8();
|
||||||
|
|
||||||
let mut found = HashSet::<String>::new();
|
let mut found = HashSet::<String>::new();
|
||||||
|
|
||||||
|
@ -30,9 +30,7 @@ fn main() {
|
|||||||
.run();
|
.run();
|
||||||
|
|
||||||
let mut found_note = false;
|
let mut found_note = false;
|
||||||
for l in output.stderr.lines() {
|
for l in output.stderr_utf8().lines() {
|
||||||
let l = l.expect("utf-8 string");
|
|
||||||
|
|
||||||
let Some(args) = l.strip_prefix("note: native-static-libs:") else {
|
let Some(args) = l.strip_prefix("note: native-static-libs:") else {
|
||||||
continue;
|
continue;
|
||||||
};
|
};
|
||||||
|
@ -39,11 +39,7 @@ fn check_(output: &str, includes: &[&str]) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --print={option}
|
// --print={option}
|
||||||
let stdout = {
|
let stdout = rustc().target(args.target).print(args.option).run().stdout_utf8();
|
||||||
let output = rustc().target(args.target).print(args.option).run();
|
|
||||||
|
|
||||||
String::from_utf8(output.stdout).unwrap()
|
|
||||||
};
|
|
||||||
|
|
||||||
// --print={option}=PATH
|
// --print={option}=PATH
|
||||||
let output = {
|
let output = {
|
||||||
@ -51,7 +47,7 @@ fn check_(output: &str, includes: &[&str]) {
|
|||||||
let mut print_arg = OsString::from(format!("--print={}=", args.option));
|
let mut print_arg = OsString::from(format!("--print={}=", args.option));
|
||||||
print_arg.push(tmp_path.as_os_str());
|
print_arg.push(tmp_path.as_os_str());
|
||||||
|
|
||||||
let _output = rustc().target(args.target).arg(print_arg).run();
|
rustc().target(args.target).arg(print_arg).run();
|
||||||
|
|
||||||
std::fs::read_to_string(&tmp_path).unwrap()
|
std::fs::read_to_string(&tmp_path).unwrap()
|
||||||
};
|
};
|
||||||
|
@ -17,9 +17,9 @@ fn main() {
|
|||||||
.input("main.rs")
|
.input("main.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
find_lld_version_in_logs(&output),
|
find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should be present in the output logs:\n{}",
|
"the LLD version string should be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
|
|
||||||
// But it can still be disabled by turning the linker feature off.
|
// But it can still be disabled by turning the linker feature off.
|
||||||
@ -30,14 +30,13 @@ fn main() {
|
|||||||
.input("main.rs")
|
.input("main.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
!find_lld_version_in_logs(&output),
|
!find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should not be present in the output logs:\n{}",
|
"the LLD version string should not be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_lld_version_in_logs(output: &Output) -> bool {
|
fn find_lld_version_in_logs(stderr: String) -> bool {
|
||||||
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
||||||
let stderr = std::str::from_utf8(&output.stderr).unwrap();
|
|
||||||
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
||||||
}
|
}
|
||||||
|
@ -23,9 +23,9 @@ fn main() {
|
|||||||
.input("lib.rs")
|
.input("lib.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
find_lld_version_in_logs(&output),
|
find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should be present in the output logs:\n{}",
|
"the LLD version string should be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
|
|
||||||
// But it can also be disabled via linker features.
|
// But it can also be disabled via linker features.
|
||||||
@ -38,14 +38,13 @@ fn main() {
|
|||||||
.input("lib.rs")
|
.input("lib.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
!find_lld_version_in_logs(&output),
|
!find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should not be present in the output logs:\n{}",
|
"the LLD version string should not be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_lld_version_in_logs(output: &Output) -> bool {
|
fn find_lld_version_in_logs(stderr: String) -> bool {
|
||||||
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
||||||
let stderr = std::str::from_utf8(&output.stderr).unwrap();
|
|
||||||
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
||||||
}
|
}
|
||||||
|
@ -21,9 +21,9 @@ fn main() {
|
|||||||
.input("main.rs")
|
.input("main.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
find_lld_version_in_logs(&output),
|
find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should be present in the output logs:\n{}",
|
"the LLD version string should be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
|
|
||||||
// It should not be used when we explictly opt-out of lld.
|
// It should not be used when we explictly opt-out of lld.
|
||||||
@ -34,9 +34,9 @@ fn main() {
|
|||||||
.input("main.rs")
|
.input("main.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
!find_lld_version_in_logs(&output),
|
!find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should not be present in the output logs:\n{}",
|
"the LLD version string should not be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
|
|
||||||
// While we're here, also check that the last linker feature flag "wins" when passed multiple
|
// While we're here, also check that the last linker feature flag "wins" when passed multiple
|
||||||
@ -52,14 +52,13 @@ fn main() {
|
|||||||
.input("main.rs")
|
.input("main.rs")
|
||||||
.run();
|
.run();
|
||||||
assert!(
|
assert!(
|
||||||
find_lld_version_in_logs(&output),
|
find_lld_version_in_logs(output.stderr_utf8()),
|
||||||
"the LLD version string should be present in the output logs:\n{}",
|
"the LLD version string should be present in the output logs:\n{}",
|
||||||
std::str::from_utf8(&output.stderr).unwrap()
|
output.stderr_utf8()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_lld_version_in_logs(output: &Output) -> bool {
|
fn find_lld_version_in_logs(stderr: String) -> bool {
|
||||||
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
let lld_version_re = Regex::new(r"^LLD [0-9]+\.[0-9]+\.[0-9]+").unwrap();
|
||||||
let stderr = std::str::from_utf8(&output.stderr).unwrap();
|
|
||||||
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
stderr.lines().any(|line| lld_version_re.is_match(line.trim()))
|
||||||
}
|
}
|
||||||
|
@ -4,9 +4,7 @@
|
|||||||
use run_make_support::rustdoc;
|
use run_make_support::rustdoc;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let output =
|
let output = rustdoc().input("input.rs").arg("--test").run_fail().stdout_utf8();
|
||||||
String::from_utf8(rustdoc().input("input.rs").arg("--test").command_output().stdout)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
let should_contain = &[
|
let should_contain = &[
|
||||||
"input.rs - foo (line 5)",
|
"input.rs - foo (line 5)",
|
||||||
|
@ -8,17 +8,14 @@ fn main() {
|
|||||||
let proc_crate_name = "foobar_macro";
|
let proc_crate_name = "foobar_macro";
|
||||||
let crate_name = "foobar";
|
let crate_name = "foobar";
|
||||||
|
|
||||||
let dylib_name = String::from_utf8(
|
let dylib_name = rustc()
|
||||||
rustc()
|
.crate_name(proc_crate_name)
|
||||||
.crate_name(proc_crate_name)
|
.crate_type("dylib")
|
||||||
.crate_type("dylib")
|
.arg("--print")
|
||||||
.arg("--print")
|
.arg("file-names")
|
||||||
.arg("file-names")
|
.arg("-")
|
||||||
.arg("-")
|
.run()
|
||||||
.command_output()
|
.stdout_utf8();
|
||||||
.stdout,
|
|
||||||
)
|
|
||||||
.unwrap();
|
|
||||||
|
|
||||||
rustc()
|
rustc()
|
||||||
.input("src/proc.rs")
|
.input("src/proc.rs")
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
use run_make_support::{rustc, rustdoc, Diff};
|
use run_make_support::{rustc, rustdoc, Diff};
|
||||||
|
|
||||||
fn compare_outputs(args: &[&str]) {
|
fn compare_outputs(args: &[&str]) {
|
||||||
let rustc_output = String::from_utf8(rustc().args(args).command_output().stdout).unwrap();
|
let rustc_output = rustc().args(args).run().stdout_utf8();
|
||||||
let rustdoc_output = String::from_utf8(rustdoc().args(args).command_output().stdout).unwrap();
|
let rustdoc_output = rustdoc().args(args).run().stdout_utf8();
|
||||||
|
|
||||||
Diff::new().expected_text("rustc", rustc_output).actual_text("rustdoc", rustdoc_output).run();
|
Diff::new().expected_text("rustc", rustc_output).actual_text("rustdoc", rustdoc_output).run();
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ fn main() {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// echo $NOT_UTF8 | rustc -
|
// echo $NOT_UTF8 | rustc -
|
||||||
let output = rustc().arg("-").stdin(NOT_UTF8).run_fail();
|
rustc().arg("-").stdin(NOT_UTF8).run_fail().assert_stderr_contains(
|
||||||
let stderr = String::from_utf8(output.stderr).unwrap();
|
"error: couldn't read from stdin, as it did not contain valid UTF-8",
|
||||||
assert!(stderr.contains("error: couldn't read from stdin, as it did not contain valid UTF-8"));
|
);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user