Fix hard and soft float libc detection for managed Python distributions on ARM (#8498)
This commit is contained in:
@@ -57,6 +57,9 @@ tracing = { workspace = true }
|
||||
url = { workspace = true }
|
||||
which = { workspace = true }
|
||||
|
||||
[target.'cfg(target_os = "linux")'.dependencies]
|
||||
procfs = { workspace = true }
|
||||
|
||||
[target.'cfg(target_os = "windows")'.dependencies]
|
||||
windows-sys = { workspace = true }
|
||||
windows-registry = { workspace = true }
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
//! Fetches CPU information.
|
||||
|
||||
use anyhow::Error;
|
||||
|
||||
#[cfg(target_os = "linux")]
|
||||
use procfs::{CpuInfo, Current};
|
||||
|
||||
/// Detects whether the hardware supports floating-point operations using ARM's Vector Floating Point (VFP) hardware.
|
||||
///
|
||||
/// This function is relevant specifically for ARM architectures, where the presence of the "vfp" flag in `/proc/cpuinfo`
|
||||
/// indicates that the CPU supports hardware floating-point operations.
|
||||
/// This helps determine whether the system is using the `gnueabihf` (hard-float) ABI or `gnueabi` (soft-float) ABI.
|
||||
///
|
||||
/// More information on this can be found in the [Debian ARM Hard Float Port documentation](https://wiki.debian.org/ArmHardFloatPort#VFP).
|
||||
#[cfg(target_os = "linux")]
|
||||
pub(crate) fn detect_hardware_floating_point_support() -> Result<bool, Error> {
|
||||
let cpu_info = CpuInfo::current()?;
|
||||
if let Some(features) = cpu_info.fields.get("Features") {
|
||||
if features.contains("vfp") {
|
||||
return Ok(true); // "vfp" found: hard-float (gnueabihf) detected
|
||||
}
|
||||
}
|
||||
|
||||
Ok(false) // Default to soft-float (gnueabi) if no "vfp" flag is found
|
||||
}
|
||||
|
||||
/// For non-Linux systems or architectures, the function will return `false` as hardware floating-point detection
|
||||
/// is not applicable outside of Linux ARM architectures.
|
||||
#[cfg(not(target_os = "linux"))]
|
||||
#[allow(clippy::unnecessary_wraps)]
|
||||
pub(crate) fn detect_hardware_floating_point_support() -> Result<bool, Error> {
|
||||
Ok(false) // Non-Linux or non-ARM systems: hardware floating-point detection is not applicable
|
||||
}
|
||||
@@ -21,6 +21,7 @@ pub use crate::version_files::{
|
||||
};
|
||||
pub use crate::virtualenv::{Error as VirtualEnvError, PyVenvConfiguration, VirtualEnvironment};
|
||||
|
||||
mod cpuinfo;
|
||||
mod discovery;
|
||||
pub mod downloads;
|
||||
mod environment;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use crate::cpuinfo::detect_hardware_floating_point_support;
|
||||
use crate::libc::{detect_linux_libc, LibcDetectionError, LibcVersion};
|
||||
use std::fmt::Display;
|
||||
use std::ops::Deref;
|
||||
@@ -30,7 +31,17 @@ impl Libc {
|
||||
pub(crate) fn from_env() -> Result<Self, LibcDetectionError> {
|
||||
match std::env::consts::OS {
|
||||
"linux" => Ok(Self::Some(match detect_linux_libc()? {
|
||||
LibcVersion::Manylinux { .. } => target_lexicon::Environment::Gnu,
|
||||
LibcVersion::Manylinux { .. } => match std::env::consts::ARCH {
|
||||
// Checks if the CPU supports hardware floating-point operations.
|
||||
// Depending on the result, it selects either the `gnueabihf` (hard-float) or `gnueabi` (soft-float) environment.
|
||||
// download-metadata.json only includes armv7.
|
||||
"arm" | "armv7" => match detect_hardware_floating_point_support() {
|
||||
Ok(true) => target_lexicon::Environment::Gnueabihf,
|
||||
Ok(false) => target_lexicon::Environment::Gnueabi,
|
||||
Err(_) => target_lexicon::Environment::Gnu,
|
||||
},
|
||||
_ => target_lexicon::Environment::Gnu,
|
||||
},
|
||||
LibcVersion::Musllinux { .. } => target_lexicon::Environment::Musl,
|
||||
})),
|
||||
"windows" | "macos" => Ok(Self::None),
|
||||
|
||||
Reference in New Issue
Block a user