SPK_NAME = python312-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 3.12 needs C11 <stdatomic.h> (and C++11); gcc ships stdatomic.h >= 4.8
MIN_GCC_VERSION = 4.8

PYTHON_PACKAGE = python312

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

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

# Enable debug_info symbols
#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/scipy

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

# [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_LIBACL_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBB2_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBLZ4_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBXXHASH_PREFIX="$(STAGING_INSTALL_PREFIX)"
ENV += BORG_LIBZSTD_PREFIX="$(STAGING_INSTALL_PREFIX)"
DEPENDS += cross/attr cross/acl cross/openssl3 cross/lz4 cross/libb2 cross/fuse cross/xxhash cross/zstd
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [borgbackup] -std=c11
endif

# [gevent]
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
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [gevent] -std=c11
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) *** unsupported ***
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
endif

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

# [lxml]
DEPENDS += cross/libxml2
DEPENDS += cross/libxslt
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

# [msgpack]
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [msgpack] -std=c11
endif

# [mysqlclient]
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]
# version <= 1.25 -> NOT SUPPORTED WITH PYTHON 3.12
# version == 1.26 -> Requires gcc >= 8.4 -> DSM-7.1
# version >= 2.3  -> Requires gcc >= 9.4 -> DSM-7.2
ifeq ($(call version_ge, $(TC_GCC), 8.5),1)
DEPENDS += python/numpy_1.26
DEPENDS += python/numpy
DEPENDS += python/numpy-latest
endif

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

# [Pendulum]
# Serves as maturin build type example
DEPENDS += python/pendulum

# [Pillow]
DEPENDS += python/pillow

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

# [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
endif

# [pycryptodomex]
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
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.24 requires rustc >= 1.82 (qoriq)
# Version = 0.25 requires rustc >= 1.85
ifeq ($(findstring $(ARCH),$(PPC_ARCHS)),$(ARCH))
WHEELS += rpds_py==0.24.0
else
WHEELS += rpds_py==0.30.0
endif

# [ruamel.yaml.clib]
ifeq ($(call version_lt, $(TC_GCC), 5.0),1)
WHEELS_CFLAGS += [ruamel.yaml.clib] -std=c11
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
