|
|
|
@ -1,9 +1,8 @@
|
|
|
|
|
use std::{
|
|
|
|
|
env,
|
|
|
|
|
ffi::OsString,
|
|
|
|
|
fmt::Write as _,
|
|
|
|
|
fs,
|
|
|
|
|
io::BufReader,
|
|
|
|
|
io::{BufRead as _, BufReader},
|
|
|
|
|
path::PathBuf,
|
|
|
|
|
process::{Child, Command, Stdio},
|
|
|
|
|
};
|
|
|
|
@ -157,14 +156,25 @@ fn main() {
|
|
|
|
|
|
|
|
|
|
let mut child = cmd
|
|
|
|
|
.stdout(Stdio::piped())
|
|
|
|
|
.stderr(Stdio::piped())
|
|
|
|
|
.spawn()
|
|
|
|
|
.unwrap_or_else(|err| panic!("failed to spawn {cmd:?}: {err}"));
|
|
|
|
|
let Child { stdout, .. } = &mut child;
|
|
|
|
|
let Child { stdout, stderr, .. } = &mut child;
|
|
|
|
|
|
|
|
|
|
// Trampoline stdout to cargo warnings.
|
|
|
|
|
let stderr = stderr.take().unwrap();
|
|
|
|
|
let stderr = BufReader::new(stderr);
|
|
|
|
|
let stderr = std::thread::spawn(move || {
|
|
|
|
|
for line in stderr.lines() {
|
|
|
|
|
let line = line.unwrap();
|
|
|
|
|
println!("cargo:warning={line}");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
let stdout = stdout.take().unwrap();
|
|
|
|
|
let reader = BufReader::new(stdout);
|
|
|
|
|
let stdout = BufReader::new(stdout);
|
|
|
|
|
let mut executables = Vec::new();
|
|
|
|
|
let mut compiler_messages = String::new();
|
|
|
|
|
for message in Message::parse_stream(reader) {
|
|
|
|
|
for message in Message::parse_stream(stdout) {
|
|
|
|
|
#[allow(clippy::collapsible_match)]
|
|
|
|
|
match message.expect("valid JSON") {
|
|
|
|
|
Message::CompilerArtifact(Artifact {
|
|
|
|
@ -177,7 +187,10 @@ fn main() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
Message::CompilerMessage(CompilerMessage { message, .. }) => {
|
|
|
|
|
writeln!(&mut compiler_messages, "{message}").unwrap()
|
|
|
|
|
println!("cargo:warning={message}");
|
|
|
|
|
}
|
|
|
|
|
Message::TextLine(line) => {
|
|
|
|
|
println!("cargo:warning={line}");
|
|
|
|
|
}
|
|
|
|
|
_ => {}
|
|
|
|
|
}
|
|
|
|
@ -186,15 +199,16 @@ fn main() {
|
|
|
|
|
let status = child
|
|
|
|
|
.wait()
|
|
|
|
|
.unwrap_or_else(|err| panic!("failed to wait for {cmd:?}: {err}"));
|
|
|
|
|
|
|
|
|
|
match status.code() {
|
|
|
|
|
Some(code) => match code {
|
|
|
|
|
0 => {}
|
|
|
|
|
code => panic!("{cmd:?} exited with status code {code}:\n{compiler_messages}"),
|
|
|
|
|
code => panic!("{cmd:?} exited with status code {code}"),
|
|
|
|
|
},
|
|
|
|
|
None => panic!("{cmd:?} terminated by signal"),
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
stderr.join().map_err(std::panic::resume_unwind).unwrap();
|
|
|
|
|
|
|
|
|
|
for (name, binary) in executables {
|
|
|
|
|
let dst = out_dir.join(name);
|
|
|
|
|
let _: u64 = fs::copy(&binary, &dst)
|
|
|
|
|