diff --git a/src/build_options.rs b/src/build_options.rs index 7c4f002d1..129ef92a9 100644 --- a/src/build_options.rs +++ b/src/build_options.rs @@ -6,14 +6,14 @@ use crate::project_layout::ProjectResolver; use crate::pyproject_toml::ToolMaturin; use crate::python_interpreter::{InterpreterConfig, InterpreterKind, MINIMUM_PYTHON_MINOR}; use crate::{BuildContext, PythonInterpreter, Target}; -use anyhow::{bail, format_err, Context, Result}; +use anyhow::{bail, format_err, Context, Ok, Result}; use cargo_metadata::{Metadata, Node}; use cargo_options::heading; use pep440_rs::VersionSpecifiers; use serde::{Deserialize, Serialize}; use std::collections::{HashMap, HashSet}; use std::env; -use std::ops::{Deref, DerefMut}; +use std::ops::{ControlFlow, Deref, DerefMut}; use std::path::PathBuf; use tracing::debug; @@ -175,6 +175,9 @@ pub struct BuildOptions { #[arg(short = 'f', long, conflicts_with = "interpreter")] pub find_interpreter: bool, + #[arg(long)] + pub allow_prereleases: bool, + /// Which kind of bindings to use. #[arg(short, long, value_parser = ["pyo3", "pyo3-ffi", "rust-cpython", "cffi", "uniffi", "bin"])] pub bindings: Option, @@ -560,6 +563,16 @@ impl BuildOptions { let generate_import_lib = is_generating_import_lib(&cargo_metadata)?; let interpreter = if self.find_interpreter { // Auto-detect interpreters + let requires_python = metadata23.requires_python.as_ref(); + if requires_python.is_some() { + let versions = requires_python.unwrap(); + let has_pre_release = versions.iter().any(|v| v.any_prerelease()); + if has_pre_release && !self.allow_prereleases { + print!("⚠️ Warning: python version is pre release, need pass flag --allow-prereleases"); + ControlFlow::Break(()); + } + } + self.find_interpreters( &bridge, &[], diff --git a/src/develop.rs b/src/develop.rs index dfd71d20e..78f608c4c 100644 --- a/src/develop.rs +++ b/src/develop.rs @@ -260,6 +260,7 @@ pub fn develop(develop_options: DevelopOptions, venv_dir: &Path) -> Result<()> { platform_tag: vec![PlatformTag::Linux], interpreter: vec![python.clone()], find_interpreter: false, + allow_prereleases: true, bindings, out: Some(wheel_dir.path().to_path_buf()), skip_auditwheel: false,