diff --git a/package/pkg-python.mk b/package/pkg-python.mk index 85374ae8bb..28ee4cb85f 100644 --- a/package/pkg-python.mk +++ b/package/pkg-python.mk @@ -109,6 +109,18 @@ HOST_PKG_PYTHON_SETUPTOOLS_INSTALL_OPTS = \ --root=/ \ --single-version-externally-managed +# Target setuptools-rust-based packages +PKG_PYTHON_SETUPTOOLS_RUST_ENV = \ + $(PKG_PYTHON_SETUPTOOLS_ENV) \ + $(PKG_CARGO_ENV) \ + PYO3_CROSS_LIB_DIR="$(STAGING_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)" + +# Host setuptools-rust-based packages +HOST_PKG_PYTHON_SETUPTOOLS_RUST_ENV = \ + $(HOST_PKG_PYTHON_SETUPTOOLS_ENV) \ + $(HOST_PKG_CARGO_ENV) \ + PYO3_CROSS_LIB_DIR="$(HOST_DIR)/lib/python$(PYTHON3_VERSION_MAJOR)" + # Target pep517-based packages PKG_PYTHON_PEP517_ENV = \ $(PKG_PYTHON_ENV) @@ -146,6 +158,18 @@ HOST_PKG_PYTHON_PEP517_INSTALL_OPTS = \ HOST_PKG_PYTHON_PEP517_BOOTSTRAP_INSTALL_OPTS = \ --installdir=$(HOST_DIR)/lib/python$(PYTHON3_VERSION_MAJOR)/site-packages +# Target maturin packages +PKG_PYTHON_MATURIN_ENV = \ + $(PKG_PYTHON_PEP517_ENV) \ + $(PKG_CARGO_ENV) \ + PYO3_CROSS_LIB_DIR="$(STAGING_DIR)/usr/lib/python$(PYTHON3_VERSION_MAJOR)" + +# Host maturin packages +HOST_PKG_PYTHON_MATURIN_ENV = \ + $(HOST_PKG_PYTHON_PEP517_ENV) \ + $(HOST_PKG_CARGO_ENV) \ + PYO3_CROSS_LIB_DIR="$(HOST_DIR)/lib/python$(PYTHON3_VERSION_MAJOR)" + ################################################################################ # inner-python-package -- defines how the configuration, compilation # and installation of a Python package should be done, implements a @@ -184,25 +208,41 @@ $(2)_BASE_BUILD_CMD = setup.py build $(2)_BASE_INSTALL_CMD = setup.py install $$(HOST_PKG_PYTHON_DISTUTILS_INSTALL_OPTS) endif # Setuptools -else ifeq ($$($(2)_SETUP_TYPE),setuptools) +else ifneq ($$(filter setuptools setuptools-rust,$$($(2)_SETUP_TYPE)),) ifeq ($(4),target) +ifeq ($$($(2)_SETUP_TYPE),setuptools-rust) +$(2)_BASE_ENV = $$(PKG_PYTHON_SETUPTOOLS_RUST_ENV) +else $(2)_BASE_ENV = $$(PKG_PYTHON_SETUPTOOLS_ENV) +endif $(2)_BASE_BUILD_CMD = $$(PKG_PYTHON_SETUPTOOLS_CMD) build $(2)_BASE_INSTALL_TARGET_CMD = $$(PKG_PYTHON_SETUPTOOLS_CMD) install --no-compile $$(PKG_PYTHON_SETUPTOOLS_INSTALL_TARGET_OPTS) $(2)_BASE_INSTALL_STAGING_CMD = $$(PKG_PYTHON_SETUPTOOLS_CMD) install $$(PKG_PYTHON_SETUPTOOLS_INSTALL_STAGING_OPTS) else +ifeq ($$($(2)_SETUP_TYPE),setuptools-rust) +$(2)_BASE_ENV = $$(HOST_PKG_PYTHON_SETUPTOOLS_RUST_ENV) +else $(2)_BASE_ENV = $$(HOST_PKG_PYTHON_SETUPTOOLS_ENV) +endif $(2)_BASE_BUILD_CMD = $$(PKG_PYTHON_SETUPTOOLS_CMD) build $(2)_BASE_INSTALL_CMD = $$(PKG_PYTHON_SETUPTOOLS_CMD) install $$(HOST_PKG_PYTHON_SETUPTOOLS_INSTALL_OPTS) endif -else ifneq ($$(filter flit pep517,$$($(2)_SETUP_TYPE)),) +else ifneq ($$(filter flit maturin pep517,$$($(2)_SETUP_TYPE)),) ifeq ($(4),target) +ifeq ($$($(2)_SETUP_TYPE),maturin) +$(2)_BASE_ENV = $$(PKG_PYTHON_MATURIN_ENV) +else $(2)_BASE_ENV = $$(PKG_PYTHON_PEP517_ENV) +endif $(2)_BASE_BUILD_CMD = -m build -n -w $(2)_BASE_INSTALL_TARGET_CMD = $(TOPDIR)/support/scripts/pyinstaller.py dist/* $$(PKG_PYTHON_PEP517_INSTALL_TARGET_OPTS) $(2)_BASE_INSTALL_STAGING_CMD = $(TOPDIR)/support/scripts/pyinstaller.py dist/* $$(PKG_PYTHON_PEP517_INSTALL_STAGING_OPTS) else +ifeq ($$($(2)_SETUP_TYPE),maturin) +$(2)_BASE_ENV = $$(HOST_PKG_PYTHON_MATURIN_ENV) +else $(2)_BASE_ENV = $$(HOST_PKG_PYTHON_PEP517_ENV) +endif $(2)_BASE_BUILD_CMD = -m build -n -w $(2)_BASE_INSTALL_CMD = $(TOPDIR)/support/scripts/pyinstaller.py dist/* $$(HOST_PKG_PYTHON_PEP517_INSTALL_OPTS) endif @@ -215,7 +255,29 @@ $(2)_BASE_BUILD_CMD = -m flit_core.wheel $(2)_BASE_INSTALL_CMD ?= $(TOPDIR)/support/scripts/pyinstaller.py dist/* $$(HOST_PKG_PYTHON_PEP517_INSTALL_OPTS) endif else -$$(error "Invalid $(2)_SETUP_TYPE. Valid options are 'distutils', 'setuptools', 'pep517' or 'flit'.") +$$(error "Invalid $(2)_SETUP_TYPE. Valid options are 'distutils', 'maturin', 'setuptools', 'setuptools-rust', 'pep517' or 'flit'.") +endif + +# We need to vendor the Cargo crates at download time for pyo3 based +# packages. +# +ifneq ($$(filter maturin setuptools-rust,$$($(2)_SETUP_TYPE)),) +ifeq ($(4),target) +$(2)_DL_ENV = $$(PKG_CARGO_ENV) +else +$(2)_DL_ENV = $$(HOST_PKG_CARGO_ENV) +endif +ifndef $(2)_CARGO_MANIFEST_PATH +ifdef $(3)_CARGO_MANIFEST_PATH +$(2)_DL_ENV += BR_CARGO_MANIFEST_PATH=$$($(3)_CARGO_MANIFEST_PATH) +else +ifneq ($$($(2)_SUBDIR),) +$(2)_DL_ENV += BR_CARGO_MANIFEST_PATH=$$($(2)_SUBDIR)/Cargo.toml +endif +endif +else +$(2)_DL_ENV += BR_CARGO_MANIFEST_PATH=$$($(2)_CARGO_MANIFEST_PATH) +endif endif # Target packages need both the python interpreter on the target (for @@ -232,19 +294,35 @@ endif # ($(4),target) # Setuptools based packages will need setuptools for the host Python # interpreter (both host and target). # -ifeq ($$($(2)_SETUP_TYPE),setuptools) +ifneq ($$(filter setuptools setuptools-rust,$$($(2)_SETUP_TYPE)),) $(2)_DEPENDENCIES += host-python-setuptools -else ifneq ($$(filter flit pep517,$$($(2)_SETUP_TYPE)),) +ifeq ($$($(2)_SETUP_TYPE),setuptools-rust) +$(2)_DEPENDENCIES += host-python-setuptools-rust +endif +else ifneq ($$(filter flit maturin pep517,$$($(2)_SETUP_TYPE)),) $(2)_DEPENDENCIES += host-python-pypa-build host-python-installer ifeq ($$($(2)_SETUP_TYPE),flit) $(2)_DEPENDENCIES += host-python-flit-core endif +ifeq ($$($(2)_SETUP_TYPE),maturin) +$(2)_DEPENDENCIES += host-python-maturin +endif else ifeq ($$($(2)_SETUP_TYPE),flit-bootstrap) # Don't add dependency on host-python-installer for # host-python-installer itself, and its dependencies. ifeq ($$(filter host-python-flit-core host-python-installer,$(1)),) $(2)_DEPENDENCIES += host-python-installer endif +endif + +# Pyo3 based packages(setuptools-rust and maturin) will need rust +# toolchain dependencies for the host Python interpreter (both host +# and target). +# +ifneq ($$(filter maturin setuptools-rust,$$($(2)_SETUP_TYPE)),) +$(2)_DEPENDENCIES += host-rustc +$(2)_DOWNLOAD_POST_PROCESS = cargo +$(2)_DOWNLOAD_DEPENDENCIES = host-rustc endif # SETUP_TYPE # Python interpreter to use for building the package.