Skip to content

Commit 5c144dd

Browse files
authored
Consider abi3 minor version when resolving Python interpreters (#2437)
Fixes #2436
1 parent 1b29abf commit 5c144dd

File tree

2 files changed

+38
-19
lines changed

2 files changed

+38
-19
lines changed

src/bridge.rs

+32-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use std::fmt::{Display, Formatter};
22

3+
use crate::python_interpreter::{MINIMUM_PYPY_MINOR, MINIMUM_PYTHON_MINOR};
4+
35
/// The name and version of the bindings crate
46
#[derive(Clone, Debug, PartialEq, Eq)]
57
pub struct Bindings {
@@ -11,7 +13,7 @@ pub struct Bindings {
1113

1214
impl Bindings {
1315
/// Returns the minimum python minor version supported
14-
pub fn minimal_python_minor_version(&self) -> usize {
16+
fn minimal_python_minor_version(&self) -> usize {
1517
use crate::python_interpreter::MINIMUM_PYTHON_MINOR;
1618

1719
match self.name.as_str() {
@@ -30,7 +32,7 @@ impl Bindings {
3032
}
3133

3234
/// Returns the minimum PyPy minor version supported
33-
pub fn minimal_pypy_minor_version(&self) -> usize {
35+
fn minimal_pypy_minor_version(&self) -> usize {
3436
use crate::python_interpreter::MINIMUM_PYPY_MINOR;
3537

3638
match self.name.as_str() {
@@ -121,6 +123,34 @@ impl BridgeModel {
121123
matches!(self, BridgeModel::Bin(_))
122124
}
123125

126+
/// Returns the minimum python minor version supported
127+
pub fn minimal_python_minor_version(&self) -> usize {
128+
match self {
129+
BridgeModel::Bin(Some(bindings)) | BridgeModel::Bindings(bindings) => {
130+
bindings.minimal_python_minor_version()
131+
}
132+
BridgeModel::BindingsAbi3 {
133+
bindings,
134+
minor: abi3_minor,
135+
..
136+
} => {
137+
let bindings_minor = bindings.minimal_python_minor_version();
138+
bindings_minor.max(*abi3_minor as usize)
139+
}
140+
BridgeModel::Bin(None) | BridgeModel::Cffi | BridgeModel::UniFfi => {
141+
MINIMUM_PYTHON_MINOR
142+
}
143+
}
144+
}
145+
146+
/// Returns the minimum PyPy minor version supported
147+
pub fn minimal_pypy_minor_version(&self) -> usize {
148+
match self.bindings() {
149+
Some(bindings) => bindings.minimal_pypy_minor_version(),
150+
None => MINIMUM_PYPY_MINOR,
151+
}
152+
}
153+
124154
/// free-threaded Python support
125155
pub fn supports_free_threaded(&self) -> bool {
126156
match self {

src/python_interpreter/mod.rs

+6-17
Original file line numberDiff line numberDiff line change
@@ -732,12 +732,11 @@ impl PythonInterpreter {
732732
requires_python: Option<&VersionSpecifiers>,
733733
bridge: Option<&BridgeModel>,
734734
) -> Vec<PythonInterpreter> {
735-
let bindings = bridge.and_then(|bridge| bridge.bindings());
736-
let min_python_minor = bindings
737-
.map(|bindings| bindings.minimal_python_minor_version())
735+
let min_python_minor = bridge
736+
.map(|bridge| bridge.minimal_python_minor_version())
738737
.unwrap_or(MINIMUM_PYTHON_MINOR);
739-
let min_pypy_minor = bindings
740-
.map(|bindings| bindings.minimal_pypy_minor_version())
738+
let min_pypy_minor = bridge
739+
.map(|bridge| bridge.minimal_pypy_minor_version())
741740
.unwrap_or(MINIMUM_PYPY_MINOR);
742741
let supports_free_threaded = bridge
743742
.map(|bridge| bridge.supports_free_threaded())
@@ -794,18 +793,8 @@ impl PythonInterpreter {
794793
bridge: &BridgeModel,
795794
requires_python: Option<&VersionSpecifiers>,
796795
) -> Result<Vec<PythonInterpreter>> {
797-
let min_python_minor = match bridge {
798-
BridgeModel::Bindings(bindings) | BridgeModel::Bin(Some(bindings)) => {
799-
bindings.minimal_python_minor_version()
800-
}
801-
_ => MINIMUM_PYTHON_MINOR,
802-
};
803-
let min_pypy_minor = match bridge {
804-
BridgeModel::Bindings(bindings) | BridgeModel::Bin(Some(bindings)) => {
805-
bindings.minimal_pypy_minor_version()
806-
}
807-
_ => MINIMUM_PYPY_MINOR,
808-
};
796+
let min_python_minor = bridge.minimal_python_minor_version();
797+
let min_pypy_minor = bridge.minimal_pypy_minor_version();
809798
let executables = if target.is_windows() {
810799
// TOFIX: add PyPy support to Windows
811800
find_all_windows(target, min_python_minor, requires_python)?

0 commit comments

Comments
 (0)