cargo-binstall/crates/detect-targets/src/lib.rs
Jiahao XU ec2bdb551e
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>
2022-10-02 04:52:25 +13:00

74 lines
2.1 KiB
Rust

//! 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.
//! - The binary is built for x86_64-apple-darwin, but run on
//! aarch64-apple-darwin.
//!
//! This crate provides two API:
//! - [`detect_targets`] provides the API to get the target
//! at runtime, but the code is run on the current thread.
//! - [`get_desired_targets`] provides the API to either
//! use override provided by the users, or run [`detect_targets`]
//! in the background using [`tokio::spawn`].
//!
//! # Example
//!
//! `detect_targets`:
//!
//! ```rust
//! use detect_targets::detect_targets;
//! # #[tokio::main(flavor = "current_thread")]
//! # async fn main() {
//!
//! let targets = detect_targets().await;
//! eprintln!("Your platform supports targets: {targets:#?}");
//! # }
//! ```
//!
//! `get_desired_targets` with user override:
//!
//! ```rust
//! use detect_targets::get_desired_targets;
//! # #[tokio::main(flavor = "current_thread")]
//! # async fn main() {
//!
//! assert_eq!(
//! get_desired_targets(Some(vec![
//! "x86_64-apple-darwin".to_string(),
//! "aarch64-apple-darwin".to_string(),
//! ])).get().await,
//! &["x86_64-apple-darwin", "aarch64-apple-darwin"],
//! );
//! # }
//! ```
//!
//! `get_desired_targets` without user override:
//!
//! ```rust
//! use detect_targets::get_desired_targets;
//! # #[tokio::main(flavor = "current_thread")]
//! # async fn main() {
//!
//! eprintln!(
//! "Your platform supports targets: {:#?}",
//! get_desired_targets(None).get().await
//! );
//! # }
//! ```
mod detect;
pub use detect::detect_targets;
mod desired_targets;
pub use desired_targets::{get_desired_targets, DesiredTargets};
/// Compiled target triple, used as default for binary fetching
pub const TARGET: &str = env!("TARGET");