From 1a501f9077898eec571133d45c1d6f81aa2c7d0f Mon Sep 17 00:00:00 2001 From: David Hewitt Date: Sun, 6 Sep 2026 15:01:19 +0100 Subject: [PATCH] remove `setup.py` from `cffi` example --- .gitignore | 1 + examples/rust_with_cffi/MANIFEST.in | 1 + examples/rust_with_cffi/build_backend.py | 63 ++++++++++++++++++++++++ examples/rust_with_cffi/noxfile.py | 2 +- examples/rust_with_cffi/pyproject.toml | 35 ++++++++++++- examples/rust_with_cffi/setup.py | 26 ---------- 6 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 examples/rust_with_cffi/build_backend.py delete mode 100644 examples/rust_with_cffi/setup.py diff --git a/.gitignore b/.gitignore index 5861247b..2c02e730 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ target *.egg-info pyo3 docs/_build +examples/rust_with_cffi/cffi_module.c diff --git a/examples/rust_with_cffi/MANIFEST.in b/examples/rust_with_cffi/MANIFEST.in index 541ad8f4..eb4dace4 100644 --- a/examples/rust_with_cffi/MANIFEST.in +++ b/examples/rust_with_cffi/MANIFEST.in @@ -1,4 +1,5 @@ include Cargo.toml +include build_backend.py include cffi_module.py recursive-include rust * recursive-include python * diff --git a/examples/rust_with_cffi/build_backend.py b/examples/rust_with_cffi/build_backend.py new file mode 100644 index 00000000..fbd694de --- /dev/null +++ b/examples/rust_with_cffi/build_backend.py @@ -0,0 +1,63 @@ +import subprocess +import sys +from pathlib import Path + +from setuptools import build_meta as _setuptools_build_meta + +_ROOT = Path(__file__).parent + + +def _generate_cffi_source(): + """Generate the CFFI source file from the Python module. + + `cffi` provides a command line tool `gen_src` that can be used to + generate the C source file from a Python module that defines the + CFFI interface. + + By implementing an in-tree build backend, we can invoke this before + forwarding to regular setuptools build backend functions. + """ + + # cffi documents `gen_src` as a command line tool + subprocess.check_call( + [ + sys.executable, + "-m", + "cffi.gen_src", + "exec-python", + "--ffi-var=ffi", + "cffi_module.py", + "cffi_module.c", + ], + cwd=_ROOT, + ) + + +def build_wheel(wheel_directory, config_settings=None, metadata_directory=None): + _generate_cffi_source() + return _setuptools_build_meta.build_wheel( + wheel_directory, config_settings, metadata_directory + ) + + +def build_sdist(sdist_directory, config_settings=None): + _generate_cffi_source() + return _setuptools_build_meta.build_sdist(sdist_directory, config_settings) + + +def build_editable(wheel_directory, config_settings=None, metadata_directory=None): + _generate_cffi_source() + return _setuptools_build_meta.build_editable( + wheel_directory, config_settings, metadata_directory + ) + + +get_requires_for_build_wheel = _setuptools_build_meta.get_requires_for_build_wheel +get_requires_for_build_sdist = _setuptools_build_meta.get_requires_for_build_sdist +get_requires_for_build_editable = _setuptools_build_meta.get_requires_for_build_editable +prepare_metadata_for_build_wheel = ( + _setuptools_build_meta.prepare_metadata_for_build_wheel +) +prepare_metadata_for_build_editable = ( + _setuptools_build_meta.prepare_metadata_for_build_editable +) diff --git a/examples/rust_with_cffi/noxfile.py b/examples/rust_with_cffi/noxfile.py index d8b9cc70..8b5dbad2 100644 --- a/examples/rust_with_cffi/noxfile.py +++ b/examples/rust_with_cffi/noxfile.py @@ -10,7 +10,7 @@ def test(session: nox.Session): session.install(SETUPTOOLS_RUST, "pytest") try: - session.install("cffi", "--only-binary=cffi") + session.install("cffi>=2.1", "--only-binary=cffi") except nox.command.CommandFailed: session.skip("cffi not available on this platform") diff --git a/examples/rust_with_cffi/pyproject.toml b/examples/rust_with_cffi/pyproject.toml index 4b5a004a..63eac998 100644 --- a/examples/rust_with_cffi/pyproject.toml +++ b/examples/rust_with_cffi/pyproject.toml @@ -1,3 +1,34 @@ [build-system] -requires = ["setuptools", "setuptools-rust", "cffi"] -build-backend = "setuptools.build_meta" +requires = ["setuptools>=74.1", "setuptools-rust", "cffi>=2.1"] +build-backend = "build_backend" +backend-path = ["."] + +[project] +name = "rust-with-cffi" +version = "0.1.0" +classifiers = [ + "License :: OSI Approved :: MIT License", + "Development Status :: 3 - Alpha", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Rust", + "Operating System :: POSIX", + "Operating System :: MacOS :: MacOS X", +] +dependencies = ["cffi"] + +[tool.setuptools] +package-dir = { "" = "python" } +include-package-data = true +zip-safe = false + +[tool.setuptools.packages.find] +where = ["python"] + +[[tool.setuptools.ext-modules]] +name = "rust_with_cffi.cffi" +sources = ["cffi_module.c"] +py-limited-api = true + +[[tool.setuptools-rust.ext-modules]] +target = "rust_with_cffi.rust" diff --git a/examples/rust_with_cffi/setup.py b/examples/rust_with_cffi/setup.py deleted file mode 100644 index a288a58f..00000000 --- a/examples/rust_with_cffi/setup.py +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env python -from setuptools import find_packages, setup -from setuptools_rust import RustExtension - -setup( - name="rust-with-cffi", - version="0.1.0", - classifiers=[ - "License :: OSI Approved :: MIT License", - "Development Status :: 3 - Alpha", - "Intended Audience :: Developers", - "Programming Language :: Python", - "Programming Language :: Rust", - "Operating System :: POSIX", - "Operating System :: MacOS :: MacOS X", - ], - packages=find_packages(where="python"), - package_dir={"": "python"}, - rust_extensions=[ - RustExtension("rust_with_cffi.rust"), - ], - cffi_modules=["cffi_module.py:ffi"], - install_requires=["cffi"], - include_package_data=True, - zip_safe=False, -)