# python.port.mk - This file is in the public domain. # Xavier Santolaria # Stuart Henderson CATEGORIES += lang/python MODPY_WANTLIB = python2.7 MODPY_RUN_DEPENDS = lang/python/2.7 MODPY_LIB_DEPENDS = lang/python/2.7 _MODPY_BUILD_DEPENDS = lang/python/2.7 MODPY_TKINTER_DEPENDS = lang/python/2.7,-tkinter MODPY_MAJOR_VERSION = 2 MODPY_PY_PREFIX = py- MODPY_SETUPTOOLS ?= MODPY_SETUPUTILS ?= MODPY_PYBUILD ?= No MODPY_PI ?= MODPY_TEST_DEPENDS = ${MODPY_RUN_DEPENDS} .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 ${MODPY_SETUPTOOLS:L} == "yes" # For Python 2, setuptools provides a package locator that is required at # runtime for pkg_resources to work, so an RDEP is needed. MODPY_SETUPUTILS_DEPEND ?= devel/py2-setuptools 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 .elif ${MODPY_PYBUILD:L} != no ERRORS += "Fatal: MODPY_PYBUILD is not supported for Python 2" .else MODPY_SETUPUTILS = No # Detect the case where a port is capable of building with setup.py # via fallback to distutils, but should use py-build instead. _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: use MODPY_PYBUILD"' \ ;echo ' raise Exception(msg)' \ ;echo 'Extension = Feature = find_packages = setup' \ ;exec 1>&3 _MODPY_USERBASE = ${WRKDIR} .endif .if ${MODPY_SETUPTOOLS:L} == "yes" # Setuptools opportunistically picks up plugins. If it picks one up that # uses finalize_distribution_options (usually setuptools_scm), junking # that plugin will cause failure at the end of build. # In the absence of a targetted means of disabling this, use a big hammer: DPB_PROPERTIES += nojunk # XXX if a "nojunk" port fails to build, DPB will no longer junk on that # XXX node, likely resulting in running out of disk space in /usr/local. .endif .if ${MODPY_PI:L} == "yes" _MODPY_EGG_NAME = ${DISTNAME:S/-${MODPY_DISTV}//} MODPY_PI_DIR ?= ${DISTNAME:C/^([a-zA-Z0-9]).*/\1/}/${_MODPY_EGG_NAME} SITES = ${SITE_PYPI:=${MODPY_PI_DIR}/} HOMEPAGE ?= https://pypi.org/project/${_MODPY_EGG_NAME} .endif MODPY_BIN = ${LOCALBASE}/bin/python2.7 MODPY_INCDIR = ${LOCALBASE}/include/python2.7 MODPY_LIBDIR = ${LOCALBASE}/lib/python2.7 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_RUNBIN = cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} ${MODPY_BIN} 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} MODPY_TEST_CMD += ./${MODPY_SETUP} ${MODPY_SETUP_ARGS} MODPY_TEST_LIBDIR ?= MODPY_TEST_LOCALE ?= LC_CTYPE=en_US.UTF-8 TEST_ENV += ${MODPY_TEST_LOCALE} .if !empty(MODPY_TEST_LIBDIR) TEST_ENV += PYTHONPATH=${MODPY_TEST_LIBDIR}:lib:src .endif SUBST_VARS := MODPY_BIN MODPY_DISTV MODPY_VERSION \ MODPY_PY_PREFIX ${SUBST_VARS} # 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 += cd ${WRKSRC} && ${MODPY_BIN_ADJ} ${MODPY_ADJ_FILES} .endif .if ${MODPY_VERSION} == ${MODPY_DEFAULT_VERSION_2} MODPY_COMPILEALL = ${MODPY_BIN} -m compileall .else MODPY_COMPILEALL = ${MODPY_BIN} -m compileall -j ${MAKE_JOBS} -s ${WRKINST} -o 0 -o 1 .endif MODPY_TEST_TARGET = 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_TEST_TARGET += ${MODPY_TEST_CMD} .if ${MODPY_SETUPUTILS:L} == "yes" MODPY_TEST_TARGET += ${TEST_TARGET} .endif .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 . if !target(do-test) && (${MODPY_SETUPUTILS:L} == "yes") do-test: @${MODPY_TEST_TARGET} . endif .endif