SPK_NAME = python311-wheels
SPK_VERS = 1.0
SPK_VERS_MAJOR_MINOR = $(word 1,$(subst ., ,$(SPK_VERS))).$(word 2,$(subst ., ,$(SPK_VERS)))
SPK_REV = 1
SPK_ICON = src/python3-pip.png

PYTHON_PACKAGE = python311

MAINTAINER = SynoCommunity
DESCRIPTION =  Collection of programs for the Python 3.11 programming language.
DESCRIPTION_FRE = Collection of programs for the Python 3.11 programming language.
DESCRIPTION_SPN = Colección de programas para el lenguaje de programación Python 3.11.
STARTABLE = no
DISPLAY_NAME = Python 3.11 Wheels Collection
CHANGELOG = "1. Initial package"

HOMEPAGE = https://www.python.org
LICENSE  = PSF

# Enable debug_info symgols
#GCC_DEBUG_INFO := 1

# IMPORTANT: WHEELS must be initialized before include of spksrc.spk-meta.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

SERVICE_SETUP = src/service-setup.sh
POST_SERVICE_TARGET = $(SPK_NAME)_extra_install

OPTIONAL_DEPENDS  = python/numpy_1.26
OPTIONAL_DEPENDS += python/numpy
OPTIONAL_DEPENDS += python/numpy-latest
OPTIONAL_DEPENDS += python/pandas
OPTIONAL_DEPENDS += python/pendulum
OPTIONAL_DEPENDS += python/pygobject
OPTIONAL_DEPENDS += python/scipy

include ../../mk/spksrc.common.mk

# [atom]
# Requires
#  - build:setuptools-scm
#  - cross:cppy
ifeq ($(call version_ge, $(TC_GCC), 4.8),1)
WHEELS += atom==0.12.1
endif

# [borgbackup]
# Use the OpenSSL path from the single source of truth:
# spksrc.cross/env-default.mk (included via spksrc.cross-cc.mk).
ENV += BORG_OPENSSL_PREFIX="$(OPENSSL_STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBLZ4_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBZSTD_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBB2_PREFIX="$(STAGING_INSTALL_PREFIX)"
DEPENDS += cross/attr cross/acl cross/openssl3 cross/lz4 cross/zstd cross/libb2 cross/fuse

# [gevent]
ifeq ($(call version_ge, $(TC_GCC), 4.4),1)
DEPENDS += cross/libev cross/c-ares
ENV += GEVENTSETUP_EMBED_CARES=FALSE
ENV += GEVENTSETUP_EMBED_LIBEV=FALSE
ifeq ($(call version_lt, $(TC_GCC), 4.9),1)
WHEELS += gevent==24.11.1
else
WHEELS += gevent==25.9.1
endif
endif

# [greenlet]
# version >= 3.1: gcc >= 8   (DSM7.1) Mandatory require full c++20 support
# version  = 3.0: gcc >= 4.9 (DSM6, comcerto2k) Mandatory require full c++11 support
# version  = 1.x: gcc <  4.9 (DSM5, DSM6) Last known working version (armv5, hi3535)
ifeq ($(call version_ge, $(TC_GCC), 8.5),1)
WHEELS += greenlet==3.3.2
else ifeq ($(call version_ge, $(TC_GCC), 4.9)$(call version_lt, $(TC_GCC), 5.0),11)
WHEELS += greenlet==3.0.3
WHEELS_CPPFLAGS += [greenlet] -std=c++11 -fpermissive
else
WHEELS += greenlet==1.1.3
endif

# [llfuse]
# llfuse<=1.5.1 using gcc<5 requires -std=gnu11 to find "clock_gettime" (-std=gnu99 makes it compatible with older gcc)
# llfuse>=1.5.2 requires gcc>=7
ifeq ($(call version_gt, $(TC_GCC), 4.4),1)
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [llfuse] -std=gnu99
WHEELS += llfuse==1.5.1
else
WHEELS += llfuse==1.5.2
endif
endif

# [lxml]
ifeq ($(call version_ge, $(TC_GCC), 4.4),1)
DEPENDS += cross/libxml2
DEPENDS += cross/libxslt
ifeq ($(call version_lt, $(TC_GCC), 4.8),1)
WHEELS_CFLAGS += [lxml] -std=gnu99
WHEELS += lxml==5.4.0
else ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [lxml] -std=c11
WHEELS += lxml==5.4.0
else
WHEELS += lxml==6.0.2
endif
endif

# [mysqlclient]
ifeq ($(call version_ge, $(TC_GCC), 4.4),1)
WHEELS += mysqlclient==2.2.8
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)"
endif

