Skip to content

Commit 646e9a0

Browse files
committed
Auto merge of #10511 - weihanglo:issue-10477, r=ehuss
Support inheriting jobserver fd for external subcommands
2 parents 04a4081 + c1b90b9 commit 646e9a0

File tree

2 files changed

+84
-44
lines changed

2 files changed

+84
-44
lines changed

src/bin/cargo/main.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,12 @@ fn execute_external_subcommand(config: &Config, cmd: &str, args: &[&str]) -> Cli
181181
};
182182

183183
let cargo_exe = config.cargo_exe()?;
184-
let err = match ProcessBuilder::new(&command)
185-
.env(cargo::CARGO_ENV, cargo_exe)
186-
.args(args)
187-
.exec_replace()
188-
{
184+
let mut cmd = ProcessBuilder::new(&command);
185+
cmd.env(cargo::CARGO_ENV, cargo_exe).args(args);
186+
if let Some(client) = config.jobserver_from_env() {
187+
cmd.inherit_jobserver(client);
188+
}
189+
let err = match cmd.exec_replace() {
189190
Ok(()) => return Ok(()),
190191
Err(e) => e,
191192
};

tests/testsuite/jobserver.rs

+78-39
Original file line numberDiff line numberDiff line change
@@ -5,50 +5,50 @@ use std::net::TcpListener;
55
use std::process::Command;
66
use std::thread;
77

8+
use cargo_test_support::install::{assert_has_installed_exe, cargo_home};
89
use cargo_test_support::{cargo_exe, project};
910

10-
#[cargo_test]
11-
fn jobserver_exists() {
12-
let p = project()
13-
.file(
14-
"build.rs",
15-
r#"
16-
use std::env;
11+
const EXE_CONTENT: &str = r#"
12+
use std::env;
1713
18-
fn main() {
19-
let var = env::var("CARGO_MAKEFLAGS").unwrap();
20-
let arg = var.split(' ')
21-
.find(|p| p.starts_with("--jobserver"))
22-
.unwrap();
23-
let val = &arg[arg.find('=').unwrap() + 1..];
24-
validate(val);
25-
}
14+
fn main() {
15+
let var = env::var("CARGO_MAKEFLAGS").unwrap();
16+
let arg = var.split(' ')
17+
.find(|p| p.starts_with("--jobserver"))
18+
.unwrap();
19+
let val = &arg[arg.find('=').unwrap() + 1..];
20+
validate(val);
21+
}
2622
27-
#[cfg(unix)]
28-
fn validate(s: &str) {
29-
use std::fs::File;
30-
use std::io::*;
31-
use std::os::unix::prelude::*;
32-
33-
let fds = s.split(',').collect::<Vec<_>>();
34-
println!("{}", s);
35-
assert_eq!(fds.len(), 2);
36-
unsafe {
37-
let mut read = File::from_raw_fd(fds[0].parse().unwrap());
38-
let mut write = File::from_raw_fd(fds[1].parse().unwrap());
39-
40-
let mut buf = [0];
41-
assert_eq!(read.read(&mut buf).unwrap(), 1);
42-
assert_eq!(write.write(&buf).unwrap(), 1);
43-
}
44-
}
23+
#[cfg(unix)]
24+
fn validate(s: &str) {
25+
use std::fs::File;
26+
use std::io::*;
27+
use std::os::unix::prelude::*;
28+
29+
let fds = s.split(',').collect::<Vec<_>>();
30+
println!("{}", s);
31+
assert_eq!(fds.len(), 2);
32+
unsafe {
33+
let mut read = File::from_raw_fd(fds[0].parse().unwrap());
34+
let mut write = File::from_raw_fd(fds[1].parse().unwrap());
35+
36+
let mut buf = [0];
37+
assert_eq!(read.read(&mut buf).unwrap(), 1);
38+
assert_eq!(write.write(&buf).unwrap(), 1);
39+
}
40+
}
4541
46-
#[cfg(windows)]
47-
fn validate(_: &str) {
48-
// a little too complicated for a test...
49-
}
50-
"#,
51-
)
42+
#[cfg(windows)]
43+
fn validate(_: &str) {
44+
// a little too complicated for a test...
45+
}
46+
"#;
47+
48+
#[cargo_test]
49+
fn jobserver_exists() {
50+
let p = project()
51+
.file("build.rs", EXE_CONTENT)
5252
.file("src/lib.rs", "")
5353
.build();
5454

@@ -58,6 +58,45 @@ fn jobserver_exists() {
5858
p.cargo("build -j2").run();
5959
}
6060

61+
#[cargo_test]
62+
fn external_subcommand_inherits_jobserver() {
63+
let make = if cfg!(windows) {
64+
"mingw32-make"
65+
} else {
66+
"make"
67+
};
68+
if Command::new(make).arg("--version").output().is_err() {
69+
return;
70+
}
71+
72+
let name = "cargo-jobserver-check";
73+
let p = project()
74+
.file(
75+
"Cargo.toml",
76+
&format!(
77+
r#"
78+
[package]
79+
name = "{name}"
80+
version = "0.0.1"
81+
"#
82+
),
83+
)
84+
.file("src/main.rs", EXE_CONTENT)
85+
.file(
86+
"Makefile",
87+
"\
88+
all:
89+
\t+$(CARGO) jobserver-check
90+
",
91+
)
92+
.build();
93+
94+
p.cargo("install --path .").run();
95+
assert_has_installed_exe(cargo_home(), name);
96+
97+
p.process(make).env("CARGO", cargo_exe()).arg("-j2").run();
98+
}
99+
61100
#[cargo_test]
62101
fn makes_jobserver_used() {
63102
let make = if cfg!(windows) {

0 commit comments

Comments
 (0)