@@ -9,7 +9,10 @@ use std::{
9
9
str:: FromStr ,
10
10
} ;
11
11
12
- const PY3_MIN_MINOR : u8 = 5 ;
12
+ /// Minimum required Python version.
13
+ const PY3_MIN_MINOR : u8 = 6 ;
14
+ /// Maximum Python version that can be used as minimum required Python version with abi3.
15
+ const ABI3_MAX_MINOR : u8 = 9 ;
13
16
const CFG_KEY : & str = "py_sys_config" ;
14
17
15
18
type Result < T > = std:: result:: Result < T , Box < dyn std:: error:: Error > > ;
@@ -770,12 +773,18 @@ fn configure(interpreter_config: &InterpreterConfig) -> Result<String> {
770
773
bail ! ( "Python 2 is not supported" ) ;
771
774
}
772
775
773
- if env:: var_os ( "CARGO_FEATURE_ABI3" ) . is_some ( ) {
776
+ let minor = if env:: var_os ( "CARGO_FEATURE_ABI3" ) . is_some ( ) {
774
777
println ! ( "cargo:rustc-cfg=Py_LIMITED_API" ) ;
775
- }
778
+ // Check any `abi3-py3*` feature is set. If not, use the interpreter version.
779
+ ( PY3_MIN_MINOR ..=ABI3_MAX_MINOR )
780
+ . find_map ( |i| env:: var_os ( format ! ( "CARGO_FEATURE_ABI3_PY3{}" , i) ) . map ( |_| i) )
781
+ . or ( interpreter_config. version . minor )
782
+ } else {
783
+ interpreter_config. version . minor
784
+ } ;
776
785
777
- if let Some ( minor) = interpreter_config . version . minor {
778
- for i in 6 ..=minor {
786
+ if let Some ( minor) = minor {
787
+ for i in PY3_MIN_MINOR ..=minor {
779
788
println ! ( "cargo:rustc-cfg=Py_3_{}" , i) ;
780
789
flags += format ! ( "CFG_Py_3_{}," , i) . as_ref ( ) ;
781
790
}
0 commit comments