From 424c6219e8c84a7b70b3213c248a33b027d74422 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 28 May 2021 16:35:36 +0300 Subject: [PATCH] fix: prevent build-time deadlock when building tests in release mode --- runtime/near-test-contracts/build.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/runtime/near-test-contracts/build.rs b/runtime/near-test-contracts/build.rs index 116c61cfbb5..1cf77c69589 100644 --- a/runtime/near-test-contracts/build.rs +++ b/runtime/near-test-contracts/build.rs @@ -1,5 +1,7 @@ +use std::path::Path; +use std::path::PathBuf; use std::process::Command; -use std::{fs, io, process}; +use std::{env, fs, io, process}; fn main() { if let Err(err) = try_main() { @@ -29,8 +31,9 @@ fn build_contract(dir: &str, args: &[&str], output: &str) -> io::Result<()> { cmd.current_dir(dir); check_status(cmd)?; + let target_dir = shared_target_dir().unwrap_or_else(|| format!("./{}/target", dir).into()); fs::copy( - format!("./{}/target/wasm32-unknown-unknown/release/{}.wasm", dir, dir.replace('-', "_")), + target_dir.join(format!("wasm32-unknown-unknown/release/{}.wasm", dir.replace('-', "_"))), format!("./res/{}.wasm", output), )?; println!("cargo:rerun-if-changed=./{}/src/lib.rs", dir); @@ -41,6 +44,10 @@ fn build_contract(dir: &str, args: &[&str], output: &str) -> io::Result<()> { fn cargo_build_cmd() -> Command { let mut res = Command::new("cargo"); res.env("RUSTFLAGS", "-C link-arg=-s"); + if let Some(target_dir) = shared_target_dir() { + res.env("CARGO_TARGET_DIR", target_dir); + } + res.args(&["build", "--target=wasm32-unknown-unknown", "--release"]); res } @@ -57,3 +64,14 @@ fn check_status(mut cmd: Command) -> io::Result<()> { } Ok(()) } + +fn shared_target_dir() -> Option { + let target_dir = env::var("CARGO_TARGET_DIR").ok()?; + // Avoid sharing the same target directory with the patent Cargo + // invocation, to avoid deadlock on the target dir. + // + // That is, this logic is needed for the case like the following: + // + // CARGO_TARGET_DIR=/tmp cargo build -p near-test-contracts --release + Some(Path::new(&target_dir).join("near-test-contracts")) +}