diff --git a/Mk/Uses/python.mk b/Mk/Uses/python.mk index 66be65eba7cf..7cb24247d578 100644 --- a/Mk/Uses/python.mk +++ b/Mk/Uses/python.mk @@ -1,1045 +1,1045 @@ # Provide support for Python related ports. This includes detecting Python # interpreters, ports providing package and modules for python as well as # consumer ports requiring Python at build or run time. # # Feature: python # Usage: USES=python[:version-spec][,arg,...] # Valid ARGS: , patch, build, run, test, env # # version-spec Declarative specification for the Python version(s) the # port supports. Subsets and ranges can be specified: # # * # * - # * + # * - # # Examples: # # USES=python:2.7 # Supports Python 2.7 Only # USES=python:3.11+ # Supports Python 3.11 or later # USES=python:3.11-3.12 # Supports Python 3.11 to 3.12 # USES=python:-3.11 # Supports Python up to 3.11 # USES=python # Supports 3.10+ # # NOTE: should be as specific as possible, matching the versions # upstream declares support for, without being incorrect. In particular, # USES=python *without* a means 3.11+, # including unreleased versions, which is probably incorrect. # # Not specifying a should only be used when a more specific # cannot be specified due to syntax limitations, for # example: 2.7,3.11-3.12, but even in this case, X.Y+ (2.7+), or -X.Y (-3.11) # is preferred and likely more correct. # # patch Python is needed at patch time. Adds dependency to PATCH_DEPENDS. # build Python is needed at build time. Adds dependency to BUILD_DEPENDS. # run Python is needed at run time. Adds dependency to RUN_DEPENDS. # test Python is needed at test time. Adds dependency to TEST_DEPENDS. # env Does not depend on Python but needs the environment set up. This # is mainly used when depending on flavored python ports, or when a # correct PYTHON_CMD is required. It has the same effect as setting # PYTHON_NO_DEPENDS. # # If build, run and test are omitted, Python will be added as BUILD_DEPENDS, # RUN_DEPENDS and TEST_DEPENDS. # patch is independant, it does not prevent the default build/run/test # dependency. # env or PYTHON_NO_DEPENDS can be set to not add any dependencies. # # Exported variables: # # PYTHON_VERSION - The chosen Python interpreter including the version, # e.g. python2.7, python3.11, etc. # # Variables, which can be set by the port: # # USE_PYTHON - A list of additional features and functionality to # enable. Supported features are: # # concurrent - Indicates that the port can be installed for # different python versions at the same time. The port # is supposed to use a unique prefix for certain # directories using USES=uniquefiles:dirs (see the # uniquefiles.mk Uses for details about the # directories), if set to yes. Binaries receive an # additional suffix, based on ${PYTHON_VER}. # # The values for the uniquefiles USES are set as # follows: # # UNIQUE_PREFIX= ${PYTHON_PKGNAMEPREFIX} # UNIQUE_SUFFIX= -${PYTHON_VER} # # If the port is installed for the current default # python version, scripts and binaries in # # ${PREFIX}/bin # ${PREFIX}/sbin # ${PREFIX}/libexec # # are linked from the prefixed version to the # prefix-less original name, e.g. # bin/foo-2.7 --> bin/foo. # # cryptography_build # - Depend on security/cryptography at build-time. # # cryptography - Depend on security/cryptography at run-time. # # cryptography_test # - Depend on security/cryptography at test-time. # # cython - Depend on lang/cython at build-time. # # cython_run - Depend on lang/cython at run-time. # # cython_test - Depend on lang/cython for tests. # # cython3 - Depend on lang/cython3 at build-time. # # cython3_run - Depend on lang/cython3 at run-time. # # cython3_test - Depend on lang/cython3 for tests. # # flavors - Force creation of flavors for Python 2 and 3 default # versions, where applicable. # # noflavors - Disable automatic creation of flavors if they would # otherwise be created and they are not wanted. # # allflavors - Generate flavors for all possible versions and not # simply the default ones. Only to be used for py-* # ports that are part of the Python distribution, but # kept as separate ports. # # optsuffix - Set PKGNAMESUFFIX to PYTHON_PKGNAMESUFFIX if not the # default python version. # # distutils - Use distutils as do-configure, do-build and # do-install targets. implies flavors. # # pep517 - Follow the PEP-517 standard to build and install wheels # as do-build and do-install targets. implies flavors. # # autoplist - Automatically generates the packaging list for a # port that uses distutils when defined. # requires: distutils # # py3kplist - Automatically generates Python 3.x compatible # __pycache__ entries from a Python 2.x packaging list # when defined. Use this for ports that do *not* use # standard Python packaging mechanisms such as # distutils, and support *both* Python 2.x and 3.x. # Not needed, if USE_PYTHON=autoplist is set. # # pythonprefix - Says that the port installs in ${PYTHONBASE} instead # of ${PREFIX}. # # noegginfo - Skip an egg-info entry from plist, if defined. # # nose - Run tests with nose (devel/py-nose) # # nose2 - Run tests with nose2 (devel/py-nose2) # # pytest - Run tests with latest pytest (devel/py-pytest) # # unittest - Run tests with unittest # # unittest2 - Run tests with unittest2 (devel/py-unittest2) # # PYTHON_CMD - Python's command line file name, including the # version number (used for dependencies). # default: ${PYTHONBASE}/bin/${PYTHON_VERSION} # # PEP517_BUILD_CMD - Command sequence for a PEP-517 build frontend that builds a wheel. # default: ${PYTHON_CMD} -m build --no-isolation --wheel ${PEP517_BUILD_CONFIG_SETTING} # # PEP517_BUILD_DEPEND - Port needed to execute ${PEP517_BUILD_CMD}. # default: ${PYTHON_PKGNAMEPREFIX}build>=0:devel/py-build@${PY_FLAVOR} # # PEP517_BUILD_CONFIG_SETTING # - Options for the build backend. Must include -C or --config-setting per option. # default: # # PEP517_INSTALL_CMD - Command sequence for a PEP-517 install frontend that installs a wheel. # default: ${PYTHON_CMD} -m installer --destdir ${STAGEDIR} --prefix ${PREFIX} ${BUILD_WRKSRC}/dist/${PORTNAME:C|[-_]+|_|g}-${DISTVERSION}*.whl # # PEP517_INSTALL_DEPEND - Port needed to execute ${PEP517_INSTALL_CMD}. # default: ${PYTHON_PKGNAMEPREFIX}installer>=0:devel/py-installer@${PY_FLAVOR} # # PYSETUP - Name of the setup script used by the distutils # package. # default: setup.py # # PYDISTUTILS_PKGNAME # - Internal name in the distutils for egg-info. # default: ${PORTNAME} # # PYDISTUTILS_PKGVERSION # - Internal version in the distutils for egg-info. # default: ${PORTVERSION} # # PYDISTUTILS_CONFIGURE_TARGET # - Pass this command to distutils on configure stage. # default: config # # PYDISTUTILS_BUILD_TARGET # - Pass this command to distutils on build stage. # default: build # # PYDISTUTILS_INSTALL_TARGET # - Pass this command to distutils on install stage. # default: install # # PYDISTUTILS_CONFIGUREARGS # - Arguments to config with distutils. # default: # # PYDISTUTILS_BUILDARGS # - Arguments to build with distutils. # default: # # PYDISTUTILS_INSTALLARGS # - Arguments to install with distutils. # default: -c -O1 --prefix=${PREFIX} --single-version-externally-managed --root=${STAGEDIR} # # PYDISTUTILS_EGGINFO # - Canonical name for egg-info. # default: ${PYDISTUTILS_PKGNAME:C/[^A-Za-z0-9.]+/_/g}-${PYDISTUTILS_PKGVERSION:C/[^A-Za-z0-9.]+/_/g}-py${PYTHON_VER}.egg-info # # PYTEST_BROKEN_TESTS - Lists of 'pytest -k' patterns to skip tests which # require fixing. # default: # # PYTEST_IGNORED_TESTS - Lists of 'pytest -k' patterns to skip tests which are # not expected to pass, e.g. requiring a database access. # default: # # The following variables can be read by ports and must not be modified: # # PYTHONBASE - The installation prefix of the chosen Python # interpreter, e.g. /usr/local # # PYTHON_DISTVERSION # - Version number suitable for ${DISTVERSION}. # # PYTHON_PORTSDIR - The port directory of the chosen Python interpreter # # PYTHON_REL - The release number of the chosen Python interpreter # without dots, e.g. 20706, 31114, ... # # PYTHON_SUFFIX - The major-minor release number of the chosen Python # interpreter without dots, e.g. 27, 310, ... # Used for prefixes and suffixes. # # PYTHON_BASESUFFIX - PYTHON_SUFFIX without the threaded ABI flag. # # PYTHON_TAG - Defined by PEP 3147, magic tag containing # implementation name and shorthand version, # primarily for bytecode files. Includes # preceding dot, e.g. .cpython-312, # .cpython-313, ... # # PYTHON_SOABI - Defined by PEP 3149, tag containing # implementation name, shorthand version # and ABI tags, primarily for compiled # extension modules. Includes preceding # dot, e.g. .cpython-313, .cpython-313t, # .cpython-313td, ... # # PYTHON_MAJOR_VER - The major release version of the chosen Python # interpreter, e.g. 2, 3, ... # # PYTHON_VER - The major-minor release version of the chosen Python # interpreter, e.g. 2.7, 3.12, ... # # PYTHON_BASEVER - PYTHON_VER without the threaded ABI flag. # # PYTHON_ABIVER - Additional ABI flags set by the chosen Python # interpreter, e.g. md # # PYTHON_INCLUDEDIR - Location of the Python include files. # default: ${PYTHONBASE}/include/${PYTHON_VERSION} # # PYTHON_LIBDIR - Base of the python library tree # default: ${PYTHONBASE}/lib/${PYTHON_VERSION} # # PYTHON_SITELIBDIR - Location of the site-packages tree. Don't change, # unless you know what you do. # default: ${PYTHON_LIBDIR}/site-packages # # There are PREFIX-clean variants of the PYTHON_*DIR variables above. # They are meant to be used by ports instead of the above variables, so the # ports respect ${PREFIX} (unless USE_PYTHON=pythonprefix is specified). # # PYTHONPREFIX_INCLUDEDIR default: ${PREFIX}/include/${PYTHON_VERSION} # PYTHONPREFIX_LIBDIR default: ${PREFIX}/lib/${PYTHON_VERSION} # PYTHONPREFIX_SITELIBDIR default: ${PYTHONPREFIX_LIBDIR}/site-packages # # PYTHON_PLATFORM - Python's idea of the OS release. # This is faked with ${OPSYS} and ${OSREL} until we # find out how to delay defining a variable until # after a certain target has been built. # # PYTHON_PKGNAMEPREFIX # - Use this as a ${PKGNAMEPREFIX} to distinguish # packages for different Python versions. # default: py${PYTHON_SUFFIX}- # # PYTHON_PKGNAMESUFFIX # - Use this as a ${PKGNAMESUFFIX} to distinguish # packages for different Python versions. # default: -py${PYTHON_SUFFIX} # # Using USES=python also will add some useful entries to SUB_LIST and PLIST_SUB: # # PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR} # PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR} # PYTHON_PLATFORM=${PYTHON_PLATFORM} # PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR} # PYTHON_SUFFIX=${PYTHON_SUFFIX} # PYTHON_BASESUFFIX=${PYTHON_BASESUFFIX} # PYTHON_VER=${PYTHON_VER} # PYTHON_BASEVER=${PYTHON_BASEVER} # PYTHON_VERSION=${PYTHON_VERSION} # # where PYTHON_INCLUDEDIR, PYTHON_LIBDIR and PYTHON_SITELIBDIR have their PREFIX # stripped for PLIST_SUB. # # PYTHON2 and PYTHON3 will also be set according to the Python version: # # PYTHON2="" PYTHON3="@comment " for Python 2.x # PYTHON2="@comment " PYTHON3="" for Python 3.x # # PYDISTUTILS_INSTALLNOSINGLE # - Deprecated without replacement # # Dependency lines of selected Python modules: # # PY_SETUPTOOLS - setuptools port based on USE_PYTHON=distutils # PYGAME - pygame port # PYNUMPY - NumPy port # PY_MERCURIAL - mercurial port, PKGNAME varies based on default # Python version # PY_BOOST - Boost Python libraries port # # The following variables may be set by the user: # # PYTEST_ENABLE_ALL_TESTS - Enable tests skipped by PYTEST_BROKEN_TESTS # and PYTEST_IGNORED_TESTS. # PYTEST_ENABLE_BROKEN_TESTS - Enable tests skipped by PYTEST_BROKEN_TESTS. # PYTEST_ENABLE_IGNORED_TESTS - Enable tests skipped by PYTEST_IGNORED_TESTS. # # MAINTAINER: python@FreeBSD.org .if !defined(_INCLUDE_USES_PYTHON_MK) _INCLUDE_USES_PYTHON_MK= yes ZEROREGS_UNSAFE= yes # What Python version and what Python interpreters are currently supported? # When adding a version, please keep the comment in # Mk/bsd.default-versions.mk in sync. -_PYTHON_VERSIONS= 3.11 3.12 3.14 3.10 2.7 # preferred first +_PYTHON_VERSIONS= 3.11 3.12 3.13 3.13t 3.14 3.10 2.7 # preferred first _PYTHON_PORTBRANCH= 3.11 # ${_PYTHON_VERSIONS:[1]} _PYTHON_BASECMD= ${LOCALBASE}/bin/python _PYTHON_RELPORTDIR= lang/python # List all valid USE_PYTHON features here _VALID_PYTHON_FEATURES= allflavors \ autoplist \ concurrent \ cryptography_build \ cryptography \ cryptography_test \ cython \ cython_run \ cython_test \ cython3 \ cython3_run \ cython3_test \ distutils \ flavors \ noegginfo \ noflavors \ nose \ nose2 \ optsuffix \ pep517 \ py3kplist \ pytest \ pythonprefix \ unittest \ unittest2 _INVALID_PYTHON_FEATURES= . for var in ${USE_PYTHON} . if empty(_VALID_PYTHON_FEATURES:M${var}) _INVALID_PYTHON_FEATURES+= ${var} . endif . endfor . if !empty(_INVALID_PYTHON_FEATURES) IGNORE= uses unknown USE_PYTHON features: ${_INVALID_PYTHON_FEATURES} . endif # Make each individual feature available as _PYTHON_FEATURE_ . for var in ${USE_PYTHON} _PYTHON_FEATURE_${var:C/=.*$//:tu}= ${var:C/.*=//:S/,/ /g} . endfor # distutils automatically generates flavors depending on the supported # versions. . if defined(_PYTHON_FEATURE_DISTUTILS) _PYTHON_FEATURE_FLAVORS= yes . endif # pep517 automatically generates flavors depending on the supported # versions. . if defined(_PYTHON_FEATURE_PEP517) _PYTHON_FEATURE_FLAVORS= yes . endif . if defined(_PYTHON_FEATURE_NOFLAVORS) .undef _PYTHON_FEATURE_FLAVORS . endif # Make sure that no dependency or some other environment variable # pollutes the build/run dependency detection .undef _PYTHON_BUILD_DEP .undef _PYTHON_RUN_DEP .undef _PYTHON_TEST_DEP _PYTHON_ARGS= ${python_ARGS:S/,/ /g} . if ${_PYTHON_ARGS:Mpatch} _PYTHON_PATCH_DEP= yes _PYTHON_ARGS:= ${_PYTHON_ARGS:Npatch} . endif . if ${_PYTHON_ARGS:Mbuild} _PYTHON_BUILD_DEP= yes _PYTHON_ARGS:= ${_PYTHON_ARGS:Nbuild} . endif . if ${_PYTHON_ARGS:Mrun} _PYTHON_RUN_DEP= yes _PYTHON_ARGS:= ${_PYTHON_ARGS:Nrun} . endif . if ${_PYTHON_ARGS:Mtest} _PYTHON_TEST_DEP= yes _PYTHON_ARGS:= ${_PYTHON_ARGS:Ntest} . endif . if ${_PYTHON_ARGS:Menv} PYTHON_NO_DEPENDS= yes _PYTHON_ARGS:= ${_PYTHON_ARGS:Nenv} . endif # The port does not specify a build, run or test dependency, assume all are # required. . if !defined(_PYTHON_BUILD_DEP) && !defined(_PYTHON_RUN_DEP) && \ !defined(_PYTHON_TEST_DEP) && !defined(PYTHON_NO_DEPENDS) _PYTHON_BUILD_DEP= yes _PYTHON_RUN_DEP= yes _PYTHON_TEST_DEP= yes . endif . if ${_PYTHON_ARGS} == 2.7 DEV_WARNING+= "lang/python27 reached End of Life and will be removed somewhere in the future, please convert to a modern version of python" . elif ${_PYTHON_ARGS} == 2 DEV_ERROR+= "USES=python:2 is no longer supported, use USES=python:2.7" . elif ${_PYTHON_ARGS} == 3 DEV_ERROR+= "USES=python:3 is no longer supported, use USES=python:3.11+ or an appropriate version range" . endif # ${_PYTHON_ARGS} == 2.7 _PYTHON_VERSION:= ${PYTHON_DEFAULT} . if empty(_PYTHON_ARGS) _PYTHON_ARGS= 3.10+ . endif # Validate Python version whether it meets the version restriction. _PYTHON_VERSION_CHECK:= ${_PYTHON_ARGS:C/^([1-9]\.[1-9]?[0-9])$/\1-\1/} _PYTHON_VERSION_MINIMUM_TMP:= ${_PYTHON_VERSION_CHECK:C/([1-9]\.[1-9]?[0-9])[-+].*/\1/} _PYTHON_VERSION_MINIMUM:= ${_PYTHON_VERSION_MINIMUM_TMP:M[1-9].[0-9]}${_PYTHON_VERSION_MINIMUM_TMP:M[1-9].[1-9][0-9]} _PYTHON_VERSION_MAXIMUM_TMP:= ${_PYTHON_VERSION_CHECK:C/.*-([1-9]\.[1-9]?[0-9])/\1/} _PYTHON_VERSION_MAXIMUM:= ${_PYTHON_VERSION_MAXIMUM_TMP:M[1-9].[0-9]}${_PYTHON_VERSION_MAXIMUM_TMP:M[1-9].[1-9][0-9]} # At this point we should have no argument left in ${_PYTHON_ARGS} # except a version spec _V1= [1-9].[0-9] _V2= [1-9].[1-9][0-9] _PYTHON_ARGS:= ${_PYTHON_ARGS:N${_V1}-${_V1}:N${_V1}-${_V2}:N${_V2}-${_V2}:N${_V1}:N${_V2}:N${_V1}+:N${_V2}+:N-${_V1}:N-${_V2}} . if !empty(_PYTHON_ARGS) IGNORE= uses unknown USES=python arguments: ${_PYTHON_ARGS} . endif # Pattern to convert python versions (X.Y or X.YY) to comparable format X.YY _VC= C/^([1-9]\.)([0-9])$$/\10\2/ .undef _PYTHON_VERSION_NONSUPPORTED . if !empty(_PYTHON_VERSION_MINIMUM) && (${_PYTHON_VERSION:${_VC}:S/t$//} < ${_PYTHON_VERSION_MINIMUM:${_VC}:S/t$//}) _PYTHON_VERSION_NONSUPPORTED= ${_PYTHON_VERSION_MINIMUM} at least . elif !empty(_PYTHON_VERSION_MAXIMUM) && (${_PYTHON_VERSION:${_VC}:S/t$//} > ${_PYTHON_VERSION_MAXIMUM:${_VC}:S/t$//}) _PYTHON_VERSION_NONSUPPORTED= ${_PYTHON_VERSION_MAXIMUM} at most . endif # If we have an unsupported version of Python, try another. . if defined(_PYTHON_VERSION_NONSUPPORTED) .undef _PYTHON_VERSION . for ver in ${PYTHON_DEFAULT} ${PYTHON2_DEFAULT} ${_PYTHON_VERSIONS} __VER= ${ver} . if !defined(_PYTHON_VERSION) && \ !(!empty(_PYTHON_VERSION_MINIMUM) && ( \ ${__VER:${_VC}:S/t$//} < ${_PYTHON_VERSION_MINIMUM:${_VC}:S/t$//})) && \ !(!empty(_PYTHON_VERSION_MAXIMUM) && ( \ ${__VER:${_VC}:S/t$//} > ${_PYTHON_VERSION_MAXIMUM:${_VC}:S/t$//})) _PYTHON_VERSION= ${ver} . endif . endfor . if !defined(_PYTHON_VERSION) IGNORE= needs an unsupported version of Python . endif . endif # defined(_PYTHON_VERSION_NONSUPPORTED) # Automatically generates FLAVORS if empty . if empty(FLAVORS) && defined(_PYTHON_FEATURE_FLAVORS) . undef _VALID_PYTHON_VERSIONS . for ver in ${PYTHON_DEFAULT} ${PYTHON2_DEFAULT} ${_PYTHON_VERSIONS} __VER= ${ver} . if !(!empty(_PYTHON_VERSION_MINIMUM) && ( \ ${__VER:${_VC}:S/t$//} < ${_PYTHON_VERSION_MINIMUM:${_VC}:S/t$//})) && \ !(!empty(_PYTHON_VERSION_MAXIMUM) && ( \ ${__VER:${_VC}:S/t$//} > ${_PYTHON_VERSION_MAXIMUM:${_VC}:S/t$//})) . if empty(_VALID_PYTHON_VERSIONS:M${ver}) _VALID_PYTHON_VERSIONS+= ${ver} . endif . endif . endfor # Get all possible flavors depending on version requirements . if defined(_VALID_PYTHON_VERSIONS) _ALL_PYTHON_FLAVORS= ${_VALID_PYTHON_VERSIONS:S/.//:S/^/py/} . else _ALL_PYTHON_FLAVORS= ${_PYTHON_VERSIONS:S/.//:S/^/py/} . endif # Decide how many flavors we want. By default, only generate the default # versions. . if defined(BUILD_ALL_PYTHON_FLAVORS) || defined(_PYTHON_FEATURE_ALLFLAVORS) FLAVORS= ${_ALL_PYTHON_FLAVORS} . else . for _v in ${PYTHON_DEFAULT} ${PYTHON2_DEFAULT} _f= py${_v:S/.//} . if ${_ALL_PYTHON_FLAVORS:M${_f}} && !${FLAVORS:M${_f}} . if !empty(FLAVORS) FLAVORS:= ${FLAVORS} ${_f} . else FLAVORS:= ${_f} . endif . endif . endfor . endif . if !empty(FLAVORS) && empty(FLAVOR) FLAVOR= ${FLAVORS:[1]} . endif . endif . if ${FLAVOR:Mpy[23][0-9]}${FLAVOR:Mpy[23][1-9][0-9]}${FLAVOR:Mpy31[3-9]t} _PYTHON_VERSION= ${FLAVOR:S/py//:C/(.)/\1./} . endif . if !empty(FLAVOR) && ${_PYTHON_VERSION} != ${PYTHON_DEFAULT} . if defined(_PYTHON_FEATURE_OPTSUFFIX) DEV_WARNING+= "USE_PYTHON=optsuffix is deprecated, consider migrating to using unconditional PKGNAMESUFFIX or PKGNAMEPREFIX" PKGNAMESUFFIX= ${PYTHON_PKGNAMESUFFIX} . endif . endif # To avoid having dependencies with @ and empty flavor: # _PYTHON_VERSION is either set by (first that matches): # - If using Python flavors, from the current Python flavor # - If using a version restriction (USES=python:3.11+), from the first # acceptable default Python version. # - From PYTHON_DEFAULT PY_FLAVOR= py${_PYTHON_VERSION:S/.//} PYTHON_VERSION= python${_PYTHON_VERSION} # Got the correct python version, set some publicly accessible variables PYTHON_VER= ${_PYTHON_VERSION} PYTHON_BASEVER= ${PYTHON_VER:S/t$//} PYTHON_SUFFIX= ${_PYTHON_VERSION:S/.//g} PYTHON_BASESUFFIX= ${PYTHON_SUFFIX:S/t$//} PYTHON_MAJOR_VER= ${PYTHON_VER:R} PYTHON_REL= # empty PYTHON_ABIVER= # empty PYTHON_PORTSDIR= ${_PYTHON_RELPORTDIR}${PYTHON_SUFFIX} # Protect partial checkouts from Mk/Scripts/functions.sh:export_ports_env(). . if !defined(_PORTS_ENV_CHECK) || exists(${PORTSDIR}/${PYTHON_PORTSDIR}) .include "${PORTSDIR}/${PYTHON_PORTSDIR:S/t$//}/Makefile.version" . endif # Create a 5 integer version string, prefixing 0 to the minor and patch # tokens if it's a single character. Only use the first 3 tokens of # DISTVERSION to stay consistent regardless of pre-release or ABI flags PYTHON_REL= ${PYTHON_DISTVERSION:C/^([0-9]+\.[0-9]+\.[0-9]+).*/\1/:C/\.([0-9])$/.0\1/:C/\.([0-9]\.[0-9]+)/.0\1/:S/.//g} # Might be overridden by calling ports PYTHON_CMD?= ${_PYTHON_BASECMD}${_PYTHON_VERSION} . if ${PYTHON_MAJOR_VER} > 2 . if exists(${PYTHON_CMD}-config) PYTHON_ABIVER!= ${PYTHON_CMD}-config --abiflags . endif . endif . if ${PYTHON_REL} >= 30807 PYTHON_TAG= .cpython-${PYTHON_BASESUFFIX} PYTHON_SOABI= .cpython-${PYTHON_SUFFIX} . else PYTHON_TAG= # empty PYTHON_SOABI= # empty . endif . if ${PYTHON_MAJOR_VER} < 3 DEPRECATED?= Uses Python 2.7 which is EOLed upstream . endif . if !defined(PYTHONBASE) PYTHONBASE!= (${PYTHON_CMD} -c 'import sys; print(sys.prefix)' \ 2> /dev/null || ${ECHO_CMD} ${LOCALBASE}) | ${TAIL} -1 . endif _EXPORTED_VARS+= PYTHONBASE PYTHON_INCLUDEDIR= ${PYTHONBASE}/include/python${_PYTHON_VERSION}${PYTHON_ABIVER} PYTHON_LIBDIR= ${PYTHONBASE}/lib/python${_PYTHON_VERSION} PYTHON_PLATFORM= ${OPSYS:tl}${OSREL:C/\.[0-9.]*//} PYTHON_SITELIBDIR= ${PYTHON_LIBDIR}/site-packages PYTHON_PKGNAMEPREFIX= py${PYTHON_SUFFIX}- PYTHON_PKGNAMESUFFIX= -py${PYTHON_SUFFIX} PYTHONPREFIX_INCLUDEDIR= ${PYTHON_INCLUDEDIR:S;${PYTHONBASE};${PREFIX};} PYTHONPREFIX_LIBDIR= ${PYTHON_LIBDIR:S;${PYTHONBASE};${PREFIX};} PYTHONPREFIX_SITELIBDIR= ${PYTHON_SITELIBDIR:S;${PYTHONBASE};${PREFIX};} # Used for recording the installed files. _PYTHONPKGLIST= ${WRKDIR}/.PLIST.pymodtmp # Ports bound to a certain python version SHOULD # - use the PYTHON_PKGNAMEPREFIX # - use directories using the PYTHON_PKGNAMEPREFIX # - install binaries using the required PYTHON_VER, with # the default python version creating a symlink to the original binary # name (for staging-aware ports). # # What makes a port 'bound' to a certain python version? # - it installs data into PYTHON_SITELIBDIR, PYTHON_INCLUDEDIR, ... # - it links against libpython*.so # - it uses USE_PYTHON=distutils # # cryptography* support . if ${PYCRYPTOGRAPHY_DEFAULT} == rust CRYPTOGRAPHY_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cryptography>=44.0.3,1:security/py-cryptography@${PY_FLAVOR} . else CRYPTOGRAPHY_DEPENDS= ${PYTHON_PKGNAMEPREFIX}cryptography-legacy>=3.4.8_3,1:security/py-cryptography-legacy@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CRYPTOGRAPHY_BUILD) BUILD_DEPENDS+= ${CRYPTOGRAPHY_DEPENDS} . endif . if defined(_PYTHON_FEATURE_CRYPTOGRAPHY) RUN_DEPENDS+= ${CRYPTOGRAPHY_DEPENDS} . endif . if defined(_PYTHON_FEATURE_CRYPTOGRAPHY_TEST) TEST_DEPENDS+= ${CRYPTOGRAPHY_DEPENDS} . endif # cython* support . if defined(_PYTHON_FEATURE_CYTHON) BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CYTHON_RUN) RUN_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CYTHON_TEST) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython>=0.29.37<3:lang/cython@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CYTHON3) BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython3>=3.1.2:lang/cython3@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CYTHON3_RUN) RUN_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython3>=3.1.2:lang/cython3@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CYTHON3_TEST) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}cython3>=3.1.2:lang/cython3@${PY_FLAVOR} . endif . if defined(_PYTHON_FEATURE_CONCURRENT) . if !defined(_PYTHON_FEATURE_FLAVORS) && (${_PYTHON_VERSION_MINIMUM:M3*} || ${_PYTHON_VERSION_MAXIMUM:M2*}) DEV_WARNING+= "USE_PYTHON=concurrent when only one of Python 2 or 3 is supported AND not using flavors does not make any sense" . endif _USES_POST+= uniquefiles:dirs . if defined(_PYTHON_FEATURE_FLAVORS) && ${FLAVOR} == ${FLAVORS:[1]} UNIQUE_DEFAULT_LINKS= yes . elif !defined(_PYTHON_FEATURE_FLAVORS) && ${_PYTHON_VERSION} == ${PYTHON_DEFAULT} UNIQUE_DEFAULT_LINKS= yes . else UNIQUE_DEFAULT_LINKS= no . endif UNIQUE_PREFIX= ${PYTHON_PKGNAMEPREFIX} UNIQUE_SUFFIX= -${PYTHON_VER} UNIQUE_SUFFIX_TYPES+= SUFFIX_MAN UNIQUE_SUFFIX_MAN_WITH_EXT= .[1-9ln] UNIQUE_SUFFIX_MAN_EXTRA_EXT= .gz . if defined(_PYTHON_FEATURE_AUTOPLIST) _UNIQUE_FIND_SUFFIX_FILES= ${SED} -e 's|^${PREFIX}/||' ${_PYTHONPKGLIST} ${TMPPLIST} . else _UNIQUE_FIND_SUFFIX_FILES= ${SED} -e 's|^${PREFIX}/||' ${TMPPLIST} 2>/dev/null . endif UNIQUE_FIND_SUFFIX_FILES+= ${_UNIQUE_FIND_SUFFIX_FILES} | \ ${EGREP} -he '^bin/.*$$|^sbin/.*$$|^libexec/.*$$' UNIQUE_FIND_SUFFIX_MAN_FILES+= ${_UNIQUE_FIND_SUFFIX_FILES} | \ ${EGREP} -he '^man/man[1-9ln]/.*$$|^share/man/man[1-9ln]/.*$$' . endif # defined(_PYTHON_FEATURE_CONCURRENT) _CURRENTPORT:= ${PKGNAMEPREFIX}${PORTNAME}${PKGNAMESUFFIX} . if defined(_PYTHON_FEATURE_DISTUTILS) && \ ${_CURRENTPORT} != ${PYTHON_PKGNAMEPREFIX}setuptools && \ ${_CURRENTPORT} != ${PYTHON_PKGNAMEPREFIX}setuptools58 && \ ${_CURRENTPORT} != ${PYTHON_PKGNAMEPREFIX}setuptools44 . if ${PYTHON_VER} == 2.7 BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}setuptools44>0:devel/py-setuptools44@${PY_FLAVOR} RUN_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}setuptools44>0:devel/py-setuptools44@${PY_FLAVOR} . else BUILD_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}setuptools>=63.1.0:devel/py-setuptools@${PY_FLAVOR} . endif . endif . if defined(_PYTHON_FEATURE_PEP517) . if ${PYTHON_MAJOR_VER} < 3 DEV_ERROR+= "USES=python:2.7 is incompatible with USE_PYTHON=pep517" . endif . if defined(_PYTHON_FEATURE_DISTUTILS) DEV_ERROR+= "USE_PYTHON=distutils is incompatible with USE_PYTHON=pep517" . endif . if defined(_PYTHON_FEATURE_PY3KPLIST) DEV_ERROR+= "USE_PYTHON=py3kplist is incompatible with USE_PYTHON=pep517" . endif . if defined(_PYTHON_FEATURE_NOEGGINFO) DEV_ERROR+= "USE_PYTHON=noegginfo is incompatible with USE_PYTHON=pep517" . endif . endif # distutils support PYSETUP?= setup.py PYDISTUTILS_SETUP?= -c \ "import sys; import setuptools; \ __file__='${PYSETUP}'; sys.argv[0]='${PYSETUP}'; \ exec(compile(open(__file__, 'rb').read().replace(b'\\r\\n', b'\\n'), __file__, 'exec'))" PYDISTUTILS_CONFIGUREARGS?= # empty PYDISTUTILS_BUILDARGS?= # empty PYDISTUTILS_INSTALLARGS?= -c -O1 --prefix=${PREFIX} . if defined(_PYTHON_FEATURE_DISTUTILS) . if !defined(PYDISTUTILS_INSTALLNOSINGLE) PYDISTUTILS_INSTALLARGS+= --single-version-externally-managed . endif PYDISTUTILS_INSTALLARGS+= --root=${STAGEDIR} . endif PYDISTUTILS_INSTALLARGS:= --record ${_PYTHONPKGLIST} \ ${PYDISTUTILS_INSTALLARGS} PYDISTUTILS_PKGNAME?= ${PORTNAME} PYDISTUTILS_PKGVERSION?=${PORTVERSION} PYDISTUTILS_EGGINFO?= ${PYDISTUTILS_PKGNAME:C/[^A-Za-z0-9.]+/_/g}-${PYDISTUTILS_PKGVERSION:C/[^A-Za-z0-9.]+/_/g}-py${PYTHON_VER}.egg-info PYDISTUTILS_EGGINFODIR?=${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} # PEP-517 support PEP517_BUILD_CMD?= ${PYTHON_CMD} -m build --no-isolation --wheel ${PEP517_BUILD_CONFIG_SETTING} PEP517_BUILD_DEPEND?= ${PYTHON_PKGNAMEPREFIX}build>=0:devel/py-build@${PY_FLAVOR} PEP517_INSTALL_CMD?= ${PYTHON_CMD} -m installer --destdir ${STAGEDIR} --prefix ${PREFIX} ${BUILD_WRKSRC}/dist/${PORTNAME:C|[-_]+|_|g}-${DISTVERSION}*.whl PEP517_INSTALL_DEPEND?= ${PYTHON_PKGNAMEPREFIX}installer>=0:devel/py-installer@${PY_FLAVOR} # nose support . if defined(_PYTHON_FEATURE_NOSE) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}nose>=0:devel/py-nose@${PY_FLAVOR} . endif # nose2 support . if defined(_PYTHON_FEATURE_NOSE2) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}nose2>=0:devel/py-nose2@${PY_FLAVOR} . endif # pytest support . if defined(_PYTHON_FEATURE_PYTEST) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}pytest>=7,1:devel/py-pytest@${PY_FLAVOR} PYTEST_BROKEN_TESTS?= # empty PYTEST_IGNORED_TESTS?= # empty _PYTEST_SKIPPED_TESTS?= # empty . if !defined(PYTEST_ENABLE_ALL_TESTS) . if !defined(PYTEST_ENABLE_BROKEN_TESTS) _PYTEST_SKIPPED_TESTS+= ${PYTEST_BROKEN_TESTS} . endif . if !defined(PYTEST_ENABLE_IGNORED_TESTS) _PYTEST_SKIPPED_TESTS+= ${PYTEST_IGNORED_TESTS} . endif . endif # !defined(PYTEST_ENABLE_ALL_TESTS) _PYTEST_FILTER_EXPRESSION= ${_PYTEST_SKIPPED_TESTS:C/^(.)/and not \1/:tW:C/^and //} . endif # defined(_PYTHON_FEATURE_PYTEST) # unittest2 support . if defined(_PYTHON_FEATURE_UNITTEST2) TEST_DEPENDS+= ${PYTHON_PKGNAMEPREFIX}unittest2>=0:devel/py-unittest2@${PY_FLAVOR} . endif . if !defined(_PYTHON_FEATURE_NOEGGINFO) && \ !defined(_PYTHON_FEATURE_AUTOPLIST) && \ defined(_PYTHON_FEATURE_DISTUTILS) && \ defined(PYTHON_REL) _USES_stage+= 933:add-plist-egginfo add-plist-egginfo: . for egginfo in ${PYDISTUTILS_EGGINFO} if [ -d "${PYDISTUTILS_EGGINFODIR}/${egginfo}" ]; then \ ${LS} ${PYDISTUTILS_EGGINFODIR}/${egginfo} | while read f; do \ ${ECHO_CMD} ${PYDISTUTILS_EGGINFODIR:S;^${STAGEDIR}${PREFIX}/;;}/${egginfo}/$${f} >> ${TMPPLIST}; \ done; \ fi; . endfor . endif . if defined(_PYTHON_FEATURE_AUTOPLIST) && (defined(_PYTHON_FEATURE_DISTUTILS) || defined(_PYTHON_FEATURE_PEP517)) _RELSITELIBDIR= ${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;} _RELLIBDIR= ${PYTHONPREFIX_LIBDIR:S;${PREFIX}/;;} _USES_stage+= 934:add-plist-pymod add-plist-pymod: @${SED} -e 's|^"\(.*\)"$$|\1|' \ -e 's|^${STAGEDIR}${PREFIX}/||' \ -e 's|^${PREFIX}/||' \ -e 's|^\(man/.*man[0-9]\)/\(.*\.[0-9]\)$$|\1/\2.gz|' \ -e 's|^\(share/man/.*man[0-9]\)/\(.*\.[0-9]\)$$|\1/\2.gz|' \ -e 's|[[:alnum:]|[:space:]]*/\.\./*||g; s|/\./|/|g' \ ${_PYTHONPKGLIST} | ${SORT} >> ${TMPPLIST} . else . if ${PYTHON_REL} >= 30200 && defined(_PYTHON_FEATURE_PY3KPLIST) # When Python version is 3.2+ we rewrite all the filenames # of TMPPLIST that end with .py[co], so that they conform # to PEP 3147 (see https://www.python.org/dev/peps/pep-3147/) _PYMAGICTAG= ${PYTHON_CMD} -c 'import sys; print(sys.implementation.cache_tag)' _USES_stage+= 935:add-plist-python add-plist-python: @${AWK} '\ /\.py[co]$$/ && !($$0 ~ "/" pc "/") {id = match($$0, /\/[^\/]+\.py[co]$$/); if (id != 0) {d = substr($$0, 1, RSTART - 1); dirs[d] = 1}; sub(/\.pyc$$/, "." mt "&"); sub(/\.pyo$$/, "." mt "." pyo); sub(/[^\/]+\.py[co]$$/, pc "/&"); print; next} \ /^@dirrm / {d = substr($$0, 8); if (d in dirs) {print $$0 "/" pc}; print $$0; next} \ /^@dirrmtry / {d = substr($$0, 11); if (d in dirs) {print $$0 "/" pc}; print $$0; next} \ {print} \ ' \ pc="__pycache__" mt="$$(${_PYMAGICTAG})" pyo="opt-1.pyc" \ ${TMPPLIST} > ${TMPPLIST}.pyc_tmp @${MV} ${TMPPLIST}.pyc_tmp ${TMPPLIST} . endif # ${PYTHON_REL} >= 30200 && defined(_PYTHON_FEATURE_PY3KPLIST) . endif # defined(_PYTHON_FEATURE_AUTOPLIST) && (defined(_PYTHON_FEATURE_DISTUTILS) || defined(_PYTHON_FEATURE_PEP517)) # Fix for programs that build python from a GNU auto* environment CONFIGURE_ENV+= PYTHON="${PYTHON_CMD}" # By default CMake picks up the highest available version of Python package. # Enforce the version required by the port or the default. CMAKE_ARGS+= -DPython_ADDITIONAL_VERSIONS=${PYTHON_VER} CMAKE_ARGS+= -DPython_EXECUTABLE:FILEPATH="${PYTHON_CMD}" CMAKE_ARGS+= -DPython${PYTHON_MAJOR_VER}_EXECUTABLE:FILEPATH="${PYTHON_CMD}" # Python 3rd-party modules PYGAME= ${PYTHON_PKGNAMEPREFIX}game>0:devel/py-game@${PY_FLAVOR} PYNUMPY= ${PYTHON_PKGNAMEPREFIX}numpy>=1.16,1<1.27,1:math/py-numpy@${PY_FLAVOR} . if defined(_PYTHON_FEATURE_DISTUTILS) . if ${PYTHON_MAJOR_VER} < 3 PY_SETUPTOOLS= ${PYTHON_PKGNAMEPREFIX}setuptools44>0:devel/py-setuptools44@${PY_FLAVOR} . else #PY_SETUPTOOLS= ${PYTHON_PKGNAMEPREFIX}setuptools58>0:devel/py-setuptools58@${PY_FLAVOR} PY_SETUPTOOLS= ${PYTHON_PKGNAMEPREFIX}setuptools>0:devel/py-setuptools@${PY_FLAVOR} . endif . else PY_SETUPTOOLS= ${PYTHON_PKGNAMEPREFIX}setuptools>0:devel/py-setuptools@${PY_FLAVOR} . endif # Common Python modules that can be needed but only for some versions of Python. . if ${PYTHON_REL} < 31100 PY_EXCEPTIONGROUP= ${PYTHON_PKGNAMEPREFIX}exceptiongroup>=1.1.1:devel/py-exceptiongroup@${PY_FLAVOR} PY_TOMLI= ${PYTHON_PKGNAMEPREFIX}tomli>=2.3<3:textproc/py-tomli@${PY_FLAVOR} PY_TYPING_EXTENSIONS= ${PYTHON_PKGNAMEPREFIX}typing-extensions>0:devel/py-typing-extensions@${PY_FLAVOR} . endif . if ${PYTHON_REL} >= 30000 PY_PILLOW= ${PYTHON_PKGNAMEPREFIX}pillow>=7.0.0:graphics/py-pillow@${PY_FLAVOR} . endif . if ${PYTHON_VER} != ${PYTHON_DEFAULT} PY_MERCURIAL= ${PYTHON_PKGNAMEPREFIX}mercurial>=5.9:devel/mercurial@${PY_FLAVOR} . else PY_MERCURIAL= mercurial>=5.9:devel/mercurial@${PY_FLAVOR} . endif CMAKE_ARGS+= -DBOOST_PYTHON_SUFFIX:STRING=${PYTHON_SUFFIX} PY_BOOST_LIB= boost_python${PYTHON_SUFFIX} PY_BOOST= lib${PY_BOOST_LIB}.so:devel/boost-python-libs@${PY_FLAVOR} # dependencies . for _stage in PATCH BUILD RUN TEST . if defined(_PYTHON_${_stage}_DEP) ${_stage}_DEPENDS+= ${PYTHON_CMD}:${PYTHON_PORTSDIR} . endif . endfor # set $PREFIX as Python's one . if defined(_PYTHON_FEATURE_PYTHONPREFIX) PREFIX= ${PYTHONBASE} . endif # Substitutions for SUB_FILES SUB_LIST+= PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR} \ PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR} \ PYTHON_PLATFORM=${PYTHON_PLATFORM} \ PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR} \ PYTHON_SUFFIX=${PYTHON_SUFFIX} \ PYTHON_BASESUFFIX=${PYTHON_BASESUFFIX} \ PYTHON_TAG=${PYTHON_TAG} \ PYTHON_SOABI=${PYTHON_SOABI} \ PYTHON_VER=${PYTHON_VER} \ PYTHON_BASEVER=${PYTHON_BASEVER} \ PYTHON_VERSION=${PYTHON_VERSION} # Substitutions for pkg-plist # Use a short form of the PYTHONPREFIX_*DIR variables; we don't need the # base directory in the plist file. PLIST_SUB+= PYTHON_INCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR:S;${PREFIX}/;;} \ PYTHON_LIBDIR=${PYTHONPREFIX_LIBDIR:S;${PREFIX}/;;} \ PYTHON_PLATFORM=${PYTHON_PLATFORM} \ PYTHON_SITELIBDIR=${PYTHONPREFIX_SITELIBDIR:S;${PREFIX}/;;} \ PYTHON_SUFFIX=${PYTHON_SUFFIX} \ PYTHON_BASESUFFIX=${PYTHON_BASESUFFIX} \ PYTHON_TAG=${PYTHON_TAG} \ PYTHON_SOABI=${PYTHON_SOABI} \ PYTHON_VER=${PYTHON_VER} \ PYTHON_BASEVER=${PYTHON_BASEVER} \ PYTHON_VERSION=${PYTHON_VERSION} . if ${PYTHON_MAJOR_VER} < 3 SUB_LIST+= PYTHON2="" PYTHON3="@comment " PLIST_SUB+= PYTHON2="" PYTHON3="@comment " . else SUB_LIST+= PYTHON2="@comment " PYTHON3="" PLIST_SUB+= PYTHON2="@comment " PYTHON3="" . endif _USES_POST+= python .endif # _INCLUDE_USES_PYTHON_MK .if defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_PYTHON_POST_MK) _INCLUDE_USES_PYTHON_POST_MK= yes # py-distutils support PYDISTUTILS_CONFIGURE_TARGET?= config PYDISTUTILS_BUILD_TARGET?= build PYDISTUTILS_INSTALL_TARGET?= install . if defined(_PYTHON_FEATURE_DISTUTILS) LDSHARED?= ${CC} -shared MAKE_ENV+= LDSHARED="${LDSHARED}" PYTHONDONTWRITEBYTECODE= PYTHONOPTIMIZE= . if !target(do-configure) && !defined(HAS_CONFIGURE) && !defined(GNU_CONFIGURE) do-configure: @(cd ${BUILD_WRKSRC}; ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${PYTHON_CMD} ${PYDISTUTILS_SETUP} ${PYDISTUTILS_CONFIGURE_TARGET} ${PYDISTUTILS_CONFIGUREARGS}) . endif . if !target(do-build) do-build: @(cd ${BUILD_WRKSRC}; ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${PYTHON_CMD} ${PYDISTUTILS_SETUP} ${PYDISTUTILS_BUILD_TARGET} ${PYDISTUTILS_BUILDARGS}) . endif . if !target(do-install) do-install: @(cd ${INSTALL_WRKSRC}; ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${PYTHON_CMD} ${PYDISTUTILS_SETUP} ${PYDISTUTILS_INSTALL_TARGET} ${PYDISTUTILS_INSTALLARGS}) . endif . endif # defined(_PYTHON_FEATURE_DISTUTILS) . if defined(_PYTHON_FEATURE_PEP517) . if !empty(PEP517_BUILD_DEPEND) BUILD_DEPENDS+= ${PEP517_BUILD_DEPEND} . endif . if !empty(PEP517_INSTALL_DEPEND) BUILD_DEPENDS+= ${PEP517_INSTALL_DEPEND} . endif . if !target(do-configure) && !defined(HAS_CONFIGURE) && !defined(GNU_CONFIGURE) do-configure: @${DO_NADA} . endif . if !target(do-build) do-build: @cd ${BUILD_WRKSRC} && ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${PEP517_BUILD_CMD} . endif . if !target(do-install) do-install: @${MKDIR} ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR} @cd ${INSTALL_WRKSRC} && ${SETENVI} ${WRK_ENV} ${MAKE_ENV} ${PEP517_INSTALL_CMD} @${PYTHON_CMD} -B ${PORTSDIR}/Mk/Scripts/strip_RECORD.py \ ${STAGEDIR}${PYTHONPREFIX_SITELIBDIR}/${PORTNAME:C|[-_]+|_|g}-${DISTVERSION}*.dist-info/RECORD >> ${_PYTHONPKGLIST} @${REINPLACE_CMD} \ -e '/\.pyc$$/d' \ -e 's|^|${PYTHONPREFIX_SITELIBDIR}/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../etc/|etc/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../bin/|bin/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../include/|include/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../lib/|lib/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../libdata/|libdata/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../libexec/|libexec/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../man/|man/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../sbin/|sbin/|' \ -e 's|^${PYTHONPREFIX_SITELIBDIR}/../../../share/|share/|' \ ${_PYTHONPKGLIST} @cd ${STAGEDIR}${PREFIX} && ${FIND} lib -name '*.pyc' >> ${_PYTHONPKGLIST} . endif . endif # defined(_PYTHON_FEATURE_PEP517) . if defined(_PYTHON_FEATURE_NOSE) . if !target(do-test) do-test: cd ${TEST_WRKSRC} && ${SETENVI} ${WRK_ENV} ${TEST_ENV} ${PYTHON_CMD} -m nose ${TEST_ARGS:NDESTDIR=*} -v . endif . endif # defined(_PYTHON_FEATURE_NOSE) . if defined(_PYTHON_FEATURE_NOSE2) . if !target(do-test) do-test: cd ${TEST_WRKSRC} && ${SETENVI} ${WRK_ENV} ${TEST_ENV} ${PYTHON_CMD} -m nose2 ${TEST_ARGS:NDESTDIR=*} -v . endif . endif # defined(_PYTHON_FEATURE_NOSE2) . if defined(_PYTHON_FEATURE_PYTEST) . if !target(do-test) do-test: cd ${TEST_WRKSRC} && ${SETENVI} ${WRK_ENV} ${TEST_ENV} ${PYTHON_CMD} -m pytest -k '${_PYTEST_FILTER_EXPRESSION}' -rs -v -o addopts= ${TEST_ARGS:NDESTDIR=*} . endif . endif # defined(_PYTHON_FEATURE_PYTEST) . if defined(_PYTHON_FEATURE_UNITTEST) . if !target(do-test) do-test: cd ${TEST_WRKSRC} && ${SETENVI} ${WRK_ENV} ${TEST_ENV} ${PYTHON_CMD} -m unittest ${TEST_ARGS:NDESTDIR=*} -v . endif . endif # defined(_PYTHON_FEATURE_UNITTEST) . if defined(_PYTHON_FEATURE_UNITTEST2) . if !target(do-test) do-test: cd ${TEST_WRKSRC} && ${SETENVI} ${WRK_ENV} ${TEST_ENV} ${PYTHON_CMD} -m unittest2 ${TEST_ARGS:NDESTDIR=*} -v . endif . endif # defined(_PYTHON_FEATURE_UNITTEST2) .endif # defined(_POSTMKINCLUDED) && !defined(_INCLUDE_USES_PYTHON_POST_MK) diff --git a/Mk/bsd.default-versions.mk b/Mk/bsd.default-versions.mk index f016f1879c02..ce84fd3ec61d 100644 --- a/Mk/bsd.default-versions.mk +++ b/Mk/bsd.default-versions.mk @@ -1,197 +1,197 @@ # MAINTAINER: ports@FreeBSD.org # # Note: before committing to this file, contact portmgr to arrange for an # experimental ports run. Untested commits may be backed out at portmgr's # discretion. # # Provide default versions for ports with multiple versions selectable # by the user. # # Users who want to override these defaults can easily do so by defining # DEFAULT_VERSIONS in their make.conf as follows: # # DEFAULT_VERSIONS= perl5=5.20 ruby=3.1 .if !defined(_INCLUDE_BSD_DEFAULT_VERSIONS_MK) _INCLUDE_BSD_DEFAULT_VERSIONS_MK= yes LOCALBASE?= /usr/local . for lang in APACHE BDB COROSYNC EBUR128 EMACS FIREBIRD FORTRAN FPC GCC \ GHOSTSCRIPT GL GO GUILE IMAGEMAGICK JAVA LAZARUS LIBRSVG2 LINUX LLVM \ LUA LUAJIT MONO MYSQL NINJA NODEJS OPENLDAP PERL5 PGSQL PHP \ PYCRYPTOGRAPHY PYTHON PYTHON2 RUBY RUST SAMBA SSL TCLTK VARNISH . if defined(${lang}_DEFAULT) ERROR+= "The variable ${lang}_DEFAULT is set and it should only be defined through DEFAULT_VERSIONS+=${lang:tl}=${${lang}_DEFAULT} in /etc/make.conf" . endif #.undef ${lang}_DEFAULT . endfor . for lang in ${DEFAULT_VERSIONS} _l= ${lang:C/=.*//g} ${_l:tu}_DEFAULT= ${lang:C/.*=//g} . endfor # Possible values: 2.4 APACHE_DEFAULT?= 2.4 # Possible values: 5, 18 BDB_DEFAULT?= 5 # Possible values: 2, 3 COROSYNC_DEFAULT?= 3 # Possible values: rust, legacy . if empty(ARCH:Naarch64:Namd64:Narmv7:Ni386:Npowerpc64:Npowerpc64le:Npowerpc:Nriscv64) EBUR128_DEFAULT?= rust . else EBUR128_DEFAULT?= legacy . endif # Possible_values: full canna nox devel_full devel_nox #EMACS_DEFAULT?= let the flavor be the default if not explicitly set # Possible values: 3.0, 4.0 FIREBIRD_DEFAULT?= 3.0 # Possible values: gfortran FORTRAN_DEFAULT?= gfortran # Possible values: 3.2.3, 3.3.1 . if (defined(WANT_FPC_DEVEL) && !empty(WANT_FPC_DEVEL)) || ${ARCH:Maarch64} FPC_DEFAULT?= 3.3.1 . else FPC_DEFAULT?= 3.2.3 . endif # Possible values: 12, 13, 14, 15, 16 # (Any other version is completely unsupported and not meant for general use.) GCC_DEFAULT?= 13 # Possible values: 10 GHOSTSCRIPT_DEFAULT?= 10 # Possible values: mesa-libs, mesa-devel GL_DEFAULT?= mesa-libs # Possible values: 1.20, 1.21, 1.22, 1.23, 1.24, 1.25, 1.26-devel GO_DEFAULT?= 1.24 # Possible values: 1.8, 2.2, 3.0 GUILE_DEFAULT?= 2.2 # Possible versions: 6, 7 # Possible flavors: x11, nox11 # (defaults to x11 when not specified) # Format: version[-flavor] # Examples: 6-nox11, 7 IMAGEMAGICK_DEFAULT?= 7 # Possible values: 8, 11, 17, 18, 19, 20, 21, 22, 23, 24, 25 JAVA_DEFAULT?= 8 # Possible values: 4.2, 4.99 . if (defined(WANT_LAZARUS_DEVEL) && !empty(WANT_LAZARUS_DEVEL)) || ${ARCH:Maarch64} LAZARUS_DEFAULT?= 4.99 . else LAZARUS_DEFAULT?= 4.2 . endif # Possible values: rust, legacy . if empty(ARCH:Naarch64:Namd64:Narmv7:Ni386:Npowerpc64:Npowerpc64le:Npowerpc:Nriscv64) LIBRSVG2_DEFAULT?= rust . else LIBRSVG2_DEFAULT?= legacy . endif # Possible values: c7 rl9 . if ${ARCH:Mi386} LINUX_DEFAULT?= c7 . else LINUX_DEFAULT?= rl9 . endif # Possible values: 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, -devel (to be used when non-base compiler is required) LLVM_DEFAULT?= 19 # Possible values: 5.1, 5.2, 5.3, 5.4 LUA_DEFAULT?= 5.4 # Possible values: luajit, luajit-openresty . if ${ARCH:Mpowerpc64*} LUAJIT_DEFAULT?= luajit-openresty . else LUAJIT_DEFAULT?= luajit . endif # Possible values: 5.10, 5.20, 6.8 MONO_DEFAULT?= 5.20 # Possible values: 8.0, 8.4, 9.1, 9.4, 10.6m, 10.11m, 11.4m, 11.8m MYSQL_DEFAULT?= 8.0 # Possible values: ninja, samurai NINJA_DEFAULT?= ninja # Possible value: 20, 22, 24, 25, current, lts (Note: current = 24 and lts = 22) NODEJS_DEFAULT?= lts # Possible value: 25, 26 OPENLDAP_DEFAULT?= 26 # Possible values: 5.38, 5.40, 5.42, devel . if !exists(${LOCALBASE}/bin/perl) || (!defined(_PORTS_ENV_CHECK) && \ defined(PACKAGE_BUILDING)) # When changing the default here, make sure the DEPRECATED/EXPIRATION lines in # the older Perl 5 ports are uncommented at the same time. PERL5_DEFAULT?= 5.42 . elif !defined(PERL5_DEFAULT) # There's no need to replace development versions, like "5.23" with "devel" # because 1) nobody is supposed to use it outside of poudriere, and 2) it must # be set manually in /etc/make.conf in the first place, and we're never getting # in here. . if !defined(_PERL5_FROM_BIN) _PERL5_FROM_BIN!= ${LOCALBASE}/bin/perl -e 'printf "%vd\n", $$^V;' . endif _EXPORTED_VARS+= _PERL5_FROM_BIN PERL5_DEFAULT:= ${_PERL5_FROM_BIN:R} . endif # Possible values: 13, 14, 15, 16, 17, 18 PGSQL_DEFAULT?= 17 # Possible values: 8.1, 8.2, 8.3, 8.4, 8.5 PHP_DEFAULT?= 8.3 # Possible values: rust, legacy . if empty(ARCH:Naarch64:Namd64:Narmv7:Ni386:Npowerpc64:Npowerpc64le:Npowerpc:Nriscv64) PYCRYPTOGRAPHY_DEFAULT?= rust . else PYCRYPTOGRAPHY_DEFAULT?= legacy . endif -# Possible values: 3.10, 3.11, 3.12, 3.14 +# Possible values: 3.10, 3.11, 3.12, 3.13, 3.14 PYTHON_DEFAULT?= 3.11 # Possible values: 2.7 PYTHON2_DEFAULT?= 2.7 # Possible values: 3.2, 3.3, 3.4, 3.5 RUBY_DEFAULT?= 3.3 # Possible values: rust, rust-nightly RUST_DEFAULT?= rust # Possible values: 4.16, 4.19, 4.20, 4.22 SAMBA_DEFAULT?= 4.16 # When updating this, please also update the same list in ssl.mk and the checks # for USES=ssl in qa.sh! # Possible values: base, openssl, openssl111, openssl33, openssl34, openssl35, # openssl36, libressl, libressl-devel . if !defined(SSL_DEFAULT) # If no preference was set, check for an installed base version # but give an installed port preference over it. . if !defined(SSL_DEFAULT) && \ !exists(${DESTDIR}/${LOCALBASE}/lib/libcrypto.so) && \ exists(${DESTDIR}/usr/include/openssl/opensslv.h) SSL_DEFAULT= base . else . if exists(${DESTDIR}/${LOCALBASE}/lib/libcrypto.so) . if defined(PKG_BIN) # find installed port and use it for dependency . if !defined(OPENSSL_INSTALLED) . if defined(DESTDIR) PKGARGS= -c ${DESTDIR} . else PKGARGS= . endif OPENSSL_INSTALLED!= ${PKG_BIN} ${PKGARGS} which -qo ${LOCALBASE}/lib/libcrypto.so || : . endif . if defined(OPENSSL_INSTALLED) && !empty(OPENSSL_INSTALLED) SSL_DEFAULT:= ${OPENSSL_INSTALLED:T} WARNING+= "You have ${OPENSSL_INSTALLED} installed but do not have DEFAULT_VERSIONS+=ssl=${SSL_DEFAULT} set in your make.conf" . endif . else check-makevars:: @${ECHO_MSG} "You have a ${LOCALBASE}/lib/libcrypto.so file installed, but the framework is unable" @${ECHO_MSG} "to determine what port it comes from." @${ECHO_MSG} "Add DEFAULT_VERSIONS+=ssl= to your /etc/make.conf and try again." @${FALSE} . endif . endif . endif # Make sure we have a default in the end SSL_DEFAULT?= base . endif # Possible values: 8.6, 9.0 TCLTK_DEFAULT?= 8.6 # Possible values: 6, 7 VARNISH_DEFAULT?= 6 .endif diff --git a/lang/Makefile b/lang/Makefile index f5a24ed7f451..3226cac5a73f 100644 --- a/lang/Makefile +++ b/lang/Makefile @@ -1,405 +1,407 @@ COMMENT = Programming languages SUBDIR += abcl SUBDIR += alchemist.el SUBDIR += algol68g SUBDIR += amber SUBDIR += angelscript SUBDIR += antimony SUBDIR += apache-commons-jelly SUBDIR += asm-lsp SUBDIR += asn1c SUBDIR += atlast SUBDIR += awka SUBDIR += bas2tap SUBDIR += basic256 SUBDIR += bend SUBDIR += bsh SUBDIR += bwbasic SUBDIR += c SUBDIR += cairo SUBDIR += cbmbasic SUBDIR += ccl SUBDIR += ceylon SUBDIR += cfortran SUBDIR += chaiscript SUBDIR += chez-scheme SUBDIR += chibi-scheme SUBDIR += chicken SUBDIR += cim SUBDIR += cjs SUBDIR += cling SUBDIR += clips SUBDIR += clisp SUBDIR += clojure SUBDIR += clojure-mode.el SUBDIR += clover SUBDIR += cocor SUBDIR += coffeescript SUBDIR += colm SUBDIR += cparser SUBDIR += crumb SUBDIR += crystal SUBDIR += csharp-mode.el SUBDIR += cython SUBDIR += cython3 SUBDIR += dhall SUBDIR += dlang-tools SUBDIR += dotnet SUBDIR += dotnet-devel SUBDIR += dotnet-host SUBDIR += dotnet8 SUBDIR += duktape SUBDIR += duktape-lib SUBDIR += ecl SUBDIR += eisl SUBDIR += elixir SUBDIR += elixir-devel SUBDIR += elixir-mode.el SUBDIR += elk SUBDIR += elm SUBDIR += emacs-lisp-intro SUBDIR += emilua SUBDIR += erlang SUBDIR += erlang-doc SUBDIR += erlang-java SUBDIR += erlang-man SUBDIR += erlang-runtime21 SUBDIR += erlang-runtime22 SUBDIR += erlang-runtime23 SUBDIR += erlang-runtime24 SUBDIR += erlang-runtime25 SUBDIR += erlang-runtime26 SUBDIR += erlang-runtime27 SUBDIR += erlang-runtime28 SUBDIR += erlang-wx SUBDIR += execline SUBDIR += expect SUBDIR += f2c SUBDIR += fasm SUBDIR += fennel SUBDIR += ficl SUBDIR += fpc SUBDIR += fpc-devel SUBDIR += fpc-devel-source SUBDIR += fpc-docs SUBDIR += fpc-source SUBDIR += fsharp SUBDIR += fth SUBDIR += gambit-c SUBDIR += gauche SUBDIR += gawk SUBDIR += gcc SUBDIR += gcc12 SUBDIR += gcc12-devel SUBDIR += gcc13 SUBDIR += gcc13-devel SUBDIR += gcc14 SUBDIR += gcc14-devel SUBDIR += gcc15 SUBDIR += gcc15-devel SUBDIR += gcc16-devel SUBDIR += gcc6-aux SUBDIR += gforth SUBDIR += ghc SUBDIR += ghc92 SUBDIR += ghc94 SUBDIR += ghc96 SUBDIR += gir-to-d SUBDIR += gjs SUBDIR += gleam SUBDIR += gluon SUBDIR += gnat12 SUBDIR += gnat13 SUBDIR += gnatcross-binutils-aarch64 SUBDIR += gnatcross-sysroot-aarch64 SUBDIR += gnatdroid-binutils SUBDIR += gnatdroid-binutils-x86 SUBDIR += gnatdroid-sysroot SUBDIR += gnatdroid-sysroot-x86 SUBDIR += gnu-apl SUBDIR += gnu-cobol SUBDIR += gnustep-base SUBDIR += go SUBDIR += go-devel SUBDIR += go120 SUBDIR += go121 SUBDIR += go122 SUBDIR += go123 SUBDIR += go124 SUBDIR += go125 SUBDIR += gomacro SUBDIR += gprolog SUBDIR += gptscript SUBDIR += gravity SUBDIR += groovy SUBDIR += gscheme SUBDIR += guile SUBDIR += guile-aclocal SUBDIR += guile1 SUBDIR += guile2 SUBDIR += guile3 SUBDIR += halide SUBDIR += harec SUBDIR += haskell-mode.el SUBDIR += hermes SUBDIR += hla SUBDIR += hs-brainfuck SUBDIR += hs-futhark SUBDIR += hs-koka SUBDIR += hs-unlambda SUBDIR += huc SUBDIR += inko SUBDIR += intel-compute-runtime SUBDIR += intercal SUBDIR += io SUBDIR += io-devel SUBDIR += itcl SUBDIR += itcl4 SUBDIR += janet SUBDIR += jimtcl SUBDIR += jpm SUBDIR += jruby SUBDIR += julia SUBDIR += jython SUBDIR += kawa SUBDIR += kefir SUBDIR += kf5-kross SUBDIR += kotlin SUBDIR += kturtle SUBDIR += lafontaine SUBDIR += lci SUBDIR += ldc SUBDIR += lfe SUBDIR += lfortran SUBDIR += libhx SUBDIR += libobjc2 SUBDIR += librep SUBDIR += libstdc++_stldoc_4.2.2 SUBDIR += linux-c7-tcl85 SUBDIR += linux-j SUBDIR += linux-rl9-python3 SUBDIR += linux-rl9-tcl86 SUBDIR += lua51 SUBDIR += lua52 SUBDIR += lua53 SUBDIR += lua54 SUBDIR += luajit SUBDIR += luajit-openresty SUBDIR += malbolge SUBDIR += maude SUBDIR += mawk SUBDIR += mdk SUBDIR += mecrisp-stellaris SUBDIR += micropython SUBDIR += mit-scheme SUBDIR += mixal SUBDIR += mlkit SUBDIR += mlton SUBDIR += mmix SUBDIR += mono SUBDIR += mono-basic SUBDIR += mono5.10 SUBDIR += mono5.20 SUBDIR += mono6.8 SUBDIR += mosh SUBDIR += mosml SUBDIR += mtasc SUBDIR += mujs SUBDIR += munger SUBDIR += myrddin SUBDIR += nawk SUBDIR += nbfc SUBDIR += neocmakelsp SUBDIR += nesasm SUBDIR += newlisp SUBDIR += nickle SUBDIR += nim SUBDIR += njs SUBDIR += nll SUBDIR += nqc SUBDIR += numbat SUBDIR += nwcc SUBDIR += nx SUBDIR += nyan SUBDIR += ocaml SUBDIR += ocaml-autoconf SUBDIR += ocaml-camlidl SUBDIR += odin SUBDIR += oo2c SUBDIR += opencoarrays SUBDIR += opensycl SUBDIR += ott SUBDIR += owl-lisp SUBDIR += p5-Data-JavaScript SUBDIR += p5-Error SUBDIR += p5-Expect SUBDIR += p5-ExtUtils-F77 SUBDIR += p5-Interpolation SUBDIR += p5-JSAN SUBDIR += p5-JavaScript-QuickJS SUBDIR += p5-JavaScript-Squish SUBDIR += p5-JavaScript-Value-Escape SUBDIR += p5-List-MoreUtils SUBDIR += p5-List-MoreUtils-XS SUBDIR += p5-Marpa SUBDIR += p5-Marpa-PP SUBDIR += p5-Marpa-XS SUBDIR += p5-Modern-Perl SUBDIR += p5-Perl6-Subs SUBDIR += p5-Promises SUBDIR += p5-Pugs-Compiler-Rule SUBDIR += p5-Quantum-Superpositions SUBDIR += p5-Scalar-List-Utils SUBDIR += p5-Switch SUBDIR += p5-Tcl SUBDIR += p5-Test-XPath SUBDIR += p5-Try-Catch SUBDIR += p5-Try-Tiny SUBDIR += p5-Try-Tiny-Retry SUBDIR += p5-TryCatch SUBDIR += p5-ePerl SUBDIR += p5-signatures SUBDIR += p5-v6 SUBDIR += pbasic SUBDIR += pcc SUBDIR += perl5-devel SUBDIR += perl5.38 SUBDIR += perl5.40 SUBDIR += perl5.42 SUBDIR += petite-chez SUBDIR += pfe SUBDIR += pharo SUBDIR += php-mode.el SUBDIR += php81 SUBDIR += php81-extensions SUBDIR += php82 SUBDIR += php82-extensions SUBDIR += php83 SUBDIR += php83-extensions SUBDIR += php84 SUBDIR += php84-extensions SUBDIR += php85 SUBDIR += php85-extensions SUBDIR += picoc SUBDIR += picolisp SUBDIR += pkl SUBDIR += plexil SUBDIR += pocl SUBDIR += polyml SUBDIR += pomsky SUBDIR += prql SUBDIR += ptoc SUBDIR += purescript SUBDIR += py-dhall SUBDIR += py-gherkin-official SUBDIR += py-hy SUBDIR += py-lupa SUBDIR += py-sly SUBDIR += py-textX SUBDIR += python SUBDIR += python-doc-html SUBDIR += python-doc-pdf-a4 SUBDIR += python-doc-text SUBDIR += python-mode.el SUBDIR += python-tools SUBDIR += python2 SUBDIR += python27 SUBDIR += python3 SUBDIR += python310 SUBDIR += python311 SUBDIR += python312 + SUBDIR += python313 + SUBDIR += python313t SUBDIR += python314 SUBDIR += qmasm SUBDIR += quickjs SUBDIR += quickjs-ng SUBDIR += quilc SUBDIR += racket SUBDIR += racket-minimal SUBDIR += ratfor SUBDIR += referenceassemblies-pcl SUBDIR += retro12 SUBDIR += rexx-imc SUBDIR += rexx-regina SUBDIR += rexx-regutil SUBDIR += rexx-wrapper SUBDIR += rhino SUBDIR += rizin SUBDIR += rizin-cutter SUBDIR += ruby32 SUBDIR += ruby33 SUBDIR += ruby34 SUBDIR += ruby35 SUBDIR += rubygem-rb_sys SUBDIR += rubygem-ruby_language_server SUBDIR += runawk SUBDIR += rust SUBDIR += rust-bootstrap SUBDIR += rust-nightly SUBDIR += rust188 SUBDIR += rustpython SUBDIR += s7 SUBDIR += s7-nrepl SUBDIR += sagittarius-scheme SUBDIR += sather-specification SUBDIR += sather-tutorial SUBDIR += sbcl SUBDIR += scala SUBDIR += scheme48 SUBDIR += scm SUBDIR += scratch SUBDIR += scryer-prolog SUBDIR += sdcc SUBDIR += see SUBDIR += seed7 SUBDIR += silq SUBDIR += siod SUBDIR += sisc SUBDIR += sketchy SUBDIR += slib SUBDIR += slib-guile SUBDIR += slisp SUBDIR += smalltalk SUBDIR += smlnj SUBDIR += snobol4 SUBDIR += solidity SUBDIR += spidermonkey102 SUBDIR += spidermonkey115 SUBDIR += spidermonkey128 SUBDIR += spidermonkey78 SUBDIR += spidermonkey91 SUBDIR += squeak SUBDIR += squirrel SUBDIR += starlark-rust SUBDIR += swift510 SUBDIR += swipl SUBDIR += tauthon SUBDIR += tcbasic SUBDIR += tcc SUBDIR += tcl-manual SUBDIR += tcl-wrapper SUBDIR += tcl86 SUBDIR += tcl90 SUBDIR += tclX SUBDIR += tolua SUBDIR += tolua++ SUBDIR += trealla-prolog SUBDIR += tuareg-mode.el SUBDIR += typescript SUBDIR += typstfmt SUBDIR += typstyle SUBDIR += ucc SUBDIR += urweb SUBDIR += v SUBDIR += v8 SUBDIR += v8-beta SUBDIR += vala SUBDIR += voc SUBDIR += yabasic SUBDIR += yap SUBDIR += yorick SUBDIR += ypsilon SUBDIR += zephir SUBDIR += zig .include diff --git a/lang/python313/Makefile b/lang/python313/Makefile new file mode 100644 index 000000000000..9583def19644 --- /dev/null +++ b/lang/python313/Makefile @@ -0,0 +1,181 @@ +PORTNAME= python +DISTVERSION= ${PYTHON_DISTVERSION} +CATEGORIES= lang python +MASTER_SITES= PYTHON/ftp/python/${DISTVERSION:C/[a-z].*//} +PKGNAMESUFFIX= ${PYTHON_BASESUFFIX}${THREADFLAG} +DISTNAME= Python-${DISTVERSION} +DIST_SUBDIR= python + +MAINTAINER= python@FreeBSD.org +COMMENT= Interpreted object-oriented programming language +WWW= https://www.python.org/ + +LICENSE= PSFL + +LIB_DEPENDS= libffi.so:devel/libffi +TEST_DEPENDS= gdb:devel/gdb + +USES= compiler:c11 cpe ncurses pathfix pkgconfig \ + python:${PYTHON_DISTVERSION:R},env readline shebangfix ssl tar:xz +PATHFIX_MAKEFILEIN= Makefile.pre.in +USE_LDCONFIG= yes +GNU_CONFIGURE= yes +python_CMD= ${PREFIX}/bin/python${PYTHON_DISTVERSION:R} +SHEBANG_GLOB= *.py* +SHEBANG_FILES= Lib/test/archivetestdata/exe_with_z64 \ + Lib/test/archivetestdata/exe_with_zip \ + Lib/test/archivetestdata/header.sh + +DISABLED_EXTENSIONS= _sqlite3 _tkinter _gdbm +CONFIGURE_ARGS+= --enable-shared --without-ensurepip +CONFIGURE_ENV+= OPT="" # Null out OPT to respect user CFLAGS and remove optimizations + +INSTALL_TARGET= altinstall # Don't want cloberring of unprefixed files + +TEST_TARGET= test +TEST_ARGS= TESTOPTS=-j${MAKE_JOBS_NUMBER} + +MAKE_ARGS+= INSTALL_SHARED="${INSTALL_LIB}" # Strip shared library + +SUB_FILES= pkg-message +SUB_LIST= PYTHON_SUFFIX=${PYTHON_BASESUFFIX}${THREADFLAG} + +PLIST_SUB= ABI=${ABIFLAGS} \ + THREAD=${THREADFLAG} \ + PYTHON_BASEINCLUDEDIR=${PYTHONPREFIX_INCLUDEDIR:S;${PREFIX}/;;:S;${PYTHON_VER};${PYTHON_BASEVER};} \ + PYTHON_BASELIBDIR=${PYTHONPREFIX_LIBDIR:S;${PREFIX}/;;:S;${PYTHON_VER};${PYTHON_BASEVER};} \ + PYTHON_BASESOABI=${PYTHON_SOABI:S;${PYTHON_SUFFIX};${PYTHON_BASESUFFIX};}${THREADFLAG} \ + DISTVERSION=${DISTVERSION} \ + OSMAJOR=${OSVERSION:C/([0-9]*)[0-9]{5}/\1/} # For plat-freebsd* in pkg-plist. https://bugs.python.org/issue19554 + +OPTIONS_DEFINE= DEBUG IPV6 LIBMPDEC LTO NLS PYMALLOC +OPTIONS_DEFAULT= LIBMPDEC LTO PYMALLOC +OPTIONS_EXCLUDE_riscv64= LTO +OPTIONS_EXCLUDE_powerpc64le= LTO +OPTIONS_RADIO= HASH +OPTIONS_RADIO_HASH= FNV SIPHASH +OPTIONS_GROUP= EXPERIMENTAL +OPTIONS_GROUP_EXPERIMENTAL= JIT +OPTIONS_SUB= yes + +LIBMPDEC_DESC= Use libmpdec from ports instead of bundled version +NLS_DESC= Enable gettext support for the locale module +PYMALLOC_DESC= Enable specialized mallocs + +HASH_DESC= Hash Algorithm (PEP-456) +FNV_DESC= Modified Fowler-Noll-Vo Algorithm +SIPHASH_DESC= SipHash24 Algorithm + +EXPERIMENTAL_DESC= Experimental features +JIT_DESC= Enable just-in-time compiler + +FNV_CONFIGURE_ON= --with-hash-algorithm=fnv +SIPHASH_CONFIGURE_ON= --with-hash-algorithm=siphash24 + +JIT_CONFIGURE_ENABLE= experimental-jit + +DEBUG_CONFIGURE_WITH= pydebug +IPV6_CONFIGURE_ENABLE= ipv6 + +LIBMPDEC_CONFIGURE_ON= --with-system-libmpdec +LIBMPDEC_LIB_DEPENDS= libmpdec.so:math/mpdecimal + +LTO_CONFIGURE_ON= --with-lto + +# Use CPPFLAGS over CFLAGS due to -I ordering, causing elementtree and pyexpat +# to break in Python 2.7, or preprocessor complaints in Python >= 3.3 +# Upstream Issue: https://bugs.python.org/issue6299 +NLS_USES= gettext +NLS_CPPFLAGS= -I${LOCALBASE}/include +NLS_LIBS= -L${LOCALBASE}/lib -lintl +NLS_CONFIGURE_ENV_OFF= ac_cv_lib_intl_textdomain=no ac_cv_header_libintl_h=no + +PYMALLOC_CONFIGURE_WITH= pymalloc + +MASTERDIR?= ${.CURDIR} +CONFLICTS_INSTALL?= python313t +.include "${MASTERDIR}/Makefile.version" +.include + +.if ${PORT_OPTIONS:MDEBUG} +ABIFLAGS:= d${ABIFLAGS} +.endif + +# Python 3.11 or newer is required to build the JIT +.if ${PORT_OPTIONS:MJIT} +. if ${PYTHON_DEFAULT:S/t$//} == 3.13 || ${PYTHON_DEFAULT:S/t$//} < 3.11 +BUILD_DEPENDS+= python3.12:lang/python312 +. else +BUILD_DEPENDS+= python${PYTHON_DEFAULT}:lang/python${PYTHON_DEFAULT:S/.//g} +. endif +.endif + +.if !empty(ABIFLAGS) || !empty(THREADFLAG) +PLIST_FILES+= bin/python${PYTHON_BASEVER}${THREADFLAG}${ABIFLAGS} \ + bin/python${PYTHON_BASEVER}${THREADFLAG}${ABIFLAGS}-config +.endif + +# See https://bugs.freebsd.org/115940 and https://bugs.freebsd.org/193650 +.if !exists(/usr/bin/ypcat) || defined(WITHOUT_NIS) +PLIST_SUB+= NO_NIS="@comment " +DISABLED_EXTENSIONS+= nis +.else +PLIST_SUB+= NO_NIS="" +.endif + +.if ${SSL_DEFAULT:Mlibressl*} +EXTRA_PATCHES+= ${PATCHDIR}/libressl +CONFIGURE_ENV+= ac_cv_working_openssl_hashlib=yes +.endif + +.include + +# llvm17 with -flto=thin makes Programs/_freeze_module crash on armv7; workaround +# cf. https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=276249 +.if ${ARCH} == armv7 && ${CHOSEN_COMPILER_TYPE} == clang && ${COMPILER_VERSION} >= 170 && \ + ${COMPILER_VERSION} < 180 +CONFIGURE_ARGS:= ${CONFIGURE_ARGS:N${LTO_CONFIGURE_ON}} +.endif + +post-patch: +# disable the detection of includes and library from libuuid, +# which introduces hidden dependency and breaks build + @${REINPLACE_CMD} -e 's|uuid/uuid.h|ignore_&|' ${WRKSRC}/configure + +# disable detection of multiarch as it breaks with clang >= 13, which adds a +# major.minor version number in -print-multiarch output, confusing Python + @${REINPLACE_CMD} -e 's|^\( *MULTIARCH=\).*--print-multiarch.*|\1|' ${WRKSRC}/configure +# Apply DISABLED_EXTENSIONS + @${ECHO_CMD} '*disabled*' > ${WRKSRC}/Modules/Setup.local +. for _module in ${DISABLED_EXTENSIONS} + @${ECHO_CMD} ${_module} >> ${WRKSRC}/Modules/Setup.local +. endfor + +post-install: +.if ! ${PORT_OPTIONS:MDEBUG} + ${RM} ${STAGEDIR}${PREFIX}/lib/libpython3.so # Upstream Issue: https://bugs.python.org/issue17975 +.endif + ${LN} -sf libpython${PYTHON_BASEVER}${THREADFLAG}${ABIFLAGS}.so.1.0 ${STAGEDIR}${PREFIX}/lib/libpython${PYTHON_BASEVER}${THREADFLAG}${ABIFLAGS}.so.1 +# This code block exists for the qemu-user enabled cross build environment. +# When using this environment in poudriere, CC is not set to the default +# of /usr/bin/cc and a cross-compile toolchain is used. We need to hand +# edit this so that the run time configuration for python matches what the +# FreeBSD base system provides. sbruno 02Aug2017 +.if ${CC} == /nxb-bin/usr/bin/cc + @${REINPLACE_CMD} -e 's=/nxb-bin==' \ + ${STAGEDIR}${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG}/_sysconfigdata_${THREADFLAG}${ABIFLAGS}_freebsd${OSREL:R}_.py + @cd ${WRKSRC} && ${SETENV} LD_LIBRARY_PATH=${WRKSRC} \ + ./python -E -m compileall -d ${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG} \ + ${STAGEDIR}${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG}/_sysconfigdata_${THREADFLAG}${ABIFLAGS}_freebsd${OSREL:R}_.py + @cd ${WRKSRC} && ${SETENV} LD_LIBRARY_PATH=${WRKSRC} \ + ./python -E -O -m compileall -d ${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG} \ + ${STAGEDIR}${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG}/_sysconfigdata_${THREADFLAG}${ABIFLAGS}_freebsd${OSREL:R}_.py + @${REINPLACE_CMD} -e 's=/nxb-bin==' \ + ${STAGEDIR}${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG}/config-${PYTHON_BASEVER}${ABIFLAGS}/Makefile +.endif + for i in ${STAGEDIR}${PREFIX}/lib/python${PYTHON_BASEVER}${THREADFLAG}/lib-dynload/*.so; do \ + ${STRIP_CMD} $$i; done # Strip shared extensions + ${INSTALL_DATA} ${WRKSRC}/Tools/gdb/libpython.py \ + ${STAGEDIR}${PREFIX}/lib/libpython${PYTHON_BASEVER}${THREADFLAG}${ABIFLAGS}.so.1.0-gdb.py + +.include diff --git a/lang/python313/Makefile.version b/lang/python313/Makefile.version new file mode 100644 index 000000000000..f0d7bbaf82e4 --- /dev/null +++ b/lang/python313/Makefile.version @@ -0,0 +1,7 @@ +# Mk/Uses/python.mk includes this file, don't remove it! + +# Do not forget to +# 1. Update python documentation (lang/python-doc-*) +# Run "make -C lang/python-doc-html makesum" +# 2. Remove PORTREVISION in Makefile +PYTHON_DISTVERSION= 3.13.9 diff --git a/lang/python313/distinfo b/lang/python313/distinfo new file mode 100644 index 000000000000..eba9d22b5e82 --- /dev/null +++ b/lang/python313/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1762008451 +SHA256 (python/Python-3.13.9.tar.xz) = ed5ef34cda36cfa2f3a340f07cac7e7814f91c7f3c411f6d3562323a866c5c66 +SIZE (python/Python-3.13.9.tar.xz) = 22681368 diff --git a/lang/python313/files/libressl/patch-Modules___hashopenssl.c b/lang/python313/files/libressl/patch-Modules___hashopenssl.c new file mode 100644 index 000000000000..405141320e47 --- /dev/null +++ b/lang/python313/files/libressl/patch-Modules___hashopenssl.c @@ -0,0 +1,26 @@ +--- Modules/_hashopenssl.c.orig 2025-02-04 14:51:09 UTC ++++ Modules/_hashopenssl.c +@@ -44,7 +44,9 @@ + + #define MUNCH_SIZE INT_MAX + ++#ifndef LIBRESSL_VERSION_NUMBER + #define PY_OPENSSL_HAS_SCRYPT 1 ++#endif + #if defined(NID_sha3_224) && defined(NID_sha3_256) && defined(NID_sha3_384) && defined(NID_sha3_512) + #define PY_OPENSSL_HAS_SHA3 1 + #endif +@@ -918,9 +920,12 @@ py_evp_fromname(PyObject *module, const char *digestna + goto exit; + } + ++#ifdef PY_OPENSSL_HAS_SHAKE + if ((EVP_MD_flags(digest) & EVP_MD_FLAG_XOF) == EVP_MD_FLAG_XOF) { + type = get_hashlib_state(module)->EVPXOFtype; +- } else { ++ } else ++#endif ++ { + type = get_hashlib_state(module)->EVPtype; + } + diff --git a/lang/python313/files/patch-Makefile.pre.in b/lang/python313/files/patch-Makefile.pre.in new file mode 100644 index 000000000000..74d5e79020ef --- /dev/null +++ b/lang/python313/files/patch-Makefile.pre.in @@ -0,0 +1,62 @@ +--- Makefile.pre.in.orig 2024-06-07 03:15:55 UTC ++++ Makefile.pre.in +@@ -83,7 +83,6 @@ BASECPPFLAGS= @BASECPPFLAGS@ + OPT= @OPT@ + BASECFLAGS= @BASECFLAGS@ + BASECPPFLAGS= @BASECPPFLAGS@ +-CONFIGURE_CFLAGS= @CFLAGS@ + # CFLAGS_NODIST is used for building the interpreter and stdlib C extensions. + # Use it when a compiler flag should _not_ be part of the distutils CFLAGS + # once Python is installed (Issue #21121). +@@ -95,18 +94,16 @@ CONFIGURE_LDFLAGS_NOLTO=@LDFLAGS_NOLTO@ + # LDFLAGS_NOLTO is an extra flag to disable lto. It is used to speed up building + # of _bootstrap_python and _freeze_module tools, which don't need LTO. + CONFIGURE_LDFLAGS_NOLTO=@LDFLAGS_NOLTO@ +-CONFIGURE_CPPFLAGS= @CPPFLAGS@ +-CONFIGURE_LDFLAGS= @LDFLAGS@ + # Avoid assigning CFLAGS, LDFLAGS, etc. so users can use them on the + # command line to append to these values without stomping the pre-set + # values. +-PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CONFIGURE_CFLAGS) $(CFLAGS) $(EXTRA_CFLAGS) ++PY_CFLAGS= $(BASECFLAGS) $(OPT) $(CFLAGS) $(EXTRA_CFLAGS) + PY_CFLAGS_NODIST=$(CONFIGURE_CFLAGS_NODIST) $(CFLAGS_NODIST) -I$(srcdir)/Include/internal -I$(srcdir)/Include/internal/mimalloc + # Both CPPFLAGS and LDFLAGS need to contain the shell's value for setup.py to + # be able to build extension modules using the directories specified in the + # environment variables +-PY_CPPFLAGS= $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CONFIGURE_CPPFLAGS) $(CPPFLAGS) +-PY_LDFLAGS= $(CONFIGURE_LDFLAGS) $(LDFLAGS) ++PY_CPPFLAGS= $(BASECPPFLAGS) -I. -I$(srcdir)/Include $(CPPFLAGS) ++PY_LDFLAGS= $(LDFLAGS) + PY_LDFLAGS_NODIST=$(CONFIGURE_LDFLAGS_NODIST) $(LDFLAGS_NODIST) + PY_LDFLAGS_NOLTO=$(PY_LDFLAGS) $(CONFIGURE_LDFLAGS_NOLTO) $(LDFLAGS_NODIST) + NO_AS_NEEDED= @NO_AS_NEEDED@ +@@ -2258,14 +2255,6 @@ bininstall: commoninstall altbininstall + else true; \ + fi + (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)$(EXE) python3$(EXE)) +- -if test "$(VERSION)" != "$(LDVERSION)"; then \ +- rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-config; \ +- (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \ +- rm -f $(DESTDIR)$(LIBPC)/python-$(VERSION).pc; \ +- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(LDVERSION).pc python-$(VERSION).pc); \ +- rm -f $(DESTDIR)$(LIBPC)/python-$(VERSION)-embed.pc; \ +- (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(LDVERSION)-embed.pc python-$(VERSION)-embed.pc); \ +- fi + -rm -f $(DESTDIR)$(BINDIR)/python3-config + (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(VERSION)-config python3-config) + -rm -f $(DESTDIR)$(LIBPC)/python3.pc +@@ -2708,6 +2697,14 @@ libainstall: all scripts + $(INSTALL_SCRIPT) $(srcdir)/install-sh $(DESTDIR)$(LIBPL)/install-sh + $(INSTALL_SCRIPT) python-config.py $(DESTDIR)$(LIBPL)/python-config.py + $(INSTALL_SCRIPT) python-config $(DESTDIR)$(BINDIR)/python$(LDVERSION)-config ++ -if test "$(VERSION)" != "$(LDVERSION)"; then \ ++ rm -f $(DESTDIR)$(BINDIR)/python$(VERSION)-config; \ ++ (cd $(DESTDIR)$(BINDIR); $(LN) -s python$(LDVERSION)-config python$(VERSION)-config); \ ++ rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION).pc; \ ++ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION).pc python-$(LDVERSION).pc); \ ++ rm -f $(DESTDIR)$(LIBPC)/python-$(LDVERSION)-embed.pc; \ ++ (cd $(DESTDIR)$(LIBPC); $(LN) -s python-$(VERSION)-embed.pc python-$(LDVERSION)-embed.pc); \ ++ fi + $(INSTALL_SCRIPT) $(SCRIPT_IDLE) $(DESTDIR)$(BINDIR)/idle$(VERSION) + $(INSTALL_SCRIPT) $(SCRIPT_PYDOC) $(DESTDIR)$(BINDIR)/pydoc$(VERSION) + @if [ -s Modules/python.exp -a \ diff --git a/lang/python313/files/patch-Misc__python-config.sh.in b/lang/python313/files/patch-Misc__python-config.sh.in new file mode 100644 index 000000000000..ebb0c6a51f6d --- /dev/null +++ b/lang/python313/files/patch-Misc__python-config.sh.in @@ -0,0 +1,11 @@ +--- Misc/python-config.sh.in.orig 2018-07-13 21:07:16 UTC ++++ Misc/python-config.sh.in +@@ -15,7 +15,7 @@ fi + # Returns the actual prefix where this script was installed to. + installed_prefix () + { +- RESULT=$(dirname $(cd $(dirname "$1") && pwd -P)) ++ RESULT=$(dirname $(cd $(dirname $(realpath "$1")) && pwd -P)) + if which readlink >/dev/null 2>&1 ; then + if readlink -f "$RESULT" >/dev/null 2>&1; then + RESULT=$(readlink -f "$RESULT") diff --git a/lang/python313/files/patch-Tools_jit___llvm.py b/lang/python313/files/patch-Tools_jit___llvm.py new file mode 100644 index 000000000000..c002680ed55b --- /dev/null +++ b/lang/python313/files/patch-Tools_jit___llvm.py @@ -0,0 +1,31 @@ +--- Tools/jit/_llvm.py.orig 2025-06-11 15:36:57 UTC ++++ Tools/jit/_llvm.py +@@ -68,20 +68,7 @@ async def _find_tool(tool: str, *, echo: bool = False) + async def _find_tool(tool: str, *, echo: bool = False) -> str | None: + # Unversioned executables: + path = tool +- if await _check_tool_version(path, echo=echo): +- return path +- # Versioned executables: +- path = f"{tool}-{_LLVM_VERSION}" +- if await _check_tool_version(path, echo=echo): +- return path +- # Homebrew-installed executables: +- prefix = await _get_brew_llvm_prefix(echo=echo) +- if prefix is not None: +- path = os.path.join(prefix, "bin", tool) +- if await _check_tool_version(path, echo=echo): +- return path +- # Nothing found: +- return None ++ return path + + + async def maybe_run( +@@ -96,5 +83,5 @@ async def run(tool: str, args: typing.Iterable[str], e + """Run an LLVM tool if it can be found. Otherwise, raise RuntimeError.""" + output = await maybe_run(tool, args, echo=echo) + if output is None: +- raise RuntimeError(f"Can't find {tool}-{_LLVM_VERSION}!") ++ raise RuntimeError(f"Can't find {tool}!") + return output diff --git a/lang/python313/files/patch-Tools_jit___targets.py b/lang/python313/files/patch-Tools_jit___targets.py new file mode 100644 index 000000000000..1e514db1f026 --- /dev/null +++ b/lang/python313/files/patch-Tools_jit___targets.py @@ -0,0 +1,12 @@ +--- Tools/jit/_targets.py.orig 2025-04-08 13:54:08 UTC ++++ Tools/jit/_targets.py +@@ -538,6 +538,9 @@ def get_target(host: str) -> _COFF | _ELF | _MachO: + elif re.fullmatch(r"x86_64-.*-linux-gnu", host): + args = ["-fpic"] + target = _ELF(host, args=args, ghccc=True) ++ elif re.fullmatch(r"amd64-.*-freebsd.*", host): ++ args = ["-fpic"] ++ target = _ELF(host, args=args, ghccc=True) + else: + raise ValueError(host) + return target diff --git a/lang/python313/files/patch-configure b/lang/python313/files/patch-configure new file mode 100644 index 000000000000..d9ab11042299 --- /dev/null +++ b/lang/python313/files/patch-configure @@ -0,0 +1,11 @@ +--- configure.orig 2022-11-02 01:26:00 UTC ++++ configure +@@ -7704,7 +7704,7 @@ if test "$Py_LTO" = 'true' ; then + + if test "$Py_LTO" = 'true' ; then + case $CC in +- *clang*) ++ *clang*|cc) + LDFLAGS_NOLTO="-fno-lto" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -flto=thin" >&5 + $as_echo_n "checking whether C compiler accepts -flto=thin... " >&6; } diff --git a/lang/python313/files/pkg-message.in b/lang/python313/files/pkg-message.in new file mode 100644 index 000000000000..286359c9f272 --- /dev/null +++ b/lang/python313/files/pkg-message.in @@ -0,0 +1,12 @@ +[ +{ type: install + message: <