# [numpy]
# version <= 1.21 (armv5,  gcc-4.6)  Requires python '<3.11,>=3.7' *** unsupported ***
# version <= 1.22 (armv7l, gcc-4.8)  Last working version
# version <= 1.24 (DSM6, comcerto2k) Last working version with gcc-4.9
# version >= 1.25 (DSM-7)            Mandatory requires c++17
# version == 1.25.2                  BUG only on x86_64 gcc-8.5.0 DSM-7.1 -> Fallback to 1.25.1
# version >= 1.26 (DSM-7.1)          Mandatory requires gcc >= 8.4
# version >= 2.3  (DSM-7.2)          Requires gcc >= 9.4 (using patch for DSM-7.1 compatibility)
ifeq ($(call version_ge, $(TC_GCC), 4.8),1)
ifeq ($(call version_lt, $(TC_GCC), 4.9),1)
WHEELS += numpy==1.22.4
else ifeq ($(call version_lt, $(TC_GCC), 8.5),1)
WHEELS += numpy==1.24.4
# workaround for compiler bug:
# https://github.com/numpy/numpy/issues/13622
ifeq ($(findstring $(ARCH),$(ARMv8_ARCHS)),$(ARCH))
WHEELS_CFLAGS += [numpy] -O0
endif
else
DEPENDS += python/numpy_1.26
DEPENDS += python/numpy
DEPENDS += python/numpy-latest
endif
endif

# [pandas] - depends on numpy >= 2.x
ifeq ($(call version_ge, $(TC_GCC), 8.5),1)
DEPENDS += python/pandas
endif

# [Pendulum]
# Needs atomic to build
# Serves as maturin type python-wheel.mk example
ifeq ($(call version_gt, $(TC_GCC), 4.8),1)
DEPENDS += python/pendulum
endif

# [Pillow]
DEPENDS += python/pillow

# [psutil]
ifeq ($(call version_gt, $(TC_GCC), 4.4),1)
WHEELS += psutil==7.2.2
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [psutil] -std=gnu99
endif
endif

# [pycares]
ifeq ($(call version_gt, $(TC_GCC), 4.4),1)
WHEELS += pycares==5.0.1
DEPENDS += cross/c-ares
ENV += PYCARES_USE_SYSTEM_LIB=1
endif

# [pycryptodome]
ifeq ($(call version_ge, $(TC_GCC), 4.9),1)
WHEELS_CFLAGS += [pycryptodome] -std=c11
else
WHEELS_CFLAGS += [pycryptodome] -std=c99
endif

# [pycryptodomex]
ifeq ($(call version_ge, $(TC_GCC), 4.9),1)
WHEELS_CFLAGS += [pycryptodomex] -std=c11
else
WHEELS_CFLAGS += [pycryptodomex] -std=c99
endif

# [pycurl]
DEPENDS += cross/curl
ENV += PYCURL_CURL_CONFIG=$(STAGING_INSTALL_PREFIX)/bin/curl-config
ENV += PYCURL_OPENSSL_DIR=$(OPENSSL_STAGING_INSTALL_PREFIX)

# [pydantic-core]
DEPENDS += python/pydantic-core

# [pygobject]
ifeq ($(call version_ge, $(TC_GCC), 5.0),1)
DEPENDS += python/pygobject
endif

# [PyNaCl]
DEPENDS += cross/libsodium
ENV += SODIUM_INSTALL=system

# [PyYAML]
DEPENDS += cross/libyaml

# [rencode]
DEPENDS += python/rencode

# [rpds-py]
# Require environment variables
#   PYO3_CROSS_LIB_DIR=$(STAGING_INSTALL_PREFIX)/lib/
#   PYO3_CROSS_INCLUDE_DIR=$(STAGING_INSTALL_PREFIX)/include/
# Version = 0.21 requires rustc >= 1.77 (armv5)
# Version = 0.24 requires rustc >= 1.82 (qoriq)
# Version = 0.25 requires rustc >= 1.85
ifeq ($(findstring $(ARCH),$(ARMv5_ARCHS)),$(ARCH))
WHEELS += rpds_py==0.21.0
else ifeq ($(findstring $(ARCH),$(PPC_ARCHS)),$(ARCH))
WHEELS += rpds_py==0.24.0
else
WHEELS += rpds_py==0.30.0
endif

# [scipy] - depends on numpy >= 2.x
ifeq ($(call version_ge, $(TC_GCC), 8.5),1)
DEPENDS += python/scipy
endif

include ../../mk/spksrc.spk-meta.mk

.PHONY: $(SPK_NAME)_extra_install
$(SPK_NAME)_extra_install:
	@$(MSG) Substituting PYTHON_PACKAGE in service-setup
	@sed -i 's|@@PYTHON_PACKAGE@@|$(PYTHON_PACKAGE)|g' $(WORK_DIR)/scripts/service-setup
