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

@ -3,17 +3,25 @@
set -euxo pipefail set -euxo pipefail
unset CARGO_INSTALL_ROOT unset CARGO_INSTALL_ROOT
unset CARGO_HOME
# Install binaries using cargo-binstall crates="b3sum cargo-release cargo-binstall cargo-watch miniserve sccache"
# shellcheck disable=SC2086
"./$1" binstall --log-level debug --no-confirm \ if [ "$2" = "Windows" ]; then
b3sum \ # Install binaries using cargo-binstall
cargo-release \ # shellcheck disable=SC2086
cargo-binstall \ "./$1" --log-level debug --no-confirm $crates
cargo-watch \ else
miniserve \ export CARGO_HOME=/tmp/cargo-home-for-test
sccache export PATH="$CARGO_HOME/bin:$PATH"
mkdir -p "$CARGO_HOME/bin"
# Copy it to bin to test use of env var `CARGO`
cp "./$1" "$CARGO_HOME/bin/cargo-binstall"
# Install binaries using cargo-binstall
# shellcheck disable=SC2086
cargo binstall --log-level debug --no-confirm $crates
fi
# Test that the installed binaries can be run # Test that the installed binaries can be run
b3sum --version b3sum --version
@ -69,7 +77,7 @@ cargo binstall --help >/dev/null
# to force failure if falling back to source # to force failure if falling back to source
# FIXME: remove/replace once #136 lands # FIXME: remove/replace once #136 lands
PATH="$test_resources/fake-cargo:$PATH" export PATH="$test_resources/fake-cargo:$PATH"
# Test default GitLab pkg-url templates # Test default GitLab pkg-url templates
"./$1" binstall \ "./$1" binstall \

View file

@ -51,6 +51,4 @@ jobs:
- name: Test - name: Test
shell: bash shell: bash
run: .github/scripts/tests.sh ${{ matrix.bin }} ${{ runner.os }} run: .github/scripts/tests.sh ${{ matrix.bin }} ${{ runner.os }}
env:
CARGO_HOME: /tmp/cargo-home-for-test/

View file

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

View file

@ -1,4 +1,7 @@
use std::{ use std::{
borrow::Cow,
env,
ffi::OsStr,
io::{BufRead, Cursor}, io::{BufRead, Cursor},
process::{Output, Stdio}, process::{Output, Stdio},
}; };
@ -65,8 +68,17 @@ pub async fn detect_targets() -> Vec<String> {
/// Figure out what the host target is using `rustc`. /// Figure out what the host target is using `rustc`.
/// If `rustc` is absent, then it would return `None`. /// 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> { 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") .arg("-vV")
.stdin(Stdio::null()) .stdin(Stdio::null())
.stdout(Stdio::piped()) .stdout(Stdio::piped())

View file

@ -1,5 +1,11 @@
//! Detect the target at the runtime. //! 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: //! Example use cases:
//! - The binary is built with musl libc to run on anywhere, but //! - The binary is built with musl libc to run on anywhere, but
//! the runtime supports glibc. //! the runtime supports glibc.