| | |
| | | |
| | | include $(WS_MAKE_RULES)/setup.py.mk |
| | | |
| | | PYTHON_BOOTSTRAP ?= no |
| | | |
| | | ifeq ($(strip $(PYTHON_BOOTSTRAP)),yes) |
| | | # |
| | | # Both 'build' and 'installer' Python modules used for packaging regular Python |
| | | # projects (see below) are not part of core Python, so we need to bootstrap |
| | | # them together with their non-core dependencies. |
| | | # |
| | | # There are basically two ways how to bootstrap such projects: |
| | | # |
| | | # 1) defer to default 'setup.py' build style for projects that still supports |
| | | # it. The 'setup.py' build style usually does not require anything outside |
| | | # core Python modules. Also, it is likely that the set of projects that needs |
| | | # to be bootstrapped (like setuptools) will support the 'setup.py' build style |
| | | # for very long time (maybe forever). Anyway, the main problem with the |
| | | # 'setup.py' build style is that its results are not PEP 376 compliant. |
| | | # |
| | | # 2) use something else, preferably as simple as possible, to do the build. |
| | | # Such tool needs to be PEP 376 and PEP 517 compliant and it also must be able |
| | | # to build itself without requiring any other non-core Python modules. We use |
| | | # pyproject_installer to do the job. |
| | | # |
| | | |
| | | ifeq ($(strip $(COMPONENT_NAME)),pyproject_installer) |
| | | # 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 |
| | | |
| | | # Since pyproject_installer requires Python >= 3.8 we need to defer to default |
| | | # setup.py build style for Python 3.7, so we will use pyproject_installer for |
| | | # Python 3.9 only. Once we obsolete Python 3.7 we should set |
| | | # COMPONENT_BUILD_CMD, COMPONENT_BUILD_ARGS, COMPONENT_INSTALL_CMD, and |
| | | # COMPONENT_INSTALL_ARGS unconditionally below and replace $(PYTHON.3.9) by |
| | | # $(PYTHON). |
| | | $(BUILD_DIR)/%-3.9/.built: COMPONENT_BUILD_CMD = $(PYTHON.3.9) -m pyproject_installer build |
| | | $(BUILD_DIR)/%-3.9/.built: COMPONENT_BUILD_ARGS = |
| | | COMPONENT_BUILD_CMD = $(PYTHON) -m pyproject_installer build |
| | | COMPONENT_BUILD_ARGS = |
| | | |
| | | $(BUILD_DIR)/%-3.9/.installed: COMPONENT_INSTALL_CMD = $(PYTHON.3.9) -m pyproject_installer install |
| | | $(BUILD_DIR)/%-3.9/.installed: COMPONENT_INSTALL_ARGS = |
| | | $(BUILD_DIR)/%-3.9/.installed: COMPONENT_INSTALL_ARGS += --destdir $(PROTO_DIR) |
| | | 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. |
| | | # |
| | | # Since pyproject_installer requires Python >= 3.8 we need to defer to default |
| | | # setup.py build style for Python 3.7, and so we do not need to compile for |
| | | # Python 3.7. Once we obsolete Python 3.7 we should set |
| | | # COMPONENT_POST_INSTALL_ACTION unconditionally below. |
| | | $(BUILD_DIR)/%-3.9/.installed: COMPONENT_POST_INSTALL_ACTION += $(PYTHON) -m compileall $(PROTO_DIR)/$(PYTHON_LIB) ; |
| | | |
| | | # Special transforms needed only until we drop support for Python 3.7 |
| | | PUBLISH_TRANSFORMS += $(WS_TOP)/transforms/python-bootstrap |
| | | |
| | | # We need pyproject_installer to bootstrap other projects, but it is not needed |
| | | # (and cannot be needed) for its own bootstrap. |
| | | ifneq ($(strip $(COMPONENT_NAME)),pyproject_installer) |
| | | # Once we obsolete Python 3.7 this should be changed to |
| | | # PYTHON_USERLAND_REQUIRED_PACKAGES and '-39' suffix should be removed |
| | | USERLAND_REQUIRED_PACKAGES += library/python/pyproject_installer-39 |
| | | endif |
| | | 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_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 |
| | |
| | | $(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 |