@@ -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,25 @@ 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
+ let abi3_minor = ( PY3_MIN_MINOR ..=ABI3_MAX_MINOR )
780
+ . find ( |i| env:: var_os ( format ! ( "CARGO_FEATURE_ABI3_PY3{}" , i) ) . is_some ( ) ) ;
781
+ match ( abi3_minor, interpreter_config. version . minor ) {
782
+ ( Some ( abi3_minor) , Some ( interpreter_minor) ) if abi3_minor > interpreter_minor => bail ! (
783
+ "You cannot set mininimum Python version {} higher than the interpreter version {}" ,
784
+ abi3_minor,
785
+ interpreter_minor
786
+ ) ,
787
+ _ => abi3_minor. or ( interpreter_config. version . minor ) ,
788
+ }
789
+ } else {
790
+ interpreter_config. version . minor
791
+ } ;
776
792
777
- if let Some ( minor) = interpreter_config . version . minor {
778
- for i in 6 ..=minor {
793
+ if let Some ( minor) = minor {
794
+ for i in PY3_MIN_MINOR ..=minor {
779
795
println ! ( "cargo:rustc-cfg=Py_3_{}" , i) ;
780
796
flags += format ! ( "CFG_Py_3_{}," , i) . as_ref ( ) ;
781
797
}
0 commit comments