Use CARGO env variable if present (#453)

* Run `$CARGO -vV` in `detect-targets` if env `CARGO` present
* Improve crate doc for `detect-targets`
* Use env var `CARGO` in `install_from_source` if present
* Test use of `CARGO` env in `tests.sh`

Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
Jiahao XU 2022-10-02 01:52:25 +10:00 committed by GitHub
parent 448542f0c8
commit ec2bdb551e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 48 additions and 18 deletions

View file

@ -1,4 +1,4 @@
use std::sync::Arc;
use std::{borrow::Cow, env, ffi::OsStr, sync::Arc};
use cargo_toml::Package;
use compact_str::CompactString;
@ -110,12 +110,18 @@ async fn install_from_source(
) -> Result<(), BinstallError> {
let jobserver_client = lazy_jobserver_client.get().await?;
let cargo = env::var_os("CARGO")
.map(Cow::Owned)
.unwrap_or_else(|| Cow::Borrowed(OsStr::new("cargo")));
debug!(
"Running `cargo install {} --version {} --target {target}`",
package.name, package.version
"Running `{} install {} --version {} --target {target}`",
cargo.to_string_lossy(),
package.name,
package.version
);
let mut cmd = Command::new("cargo");
let mut cmd = Command::new(cargo);
cmd.arg("install")
.arg(&package.name)

View file

@ -1,4 +1,7 @@
use std::{
borrow::Cow,
env,
ffi::OsStr,
io::{BufRead, Cursor},
process::{Output, Stdio},
};
@ -65,8 +68,17 @@ pub async fn detect_targets() -> Vec<String> {
/// Figure out what the host target is using `rustc`.
/// If `rustc` is absent, then it would return `None`.
///
/// If environment variable `CARGO` is present, then
/// `$CARGO -vV` will be run instead.
///
/// Otherwise, it will run `rustc -vV` to detect target.
async fn get_target_from_rustc() -> Option<String> {
let Output { status, stdout, .. } = Command::new("rustc")
let cmd = env::var_os("CARGO")
.map(Cow::Owned)
.unwrap_or_else(|| Cow::Borrowed(OsStr::new("rustc")));
let Output { status, stdout, .. } = Command::new(cmd)
.arg("-vV")
.stdin(Stdio::null())
.stdout(Stdio::piped())

View file

@ -1,5 +1,11 @@
//! Detect the target at the runtime.
//!
//! It runs `$CARGO -vV` if environment variable `CARGO` is present
//! for cargo subcommands, otherwise it would try running `rustc -vV`.
//!
//! If both `rustc` isn't present on the system, it will fallback
//! to using syscalls plus `ldd` on Linux to detect targets.
//!
//! Example use cases:
//! - The binary is built with musl libc to run on anywhere, but
//! the runtime supports glibc.