@@ -6,14 +6,14 @@ use crate::project_layout::ProjectResolver;
66use crate :: pyproject_toml:: ToolMaturin ;
77use crate :: python_interpreter:: { InterpreterConfig , InterpreterKind , MINIMUM_PYTHON_MINOR } ;
88use crate :: { BuildContext , PythonInterpreter , Target } ;
9- use anyhow:: { bail, format_err, Context , Result } ;
9+ use anyhow:: { bail, format_err, Context , Ok , Result } ;
1010use cargo_metadata:: { Metadata , Node } ;
1111use cargo_options:: heading;
1212use pep440_rs:: VersionSpecifiers ;
1313use serde:: { Deserialize , Serialize } ;
1414use std:: collections:: { HashMap , HashSet } ;
1515use std:: env;
16- use std:: ops:: { Deref , DerefMut } ;
16+ use std:: ops:: { ControlFlow , Deref , DerefMut } ;
1717use std:: path:: PathBuf ;
1818use tracing:: debug;
1919
@@ -175,6 +175,9 @@ pub struct BuildOptions {
175175 #[ arg( short = 'f' , long, conflicts_with = "interpreter" ) ]
176176 pub find_interpreter : bool ,
177177
178+ #[ arg( long) ]
179+ pub allow_prereleases : bool ,
180+
178181 /// Which kind of bindings to use.
179182 #[ arg( short, long, value_parser = [ "pyo3" , "pyo3-ffi" , "rust-cpython" , "cffi" , "uniffi" , "bin" ] ) ]
180183 pub bindings : Option < String > ,
@@ -560,6 +563,16 @@ impl BuildOptions {
560563 let generate_import_lib = is_generating_import_lib ( & cargo_metadata) ?;
561564 let interpreter = if self . find_interpreter {
562565 // Auto-detect interpreters
566+ let requires_python = metadata23. requires_python . as_ref ( ) ;
567+ if requires_python. is_some ( ) {
568+ let versions = requires_python. unwrap ( ) ;
569+ let has_pre_release = versions. iter ( ) . any ( |v| v. any_prerelease ( ) ) ;
570+ if has_pre_release && !self . allow_prereleases {
571+ print ! ( "⚠️ Warning: python version is pre release, need pass flag --allow-prereleases" ) ;
572+ ControlFlow :: Break ( ( ) ) ;
573+ }
574+ }
575+
563576 self . find_interpreters (
564577 & bridge,
565578 & [ ] ,
0 commit comments