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
);
# }
```