Skip to content

feat: support conditional cargo features based on Python version#3027

Merged
messense merged 1 commit intoPyO3:mainfrom
messense:feat/conditional-python-version-features
Feb 21, 2026
Merged

feat: support conditional cargo features based on Python version#3027
messense merged 1 commit intoPyO3:mainfrom
messense:feat/conditional-python-version-features

Conversation

@messense
Copy link
Copy Markdown
Member

Extend [tool.maturin] features to accept both plain feature strings and conditional objects with feature and python-version keys:

features = [
  "always-on-feature",
  { feature = "pyo3/abi3-py311", python-version = ">=3.11" },
  { feature = "pyo3/abi3-py38", python-version = "<3.11" },
]

Conditional features use PEP 440 version specifiers and are resolved at build time against the target Python interpreter version.

Closes #2472

@messense messense force-pushed the feat/conditional-python-version-features branch from 4b1dac4 to 5e795ee Compare February 21, 2026 06:42
@messense messense requested a review from Copilot February 21, 2026 06:43
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends tool.maturin.features to support conditional Cargo features that are enabled based on the target Python interpreter version using PEP 440 version specifiers.

Changes:

  • Added a FeatureSpec type to parse either plain feature strings or conditional { feature, python-version } objects.
  • Plumbed conditional feature extraction into BuildContext and resolve/enable them during Cargo build command construction.
  • Updated JSON schema and documentation, and added tests for parsing and resolution.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/pyproject_toml.rs Introduces FeatureSpec, updates ToolMaturin.features, and adds tests for conditional feature parsing/resolution.
src/compile.rs Resolves conditional features from BuildContext using the target interpreter and appends them to Cargo features.
src/build_options.rs Extracts conditional feature rules from pyproject.toml and ensures only plain features become base Cargo features.
src/build_context.rs Stores conditional feature rules on BuildContext.
maturin.schema.json Extends schema to allow mixed string/object feature entries via FeatureSpec.
guide/src/config.md Documents conditional features under [tool.maturin].

Comment thread src/pyproject_toml.rs
Comment thread src/compile.rs
Extend `[tool.maturin] features` to accept both plain feature strings
and conditional objects with `feature` and `python-version` keys:

```toml
features = [
  "always-on-feature",
  { feature = "pyo3/abi3-py311", python-version = ">=3.11" },
  { feature = "pyo3/abi3-py38", python-version = "<3.11" },
]
```

Conditional features use PEP 440 version specifiers and are resolved at
build time against the target Python interpreter version.

Closes PyO3#2472
@messense messense force-pushed the feat/conditional-python-version-features branch from 5e795ee to f4e93f0 Compare February 21, 2026 06:53
@messense messense enabled auto-merge (squash) February 21, 2026 06:54
@messense messense merged commit ca9dd29 into PyO3:main Feb 21, 2026
45 checks passed
@messense messense deleted the feat/conditional-python-version-features branch February 21, 2026 07:27
netbsd-srcmastr pushed a commit to NetBSD/pkgsrc that referenced this pull request Feb 22, 2026
## 1.12.4

* Upgrade memmap2 version ([#3021](PyO3/maturin#3021))
* Fix: platform tag detection for Android targets ([#3023](PyO3/maturin#3023))
* Fix: only ignore maturin-generated native libraries on all platforms ([#3025](PyO3/maturin#3025))
* Fix: ignore develop artifacts for all binding types during build ([#3026](PyO3/maturin#3026))
* Feat: support conditional cargo features based on Python version ([#3027](PyO3/maturin#3027))

## 1.12.3

* Ci: set crt-static for riscv64 and loongarch64 musl targets ([#3009](PyO3/maturin#3009))
* Fix: support `maturin develop` on Windows ARM with x86 Python ([#3011](PyO3/maturin#3011))
* Fix: exclude `external_packages` bindings from uniffi wheels ([#3013](PyO3/maturin#3013))
* Update cargo-zigbuild to 0.22.1 ([#3015](PyO3/maturin#3015))
* Feat: build wheels from sdist with `--sdist` flag ([#3014](PyO3/maturin#3014))
* Feat: add `include-import-lib` option to bundle Windows import libraries in wheels ([#3017](PyO3/maturin#3017))
* Fix: auditwheel external lib check respects musllinux and reports symbol versions ([#3019](PyO3/maturin#3019))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Make it easier to support multiple versions

2 participants