# $OpenBSD: python.port.mk,v 1.122 2020/10/05 20:51:18 kmos Exp $ # # python.port.mk - Xavier Santolaria # This file is in the public domain. CATEGORIES += lang/python # define the default versions MODPY_DEFAULT_VERSION_2 = 2.7 MODPY_DEFAULT_VERSION_3 = 3.8 # If switching to a new MODPY_DEFAULT_VERSION_3: # - In the old default version, @comment the non-suffixed bin/XXX files (python3, # pydoc3, idle3, etc), lib/pkgconfig/python3.pc, and man/man1/python3.1 and # bump REVISION # - In the new version, un-@comment these same files # - In the new version, @conflict on the old REVISION of the old version # (3.6.8p1 was "default py3 is py3.6", 3.6.8p2 was after the switch to "default # is py3.7", so the 3.7 ports had @conflict python-subpkg-<3.6.8p2) # If later *removing* an old version: # - *move* the numbered @conflict python-*->=3.2,<3.7 to the new version # and update e.g. to @conflict python-*->=3.2,<3.8 # - *move* the @pkgpath markers to the new version and add a new one for # the old version you have just retired. # In all cases: # - keep the @conflict python-*-${VERSION_SPEC} PLIST lines as-is, they are # there to override the "@option no-default-conflict" and set automatically # from the variable defined in 3.x/Makefile. # Also note: # - Some subpackages e.g. -idle have a conflict on an old version of the main # package e.g. "@conflict python->=3.6,<3.6.8p0", this is due to a file # moving between subpackages in the past. .if !defined(MODPY_VERSION) FLAVOR ?= . if ${FLAVOR:Mpython3} # define default version 3 MODPY_VERSION ?= ${MODPY_DEFAULT_VERSION_3} . else # without flavor, assume we use the default version 2 MODPY_VERSION ?= ${MODPY_DEFAULT_VERSION_2} . endif # verify if MODPY_VERSION forced is correct .else . if ${MODPY_VERSION} != "2.7" && \ ${MODPY_VERSION} != "3.7" && \ ${MODPY_VERSION} != "3.8" && \ ${MODPY_VERSION} != "3.9" ERRORS += "Fatal: unknown or unsupported MODPY_VERSION: ${MODPY_VERSION}" . endif .endif MODPY_MAJOR_VERSION = ${MODPY_VERSION:R} .if ${MODPY_MAJOR_VERSION} == 2 MODPY_LIB_SUFFIX = MODPY_FLAVOR = MODPY_BIN_SUFFIX = MODPY_PY_PREFIX = py- MODPY_PYCACHE = MODPY_PYC_MAGIC_TAG = MODPY_COMMENT = "@comment " MODPY_ABI3SO = MODPY_PYOEXTENSION = pyo .elif ${MODPY_MAJOR_VERSION} == 3 . if ${MODPY_VERSION} == "3.7" MODPY_LIB_SUFFIX = m . else # 3.8 (and later) discard the m suffix on the library MODPY_LIB_SUFFIX = . endif # replace py- prefix by py3- FULLPKGNAME ?= ${PKGNAME:S/^py-/py3-/}${FLAVOR_EXT:S/-python3//} MODPY_FLAVOR = ,python3 # use MODPY_SUFFIX for binaries to avoid conflict MODPY_BIN_SUFFIX = -3 MODPY_PY_PREFIX = py3- MODPY_PYCACHE = "__pycache__/" MODPY_MAJORMINOR = ${MODPY_VERSION:C/\.//g} MODPY_PYC_MAGIC_TAG = "cpython-${MODPY_MAJORMINOR}." MODPY_COMMENT = MODPY_ABI3SO = ".abi3" MODPY_PYOEXTENSION ?= opt-1.pyc .endif MODPY_PYTEST ?= No MODPY_WANTLIB = python${MODPY_VERSION}${MODPY_LIB_SUFFIX} MODPY_RUN_DEPENDS = lang/python/${MODPY_VERSION} MODPY_LIB_DEPENDS = lang/python/${MODPY_VERSION} _MODPY_BUILD_DEPENDS = lang/python/${MODPY_VERSION} MODPY_TEST_DEPENDS = ${RUN_DEPENDS} .if ${MODPY_PYTEST:L} == "yes" MODPY_TEST_DEPENDS += devel/py-test${MODPY_FLAVOR} .endif .if ${NO_BUILD:L} == "no" MODPY_BUILDDEP ?= Yes .else MODPY_BUILDDEP ?= No .endif MODPY_RUNDEP ?= Yes .if ${NO_TEST:L} == "no" MODPY_TESTDEP ?= Yes .else MODPY_TESTDEP ?= No .endif .if ${MODPY_BUILDDEP:L} == "yes" BUILD_DEPENDS += ${_MODPY_BUILD_DEPENDS} .endif .if ${MODPY_RUNDEP:L} == "yes" RUN_DEPENDS += ${MODPY_RUN_DEPENDS} .endif .if ${MODPY_TESTDEP:L} == "yes" TEST_DEPENDS += ${MODPY_TEST_DEPENDS} .endif _MODPY_PRE_BUILD_STEPS = : .if defined(MODPY_SETUPTOOLS) && ${MODPY_SETUPTOOLS:L} == "yes" # The setuptools module provides a package locator (site.py) that is # required at runtime for the pkg_resources stuff to work MODPY_SETUPUTILS_DEPEND ?= devel/py-setuptools${MODPY_FLAVOR}>=39.0.1v0 MODPY_RUN_DEPENDS += ${MODPY_SETUPUTILS_DEPEND} BUILD_DEPENDS += ${MODPY_SETUPUTILS_DEPEND} MODPY_SETUPUTILS = Yes # The setuptools uses test target TEST_TARGET ?= test _MODPY_USERBASE = _MODPY_PRE_BUILD_STEPS += ;${MODPY_CMD} egg_info || true .else # Try to detect the case where a port will build regardless of setuptools # but the final plist will be different if it's present. _MODPY_SETUPUTILS_FAKE_DIR = \ ${WRKDIR}/lib/python${MODPY_VERSION}/site-packages/setuptools _MODPY_PRE_BUILD_STEPS += \ ;mkdir -p ${_MODPY_SETUPUTILS_FAKE_DIR} \ ;exec 3>&1 \ ;exec >${_MODPY_SETUPUTILS_FAKE_DIR}/__init__.py \ ;echo 'def setup(*args, **kwargs):' \ ;echo ' msg = "OpenBSD ports: MODPY_SETUPTOOLS = Yes is required"' \ ;echo ' raise Exception(msg)' \ ;echo 'Extension = Feature = find_packages = setup' \ ;exec 1>&3 MODPY_SETUPUTILS = No _MODPY_USERBASE = ${WRKDIR} .endif .if defined(MODPY_PI) && ${MODPY_PI:L} == "yes" _MODPY_EGG_NAME = ${DISTNAME:S/-${MODPY_EGG_VERSION}//} MODPY_PI_DIR ?= ${DISTNAME:C/^([a-zA-Z0-9]).*/\1/}/${_MODPY_EGG_NAME} MASTER_SITES = ${MASTER_SITE_PYPI:=${MODPY_PI_DIR}/} HOMEPAGE ?= https://pypi.python.org/pypi/${_MODPY_EGG_NAME} .endif MODPY_TKINTER_DEPENDS = lang/python/${MODPY_VERSION},-tkinter MODPY_BIN = ${LOCALBASE}/bin/python${MODPY_VERSION} MODPY_INCDIR = ${LOCALBASE}/include/python${MODPY_VERSION}${MODPY_LIB_SUFFIX} MODPY_LIBDIR = ${LOCALBASE}/lib/python${MODPY_VERSION} MODPY_SITEPKG = ${MODPY_LIBDIR}/site-packages # usually setup.py but Setup.py can be found too MODPY_SETUP ?= setup.py # build or build_ext are commonly used MODPY_DISTUTILS_BUILD ?= build --build-base=${WRKBUILD} .if ${MODPY_SETUPUTILS:L} == "yes" MODPY_DISTUTILS_INSTALL ?= install --prefix=${TRUEPREFIX} \ --root=${DESTDIR} \ --single-version-externally-managed .else MODPY_DISTUTILS_INSTALL ?= install --prefix=${TRUEPREFIX} \ --root=${DESTDIR} .endif MAKE_ENV += CC=${CC} PYTHONUSERBASE=${_MODPY_USERBASE} CONFIGURE_ENV += PYTHON="${MODPY_BIN}" .if ${CONFIGURE_STYLE:Mgnu} CONFIGURE_ENV += ac_cv_prog_PYTHON="${MODPY_BIN}" \ ac_cv_path_PYTHON="${MODPY_BIN}" .endif MODPY_CMD = cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} \ ${MODPY_BIN} ./${MODPY_SETUP} \ ${MODPY_SETUP_ARGS} MODPY_TEST_DIR ?= ${WRKSRC} MODPY_TEST_CMD = cd ${MODPY_TEST_DIR} && ${SETENV} ${ALL_TEST_ENV} ${MODPY_BIN} .if ${MODPY_PYTEST:L} == "yes" MODPY_TEST_CMD += -m pytest .else MODPY_TEST_CMD += ./${MODPY_SETUP} ${MODPY_SETUP_ARGS} .endif MODPY_TEST_LOCALE ?= LC_CTYPE=en_US.UTF-8 TEST_ENV += ${MODPY_TEST_LOCALE} SUBST_VARS := MODPY_PYCACHE MODPY_COMMENT MODPY_ABI3SO MODPY_PYC_MAGIC_TAG \ MODPY_BIN MODPY_EGG_VERSION MODPY_VERSION MODPY_BIN_SUFFIX \ MODPY_PY_PREFIX MODPY_PYOEXTENSION ${SUBST_VARS} UPDATE_PLIST_ARGS += -S MODPY_BIN_SUFFIX -S MODPY_PYOEXTENSION \ -I MODPY_ABI3SO -c MODPY_COMMENT -I MODPY_PYCACHE # set MODPY_BIN for executable scripts MODPY_BIN_ADJ = perl -pi \ -e '$$. == 1 && s|^.*env +python.*$$|\#!${MODPY_BIN}|;' \ -e '$$. == 1 && s|^.*bin/python.*$$|\#!${MODPY_BIN}|;' \ -e 'close ARGV if eof;' MODPY_ADJ_FILES ?= .if !empty(MODPY_ADJ_FILES) MODPYTHON_pre-configure += for f in ${MODPY_ADJ_FILES}; do \ ${MODPY_BIN_ADJ} ${WRKSRC}/$${f}; done .endif MODPY_BUILD_TARGET = ${_MODPY_PRE_BUILD_STEPS}; \ ${MODPY_CMD} ${MODPY_DISTUTILS_BUILD} ${MODPY_DISTUTILS_BUILDARGS} MODPY_INSTALL_TARGET = \ ${MODPY_CMD} ${MODPY_DISTUTILS_BUILD} ${MODPY_DISTUTILS_BUILDARGS} \ ${MODPY_DISTUTILS_INSTALL} ${MODPY_DISTUTILS_INSTALLARGS} MODPY_PYTEST_ARGS ?= MODPY_TEST_TARGET = ${MODPY_TEST_CMD} .if ${MODPY_PYTEST:L} == "yes" MODPY_TEST_TARGET += ${MODPY_PYTEST_ARGS} .elif ${MODPY_SETUPUTILS:L} == "yes" MODPY_TEST_TARGET += ${TEST_TARGET} .endif # dirty way to do it with no modifications in bsd.port.mk .if empty(CONFIGURE_STYLE) . if !target(do-build) do-build: @${MODPY_BUILD_TARGET} . endif # extra documentation or scripts should be installed via post-install . if !target(do-install) do-install: @${MODPY_INSTALL_TARGET} . endif # setuptools supports regress testing from setup.py using a standard target . if !target(do-test) && \ (${MODPY_SETUPUTILS:L} == "yes" || ${MODPY_PYTEST:L} == "yes") do-test: @${MODPY_TEST_TARGET} . endif . if make(update-plist) || make(plist) . if defined(FLAVORS) && ${FLAVORS:Mpython3} && !${FLAVOR:Mpython3} ERRORS += "***\n*** WARNING: running update-plist without FLAVOR=python3\n***\n***" . endif . endif .endif