Marcel Telka
2024-04-07 76a1721da25c9ff6078485e917711feccfacd133
make-rules/pyproject.mk
@@ -15,12 +15,24 @@
include $(WS_MAKE_RULES)/setup.py.mk
PYTHON_BOOTSTRAP ?= no
ifeq ($(strip $(PYTHON_BOOTSTRAP)),yes)
# To bootstrap the bootstrapper we need to make sure it finds its own modules
ifeq ($(strip $(COMPONENT_NAME)),pyproject_installer)
PYTHON_ENV += PYTHONPATH=$(@D)/src
endif
# Both build and installer Python modules together with versioned
# library/python/build and library/python/installer packages are not available
# during bootstrap.
ifeq ($(strip $(PYTHON_BOOTSTRAP)),no)
COMPONENT_BUILD_CMD =      $(PYTHON) -m pyproject_installer build
COMPONENT_BUILD_ARGS =
COMPONENT_INSTALL_CMD =      $(PYTHON) -m pyproject_installer install
COMPONENT_INSTALL_ARGS =
COMPONENT_INSTALL_ARGS +=   --destdir $(PROTO_DIR)
# pyproject_installer does not bytecompile after the install.  Since we need
# pyc files we need to force that.
COMPONENT_POST_INSTALL_ACTION += \
   $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_DIR)/site-packages $(PROTO_DIR)/$(PYTHON_LIB) ;
else
COMPONENT_BUILD_CMD =      $(PYTHON) -m build
COMPONENT_BUILD_ARGS =
COMPONENT_BUILD_ARGS +=      --wheel
@@ -31,8 +43,8 @@
COMPONENT_INSTALL_ARGS +=   --destdir $(PROTO_DIR)
COMPONENT_INSTALL_ARGS +=   $(@D)/dist/*.whl
PYTHON_USERLAND_REQUIRED_PACKAGES += library/python/build
PYTHON_USERLAND_REQUIRED_PACKAGES += library/python/installer
USERLAND_REQUIRED_PACKAGES.python += library/python/build
USERLAND_REQUIRED_PACKAGES.python += library/python/installer
endif
# Move all modules from default site-packages directory to vendor-packages
@@ -43,3 +55,27 @@
      $(RM) -r $(PROTO_DIR)/$(PYTHON_LIB) ; \
      $(MV) $(PROTO_DIR)/$(PYTHON_DIR)/site-packages $(PROTO_DIR)/$(PYTHON_LIB) ; \
   fi ;
# Add build dependencies from project metadata to REQUIRED_PACKAGES
REQUIRED_PACKAGES_RESOLVED += $(BUILD_DIR)/META.depend.res
$(BUILD_DIR)/META.depend.res: $(SOURCE_DIR)/.prep
   $(MKDIR) $(BUILD_DIR)
   # PYTHON_ENV is needed four times here to have the PYTHONPATH set
   # properly when we bootstrap the pyproject_installer bootstrapper.
   $(PYTHON_ENV) $(PYTHON) -m pyproject_installer deps --depsconfig $(BUILD_DIR)/pyproject_deps.json add build_pep517 pep517
   $(PYTHON_ENV) $(PYTHON) -m pyproject_installer deps --depsconfig $(BUILD_DIR)/pyproject_deps.json add build_pep518 pep518
   cd $(SOURCE_DIR) ; $(PYTHON_ENV) $(PYTHON) -m pyproject_installer deps --depsconfig $(BUILD_DIR)/pyproject_deps.json sync
   $(PYTHON_ENV) $(PYTHON) -m pyproject_installer deps --depsconfig $(BUILD_DIR)/pyproject_deps.json eval --depformat '$$nname' \
      | $(GSED) -e 's/.*/depend type=require fmri=pkg:\/library\/python\/&-$$(PYV)/' \
      > $@
# PYTHON_ENV (see above) needs BITS
$(BUILD_DIR)/META.depend.res: BITS = $(PREFERRED_BITS)
# We need pyproject_installer for two purposes:
# - to detect build dependencies for all Python projects, and
# - to bootstrap some other Python projects.
# The pyproject_installer is not needed (and cannot be needed) for its own
# build.
ifneq ($(strip $(COMPONENT_NAME)),pyproject_installer)
USERLAND_REQUIRED_PACKAGES.python += library/python/pyproject-installer
endif