mirror of
https://github.com/cargo-bins/cargo-binstall.git
synced 2025-04-20 12:38:43 +00:00
feature: Add fallback x86_64h-apple-darwin
and fallback for it (#1228)
Now `detect_targets` would fallback to `x86_64h-apple-darwin` on `aarch64-apple-darwin`. It also provides fallback to `x86_64h-apple-darwin` to `x86_64-apple-darwin` and universal targets. Signed-off-by: Jiahao XU <Jiahao_XU@outlook.com>
This commit is contained in:
parent
38d37c69b2
commit
1293314100
1 changed files with 29 additions and 9 deletions
|
@ -4,6 +4,20 @@ use tokio::process::Command;
|
||||||
|
|
||||||
const AARCH64: &str = "aarch64-apple-darwin";
|
const AARCH64: &str = "aarch64-apple-darwin";
|
||||||
const X86: &str = "x86_64-apple-darwin";
|
const X86: &str = "x86_64-apple-darwin";
|
||||||
|
/// https://doc.rust-lang.org/nightly/rustc/platform-support/x86_64h-apple-darwin.html
|
||||||
|
///
|
||||||
|
/// This target is an x86_64 target that only supports Apple's late-gen
|
||||||
|
/// (Haswell-compatible) Intel chips.
|
||||||
|
///
|
||||||
|
/// It enables a set of target features available on these chips (AVX2 and similar),
|
||||||
|
/// and MachO binaries built with this target may be used as the x86_64h entry in
|
||||||
|
/// universal binaries ("fat" MachO binaries), and will fail to load on machines
|
||||||
|
/// that do not support this.
|
||||||
|
///
|
||||||
|
/// It is similar to x86_64-apple-darwin in nearly all respects, although
|
||||||
|
/// the minimum supported OS version is slightly higher (it requires 10.8
|
||||||
|
/// rather than x86_64-apple-darwin's 10.7).
|
||||||
|
const X86H: &str = "x86_64h-apple-darwin";
|
||||||
const UNIVERSAL: &str = "universal-apple-darwin";
|
const UNIVERSAL: &str = "universal-apple-darwin";
|
||||||
const UNIVERSAL2: &str = "universal2-apple-darwin";
|
const UNIVERSAL2: &str = "universal2-apple-darwin";
|
||||||
|
|
||||||
|
@ -13,8 +27,7 @@ async fn is_x86_64_supported() -> io::Result<bool> {
|
||||||
.stdin(Stdio::null())
|
.stdin(Stdio::null())
|
||||||
.stdout(Stdio::null())
|
.stdout(Stdio::null())
|
||||||
.stderr(Stdio::null())
|
.stderr(Stdio::null())
|
||||||
.spawn()?
|
.status()
|
||||||
.wait()
|
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
Ok(exit_status.success())
|
Ok(exit_status.success())
|
||||||
|
@ -22,13 +35,20 @@ async fn is_x86_64_supported() -> io::Result<bool> {
|
||||||
|
|
||||||
pub(super) async fn detect_alternative_targets(target: &str) -> impl Iterator<Item = String> {
|
pub(super) async fn detect_alternative_targets(target: &str) -> impl Iterator<Item = String> {
|
||||||
match target {
|
match target {
|
||||||
AARCH64 => [
|
AARCH64 => {
|
||||||
is_x86_64_supported().await.unwrap_or(false).then_some(X86),
|
let is_x86_64_supported = is_x86_64_supported().await.unwrap_or(false);
|
||||||
|
[
|
||||||
|
// Prefer universal as it provides native arm executable
|
||||||
Some(UNIVERSAL),
|
Some(UNIVERSAL),
|
||||||
Some(UNIVERSAL2),
|
Some(UNIVERSAL2),
|
||||||
],
|
// Prefer x86h since it is more optimized
|
||||||
X86 => [Some(UNIVERSAL), Some(UNIVERSAL2), None],
|
is_x86_64_supported.then_some(X86H),
|
||||||
_ => [None, None, None],
|
is_x86_64_supported.then_some(X86),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
X86 => [Some(UNIVERSAL), Some(UNIVERSAL2), None, None],
|
||||||
|
X86H => [Some(X86), Some(UNIVERSAL), Some(UNIVERSAL2), None],
|
||||||
|
_ => [None, None, None, None],
|
||||||
}
|
}
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.flatten()
|
.flatten()
|
||||||
|
|
Loading…
Add table
Reference in a new issue