diff --git a/.gitignore b/.gitignore index 9c30aabe191..9e7c90b4a91 100644 --- a/.gitignore +++ b/.gitignore @@ -8,8 +8,10 @@ cross/*/status* kernel/*/work* spk/*/work* spk/*/build* +spk/*/crossenv* spk/*/publish* spk/*/status* +spk/*/wheel* diyspk/*/work* diyspk/*/build* diyspk/*/status* diff --git a/cross/python312/Makefile b/cross/python312/Makefile index 0a9193237f8..ea7830af568 100644 --- a/cross/python312/Makefile +++ b/cross/python312/Makefile @@ -1,5 +1,5 @@ PKG_NAME = python312 -PKG_VERS = 3.12.8 +PKG_VERS = 3.12.9 PKG_VERS_MAJOR_MINOR = $(word 1,$(subst ., ,$(PKG_VERS))).$(word 2,$(subst ., ,$(PKG_VERS))) PKG_EXT = tar.xz PKG_DIST_NAME = Python-$(PKG_VERS).$(PKG_EXT) diff --git a/cross/python312/digests b/cross/python312/digests index bbc77569f89..08017a1d2b8 100644 --- a/cross/python312/digests +++ b/cross/python312/digests @@ -1,3 +1,3 @@ -Python-3.12.8.tar.xz SHA1 8872c7a124c6970833e0bde4f25d6d7d61c6af6e -Python-3.12.8.tar.xz SHA256 c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e -Python-3.12.8.tar.xz MD5 d46e5bf9f2e596a3ba45fc0b3c053dd2 +Python-3.12.9.tar.xz SHA1 465d8a664e63dc5aa1f0d90cd1d0000a970ee2fb +Python-3.12.9.tar.xz SHA256 7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112 +Python-3.12.9.tar.xz MD5 880942124f7d5c01e7b65cbad62dc873 diff --git a/cross/python313/Makefile b/cross/python313/Makefile index 6076b1a2ef7..d03014cc35a 100644 --- a/cross/python313/Makefile +++ b/cross/python313/Makefile @@ -1,5 +1,5 @@ PKG_NAME = python313 -PKG_VERS = 3.13.1 +PKG_VERS = 3.13.2 PKG_VERS_MAJOR_MINOR = $(word 1,$(subst ., ,$(PKG_VERS))).$(word 2,$(subst ., ,$(PKG_VERS))) PKG_EXT = tar.xz PKG_DIST_NAME = Python-$(PKG_VERS).$(PKG_EXT) diff --git a/cross/python313/digests b/cross/python313/digests index 35979854910..fedc4e80cb2 100644 --- a/cross/python313/digests +++ b/cross/python313/digests @@ -1,3 +1,3 @@ -Python-3.13.1.tar.xz SHA1 4b0c2a49a848c3c5d611416099636262a0b9090f -Python-3.13.1.tar.xz SHA256 9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9 -Python-3.13.1.tar.xz MD5 80c16badb94ffe235280d4d9a099b8bc +Python-3.13.2.tar.xz SHA1 e4949d999f28d6ad941e766b7dac09a74efbc912 +Python-3.13.2.tar.xz SHA256 d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56 +Python-3.13.2.tar.xz MD5 4c2d9202ab4db02c9d0999b14655dfe5 diff --git a/mk/spksrc.common.mk b/mk/spksrc.common.mk index abbb8d8cd85..a3e2753f764 100644 --- a/mk/spksrc.common.mk +++ b/mk/spksrc.common.mk @@ -123,11 +123,17 @@ endif # Always send PSTAT output to proper log file # independantly from active Makefile location ifeq ($(filter cross diyspk spk,$(shell basename $(dir $(abspath $(dir $$PWD))))),) +CROSSENV_LOG = $(shell pwdx $$(ps -o ppid= $$(echo $$PPID)) | cut -f2 -d:)/build-$(ARCH)-$(TCVERSION)-crossenv.log PSTAT_LOG = $(shell pwdx $$(ps -o ppid= $$(echo $$PPID)) | cut -f2 -d:)/status-build.log +WHEEL_LOG = $(shell pwdx $$(ps -o ppid= $$(echo $$PPID)) | cut -f2 -d:)/build-$(ARCH)-$(TCVERSION)-wheel.log else ifneq ($(wildcard $(WORK_DIR)),) +CROSSENV_LOG = $(WORK_DIR)/../build-$(ARCH)-$(TCVERSION)-crossenv.log PSTAT_LOG = $(WORK_DIR)/../status-build.log +WHEEL_LOG = $(WORK_DIR)/../build-$(ARCH)-$(TCVERSION)-wheel.log else +CROSSENV_LOG = $(CURDIR)/build-$(ARCH)-$(TCVERSION)-crossenv.log PSTAT_LOG = $(CURDIR)/status-build.log +WHEEL_LOG = $(CURDIR)/build-$(ARCH)-$(TCVERSION)-wheel.log endif # Terminal colors diff --git a/mk/spksrc.crossenv.mk b/mk/spksrc.crossenv.mk index 04354aa102a..ba5eb93e017 100644 --- a/mk/spksrc.crossenv.mk +++ b/mk/spksrc.crossenv.mk @@ -16,6 +16,12 @@ # WHEEL_NAME Name of wheel to process # WHEEL_VERSION Version of wheel to process (can be empty) +# include cmake definitions +include ../../mk/spksrc.cross-cmake-env.mk + +# include meson definitions +include ../../mk/spksrc.cross-meson-env.mk + # Defined using PYTHON_PACKAGE_WORK_DIR from spksrc.python.mk or use local work directory PYTHON_WORK_DIR = $(or $(wildcard $(PYTHON_PACKAGE_WORK_DIR)),$(wildcard $(WORK_DIR))) @@ -34,7 +40,7 @@ PYTHON_LIB_CROSS = $(abspath $(PYTHON_WORK_DIR)/$(PYTHON_PKG_DIR)/bui # wheel crossenv definitions CROSSENV_CONFIG_PATH = $(abspath $(PYTHON_WORK_DIR)/../crossenv) CROSSENV_CONFIG_DEFAULT = $(CROSSENV_CONFIG_PATH)/requirements-default.txt -CROSSENV_PATH = $(abspath $(WORK_DIR)/crossenv-$(CROSSENV_BUILD_WHEEL)/) +CROSSENV_PATH = $(abspath $(WORK_DIR)/crossenv-$(CROSSENV_WHEEL)/) ### @@ -58,50 +64,47 @@ endif # Check for -, then fallback to , then default ifneq ($(wildcard $(CROSSENV_CONFIG_PATH)/requirements-$(WHEEL_NAME)-$(WHEEL_VERSION).txt),) -CROSSENV_BUILD_WHEEL = $(WHEEL_NAME)-$(WHEEL_VERSION) -CROSSENV_BUILD_REQUIREMENTS = $(CROSSENV_CONFIG_PATH)/requirements-$(CROSSENV_BUILD_WHEEL).txt +CROSSENV_WHEEL = $(WHEEL_NAME)-$(WHEEL_VERSION) +CROSSENV_REQUIREMENTS = $(CROSSENV_CONFIG_PATH)/requirements-$(CROSSENV_WHEEL).txt else ifneq ($(wildcard $(CROSSENV_CONFIG_PATH)/requirements-$(WHEEL_NAME).txt),) -CROSSENV_BUILD_WHEEL = $(WHEEL_NAME) -CROSSENV_BUILD_REQUIREMENTS = $(CROSSENV_CONFIG_PATH)/requirements-$(WHEEL_NAME).txt +CROSSENV_WHEEL = $(WHEEL_NAME) +CROSSENV_REQUIREMENTS = $(CROSSENV_CONFIG_PATH)/requirements-$(WHEEL_NAME).txt else -CROSSENV_BUILD_WHEEL = default -CROSSENV_BUILD_REQUIREMENTS = $(CROSSENV_CONFIG_DEFAULT) +CROSSENV_WHEEL = default +CROSSENV_REQUIREMENTS = $(CROSSENV_CONFIG_DEFAULT) endif # Completion status file -CROSSENV_COOKIE = $(WORK_DIR)/.crossenv-$(CROSSENV_BUILD_WHEEL)_done +CROSSENV_COOKIE = $(WORK_DIR)/.crossenv-$(CROSSENV_WHEEL)_done ### -# default wheel packages to install in crossenv -ifneq ($(wildcard $(CROSSENV_BUILD_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)),) -CROSSENV_DEFAULT_PIP_VERSION = $(shell grep -h -E "^pip[<>=]=" $(wildcard $(CROSSENV_BUILD_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') -CROSSENV_DEFAULT_SETUPTOOLS_VERSION = $(shell grep -h -E "^setuptools[<>=]=" $(wildcard $(CROSSENV_BUILD_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') -CROSSENV_DEFAULT_WHEEL_VERSION = $(shell grep -h -E "^wheel[<>=]=" $(wildcard $(CROSSENV_BUILD_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') -endif - -ifneq ($(CROSSENV_DEFAULT_PIP_VERSION),) -CROSSENV_DEFAULT_PIP = pip==$(CROSSENV_DEFAULT_PIP_VERSION) -else -CROSSENV_DEFAULT_PIP = pip -endif - -ifneq ($(CROSSENV_DEFAULT_SETUPTOOLS_VERSION),) -CROSSENV_DEFAULT_SETUPTOOLS = setuptools==$(CROSSENV_DEFAULT_SETUPTOOLS_VERSION) -else -CROSSENV_DEFAULT_SETUPTOOLS = setuptools +# default pip, setuptools and wheel packages to +# install in crossenv/build and crossenv/cross +ifneq ($(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)),) +CROSSENV_BUILD_PIP_VERSION = $(shell grep -h -E "(^build:|^)pip[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') +CROSSENV_CROSS_PIP_VERSION = $(or $(shell grep -h -E "(^cross:)pip[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//'), $(CROSSENV_BUILD_PIP_VERSION)) +CROSSENV_BUILD_SETUPTOOLS_VERSION = $(shell grep -h -E "(^build:|^)setuptools[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') +CROSSENV_CROSS_SETUPTOOLS_VERSION = $(or $(shell grep -h -E "(^cross:)setuptools[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//'), $(CROSSENV_BUILD_SETUPTOOLS_VERSION)) +CROSSENV_BUILD_WHEEL_VERSION = $(shell grep -h -E "(^build:|^)wheel[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//') +CROSSENV_CROSS_WHEEL_VERSION = $(or $(shell grep -h -E "(^cross:)wheel[<>=]=" $(wildcard $(CROSSENV_REQUIREMENTS) $(CROSSENV_CONFIG_DEFAULT)) | head -1 | sed -E 's/.*[<>=]=//'), $(CROSSENV_BUILD_WHEEL_VERSION)) endif -ifneq ($(CROSSENV_DEFAULT_WHEEL_VERSION),) -CROSSENV_DEFAULT_WHEEL = wheel==$(CROSSENV_DEFAULT_WHEEL_VERSION) -else -CROSSENV_DEFAULT_WHEEL = wheel -endif +CROSSENV_BUILD_PIP ?= pip$(if $(CROSSENV_BUILD_PIP_VERSION),==$(CROSSENV_BUILD_PIP_VERSION)) +CROSSENV_CROSS_PIP ?= pip$(if $(CROSSENV_CROSS_PIP_VERSION),==$(CROSSENV_CROSS_PIP_VERSION)) +CROSSENV_BUILD_SETUPTOOLS ?= setuptools$(if $(CROSSENV_BUILD_SETUPTOOLS_VERSION),==$(CROSSENV_BUILD_SETUPTOOLS_VERSION)) +CROSSENV_CROSS_SETUPTOOLS ?= setuptools$(if $(CROSSENV_CROSS_SETUPTOOLS_VERSION),==$(CROSSENV_CROSS_SETUPTOOLS_VERSION)) +CROSSENV_BUILD_WHEEL ?= wheel$(if $(CROSSENV_BUILD_WHEEL_VERSION),==$(CROSSENV_BUILD_WHEEL_VERSION)) +CROSSENV_CROSS_WHEEL ?= wheel$(if $(CROSSENV_CROSS_WHEEL_VERSION),==$(CROSSENV_CROSS_WHEEL_VERSION)) ### crossenv_msg_target: - @$(MSG) "Preparing crossenv for $(NAME)" +ifneq ($(WHEEL_NAME),) + @$(MSG) "Preparing crossenv for $(NAME) - [$(WHEEL_NAME)==$(WHEEL_VERSION)]" +else + @$(MSG) "Preparing crossenv for $(NAME) - [default]" +endif # Create per-arch caching directory: # PIP_CACHE_DIR defaults to $(WORK_DIR)/pip @@ -110,13 +113,13 @@ pre_crossenv_target: crossenv_msg_target mkdir -p $(PIP_CACHE_DIR) ; \ fi; \ -post_crossenv_target: $(CROSSENV_TARGET) - ### +crossenv-%: SHELL:=/bin/bash crossenv-%: - @$(MSG) $(MAKE) ARCH=\"$(firstword $(subst -, ,$*))\" TCVERSION=\"$(lastword $(subst -, ,$*))\" WHEEL_NAME=\"$(WHEEL_NAME)\" WHEEL_VERSION=\"$(WHEEL_VERSION)\" crossenv - @MAKEFLAGS= $(MAKE) ARCH="$(firstword $(subst -, ,$*))" TCVERSION="$(lastword $(subst -, ,$*))" WHEEL_NAME="$(WHEEL_NAME)" WHEEL_VERSION="$(WHEEL_VERSION)" crossenv --no-print-directory + @$(MSG) $(MAKE) ARCH=\"$(firstword $(subst -, ,$*))\" TCVERSION=\"$(lastword $(subst -, ,$*))\" WHEEL_NAME=\"$(WHEEL_NAME)\" WHEEL_VERSION=\"$(WHEEL_VERSION)\" WHEEL_DEPENDENCY=\"$(WHEEL_DEPENDENCY)\" crossenv | tee --append $(CROSSENV_LOG) + @MAKEFLAGS= $(MAKE) ARCH="$(firstword $(subst -, ,$*))" TCVERSION="$(lastword $(subst -, ,$*))" WHEEL_NAME="$(WHEEL_NAME)" WHEEL_VERSION="$(WHEEL_VERSION)" WHEEL_DEPENDENCY=\"$(WHEEL_DEPENDENCY)\" crossenv --no-print-directory | tee --append $(CROSSENV_LOG) ; \ + [ $${PIPESTATUS[0]} -eq 0 ] || false #### @@ -162,11 +165,10 @@ export PYTHONPATH = $(PYTHON_LIB_NATIVE):$(PYTHON_STAGING_INSTALL_PREFIX)/lib/py # >>> sys.path # build_crossenv_target: SHELL:=/bin/bash -build_crossenv_target: pre_crossenv_target $(CROSSENV_PATH)/build/python-cc.mk - @$(MSG) $$(date +%Y%m%d-%H%M%S) MAKELEVEL: $(MAKELEVEL), PARALLEL_MAKE: $(PARALLEL_MAKE), ARCH: $(ARCH)-$(TCVERSION), CROSSENV: $(CROSSENV_BUILD_WHEEL) >> $(PSTAT_LOG) +build_crossenv_target: pre_crossenv_target + @$(MSG) $$(date +%Y%m%d-%H%M%S) MAKELEVEL: $(MAKELEVEL), PARALLEL_MAKE: $(PARALLEL_MAKE), ARCH: $(ARCH)-$(TCVERSION), CROSSENV: $(CROSSENV_WHEEL) >> $(PSTAT_LOG) @$(MSG) Python sources: $(wildcard $(PYTHON_WORK_DIR)/Python-[0-9]*) - @$(MSG) crossenv wheel packages: $(CROSSENV_DEFAULT_PIP), $(CROSSENV_DEFAULT_SETUPTOOLS), $(CROSSENV_DEFAULT_WHEEL) - @$(MSG) crossenv requirement definition: $(CROSSENV_BUILD_REQUIREMENTS) + @$(MSG) crossenv requirement definition: $(CROSSENV_REQUIREMENTS) mkdir -p $(PYTHON_LIB_CROSS) cp -RL $(HOSTPYTHON_LIB_NATIVE) $(abspath $(PYTHON_LIB_CROSS)/../) @echo $(PYTHON_NATIVE) -m crossenv $(abspath $(PYTHON_WORK_DIR)/install/$(PYTHON_INSTALL_PREFIX)/bin/python$(PYTHON_PKG_VERS_MAJOR_MINOR)) \ @@ -175,7 +177,7 @@ build_crossenv_target: pre_crossenv_target $(CROSSENV_PATH)/build/python-cc.mk --ar $(TC_PATH)$(TC_PREFIX)ar \ --sysroot $(TC_SYSROOT) \ --env LIBRARY_PATH= \ - --manylinux manylinux2014 \ + --machine $(TC_TARGET) \ "$(CROSSENV_PATH)" @$(RUN) $(PYTHON_NATIVE) -m crossenv $(abspath $(PYTHON_WORK_DIR)/install/$(PYTHON_INSTALL_PREFIX)/bin/python$(PYTHON_PKG_VERS_MAJOR_MINOR)) \ --cc $(TC_PATH)$(TC_PREFIX)gcc \ @@ -183,40 +185,55 @@ build_crossenv_target: pre_crossenv_target $(CROSSENV_PATH)/build/python-cc.mk --ar $(TC_PATH)$(TC_PREFIX)ar \ --sysroot $(TC_SYSROOT) \ --env LIBRARY_PATH= \ - --manylinux manylinux2014 \ + --machine $(TC_TARGET) \ "$(CROSSENV_PATH)" -ifeq ($(CROSSENV_BUILD_WHEEL),default) +ifeq ($(CROSSENV_WHEEL),default) @$(MSG) Setting default crossenv $(CROSSENV_PATH) @$(MSG) ln -sf crossenv-default $(WORK_DIR)/crossenv @$(RUN) ln -sf crossenv-default $(WORK_DIR)/crossenv endif @$(RUN) wget --no-verbose https://bootstrap.pypa.io/get-pip.py --directory-prefix=$(CROSSENV_PATH)/build ; \ $(RUN) chmod 755 $(CROSSENV_PATH)/build/get-pip.py + @$(MSG) crossenv-$(CROSSENV_WHEEL)/build default packages: $(CROSSENV_BUILD_PIP), $(CROSSENV_BUILD_SETUPTOOLS), $(CROSSENV_BUILD_WHEEL) @. $(CROSSENV_PATH)/bin/activate ; \ - $(MSG) build-python install $(CROSSENV_DEFAULT_PIP) ; \ - $(RUN) $$(which build-python) $(CROSSENV_PATH)/build/get-pip.py $(CROSSENV_DEFAULT_PIP) --no-setuptools --no-wheel --disable-pip-version-check ; \ - $(MSG) cross-python Install $(CROSSENV_DEFAULT_PIP) ; \ - $(RUN) $$(which cross-python) $(CROSSENV_PATH)/build/get-pip.py $(CROSSENV_DEFAULT_PIP) --no-setuptools --no-wheel --disable-pip-version-check - @. $(CROSSENV_PATH)/bin/activate ; \ - $(MSG) build-pip Install $(CROSSENV_DEFAULT_SETUPTOOLS) $(CROSSENV_DEFAULT_WHEEL) ; \ - $(RUN) $$(which build-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install $(CROSSENV_DEFAULT_SETUPTOOLS) $(CROSSENV_DEFAULT_WHEEL) ; \ - $(MSG) cross-pip Install $(CROSSENV_DEFAULT_SETUPTOOLS) $(CROSSENV_DEFAULT_WHEEL) ; \ - $(RUN) $$(which cross-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install $(CROSSENV_DEFAULT_SETUPTOOLS) $(CROSSENV_DEFAULT_WHEEL) - @$(MSG) [$(CROSSENV_PATH)] Processing $(CROSSENV_BUILD_REQUIREMENTS) - @. $(CROSSENV_PATH)/bin/activate ; \ - $(MSG) build-pip install -r $(CROSSENV_BUILD_REQUIREMENTS) ; \ - $(RUN) \ - PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/bin):$(PATH)" \ - LD_LIBRARY_PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/lib):$(LD_LIBRARY_PATH)" \ - $$(which build-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install -r $(CROSSENV_BUILD_REQUIREMENTS) ; \ - $(MSG) cross-pip Install -r $(CROSSENV_BUILD_REQUIREMENTS) ; \ - $(RUN) \ - PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/bin):$(PATH)" \ - LD_LIBRARY_PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/lib):$(LD_LIBRARY_PATH)" \ - $$(which cross-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install -r $(CROSSENV_BUILD_REQUIREMENTS) + $(MSG) $$(which build-python) install $(CROSSENV_BUILD_PIP) ; \ + $(RUN) $(CROSSENV_PATH)/bin/build-python $(CROSSENV_PATH)/build/get-pip.py $(CROSSENV_BUILD_PIP) --no-setuptools --no-wheel --disable-pip-version-check ; \ + $(MSG) build-pip Install $(CROSSENV_BUILD_SETUPTOOLS) $(CROSSENV_BUILD_WHEEL) ; \ + $(RUN) $$(which build-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install $(CROSSENV_BUILD_SETUPTOOLS) $(CROSSENV_BUILD_WHEEL) + @$(MSG) crossenv-$(CROSSENV_WHEEL)/cross default packages: $(CROSSENV_CROSS_PIP), $(CROSSENV_CROSS_SETUPTOOLS), $(CROSSENV_CROSS_WHEEL) @. $(CROSSENV_PATH)/bin/activate ; \ - $(MSG) "Package list for $(CROSSENV_PATH):" ; \ - $(RUN) $$(which cross-pip) list + $(MSG) cross-python Install $(CROSSENV_CROSS_PIP) ; \ + $(RUN) $$(which cross-python) $(CROSSENV_PATH)/build/get-pip.py $(CROSSENV_CROSS_PIP) --no-setuptools --no-wheel --disable-pip-version-check ; \ + $(MSG) cross-pip Install $(CROSSENV_CROSS_SETUPTOOLS) $(CROSSENV_CROSS_WHEEL) ; \ + $(RUN) $$(which cross-pip) --cache-dir $(PIP_CACHE_DIR) --disable-pip-version-check install $(CROSSENV_CROSS_SETUPTOOLS) $(CROSSENV_CROSS_WHEEL) + @$(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$(CROSSENV_REQUIREMENTS)\" REQUIREMENT_GOAL=\"crossenv-install-$(CROSSENV_WHEEL)\" requirement ; \ + MAKEFLAGS= $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT="$(CROSSENV_REQUIREMENTS)" REQUIREMENT_GOAL="crossenv-install-$(CROSSENV_WHEEL)" requirement + + +### +### crossenv-install- +### = $(lastword $(subst -, ,$*)) being -, or default +### +crossenv-install-%: + @. $(abspath $(WORK_DIR)/crossenv-$(lastword $(subst -, ,$*)))/bin/activate ; \ + if [ -e "$(abspath $(WORK_DIR)/crossenv-$(lastword $(subst -, ,$*)))/bin/activate" ] ; then \ + export PATH=$${PATH}:$(abspath $(WORK_DIR)/crossenv-$(lastword $(subst -, ,$*)))/build/bin ; \ + $(MSG) "crossenv: [$(abspath $(WORK_DIR)/crossenv-$(lastword $(subst -, ,$*)))/bin/activate]" ; \ + $(MSG) "python: [$$(which $(WHEEL_TYPE)-python)]" ; \ + else \ + echo "ERROR: crossenv not found!" ; \ + exit 2 ; \ + fi ; \ + $(MSG) \ + $$(which $(WHEEL_TYPE)-python) -m pip \ + install $(WHEEL_NAME)==$(WHEEL_VERSION) ; \ + $(RUN) \ + PATH=$${PATH} \ + $$(which $(WHEEL_TYPE)-python) -m pip \ + --cache-dir $(PIP_CACHE_DIR) \ + --disable-pip-version-check \ + install $(WHEEL_NAME)==$(WHEEL_VERSION) + ## ## python-cc.mk @@ -248,10 +265,21 @@ $(CROSSENV_PATH)/build/python-cc.mk: @echo PIP=$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/bin/pip) >> $@ @echo CROSS_COMPILE_WHEELS=1 >> $@ @echo ADDITIONAL_WHEEL_BUILD_ARGS=--no-build-isolation >> $@ - @echo CROSSENV_BUILD_REQUIREMENTS=$(CROSSENV_BUILD_REQUIREMENTS) >> $@ - @echo CROSSENV_DEFAULT_PIP=$(CROSSENV_DEFAULT_PIP_VERSION) >> $@ - @echo CROSSENV_DEFAULT_SETUPTOOLS=$(CROSSENV_DEFAULT_SETUPTOOLS_VERSION) >> $@ - @echo CROSSENV_DEFAULT_WHEEL=$(CROSSENV_DEFAULT_WHEEL_VERSION) >> $@ + @echo CROSSENV_REQUIREMENTS=$(CROSSENV_REQUIREMENTS) >> $@ + @echo CROSSENV_BUILD_PIP=$(CROSSENV_BUILD_PIP_VERSION) >> $@ + @echo CROSSENV_BUILD_SETUPTOOLS=$(CROSSENV_BUILD_SETUPTOOLS_VERSION) >> $@ + @echo CROSSENV_BUILD_WHEEL=$(CROSSENV_WHEEL_VERSION) >> $@ + @echo CROSSENV_CROSS_PIP=$(CROSSENV_CROSS_PIP_VERSION) >> $@ + @echo CROSSENV_CROSS_SETUPTOOLS=$(CROSSENV_CROSS_SETUPTOOLS_VERSION) >> $@ + @echo CROSSENV_CROSS_WHEEL=$(CROSSENV_CROSS_WHEEL_VERSION) >> $@ + +post_crossenv_target: $(CROSSENV_TARGET) $(CROSSENV_PATH)/build/python-cc.mk + @$(MSG) "Package list for $(CROSSENV_PATH)/build:" + @. $(CROSSENV_PATH)/bin/activate ; \ + $(RUN) $$(which build-pip) list + @$(MSG) "Package list for $(CROSSENV_PATH)/cross:" + @. $(CROSSENV_PATH)/bin/activate ; \ + $(RUN) $$(which cross-pip) list ifeq ($(wildcard $(CROSSENV_COOKIE)),) crossenv: $(CROSSENV_COOKIE) diff --git a/mk/spksrc.python-module.mk b/mk/spksrc.python-module.mk index eb1fb797bd7..f9f3da24dbd 100644 --- a/mk/spksrc.python-module.mk +++ b/mk/spksrc.python-module.mk @@ -25,43 +25,54 @@ prepare_crossenv: @MAKEFLAGS= $(MAKE) WHEEL_NAME="$(PKG_NAME)" WHEEL_VERSION="$(PKG_VERS)" crossenv-$(ARCH)-$(TCVERSION) --no-print-directory ### Python extension module rules +compile_python_module: SHELL:=/bin/bash compile_python_module: prepare_crossenv $(foreach e,$(shell cat $(CROSSENV_MODULE_PATH)/build/python-cc.mk),$(eval $(e))) $(eval PYTHONPATH = $(PYTHON_SITE_PACKAGES_NATIVE):$(PYTHON_LIB_NATIVE):$(INSTALL_DIR)$(INSTALL_PREFIX)/$(PYTHON_LIB_DIR)/site-packages/) - @if [ -d "$(CROSSENV_PATH)" ] ; then \ - PATH=$(call dedup, $(call merge, $(ENV), PATH, :), :):$(PYTHON_NATIVE_PATH):$(CROSSENV_PATH)/bin:$${PATH} ; \ + @set -o pipefail; { \ + . $(CROSSENV) ; \ + if [ -e "$(CROSSENV)" ] ; then \ + export PATH=$${PATH}:$(CROSSENV_PATH)/build/bin ; \ $(MSG) "crossenv: [$(CROSSENV_PATH)]" ; \ - $(MSG) "pip: [$$(which cross-pip)]" ; \ + $(MSG) "python: [$$(which cross-python)]" ; \ $(MSG) "maturin: [$$(which maturin)]" ; \ else \ echo "ERROR: crossenv not found!" ; \ exit 2 ; \ fi ; \ - $(MSG) PYTHONPATH=$(PYTHONPATH) cross-python3 setup.py build_ext \ + $(MSG) PYTHONPATH=$(PYTHONPATH) $$(which cross-python) setup.py build_ext \ -I $(STAGING_INSTALL_PREFIX)/include \ -L $(STAGING_INSTALL_PREFIX)/lib $(BUILD_ARGS) ; \ - $(RUN) PYTHONPATH=$(PYTHONPATH) cross-python3 setup.py build_ext \ + $(RUN) PYTHONPATH=$(PYTHONPATH) $$(which cross-python) setup.py build_ext \ -I $(STAGING_INSTALL_PREFIX)/include \ - -L $(STAGING_INSTALL_PREFIX)/lib $(BUILD_ARGS) + -L $(STAGING_INSTALL_PREFIX)/lib $(BUILD_ARGS) ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false +install_python_module: SHELL:=/bin/bash install_python_module: - @PATH=$(call dedup, $(call merge, $(ENV), PATH, :), :):$(PYTHON_NATIVE_PATH):$(CROSSENV_PATH)/bin:$${PATH} ; \ - $(MSG) PYTHONPATH=$(PYTHONPATH) cross-python3 setup.py install \ + @set -o pipefail; { \ + . $(CROSSENV) ; \ + export PATH=$${PATH}:$(CROSSENV_PATH)/build/bin ; \ + $(MSG) PYTHONPATH=$(PYTHONPATH) $$(which cross-python) setup.py install \ --root $(INSTALL_DIR) \ --prefix $(INSTALL_PREFIX) $(INSTALL_ARGS) ; \ - $(RUN) PYTHONPATH=$(PYTHONPATH) cross-python3 setup.py install \ + $(RUN) PYTHONPATH=$(PYTHONPATH) $$(which cross-python) setup.py install \ --root $(INSTALL_DIR) \ - --prefix $(INSTALL_PREFIX) $(INSTALL_ARGS) + --prefix $(INSTALL_PREFIX) $(INSTALL_ARGS) ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false +fix_shebang_python_module: SHELL:=/bin/bash fix_shebang_python_module: - @cat PLIST | sed 's/:/ /' | while read type file ; do \ + @set -o pipefail; { \ + cat PLIST | sed 's/:/ /' | while read type file ; do \ for script in $(INSTALL_DIR)$(INSTALL_PREFIX)/$${file} ; do \ if file $${script} | grep -iq "python script" ; then \ echo -n "Fixing shebang for $${script} ... " ; \ sed -i -e '1 s|^#!.*$$|#!$(PYTHON_INTERPRETER)|g' $${script} > /dev/null 2>&1 && echo "ok" || echo "failed!" ; \ fi ; \ done ; \ - done + done ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false all: install fix_shebang_python_module @@ -69,3 +80,6 @@ all: install fix_shebang_python_module # Allow generating per-wheel crossenv include ../../mk/spksrc.crossenv.mk + +## python wheel specific configurations +include ../../mk/spksrc.wheel-env.mk diff --git a/mk/spksrc.python-requirement.mk b/mk/spksrc.python-requirement.mk new file mode 100644 index 00000000000..59726be53fb --- /dev/null +++ b/mk/spksrc.python-requirement.mk @@ -0,0 +1,136 @@ +### Wheel rules +# Process wheels for modules listed in WHEELS. +# 1. wheel_download +# 2. wheel_compile +# 3. wheel_install +# +# Targets are executed in the following order: +# requirement_msg_target +# pre_requirement_target (override with PRE_REQUIREMENT_TARGET) +# requirement_target (override with REQUIREMENT_TARGET) +# post_requirement_target (override with POST_REQUIREMENT_TARGET) +# Variables: +# WHEELS List of wheels to go through + +# When wheel is called from: +# spksrc.spk.mk: MAKECMDGOALS is empty (needs to be set to wheel) +# make wheel-- : MAKECMDGOALS is wheel +# make download-wheels : MAKECMDGOALS is download-wheels +REQUIREMENT_GOAL := $(if $(MAKECMDGOALS),$(MAKECMDGOALS),requirement) + +ifeq ($(strip $(PRE_REQUIREMENT_TARGET)),) +PRE_REQUIREMENT_TARGET = pre_requirement_target +else +$(PRE_REQUIREMENT_TARGET): requirement_msg_target +endif +ifeq ($(strip $(REQUIREMENT_TARGET)),) +REQUIREMENT_TARGET = requirement_target +else +$(REQUIREMENT_TARGET): $(BUILD_REQUIREMENT_TARGET) +endif +ifeq ($(strip $(POST_REQUIREMENT_TARGET)),) +POST_REQUIREMENT_TARGET = post_requirement_target +else +$(POST_REQUIREMENT_TARGET): $(REQUIREMENT_TARGET) +endif + +requirement_msg_target: + @$(MSG) "Processing wheel for $(NAME)" + +pre_requirement_target: requirement_msg_target + +requirement-%: +ifneq ($(strip $(REQUIREMENT)),) + @$(MSG) $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) REQUIREMENT=\"$(REQUIREMENT)\" requirement + @MAKEFLAGS= $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) REQUIREMENT="$(REQUIREMENT)" requirement --no-print-directory +else + $(error No python wheel requirement to process) +endif + +requirement_target: SHELL:=/bin/bash +requirement_target: pre_requirement_target +ifneq ($(wildcard $(REQUIREMENT)),) + @set -e ; \ + while IFS= read -r requirement ; do \ + $(MSG) Processing requirement file [$${requirement}] ; \ + wheel=$${requirement#*requirements-*.txt:} ; \ + prefix=$$(basename $${requirement%%:*}) ; \ + case $${prefix} in \ + requirements-abi3.txt) type=abi3 ;; \ + requirements-crossenv*.txt) type=crossenv ;; \ + requirements-pure.txt) type=pure ;; \ + esac ; \ + $(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$${wheel}\" WHEEL_TYPE=\"$${type}\" REQUIREMENT_GOAL=\"$(REQUIREMENT_GOAL)\" requirement ; \ + MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" TCVERSION="$(TCVERSION)" REQUIREMENT="$${wheel}" WHEEL_TYPE="$${type}" REQUIREMENT_GOAL="$(REQUIREMENT_GOAL)" requirement --no-print-directory || exit 1 ; \ + done < <(grep -svH -e "^\#" -e "^\$$" $(wildcard $(REQUIREMENT)) | sed 's/\s* #.*//') +else + @for requirement in $(REQUIREMENT) ; do \ + $(MSG) Processing requirement [$${requirement}] ; \ + wheel=$$(echo $${requirement} | sed -E "s/^(abi3|build|cross|crossenv|pure)://") ; \ + case $${requirement} in \ + abi3:*) type=abi3 ;; \ + build:*) type=build ;; \ + cross:*) type=cross ;; \ + crossenv:*) type=crossenv ;; \ + pure:*) type=pure ;; \ + *) [[ "$(REQUIREMENT_GOAL)" == crossenv-install-* ]] && type=build || type=$(WHEEL_DEFAULT_PREFIX) ;; \ + esac ; \ + version=$$(echo $${wheel} | grep -oP '(?<=([<>=]=))[^ ]*' || echo "") ; \ + if [ "$$(grep -s egg <<< $${requirement})" ]; then \ + name=$$(echo $${wheel#*egg=} | cut -f1 -d=) ; \ + wheel_url=$$(echo $${wheel%%#egg=*}) ; \ + else \ + name=$$(echo $${wheel%%[<>=]=*} | sed -E "s/^(abi3|build|cross|crossenv|pure)://") ; \ + fi ; \ + if [ ! "$${version}" ]; then \ + $(MSG) Fetching latest version available ; \ + query="curl -s https://pypi.org/pypi/$${name}/json" ; \ + query+=" | jq -r '.releases[][]" ; \ + query+=" | select(.packagetype==\"sdist\")" ; \ + query+=" | .filename'" ; \ + query+=" | sort -V" ; \ + query+=" | tail -1" ; \ + query+=" | sed -e 's/.tar.gz//g' -e 's/.zip//g'" ; \ + query+=" | awk -F'-' '{print \$$2}'" ; \ + version=$$(eval $${query} 2>/dev/null) ; \ + fi ; \ + if [ "$(REQUIREMENT_GOAL)" = "wheel" ]; then \ + $(MSG) $(MAKE) ARCH=\"$(ARCH)\" \ + TCVERSION=\"$(TCVERSION)\" \ + WHEEL_NAME=\"$${name}\" \ + WHEEL_VERSION=\"$${version}\" \ + WHEEL_TYPE=\"$(or $(WHEEL_TYPE),$${type})\" \ + WHEEL_URL=\"$${wheel_url}\" \ + $(REQUIREMENT_GOAL) | tee --append $(WHEEL_LOG) ; \ + MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" \ + TCVERSION="$(TCVERSION)" \ + WHEEL_NAME="$${name}" \ + WHEEL_VERSION="$${version}" \ + WHEEL_TYPE="$(or $(WHEEL_TYPE),$${type})" \ + WHEEL_URL="$${wheel_url}" \ + $(REQUIREMENT_GOAL) \ + --no-print-directory | tee --append $(WHEEL_LOG) ; \ + [ $${PIPESTATUS[0]} -eq 0 ] || false ; \ + else \ + $(MSG) $(MAKE) ARCH=\"$(ARCH)\" \ + TCVERSION=\"$(TCVERSION)\" \ + WHEEL_NAME=\"$${name}\" \ + WHEEL_VERSION=\"$${version}\" \ + WHEEL_TYPE=\"$(or $(WHEEL_TYPE),$${type})\" \ + WHEEL_URL=\"$${wheel_url}\" \ + $(REQUIREMENT_GOAL) ; \ + MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" \ + TCVERSION="$(TCVERSION)" \ + WHEEL_NAME="$${name}" \ + WHEEL_VERSION="$${version}" \ + WHEEL_TYPE="$(or $(WHEEL_TYPE),$${type})" \ + WHEEL_URL="$${wheel_url}" \ + $(REQUIREMENT_GOAL) \ + --no-print-directory ; \ + fi ; \ + done +endif + +post_requirement_target: $(REQUIREMENT_TARGET) + +requirement: $(POST_REQUIREMENT_TARGET) diff --git a/mk/spksrc.python-wheel.mk b/mk/spksrc.python-wheel.mk index d7bdae40302..34021634390 100644 --- a/mk/spksrc.python-wheel.mk +++ b/mk/spksrc.python-wheel.mk @@ -34,36 +34,43 @@ prepare_crossenv: @$(MSG) $(MAKE) WHEEL_NAME=\"$(PKG_NAME)\" WHEEL_VERSION=\"$(PKG_VERS)\" crossenv-$(ARCH)-$(TCVERSION) @MAKEFLAGS= $(MAKE) WHEEL_NAME="$(PKG_NAME)" WHEEL_VERSION="$(PKG_VERS)" crossenv-$(ARCH)-$(TCVERSION) --no-print-directory +build_python_wheel_target: SHELL:=/bin/bash build_python_wheel_target: prepare_crossenv $(foreach e,$(shell cat $(CROSSENV_WHEEL_PATH)/build/python-cc.mk),$(eval $(e))) - @if [ -d "$(CROSSENV_PATH)" ] ; then \ - PATH=$(call dedup, $(call merge, $(ENV), PATH, :), :):$(PYTHON_NATIVE_PATH):$(CROSSENV_PATH)/bin:$${PATH} ; \ - $(MSG) "crossenv: [$(CROSSENV_PATH)]" ; \ - $(MSG) "pip: [$$(which cross-pip)]" ; \ + @set -o pipefail; { \ + . $(CROSSENV) ; \ + if [ -e "$(CROSSENV)" ] ; then \ + export PATH=$${PATH}:$(CROSSENV_PATH)/build/bin ; \ + $(MSG) "crossenv: [$(CROSSENV)]" ; \ + $(MSG) "python: [$$(which cross-python)]" ; \ $(MSG) "maturin: [$$(which maturin)]" ; \ else \ echo "ERROR: crossenv not found!" ; \ exit 2 ; \ fi ; \ - $(MSG) _PYTHON_HOST_PLATFORM=$(TC_TARGET) cross-python3 -m build $(BUILD_ARGS) \ + $(MSG) _PYTHON_HOST_PLATFORM=$(TC_TARGET) $$(which cross-python) -m build $(BUILD_ARGS) \ --wheel $(WHEELS_BUILD_ARGS) \ --outdir $(WHEELHOUSE) ; \ - $(RUN) _PYTHON_HOST_PLATFORM=$(TC_TARGET) cross-python3 -m build $(BUILD_ARGS) \ + $(RUN) _PYTHON_HOST_PLATFORM=$(TC_TARGET) $$(which cross-python) -m build $(BUILD_ARGS) \ --wheel $(WHEELS_BUILD_ARGS) \ - --outdir $(WHEELHOUSE) + --outdir $(WHEELHOUSE) ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false -install_python_wheel_target: - @$(MSG) $(MAKE) REQUIREMENT=\"$(PKG_NAME)==$(PKG_VERS)\" \ +install_python_wheel_target: SHELL:=/bin/bash +install_python_wheel_target: + @set -o pipefail; { \ + $(MSG) $(MAKE) REQUIREMENT=\"$(PKG_NAME)==$(PKG_VERS)\" \ WHEEL_NAME=\"$(PKG_NAME)\" \ WHEEL_VERSION=\"$(PKG_VERS)\" \ WHEEL_TYPE=\"cross\" \ - wheel_install - @MAKEFLAGS= $(MAKE) REQUIREMENT="$(PKG_NAME)==$(PKG_VERS)" \ + wheel_install ; \ + MAKEFLAGS= $(MAKE) REQUIREMENT="$(PKG_NAME)==$(PKG_VERS)" \ WHEEL_NAME="$(PKG_NAME)" \ WHEEL_VERSION="$(PKG_VERS)" \ WHEEL_TYPE="cross" \ --no-print-directory \ - wheel_install + wheel_install ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false ### diff --git a/mk/spksrc.wheel-compile.mk b/mk/spksrc.wheel-compile.mk index 5394da52da6..1ef47469d49 100644 --- a/mk/spksrc.wheel-compile.mk +++ b/mk/spksrc.wheel-compile.mk @@ -6,11 +6,12 @@ # pre_wheel_compile_target (override with PRE_WHEEL_COMPILE_TARGET) # wheel_compile_target (override with WHEEL_COMPILE_TARGET) # post_wheel_compile_target (override with POST_WHEEL_COMPILE_TARGET) +# # Variables: -# REQUIREMENT Requirement formatted wheel information # WHEEL_NAME Name of wheel to process -# WHEEL_VERSION Version of wheel to process (can be empty) # WHEEL_TYPE Type of wheel to process (abi3, crossenv, pure) +# WHEEL_URL URL usually of type git+https:// +# WHEEL_VERSION Version of wheel to process (can be empty) ifeq ($(WHEEL_VERSION),) WHEEL_COMPILE_COOKIE = $(WORK_DIR)/.$(COOKIE_PREFIX)wheel_compile-$(WHEEL_NAME)_done @@ -45,31 +46,32 @@ wheel_compile_msg_target: @$(MSG) "Processing wheels of $(NAME)" pre_wheel_compile_target: wheel_compile_msg_target - -wheel_compile_target: SHELL:=/bin/bash -wheel_compile_target: ifeq ($(wildcard $(WHEELHOUSE)),) @$(MSG) Creating wheelhouse directory: $(WHEELHOUSE) @mkdir -p $(WHEELHOUSE) endif - @$(MSG) Compiling wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] -ifneq ($(WHEEL_TYPE),pure) +ifneq ($(or $(filter-out pure,$(WHEEL_TYPE)),$(filter 1 ON TRUE,$(WHEELS_PURE_PYTHON_PACKAGING_ENABLE))),) @$(MSG) $(MAKE) WHEEL_NAME=\"$(WHEEL_NAME)\" WHEEL_VERSION=\"$(WHEEL_VERSION)\" crossenv-$(ARCH)-$(TCVERSION) @MAKEFLAGS= $(MAKE) WHEEL_NAME="$(WHEEL_NAME)" WHEEL_VERSION="$(WHEEL_VERSION)" crossenv-$(ARCH)-$(TCVERSION) --no-print-directory +endif + +wheel_compile_target: SHELL:=/bin/bash +wheel_compile_target: pre_wheel_compile_target +ifneq ($(WHEEL_TYPE),pure) @[ "$(WHEEL_TYPE)" = "$(WHEELS_LIMITED_API)" ] && abi3="--build-option=--py-limited-api=$(PYTHON_LIMITED_API)" || abi3="" ; \ global_options=$$(echo $(WHEELS_BUILD_ARGS) | sed -e 's/ \[/\n\[/g' | grep -i $(WHEEL_NAME) | cut -f2 -d] | xargs) ; \ localCFLAGS=($$(echo $(WHEELS_CFLAGS) | sed -e 's/ \[/\n\[/g' | grep -i $(WHEEL_NAME) | cut -f2 -d] | xargs)) ; \ localLDFLAGS=($$(echo $(WHEELS_LDFLAGS) | sed -e 's/ \[/\n\[/g' | grep -i $(WHEEL_NAME) | cut -f2 -d] | xargs)) ; \ localCPPFLAGS=($$(echo $(WHEELS_CPPFLAGS) | sed -e 's/ \[/\n\[/g' | grep -i $(WHEEL_NAME) | cut -f2 -d] | xargs)) ; \ localCXXFLAGS=($$(echo $(WHEELS_CXXFLAGS) | sed -e 's/ \[/\n\[/g' | grep -i $(WHEEL_NAME) | cut -f2 -d] | xargs)) ; \ - $(MSG) pip build [$(WHEEL_NAME)], version: [$(WHEEL_VERSION)] \ + $(MSG) python -m pip build [$(WHEEL_NAME)], version: [$(WHEEL_VERSION)] \ $$([ "$$(echo $${localCFLAGS[@]})" ] && echo "CFLAGS=\"$${localCFLAGS[@]}\" ") \ $$([ "$$(echo $${localCPPFLAGS[@]})" ] && echo "CPPFLAGS=\"$${localCPPFLAGS[@]}\" ") \ $$([ "$$(echo $${localCXXFLAGS[@]})" ] && echo "CXXFLAGS=\"$${localCXXFLAGS[@]}\" ") \ $$([ "$$(echo $${localLDFLAGS[@]})" ] && echo "LDFLAGS=\"$${localLDFLAGS[@]}\" ") \ $$([ "$$(echo $${abi3})" ] && echo "$${abi3} ")" \ $${global_options}" ; \ - REQUIREMENT=$(REQUIREMENT) \ + REQUIREMENT=$(or $(WHEEL_URL),$(WHEEL_NAME)==$(WHEEL_VERSION)) \ WHEEL_NAME=$(WHEEL_NAME) \ WHEEL_VERSION=$(WHEEL_VERSION) \ ADDITIONAL_CFLAGS="-I$(STAGING_INSTALL_PREFIX)/$(PYTHON_INC_DIR) $${localCFLAGS[@]}" \ @@ -81,31 +83,35 @@ ifneq ($(WHEEL_TYPE),pure) $(MAKE) --no-print-directory \ cross-compile-wheel-$(WHEEL_NAME)-$(WHEEL_VERSION) else ifneq ($(filter 1 ON TRUE,$(WHEELS_PURE_PYTHON_PACKAGING_ENABLE)),) - @if [ -s "$(WHEELHOUSE)/$(WHEELS_PURE_PYTHON)" ]; then \ - export LD= LDSHARED= CPP= NM= CC= AS= RANLIB= CXX= AR= STRIP= OBJDUMP= OBJCOPY= READELF= CFLAGS= CPPFLAGS= CXXFLAGS= LDFLAGS= && \ - $(RUN) \ - PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/bin):$(PATH)" \ - LD_LIBRARY_PATH="$(abspath $(WORK_DIR)/../../../native/$(PYTHON_PKG_NAME)/work-native/install/usr/local/lib):$(LD_LIBRARY_PATH)" \ - $(MSG) $(PIP_NATIVE) $(PIP_WHEEL_ARGS) $(REQUIREMENT) ; \ - $(PIP_NATIVE) $(PIP_WHEEL_ARGS) $(REQUIREMENT) ; \ - fi + @REQUIREMENT=$(or $(WHEEL_URL),$(WHEEL_NAME)==$(WHEEL_VERSION)) \ + WHEEL_NAME=$(WHEEL_NAME) \ + WHEEL_VERSION=$(WHEEL_VERSION) \ + $(MAKE) --no-print-directory \ + pure-build-wheel-$(WHEEL_NAME)-$(WHEEL_VERSION) +else ifeq ($(filter 1 ON TRUE,$(WHEELS_PURE_PYTHON_PACKAGING_ENABLE)),) + @echo "WARNING: Skipping building pure Python wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] - pure python packaging disabled" +else + $(error No wheel to process) endif ## ## crossenv PATH environment requires a combination of: -## 1) unique PATH variable from $(ENV) -> using merge + dedup macros +## 1) unique PATH variable from $(ENV) -> using merge macro + awk to dedup ## Note: Multiple declarations of ENV += PATH=bla creates confusion in its interpretation. ## Solution implemented fetches all PATH from ENV and combine them in reversed order. -## 2) access to maturin from native/python/.../bin -> ${PYTHON_NATIVE_PATH}/bin +## 2) access to maturin from crossenv/build/bin -> ${CROSSENV_PATH}/build/bin ## 3) access to crossenv/bin/cross* tools, mainly cross-pip -> ${CROSSENV_PATH}/bin ## cross-compile-wheel-%: SHELL:=/bin/bash cross-compile-wheel-%: + @$(MSG) Cross-compiling Python wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] $(foreach e,$(shell cat $(CROSSENV_WHEEL_PATH)/build/python-cc.mk),$(eval $(e))) - @if [ -d "$(CROSSENV_PATH)" ] ; then \ - PATH=$(call dedup, $(call merge, $(ENV), PATH, :), :):$(PYTHON_NATIVE_PATH):$(CROSSENV_PATH)/bin:$${PATH} ; \ - $(MSG) "crossenv: [$(CROSSENV_PATH)]" ; \ - $(MSG) "pip: [$$(which cross-pip)]" ; \ + @. $(CROSSENV) ; \ + if [ -e "$(CROSSENV)" ] ; then \ + export PATH=$$(echo $${PATH}:$(call merge, $(ENV), PATH, :):$(CROSSENV_PATH)/build/bin | awk -v RS=':' '!seen[$$0]++' | paste -sd ':') ; \ + $(MSG) "PATH: [$${PATH}]" ; \ + $(MSG) "crossenv: [$(CROSSENV)]" ; \ + $(MSG) "python: [$$(which cross-python)]" ; \ $(MSG) "maturin: [$$(which maturin)]" ; \ else \ echo "ERROR: crossenv not found!" ; \ @@ -115,12 +121,12 @@ cross-compile-wheel-%: pip_global_option=$$(echo $(PIP_GLOBAL_OPTION) | sed 's/=\([^ ]*\)/="\1"/g; s/[^ ]*/--global-option=&/g') ; \ pip_global_option=$${pip_global_option}" --no-use-pep517" ; \ fi ; \ - $(RUN) $(MSG) \ + $(MSG) \ _PYTHON_HOST_PLATFORM=\"$(TC_TARGET)\" \ PATH=$${PATH} \ - CMAKE_TOOLCHAIN_FILE=$${CMAKE_TOOLCHAIN_FILE} \ - MESON_CROSS_FILE=$${MESON_CROSS_FILE} \ - cross-pip \ + CMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \ + MESON_CROSS_FILE=$(MESON_CROSS_FILE) \ + $$(which cross-python) -m pip \ $(PIP_WHEEL_ARGS_CROSSENV) \ $${pip_global_option} \ --no-build-isolation \ @@ -129,15 +135,32 @@ cross-compile-wheel-%: $(RUN) \ _PYTHON_HOST_PLATFORM="$(TC_TARGET)" \ PATH=$${PATH} \ - CMAKE_TOOLCHAIN_FILE=$${CMAKE_TOOLCHAIN_FILE} \ - MESON_CROSS_FILE=$${MESON_CROSS_FILE} \ - cross-pip \ + CMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) \ + MESON_CROSS_FILE=$(MESON_CROSS_FILE) \ + $$(which cross-python) -m pip \ $(PIP_WHEEL_ARGS_CROSSENV) \ $${pip_global_option} \ --no-build-isolation \ $(ABI3) \ $(REQUIREMENT) +pure-build-wheel-%: SHELL:=/bin/bash +pure-build-wheel-%: + @$(MSG) Building pure Python wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] + $(foreach e,$(shell cat $(CROSSENV_WHEEL_PATH)/build/python-cc.mk),$(eval $(e))) + @. $(CROSSENV) ; \ + if [ -e "$(CROSSENV)" ] ; then \ + export LD= LDSHARED= CPP= NM= CC= AS= RANLIB= CXX= AR= STRIP= OBJDUMP= OBJCOPY= READELF= CFLAGS= CPPFLAGS= CXXFLAGS= LDFLAGS= ; \ + export PATH=$${PATH}:$(CROSSENV_PATH)/build/bin ; \ + $(MSG) "crossenv: [$(CROSSENV)]" ; \ + $(MSG) "python: [$$(which build-python)]" ; \ + else \ + echo "ERROR: crossenv not found!" ; \ + exit 2 ; \ + fi ; \ + $(MSG) $$(which build-python) -m pip $(PIP_WHEEL_ARGS) $(or $(WHEEL_URL),$(WHEEL_NAME)==$(WHEEL_VERSION)) ; \ + $(RUN) $$(which build-python) -m pip $(PIP_WHEEL_ARGS) $(or $(WHEEL_URL),$(WHEEL_NAME)==$(WHEEL_VERSION)) + post_wheel_compile_target: $(WHEEL_COMPILE_TARGET) ifeq ($(wildcard $(WHEEL_COMPILE_COOKIE)),) diff --git a/mk/spksrc.wheel-download.mk b/mk/spksrc.wheel-download.mk index 479fa24a024..92c9e2d7c7f 100644 --- a/mk/spksrc.wheel-download.mk +++ b/mk/spksrc.wheel-download.mk @@ -1,16 +1,20 @@ ### Wheel rules -# Download wheels for modules listed in WHEELS. +# Download wheels for modules listed in WHEELS. +# These are being pre-processed thru spksrc.wheel.mk +# along with spksrc.requirement.mk so 1 wheel at +# a time gets submitted to download. # # Targets are executed in the following order: # wheel_download_msg_target # pre_wheel_download_target (override with PRE_WHEEL_DOWNLOAD_TARGET) # wheel_download_target (override with WHEEL_DOWNLOAD_TARGET) # post_wheel_download_target (override with POST_WHEEL_DOWNLOAD_TARGET) +# # Variables: -# REQUIREMENT Requirement formatted wheel information # WHEEL_NAME Name of wheel to process -# WHEEL_VERSION Version of wheel to process (can be empty) # WHEEL_TYPE Type of wheel to process (abi3, crossenv, pure) +# WHEEL_URL URL usually of type git+https:// +# WHEEL_VERSION Version of wheel to process (can be empty) ifeq ($(WHEEL_VERSION),) WHEEL_DOWNLOAD_COOKIE = $(WORK_DIR)/.$(COOKIE_PREFIX)wheel_download-$(WHEEL_NAME)_done @@ -52,7 +56,7 @@ ifeq ($(wildcard $(PIP_CACHE_DIR)),) @mkdir -p $(PIP_CACHE_DIR) endif @$(MSG) Downloading wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)] ; \ - if [ "$$(grep -Eo 'http://|https://' <<< $(REQUIREMENT))" ] ; then \ + if [ "$(WHEEL_URL)" ] ; then \ echo "WARNING: Skipping download URL - Downloaded at build time" ; \ elif [ "$(WHEEL_TYPE)" = "pure" ] && [ ! "$(WHEELS_PURE_PYTHON_PACKAGING_ENABLE)" = "1" ]; then \ echo "WARNING: Skipping download - pure python packaging disabled" ; \ diff --git a/mk/spksrc.wheel-env.mk b/mk/spksrc.wheel-env.mk index addf5a2dc41..77c305fcf06 100644 --- a/mk/spksrc.wheel-env.mk +++ b/mk/spksrc.wheel-env.mk @@ -2,6 +2,9 @@ # Configuration for python wheel build # +### python wheel requirement processing +include ../../mk/spksrc.python-requirement.mk + ##### rust specific configurations include ../../mk/spksrc.cross-rust-env.mk diff --git a/mk/spksrc.wheel-install.mk b/mk/spksrc.wheel-install.mk index e72acd2dd28..9c09f6aa830 100644 --- a/mk/spksrc.wheel-install.mk +++ b/mk/spksrc.wheel-install.mk @@ -6,11 +6,12 @@ # pre_wheel_install_target (override with PRE_WHEEL_INSTALL_TARGET) # wheel_install_target (override with WHEEL_INSTALL_TARGET) # post_wheel_install_target (override with POST_WHEEL_INSTALL_TARGET) +# # Variables: -# REQUIREMENT Requirement formatted wheel information # WHEEL_NAME Name of wheel to process -# WHEEL_VERSION Version of wheel to process (can be empty) # WHEEL_TYPE Type of wheel to process (abi3, crossenv, pure) +# WHEEL_URL URL usually of type git+https:// +# WHEEL_VERSION Version of wheel to process (can be empty) ifeq ($(WHEEL_VERSION),) WHEEL_INSTALL_COOKIE = $(WORK_DIR)/.$(COOKIE_PREFIX)wheel_install-$(WHEEL_NAME)_done @@ -43,7 +44,8 @@ pre_wheel_install_target: wheel_install_msg_target wheel_install_target: SHELL:=/bin/bash wheel_install_target: - @$(MSG) Installing wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] ; \ + @set -o pipefail; { \ + $(MSG) Installing wheel [$(WHEEL_NAME)], version [$(WHEEL_VERSION)], type [$(WHEEL_TYPE)] ; \ case $(WHEEL_TYPE) in \ abi3) $(MSG) Adding $(WHEEL_NAME)==$(WHEEL_VERSION) to wheelhouse/$(WHEELS_LIMITED_API) ; \ echo $(WHEEL_NAME)==$(WHEEL_VERSION) | sed -e '/^[[:blank:]]*$$\|^#/d' >> $(WHEELHOUSE)/$(WHEELS_LIMITED_API) ; \ @@ -57,15 +59,18 @@ wheel_install_target: pure) $(MSG) Adding $(WHEEL_NAME)==$(WHEEL_VERSION) to wheelhouse/$(WHEELS_PURE_PYTHON) ; \ echo $(WHEEL_NAME)==$(WHEEL_VERSION) | sed -e '/^[[:blank:]]*$$\|^#/d' >> $(WHEELHOUSE)/$(WHEELS_PURE_PYTHON) ; \ ;; \ - *) $(MSG) No type found for wheel [$(REQUIREMENT)] ; \ + *) $(MSG) No type found for wheel [$(WHEEL_NAME)==$(WHEEL_VERSION)] ; \ ;; \ - esac - @for file in $$(ls -1 $(WHEELHOUSE)/requirements-*.txt) ; do \ + esac ; \ + for file in $$(ls -1 $(WHEELHOUSE)/requirements-*.txt) ; do \ sort -u -o $${file}{,} ; \ - done + done ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false +install_python_wheel: SHELL:=/bin/bash install_python_wheel: - @if [ -d "$(WHEELHOUSE)" ] ; then \ + @set -o pipefail; { \ + if [ -d "$(WHEELHOUSE)" ] ; then \ mkdir -p $(STAGING_INSTALL_WHEELHOUSE) ; \ cd $(WHEELHOUSE) ; \ if stat -t requirements*.txt >/dev/null 2>&1; then \ @@ -83,11 +88,12 @@ install_python_wheel: else \ _new_name=$$(echo $$w | sed -E "s/(.*-).*(linux_).*(\.whl)/\1\2$(PYTHON_ARCH)\3/") ; \ fi ; \ - $(MSG) Copying to wheelhouse: $$_new_name ; \ - cp -f $$w $(STAGING_INSTALL_WHEELHOUSE)/$$_new_name ; \ + $(MSG) "Copying to wheelhouse: $${w} -> share/wheelhouse/$${_new_name}" ; \ + cp -f $${w} $(STAGING_INSTALL_WHEELHOUSE)/$${_new_name} ; \ done ; \ fi ; \ - fi + fi ; \ + } > >(tee --append $(WHEEL_LOG)) 2>&1 ; [ $${PIPESTATUS[0]} -eq 0 ] || false post_wheel_install_target: $(WHEEL_INSTALL_TARGET) diff --git a/mk/spksrc.wheel.mk b/mk/spksrc.wheel.mk index 6fc617aff80..638a42478bb 100644 --- a/mk/spksrc.wheel.mk +++ b/mk/spksrc.wheel.mk @@ -7,7 +7,7 @@ # Targets are executed in the following order: # wheel_msg_target # pre_wheel_target (override with PRE_WHEEL_TARGET) -# build_wheel_target (override with WHEEL_TARGET) +# wheel_target (override with WHEEL_TARGET) # post_wheel_target (override with POST_WHEEL_TARGET) # Variables: # WHEELS List of wheels to go through @@ -43,7 +43,7 @@ include ../../mk/spksrc.wheel-install.mk ## -ifneq ($(strip $(REQUIREMENT)),) +ifneq ($(and $(WHEEL_NAME),$(or (WHEEL_VERISON),$(WHEEL_URL))),) download-wheels: wheel_download wheel: wheel_install else @@ -54,7 +54,7 @@ else $(PRE_WHEEL_TARGET): wheel_msg_target endif ifeq ($(strip $(WHEEL_TARGET)),) -WHEEL_TARGET = build_wheel_target +WHEEL_TARGET = wheel_target else $(WHEEL_TARGET): $(BUILD_WHEEL_TARGET) endif @@ -71,80 +71,25 @@ pre_wheel_target: wheel_msg_target wheel-%: ifneq ($(strip $(WHEELS)),) - @$(MSG) $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) WHEELS=\"$(WHEELS)\" wheel - @MAKEFLAGS= $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) WHEELS="$(WHEELS)" wheel --no-print-directory + @$(MSG) $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) WHEELS=\"$(WHEELS)\" wheel | tee --append $(WHEEL_LOG) + @MAKEFLAGS= $(MAKE) ARCH=$(firstword $(subst -, ,$*)) TCVERSION=$(lastword $(subst -, ,$*)) WHEELS="$(WHEELS)" wheel --no-print-directory || false else - $(error No wheel to process) + $(error No python wheel to process) endif -build_wheel_target: SHELL:=/bin/bash -build_wheel_target: pre_wheel_target +wheel_target: SHELL:=/bin/bash +wheel_target: pre_wheel_target ifneq ($(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))),) @set -e ; \ - while IFS= read -r requirement ; do \ - $(MSG) Processing requirement [$${requirement}] ; \ - wheel=$${requirement#*requirements-*.txt:} ; \ - file=$$(basename $${requirement%%:*}) ; \ - case $${file} in \ - requirements-pure.txt) type=pure ;; \ - requirements-crossenv*.txt) type=crossenv ;; \ - requirements-abi3.txt) type=abi3 ;; \ - *) type=$(WHEEL_DEFAULT_PREFIX) ;; \ - esac ; \ - version=$$(echo $${wheel} | grep -oP '(?<=([<>=]=))[^ ]*' || echo "") ; \ - if [ "$$(grep -s egg <<< $${wheel})" ]; then \ - name=$$(echo $${wheel#*egg=} | cut -f1 -d=) ; \ - wheel=$$(echo $${wheel%%#egg=*}) ; \ - else \ - name=$$(echo $${wheel%%[<>=]=*} | sed -E "s/^(abi3|crossenv|pure)://") ; \ - fi ; \ - if [ ! "$${version}" ]; then \ - $(MSG) Fetching latest version available ; \ - query="curl -s https://pypi.org/pypi/$${name}/json" ; \ - query+=" | jq -r '.releases[][]" ; \ - query+=" | select(.packagetype==\"sdist\")" ; \ - query+=" | .filename'" ; \ - query+=" | sort -V" ; \ - query+=" | tail -1" ; \ - query+=" | sed -e 's/.tar.gz//g' -e 's/.zip//g'" ; \ - query+=" | awk -F'-' '{print \$$2}'" ; \ - version=$$(eval $${query} 2>/dev/null) ; \ - fi ; \ - $(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$${wheel}\" WHEEL_NAME=\"$${name}\" WHEEL_VERSION=\"$${version}\" WHEEL_TYPE=\"$${type}\" $(WHEEL_GOAL) ; \ - MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" TCVERSION="$(TCVERSION)" REQUIREMENT="$${wheel}" WHEEL_NAME="$${name}" WHEEL_VERSION="$${version}" WHEEL_TYPE="$${type}" $(WHEEL_GOAL) --no-print-directory || exit 1 ; \ - done < <(grep -svH -e "^\#" -e "^\$$" $(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))) | sed 's/\s* #.*//') -endif -ifneq ($(filter-out $(addprefix src/,$(notdir $(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))))),$(WHEELS)),) - @for requirement in $(filter-out $(addprefix src/,$(notdir $(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))))),$(WHEELS)) ; do \ - $(MSG) Processing requirement [$${requirement}] ; \ - wheel=$$(echo $${requirement} | sed -E "s/^(abi3|crossenv|pure)://") ; \ - case $${requirement} in \ - abi3:*) type=abi3 ;; \ - crossenv:*) type=crossenv ;; \ - pure:*) type=pure ;; \ - *) type=$(WHEEL_DEFAULT_PREFIX) ;; \ - esac ; \ - version=$$(echo $${wheel} | grep -oP '(?<=([<>=]=))[^ ]*' || echo "") ; \ - if [ "$$(grep -s egg <<< $${requirement})" ]; then \ - name=$$(echo $${wheel#*egg=} | cut -f1 -d=) ; \ - wheel=$$(echo $${wheel%%#egg=*}) ; \ - else \ - name=$$(echo $${wheel%%[<>=]=*} | sed -E "s/^(abi3|crossenv|pure)://") ; \ - fi ; \ - if [ ! "$${version}" ]; then \ - $(MSG) Fetching latest version available ; \ - query="curl -s https://pypi.org/pypi/$${name}/json" ; \ - query+=" | jq -r '.releases[][]" ; \ - query+=" | select(.packagetype==\"sdist\")" ; \ - query+=" | .filename'" ; \ - query+=" | sort -V" ; \ - query+=" | tail -1" ; \ - query+=" | sed -e 's/.tar.gz//g' -e 's/.zip//g'" ; \ - query+=" | awk -F'-' '{print \$$2}'" ; \ - version=$$(eval $${query} 2>/dev/null) ; \ - fi ; \ - $(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$${wheel}\" WHEEL_NAME=\"$${name}\" WHEEL_VERSION=\"$${version}\" WHEEL_TYPE=\"$${type}\" $(WHEEL_GOAL) ; \ - MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" TCVERSION="$(TCVERSION)" REQUIREMENT="$${wheel}" WHEEL_NAME="$${name}" WHEEL_VERSION="$${version}" WHEEL_TYPE="$${type}" $(WHEEL_GOAL) --no-print-directory ; \ + for requirement in $(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))) ; do \ + $(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$${requirement}\" REQUIREMENT_GOAL=\"$(WHEEL_GOAL)\" requirement ; \ + MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" TCVERSION="$(TCVERSION)" REQUIREMENT="$${requirement}" REQUIREMENT_GOAL="$(WHEEL_GOAL)" requirement --no-print-directory || false ; \ + done +else + @set -e ; \ + for requirement in $(filter-out $(addprefix src/,$(notdir $(wildcard $(abspath $(addprefix $(WORK_DIR)/../,$(WHEELS)))))),$(WHEELS)) ; do \ + $(MSG) $(MAKE) ARCH=$(ARCH) TCVERSION=$(TCVERSION) REQUIREMENT=\"$${requirement}\" REQUIREMENT_GOAL=\"$(WHEEL_GOAL)\" requirement ; \ + MAKEFLAGS= $(MAKE) ARCH="$(ARCH)" TCVERSION="$(TCVERSION)" REQUIREMENT="$${requirement}" REQUIREMENT_GOAL="$(WHEEL_GOAL)" requirement --no-print-directory || false ; \ done endif @@ -163,5 +108,5 @@ else wheel: ; endif -# endif REQUIREMENT non-empty +# endif $(and $(WHEEL_NAME),$(or (WHEEL_VERISON),$(WHEEL_URL))) non-empty endif diff --git a/native/python310/Makefile b/native/python310/Makefile index ee3fc05f7b2..08227049619 100644 --- a/native/python310/Makefile +++ b/native/python310/Makefile @@ -33,10 +33,7 @@ PIP_NATIVE = $(WORK_DIR)/../../../native/$(PKG_NAME)/work-native/install/usr/loc PIP_VERSION = "24.3.1" PIP_WHEELS = setuptools==75.6.0 -PIP_WHEELS += setuptools-rust==1.10.2 -PIP_WHEELS += maturin==1.7.7 PIP_WHEELS += wheel==0.45.1 -PIP_WHEELS += cffi==1.17.1 PIP_WHEELS += crossenv==1.5.0 .PHONY: python310_native_post_install diff --git a/native/python311/Makefile b/native/python311/Makefile index 45224b81f70..b75d8525e8b 100644 --- a/native/python311/Makefile +++ b/native/python311/Makefile @@ -31,10 +31,7 @@ PIP_NATIVE = $(WORK_DIR)/../../../native/$(PKG_NAME)/work-native/install/usr/loc PIP_VERSION = "24.3.1" PIP_WHEELS = setuptools==75.8.0 -PIP_WHEELS += setuptools-rust==1.10.2 -PIP_WHEELS += maturin==1.8.1 PIP_WHEELS += wheel==0.45.1 -PIP_WHEELS += cffi==1.17.1 PIP_WHEELS += crossenv==1.5.0 .PHONY: python311_native_post_install diff --git a/native/python312/Makefile b/native/python312/Makefile index 769717d5749..6e4d5eb6938 100644 --- a/native/python312/Makefile +++ b/native/python312/Makefile @@ -1,5 +1,5 @@ PKG_NAME = python312 -PKG_VERS = 3.12.8 +PKG_VERS = 3.12.9 PKG_EXT = tar.xz PKG_DIST_NAME = Python-$(PKG_VERS).$(PKG_EXT) PKG_DIST_SITE = https://www.python.org/ftp/python/$(PKG_VERS) @@ -31,10 +31,7 @@ PIP_NATIVE = $(WORK_DIR)/../../../native/$(PKG_NAME)/work-native/install/usr/loc PIP_VERSION = "24.3.1" PIP_WHEELS = setuptools==75.8.0 -PIP_WHEELS += setuptools-rust==1.10.2 -PIP_WHEELS += maturin==1.8.1 PIP_WHEELS += wheel==0.45.1 -PIP_WHEELS += cffi==1.17.1 PIP_WHEELS += crossenv==1.5.0 .PHONY: python312_native_post_install diff --git a/native/python312/digests b/native/python312/digests index bbc77569f89..08017a1d2b8 100644 --- a/native/python312/digests +++ b/native/python312/digests @@ -1,3 +1,3 @@ -Python-3.12.8.tar.xz SHA1 8872c7a124c6970833e0bde4f25d6d7d61c6af6e -Python-3.12.8.tar.xz SHA256 c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e -Python-3.12.8.tar.xz MD5 d46e5bf9f2e596a3ba45fc0b3c053dd2 +Python-3.12.9.tar.xz SHA1 465d8a664e63dc5aa1f0d90cd1d0000a970ee2fb +Python-3.12.9.tar.xz SHA256 7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112 +Python-3.12.9.tar.xz MD5 880942124f7d5c01e7b65cbad62dc873 diff --git a/native/python313/Makefile b/native/python313/Makefile index 88ba9f5eb6b..270a248bbff 100644 --- a/native/python313/Makefile +++ b/native/python313/Makefile @@ -1,5 +1,5 @@ PKG_NAME = python313 -PKG_VERS = 3.13.1 +PKG_VERS = 3.13.2 PKG_EXT = tar.xz PKG_DIST_NAME = Python-$(PKG_VERS).$(PKG_EXT) PKG_DIST_SITE = https://www.python.org/ftp/python/$(PKG_VERS) @@ -31,10 +31,7 @@ PIP_NATIVE = $(WORK_DIR)/../../../native/$(PKG_NAME)/work-native/install/usr/loc PIP_VERSION = "24.3.1" PIP_WHEELS = setuptools==75.8.0 -PIP_WHEELS += setuptools-rust==1.10.2 -PIP_WHEELS += maturin==1.8.1 PIP_WHEELS += wheel==0.45.1 -PIP_WHEELS += cffi==1.17.1 PIP_WHEELS += crossenv==1.5.0 .PHONY: python313_native_post_install diff --git a/native/python313/digests b/native/python313/digests index 35979854910..fedc4e80cb2 100644 --- a/native/python313/digests +++ b/native/python313/digests @@ -1,3 +1,3 @@ -Python-3.13.1.tar.xz SHA1 4b0c2a49a848c3c5d611416099636262a0b9090f -Python-3.13.1.tar.xz SHA256 9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9 -Python-3.13.1.tar.xz MD5 80c16badb94ffe235280d4d9a099b8bc +Python-3.13.2.tar.xz SHA1 e4949d999f28d6ad941e766b7dac09a74efbc912 +Python-3.13.2.tar.xz SHA256 d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56 +Python-3.13.2.tar.xz MD5 4c2d9202ab4db02c9d0999b14655dfe5 diff --git a/spk/python311-wheels/Makefile b/spk/python311-wheels/Makefile index 3113b7c7ca3..e9c62abec28 100644 --- a/spk/python311-wheels/Makefile +++ b/spk/python311-wheels/Makefile @@ -26,6 +26,9 @@ LICENSE = PSF # Enable debug_info symgols #GCC_DEBUG_INFO := 1 +# IMPORTANT: WHEELS must be initialized before include of spksrc.python.mk +# later additions are ok, but WHEELS must not be empty at this point, +# otherwise the build of WHEELS is skipped WHEELS = src/requirements-abi3.txt WHEELS += src/requirements-crossenv.txt WHEELS += src/requirements-pure.txt @@ -95,13 +98,6 @@ ifneq ($(findstring $(ARCH),$(ARMv5_ARCHS)),$(ARCH)) WHEELS += src/requirements-crossenv-rpds-py.txt endif -## -## Addition of requirements files beyond spksrc.python.mk -## will not be taken into consideration for processing -## unless WHEELS has been previously populated. This is due to -## the makefile analysis phase which discard ifeq instructions. -## - include ../../mk/spksrc.python.mk # [greenlet] diff --git a/spk/python311/crossenv/requirements-default.txt b/spk/python311/crossenv/requirements-default.txt index 20e7bb48754..bedce8a87c9 100644 --- a/spk/python311/crossenv/requirements-default.txt +++ b/spk/python311/crossenv/requirements-default.txt @@ -1,21 +1,20 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.8.0 -build==1.2.2 wheel==0.45.1 # -# keep older version for gcc <= 4.9.x -msgpack==1.0.5 +build:build==1.2.2 +build:Cython==3.0.11 +build:maturin==1.8.1 +build:meson-python==0.17.1 +build:pip-tools==7.4.1 +build:poetry==1.8.5 +build:scikit-build==0.18.1 +build:scikit-build-core==0.10.7 +build:setuptools-rust==1.10.2 +build:setuptools-scm==8.1.0 # -cffi==1.17.1 -cryptography==44.0.0 -Cython==3.0.11 -flit==3.10.1 -maturin==1.8.1 -meson-python==0.17.1 -poetry==1.8.5 -scikit-build==0.18.1 -scikit-build-core==0.10.7 -setuptools-rust==1.10.2 -setuptools-scm==8.1.0 -typing_extensions==4.12.2 +cross:cffi==1.17.1 +cross:cryptography==44.0.0 +cross:flit==3.10.1 +cross:msgpack==1.0.5 # keep older version for gcc <= 4.9.x +cross:typing_extensions==4.12.2 diff --git a/spk/python311/crossenv/requirements-frozenlist.txt b/spk/python311/crossenv/requirements-frozenlist.txt index 4edc3b107fb..1dc9ec5602e 100644 --- a/spk/python311/crossenv/requirements-frozenlist.txt +++ b/spk/python311/crossenv/requirements-frozenlist.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:build==1.2.2 +build:Cython==3.0.11 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0 diff --git a/spk/python311/crossenv/requirements-numpy.txt b/spk/python311/crossenv/requirements-numpy.txt index b5dc14ee2da..16791e33c51 100644 --- a/spk/python311/crossenv/requirements-numpy.txt +++ b/spk/python311/crossenv/requirements-numpy.txt @@ -2,8 +2,8 @@ pip==23.2.1 setuptools==59.8.0 wheel==0.41.2 # -Cython==0.29.36 -meson-python==0.17.1 -scikit-build==0.18.1 -scikit-build-core==0.10.7 -setuptools-scm==8.1.0 +build:Cython==0.29.36 +build:meson-python==0.17.1 +build:scikit-build==0.18.1 +build:scikit-build-core==0.10.7 +build:setuptools-scm==8.1.0 diff --git a/spk/python311/crossenv/requirements-yarl.txt b/spk/python311/crossenv/requirements-yarl.txt index 4edc3b107fb..1dc9ec5602e 100644 --- a/spk/python311/crossenv/requirements-yarl.txt +++ b/spk/python311/crossenv/requirements-yarl.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:build==1.2.2 +build:Cython==3.0.11 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0 diff --git a/spk/python312-wheels/Makefile b/spk/python312-wheels/Makefile index dcad0f72ab1..6a8b5ea6dbf 100644 --- a/spk/python312-wheels/Makefile +++ b/spk/python312-wheels/Makefile @@ -24,12 +24,63 @@ LICENSE = PSF # Enable debug_info symgols #GCC_DEBUG_INFO := 1 +# IMPORTANT: WHEELS must be initialized before include of spksrc.python.mk +# later additions are ok, but WHEELS must not be empty at this point, +# otherwise the build of WHEELS is skipped WHEELS = src/requirements-abi3.txt WHEELS += src/requirements-crossenv.txt WHEELS += src/requirements-pure.txt include ../../mk/spksrc.common.mk +# [cryptography] +# Use cross/cryptography to generate py36-abi3 limited API +# NOTE: It's not possible to build py36-abi3 limited API using pip due to PEP517 +# To generate py311-py311 regular build use src/requirements-crossenv.txt +DEPENDS += cross/cryptography + +# [mysqlclient] +DEPENDS += cross/mysql-connector-c +DEPENDS += cross/mariadb-connector-c +ENV += MYSQLCLIENT_CFLAGS="$(CFLAGS) -I$(STAGING_INSTALL_PREFIX)/include/mysql -I$(STAGING_INSTALL_PREFIX)/include/mariadb -I$(STAGING_INSTALL_PREFIX)/$(PYTHON_INC_DIR)" +ENV += MYSQLCLIENT_LDFLAGS="$(LDFLAGS)" + +# [Pendulum] +# Needs atomic to build +# Serves as maturin type python-wheel.mk example +ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) +DEPENDS += cross/pendulum +endif + +# [Pillow] +DEPENDS += cross/pillow + +# [pycares] +DEPENDS += cross/c-ares +ENV += PYCARES_USE_SYSTEM_LIB=1 + +# [pycurl] +DEPENDS += cross/curl +ENV += PYCURL_CURL_CONFIG=$(STAGING_INSTALL_PREFIX)/bin/curl-config + +# [pydantic-core] +DEPENDS += cross/pydantic-core + +# [PyNaCl] +DEPENDS += cross/libsodium +ENV += SODIUM_INSTALL=system + +# [PyYAML] +DEPENDS += cross/libyaml + +# [rpds-py] +# Version >= 0.22.3 requires rustc >= 1.80 +ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) +WHEELS += src/requirements-crossenv-rpds-py.txt +endif + +include ../../mk/spksrc.python.mk + # [borgbackup] # Use OpenSSL path as defined by either # spksrc.wheel-env.mk or spksrc.python.mk @@ -44,12 +95,6 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [borgbackup] -std=c11 endif -# [cryptography] -# Use cross/cryptography to generate py36-abi3 limited API -# NOTE: It's not possible to build py36-abi3 limited API using pip due to PEP517 -# To generate py311-py311 regular build use src/requirements-crossenv.txt -DEPENDS += cross/cryptography - # [gevent] DEPENDS += cross/libev cross/c-ares ENV += GEVENTSETUP_EMBED_CARES=FALSE @@ -68,7 +113,7 @@ endif # [llfuse] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) -WHEELS_CFLAGS += [llfuse] -std=c11 +WHEELS_CFLAGS += [llfuse] -std=gnu11 endif # [lxml] @@ -83,31 +128,11 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [msgpack] -std=c11 endif -# [mysqlclient] -DEPENDS += cross/mysql-connector-c -DEPENDS += cross/mariadb-connector-c -ENV += MYSQLCLIENT_CFLAGS="$(CFLAGS) -I$(STAGING_INSTALL_PREFIX)/include/mysql -I$(STAGING_INSTALL_PREFIX)/include/mariadb -I$(STAGING_INSTALL_PREFIX)/$(PYTHON_INC_DIR)" -ENV += MYSQLCLIENT_LDFLAGS="$(LDFLAGS)" - # [numpy] ifeq ($(call version_gt, $(TC_GCC), 5.0),1) WHEELS += src/requirements-crossenv-numpy.txt endif -# [Pendulum] -# Needs atomic to build -# Serves as maturin type python-wheel.mk example -ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) -DEPENDS += cross/pendulum -endif - -# [Pillow] -DEPENDS += cross/pillow - -# [pycares] -DEPENDS += cross/c-ares -ENV += PYCARES_USE_SYSTEM_LIB=1 - # [pycryptodome] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [pycryptodome] -std=c11 @@ -118,36 +143,7 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [pycryptodomex] -std=c11 endif -# [pycurl] -DEPENDS += cross/curl -ENV += PYCURL_CURL_CONFIG=$(STAGING_INSTALL_PREFIX)/bin/curl-config - -# [pydantic-core] -DEPENDS += cross/pydantic-core - -# [PyNaCl] -DEPENDS += cross/libsodium -ENV += SODIUM_INSTALL=system - -# [PyYAML] -DEPENDS += cross/libyaml - -# [rpds-py] -# Version >= 0.22.3 requires rustc >= 1.80 -ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) -WHEELS += src/requirements-crossenv-rpds-py.txt -endif - # [ruamel.yaml.clib] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [ruamel.yaml.clib] -std=c11 endif - -## -## Addition of requirements files beyond spksrc.python.mk -## will not be taken into consideration for processing -## unless WHEELS has been previously populated. This is due to -## the makefile analysis phase which discard ifeq instructions. -## - -include ../../mk/spksrc.python.mk diff --git a/spk/python312-wheels/src/requirements-crossenv-numpy.txt b/spk/python312-wheels/src/requirements-crossenv-numpy.txt index 19ed52fba98..49795d628f2 100644 --- a/spk/python312-wheels/src/requirements-crossenv-numpy.txt +++ b/spk/python312-wheels/src/requirements-crossenv-numpy.txt @@ -9,7 +9,7 @@ # - Numpy >= 1.26.x requires: # c++17, meson-python, scikit-build-core # - Older version <= 1.25.x no longer supported -numpy==2.2.2 -numpy==2.1.3 -numpy==2.0.2 -numpy==1.26.4 +#numpy==2.2.2 +#numpy==2.1.3 +#numpy==2.0.2 +#numpy==1.26.4 diff --git a/spk/python312-wheels/src/requirements-crossenv.txt b/spk/python312-wheels/src/requirements-crossenv.txt index d420ff3d02d..560bd32f311 100644 --- a/spk/python312-wheels/src/requirements-crossenv.txt +++ b/spk/python312-wheels/src/requirements-crossenv.txt @@ -24,10 +24,19 @@ cffi==1.17.1 # All tested and can be enabled but may conflict # with local python apps requirements +# [atom] +# Requires +# - build:setuptools-scm +# - cross:cppy +atom==0.10.5 +atom==0.11.0 + borgbackup==1.4.0 charset_normalizer==3.4.1 immutables==0.21 -### llfuse==1.5.0 # fails to find "clock_gettime" +# [llfuse] +# gcc < 5 requires -std=gnu11 to find "clock_gettime" +llfuse==1.5.0 MarkupSafe==3.0.2 msgpack==1.1.0 # used compiled verrsion for performance msgpack_python==0.5.6 diff --git a/spk/python312/Makefile b/spk/python312/Makefile index fea0f1d29b4..f0a4c1d31ca 100644 --- a/spk/python312/Makefile +++ b/spk/python312/Makefile @@ -1,7 +1,7 @@ SPK_NAME = python312 -SPK_VERS = 3.12.8 +SPK_VERS = 3.12.9 SPK_VERS_MAJOR_MINOR = $(word 1,$(subst ., ,$(SPK_VERS))).$(word 2,$(subst ., ,$(SPK_VERS))) -SPK_REV = 1 +SPK_REV = 2 SPK_ICON = src/python3.png # Compiler must support std=c++11 diff --git a/spk/python312/crossenv/requirements-atom.txt b/spk/python312/crossenv/requirements-atom.txt new file mode 100644 index 00000000000..eea9bcfcc18 --- /dev/null +++ b/spk/python312/crossenv/requirements-atom.txt @@ -0,0 +1,7 @@ +pip==24.3.1 +setuptools==75.8.0 +wheel==0.45.1 +# +build:setuptools-scm==8.1.0 +# +cross:cppy==1.3.1 diff --git a/spk/python312/crossenv/requirements-default.txt b/spk/python312/crossenv/requirements-default.txt index 20e7bb48754..bedce8a87c9 100644 --- a/spk/python312/crossenv/requirements-default.txt +++ b/spk/python312/crossenv/requirements-default.txt @@ -1,21 +1,20 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.8.0 -build==1.2.2 wheel==0.45.1 # -# keep older version for gcc <= 4.9.x -msgpack==1.0.5 +build:build==1.2.2 +build:Cython==3.0.11 +build:maturin==1.8.1 +build:meson-python==0.17.1 +build:pip-tools==7.4.1 +build:poetry==1.8.5 +build:scikit-build==0.18.1 +build:scikit-build-core==0.10.7 +build:setuptools-rust==1.10.2 +build:setuptools-scm==8.1.0 # -cffi==1.17.1 -cryptography==44.0.0 -Cython==3.0.11 -flit==3.10.1 -maturin==1.8.1 -meson-python==0.17.1 -poetry==1.8.5 -scikit-build==0.18.1 -scikit-build-core==0.10.7 -setuptools-rust==1.10.2 -setuptools-scm==8.1.0 -typing_extensions==4.12.2 +cross:cffi==1.17.1 +cross:cryptography==44.0.0 +cross:flit==3.10.1 +cross:msgpack==1.0.5 # keep older version for gcc <= 4.9.x +cross:typing_extensions==4.12.2 diff --git a/spk/python312/crossenv/requirements-frozenlist.txt b/spk/python312/crossenv/requirements-frozenlist.txt index 4edc3b107fb..1dc9ec5602e 100644 --- a/spk/python312/crossenv/requirements-frozenlist.txt +++ b/spk/python312/crossenv/requirements-frozenlist.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:build==1.2.2 +build:Cython==3.0.11 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0 diff --git a/spk/python312/crossenv/requirements-yarl.txt b/spk/python312/crossenv/requirements-yarl.txt index 4edc3b107fb..1dc9ec5602e 100644 --- a/spk/python312/crossenv/requirements-yarl.txt +++ b/spk/python312/crossenv/requirements-yarl.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:build==1.2.2 +build:Cython==3.0.11 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0 diff --git a/spk/python313-wheels/Makefile b/spk/python313-wheels/Makefile index 69176709a39..6001d309106 100644 --- a/spk/python313-wheels/Makefile +++ b/spk/python313-wheels/Makefile @@ -24,12 +24,63 @@ LICENSE = PSF # Enable debug_info symgols #GCC_DEBUG_INFO := 1 +# IMPORTANT: WHEELS must be initialized before include of spksrc.python.mk +# later additions are ok, but WHEELS must not be empty at this point, +# otherwise the build of WHEELS is skipped WHEELS = src/requirements-abi3.txt WHEELS += src/requirements-crossenv.txt WHEELS += src/requirements-pure.txt include ../../mk/spksrc.common.mk +# [cryptography] +# Use cross/cryptography to generate py36-abi3 limited API +# NOTE: It's not possible to build py36-abi3 limited API using pip due to PEP517 +# To generate py311-py311 regular build use src/requirements-crossenv.txt +DEPENDS += cross/cryptography + +# [mysqlclient] +DEPENDS += cross/mysql-connector-c +DEPENDS += cross/mariadb-connector-c +ENV += MYSQLCLIENT_CFLAGS="$(CFLAGS) -I$(STAGING_INSTALL_PREFIX)/include/mysql -I$(STAGING_INSTALL_PREFIX)/include/mariadb -I$(STAGING_INSTALL_PREFIX)/$(PYTHON_INC_DIR)" +ENV += MYSQLCLIENT_LDFLAGS="$(LDFLAGS)" + +# [Pendulum] +# Needs atomic to build +# Serves as maturin type python-wheel.mk example +ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) +DEPENDS += cross/pendulum +endif + +# [Pillow] +DEPENDS += cross/pillow + +# [pycares] +DEPENDS += cross/c-ares +ENV += PYCARES_USE_SYSTEM_LIB=1 + +# [pycurl] +DEPENDS += cross/curl +ENV += PYCURL_CURL_CONFIG=$(STAGING_INSTALL_PREFIX)/bin/curl-config + +# [pydantic-core] +DEPENDS += cross/pydantic-core + +# [PyNaCl] +DEPENDS += cross/libsodium +ENV += SODIUM_INSTALL=system + +# [PyYAML] +DEPENDS += cross/libyaml + +# [rpds-py] +# Version >= 0.22.3 requires rustc >= 1.80 +ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) +WHEELS += src/requirements-crossenv-rpds-py.txt +endif + +include ../../mk/spksrc.python.mk + # [borgbackup] # Use OpenSSL path as defined by either # spksrc.wheel-env.mk or spksrc.python.mk @@ -44,12 +95,6 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [borgbackup] -std=c11 endif -# [cryptography] -# Use cross/cryptography to generate py36-abi3 limited API -# NOTE: It's not possible to build py36-abi3 limited API using pip due to PEP517 -# To generate py311-py311 regular build use src/requirements-crossenv.txt -DEPENDS += cross/cryptography - # [gevent] DEPENDS += cross/libev cross/c-ares ENV += GEVENTSETUP_EMBED_CARES=FALSE @@ -65,7 +110,7 @@ endif # [llfuse] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) -WHEELS_CFLAGS += [llfuse] -std=c11 +WHEELS_CFLAGS += [llfuse] -std=gnu11 endif # [lxml] @@ -80,31 +125,11 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [msgpack] -std=c11 endif -# [mysqlclient] -DEPENDS += cross/mysql-connector-c -DEPENDS += cross/mariadb-connector-c -ENV += MYSQLCLIENT_CFLAGS="$(CFLAGS) -I$(STAGING_INSTALL_PREFIX)/include/mysql -I$(STAGING_INSTALL_PREFIX)/include/mariadb -I$(STAGING_INSTALL_PREFIX)/$(PYTHON_INC_DIR)" -ENV += MYSQLCLIENT_LDFLAGS="$(LDFLAGS)" - # [numpy] ifeq ($(call version_gt, $(TC_GCC), 5.0),1) WHEELS += src/requirements-crossenv-numpy.txt endif -# [Pendulum] -# Needs atomic to build -# Serves as maturin type python-wheel.mk example -ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) -DEPENDS += cross/pendulum -endif - -# [Pillow] -DEPENDS += cross/pillow - -# [pycares] -DEPENDS += cross/c-ares -ENV += PYCARES_USE_SYSTEM_LIB=1 - # [pycryptodome] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [pycryptodome] -std=c11 @@ -115,36 +140,7 @@ ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [pycryptodomex] -std=c11 endif -# [pycurl] -DEPENDS += cross/curl -ENV += PYCURL_CURL_CONFIG=$(STAGING_INSTALL_PREFIX)/bin/curl-config - -# [pydantic-core] -DEPENDS += cross/pydantic-core - -# [PyNaCl] -DEPENDS += cross/libsodium -ENV += SODIUM_INSTALL=system - -# [PyYAML] -DEPENDS += cross/libyaml - -# [rpds-py] -# Version >= 0.22.3 requires rustc >= 1.80 -ifneq ($(findstring $(ARCH),$(ARMv7L_ARCHS)),$(ARCH)) -WHEELS += src/requirements-crossenv-rpds-py.txt -endif - # [ruamel.yaml.clib] ifeq ($(call version_lt, $(TC_GCC), 5.0),1) WHEELS_CFLAGS += [ruamel.yaml.clib] -std=c11 endif - -## -## Addition of requirements files beyond spksrc.python.mk -## will not be taken into consideration for processing -## unless WHEELS has been previously populated. This is due to -## the makefile analysis phase which discard ifeq instructions. -## - -include ../../mk/spksrc.python.mk diff --git a/spk/python313-wheels/src/requirements-crossenv-greenlet-v3.txt b/spk/python313-wheels/src/requirements-crossenv-greenlet-v3.txt index 837c343884b..1e48c9116dd 100644 --- a/spk/python313-wheels/src/requirements-crossenv-greenlet-v3.txt +++ b/spk/python313-wheels/src/requirements-crossenv-greenlet-v3.txt @@ -5,7 +5,6 @@ ## # [greenlet] -# - Mandatory require full c++11 support -greenlet==3.0.3 +# - v3.0 no longer builds with python 3.13 # - Mandatory require full c++20 support added with gcc >= 8 greenlet==3.1.1 diff --git a/spk/python313-wheels/src/requirements-crossenv-numpy.txt b/spk/python313-wheels/src/requirements-crossenv-numpy.txt index 19ed52fba98..49795d628f2 100644 --- a/spk/python313-wheels/src/requirements-crossenv-numpy.txt +++ b/spk/python313-wheels/src/requirements-crossenv-numpy.txt @@ -9,7 +9,7 @@ # - Numpy >= 1.26.x requires: # c++17, meson-python, scikit-build-core # - Older version <= 1.25.x no longer supported -numpy==2.2.2 -numpy==2.1.3 -numpy==2.0.2 -numpy==1.26.4 +#numpy==2.2.2 +#numpy==2.1.3 +#numpy==2.0.2 +#numpy==1.26.4 diff --git a/spk/python313-wheels/src/requirements-crossenv.txt b/spk/python313-wheels/src/requirements-crossenv.txt index d420ff3d02d..0bd4e914d87 100644 --- a/spk/python313-wheels/src/requirements-crossenv.txt +++ b/spk/python313-wheels/src/requirements-crossenv.txt @@ -24,10 +24,16 @@ cffi==1.17.1 # All tested and can be enabled but may conflict # with local python apps requirements +# [atom] +# Requires +# - build:setuptools-scm +# - cross:cppy +atom==0.11.0 + borgbackup==1.4.0 charset_normalizer==3.4.1 immutables==0.21 -### llfuse==1.5.0 # fails to find "clock_gettime" +### llfuse==1.5.0 MarkupSafe==3.0.2 msgpack==1.1.0 # used compiled verrsion for performance msgpack_python==0.5.6 diff --git a/spk/python313/Makefile b/spk/python313/Makefile index dbbe8d6dbc1..7f6c7c13dd4 100644 --- a/spk/python313/Makefile +++ b/spk/python313/Makefile @@ -1,7 +1,7 @@ SPK_NAME = python313 -SPK_VERS = 3.13.1 +SPK_VERS = 3.13.2 SPK_VERS_MAJOR_MINOR = $(word 1,$(subst ., ,$(SPK_VERS))).$(word 2,$(subst ., ,$(SPK_VERS))) -SPK_REV = 1 +SPK_REV = 2 SPK_ICON = src/python3.png # Compiler must support std=c++11 diff --git a/spk/python313/crossenv/requirements-atom.txt b/spk/python313/crossenv/requirements-atom.txt new file mode 100644 index 00000000000..eea9bcfcc18 --- /dev/null +++ b/spk/python313/crossenv/requirements-atom.txt @@ -0,0 +1,7 @@ +pip==24.3.1 +setuptools==75.8.0 +wheel==0.45.1 +# +build:setuptools-scm==8.1.0 +# +cross:cppy==1.3.1 diff --git a/spk/python313/crossenv/requirements-default.txt b/spk/python313/crossenv/requirements-default.txt index 20e7bb48754..bedce8a87c9 100644 --- a/spk/python313/crossenv/requirements-default.txt +++ b/spk/python313/crossenv/requirements-default.txt @@ -1,21 +1,20 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.8.0 -build==1.2.2 wheel==0.45.1 # -# keep older version for gcc <= 4.9.x -msgpack==1.0.5 +build:build==1.2.2 +build:Cython==3.0.11 +build:maturin==1.8.1 +build:meson-python==0.17.1 +build:pip-tools==7.4.1 +build:poetry==1.8.5 +build:scikit-build==0.18.1 +build:scikit-build-core==0.10.7 +build:setuptools-rust==1.10.2 +build:setuptools-scm==8.1.0 # -cffi==1.17.1 -cryptography==44.0.0 -Cython==3.0.11 -flit==3.10.1 -maturin==1.8.1 -meson-python==0.17.1 -poetry==1.8.5 -scikit-build==0.18.1 -scikit-build-core==0.10.7 -setuptools-rust==1.10.2 -setuptools-scm==8.1.0 -typing_extensions==4.12.2 +cross:cffi==1.17.1 +cross:cryptography==44.0.0 +cross:flit==3.10.1 +cross:msgpack==1.0.5 # keep older version for gcc <= 4.9.x +cross:typing_extensions==4.12.2 diff --git a/spk/python313/crossenv/requirements-frozenlist.txt b/spk/python313/crossenv/requirements-frozenlist.txt index 4edc3b107fb..1dc9ec5602e 100644 --- a/spk/python313/crossenv/requirements-frozenlist.txt +++ b/spk/python313/crossenv/requirements-frozenlist.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:build==1.2.2 +build:Cython==3.0.11 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0 diff --git a/spk/python313/crossenv/requirements-pydantic_core.txt b/spk/python313/crossenv/requirements-pydantic_core.txt index aab8e3a040e..c027cab329a 100644 --- a/spk/python313/crossenv/requirements-pydantic_core.txt +++ b/spk/python313/crossenv/requirements-pydantic_core.txt @@ -1,10 +1,10 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -# [pydantic_core] depends on Cython < 3.x -Cython==0.29.37 -maturin==1.7.4 -typing_extensions==4.12.2 +build:build==1.2.2 +build:Cython==0.29.37 # [pydantic_core] depends on Cython < 3.x +build:maturin==1.7.4 +build:pip-tools==7.4.1 +# +cross:typing_extensions==4.12.2 diff --git a/spk/python313/crossenv/requirements-yarl.txt b/spk/python313/crossenv/requirements-yarl.txt index 4edc3b107fb..667fcd669f3 100644 --- a/spk/python313/crossenv/requirements-yarl.txt +++ b/spk/python313/crossenv/requirements-yarl.txt @@ -1,8 +1,9 @@ pip==24.3.1 -pip-tools==7.4.1 setuptools==75.4.0 -build==1.2.2 wheel==0.45.0 # -Cython==3.0.11 -expandvars==0.12.0 +build:Cython==3.0.11 +build:build==1.2.2 +build:pip-tools==7.4.1 +# +cross:expandvars==0.12.0