1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
|
From: Jieyou Xu <jieyouxu@outlook.com>
Date: Fri, 9 May 2025 19:51:03 +0800
Subject: run-make-support: support "ejecting" the underlying std command
In rare cases, the test may need access to the underlying
`std::process::Command` (e.g. for non-trivial process spawning).
Co-authored-by: Jesus Checa Hidalgo <jchecahi@redhat.com>
(cherry picked from commit d9f513f0dafd6a5bc9340c77d3f86f727ff52824)
Description: pre-requisite for broken-pipe-no-ice patch
---
src/tools/run-make-support/src/command.rs | 6 ++++++
src/tools/run-make-support/src/external_deps/rustdoc.rs | 4 ++--
src/tools/run-make-support/src/macros.rs | 12 ++++++++++++
3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/src/tools/run-make-support/src/command.rs b/src/tools/run-make-support/src/command.rs
index 70a72bd..b46ddd1 100644
--- a/src/tools/run-make-support/src/command.rs
+++ b/src/tools/run-make-support/src/command.rs
@@ -63,6 +63,12 @@ impl Command {
}
}
+ // Internal-only.
+ pub(crate) fn into_raw_command(mut self) -> std::process::Command {
+ self.drop_bomb.defuse();
+ self.cmd
+ }
+
/// Specify a stdin input buffer. This is a convenience helper,
pub fn stdin_buf<I: AsRef<[u8]>>(&mut self, input: I) -> &mut Self {
self.stdin_buf = Some(input.as_ref().to_vec().into_boxed_slice());
diff --git a/src/tools/run-make-support/src/external_deps/rustdoc.rs b/src/tools/run-make-support/src/external_deps/rustdoc.rs
index 433a57c..7040fb6 100644
--- a/src/tools/run-make-support/src/external_deps/rustdoc.rs
+++ b/src/tools/run-make-support/src/external_deps/rustdoc.rs
@@ -5,7 +5,7 @@ use crate::command::Command;
use crate::env::env_var;
use crate::util::set_host_compiler_dylib_path;
-/// Construct a new `rustdoc` invocation.
+/// Construct a new `rustdoc` invocation. This will configure the host compiler runtime libs.
#[track_caller]
pub fn rustdoc() -> Rustdoc {
Rustdoc::new()
@@ -28,7 +28,7 @@ fn setup_common() -> Command {
}
impl Rustdoc {
- /// Construct a bare `rustdoc` invocation.
+ /// Construct a bare `rustdoc` invocation. This will configure the host compiler runtime libs.
#[track_caller]
pub fn new() -> Self {
let cmd = setup_common();
diff --git a/src/tools/run-make-support/src/macros.rs b/src/tools/run-make-support/src/macros.rs
index 94955ae..9d5cc4e 100644
--- a/src/tools/run-make-support/src/macros.rs
+++ b/src/tools/run-make-support/src/macros.rs
@@ -28,6 +28,18 @@
macro_rules! impl_common_helpers {
($wrapper: ident) => {
impl $wrapper {
+ /// In very rare circumstances, you may need a e.g. `bare_rustc()` or `bare_rustdoc()`
+ /// with host runtime libs configured, but want the underlying raw
+ /// [`std::process::Command`] (e.g. for manipulating pipes or whatever). This function
+ /// will consume the command wrapper and extract the underlying
+ /// [`std::process::Command`].
+ ///
+ /// Caution: this will mean that you can no longer use the convenience methods on the
+ /// command wrapper. Use as a last resort.
+ pub fn into_raw_command(self) -> ::std::process::Command {
+ self.cmd.into_raw_command()
+ }
+
/// Specify an environment variable.
pub fn env<K, V>(&mut self, key: K, value: V) -> &mut Self
where
|