mirror of
https://github.com/Noratrieb/does-it-build.git
synced 2026-01-14 10:25:01 +01:00
Handle pre-2024 cargo and pre-knows-whether-to-build-std cargo
This commit is contained in:
parent
9f18ad0d06
commit
c90b94ee69
1 changed files with 58 additions and 52 deletions
84
src/build.rs
84
src/build.rs
|
|
@ -2,6 +2,7 @@ use std::{
|
|||
fmt::{Debug, Display},
|
||||
num::NonZeroUsize,
|
||||
path::Path,
|
||||
process::Output,
|
||||
time::{Duration, Instant, SystemTime},
|
||||
};
|
||||
|
||||
|
|
@ -233,12 +234,7 @@ async fn build_single_target(db: &Db, nightly: &str, target: &str, mode: BuildMo
|
|||
|
||||
let start_time = Instant::now();
|
||||
|
||||
let result = build_target(
|
||||
tmpdir.path(),
|
||||
&Toolchain::from_nightly(nightly),
|
||||
target,
|
||||
mode,
|
||||
)
|
||||
let result = build_target(tmpdir.path(), &Toolchain::from_nightly(nightly), target)
|
||||
.await
|
||||
.wrap_err("running build")?;
|
||||
|
||||
|
|
@ -272,16 +268,19 @@ struct BuildResult {
|
|||
}
|
||||
|
||||
/// Build a target core in a temporary directory and see whether it passes or not.
|
||||
async fn build_target(
|
||||
tmpdir: &Path,
|
||||
toolchain: &Toolchain,
|
||||
target: &str,
|
||||
mode: BuildMode,
|
||||
) -> Result<BuildResult> {
|
||||
async fn build_target(tmpdir: &Path, toolchain: &Toolchain, target: &str) -> Result<BuildResult> {
|
||||
let mut rustflags = None;
|
||||
|
||||
let init = Command::new("cargo")
|
||||
.args(["init", "--lib", "--name", "target-test"])
|
||||
.arg(format!("+{toolchain}"))
|
||||
.args([
|
||||
"init",
|
||||
"--lib",
|
||||
"--name",
|
||||
"target-test",
|
||||
"--edition",
|
||||
"2015",
|
||||
])
|
||||
.current_dir(tmpdir)
|
||||
.output()
|
||||
.await
|
||||
|
|
@ -294,12 +293,17 @@ async fn build_target(
|
|||
std::fs::write(&librs, "#![no_std]\n")
|
||||
.wrap_err_with(|| format!("writing to {}", librs.display()))?;
|
||||
|
||||
async fn run(
|
||||
toolchain: &Toolchain,
|
||||
target: &str,
|
||||
rustflags: &mut Option<String>,
|
||||
tmpdir: &Path,
|
||||
build_std: &str,
|
||||
) -> Result<Output> {
|
||||
let mut cmd = Command::new("cargo");
|
||||
|
||||
match mode {
|
||||
BuildMode::Core => {
|
||||
cmd.arg(format!("+{toolchain}"))
|
||||
.args(["build", "-Zbuild-std=core", "--release", "-j1"])
|
||||
.args(["build", "--release", "-j1"])
|
||||
.arg(build_std)
|
||||
.args(["--target", target]);
|
||||
|
||||
let extra_flags = CUSTOM_CORE_FLAGS
|
||||
|
|
@ -309,36 +313,38 @@ async fn build_target(
|
|||
if let Some(extra_flags) = extra_flags {
|
||||
let flags = extra_flags.flags.join(" ");
|
||||
cmd.env("RUSTFLAGS", &flags);
|
||||
rustflags = Some(flags);
|
||||
*rustflags = Some(flags);
|
||||
}
|
||||
}
|
||||
BuildMode::Std => {
|
||||
cmd.arg(format!("+{toolchain}"))
|
||||
.args(["build", "-Zbuild-std", "--release", "-j1"])
|
||||
.args(["--target", target]);
|
||||
|
||||
let extra_flags = CUSTOM_CORE_FLAGS
|
||||
.iter()
|
||||
.find(|flags| flags.target == target);
|
||||
|
||||
if let Some(extra_flags) = extra_flags {
|
||||
let flags = extra_flags.flags.join(" ");
|
||||
cmd.env("RUSTFLAGS", &flags);
|
||||
rustflags = Some(flags);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let output = cmd
|
||||
.current_dir(tmpdir)
|
||||
cmd.current_dir(tmpdir)
|
||||
.output()
|
||||
.await
|
||||
.wrap_err("spawning cargo build")?;
|
||||
.wrap_err("spawning cargo build")
|
||||
}
|
||||
|
||||
let stderr = String::from_utf8(output.stderr).wrap_err("cargo stderr utf8")?;
|
||||
let mut output = run(&toolchain, target, &mut rustflags, tmpdir, "-Zbuild-std").await?;
|
||||
let mut stderr = String::from_utf8(output.stderr).wrap_err("cargo stderr utf8")?;
|
||||
|
||||
let status = if output.status.success() {
|
||||
Status::Pass
|
||||
// older cargo (before 2024-12-15) is clueless about std support
|
||||
} else if stderr.contains("building std is not supported") {
|
||||
info!("Retrying build because std is not supported");
|
||||
output = run(
|
||||
&toolchain,
|
||||
target,
|
||||
&mut rustflags,
|
||||
tmpdir,
|
||||
"-Zbuild-std=core",
|
||||
)
|
||||
.await?;
|
||||
stderr = String::from_utf8(output.stderr).wrap_err("cargo stderr utf8")?;
|
||||
|
||||
if output.status.success() {
|
||||
Status::Pass
|
||||
} else {
|
||||
Status::Error
|
||||
}
|
||||
} else {
|
||||
Status::Error
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue