I think this is a very clever yet simple approach, I like it.
A bulk is needed with this to make sure everything still builds the same way,
before doing any of the IS_PY3 change.
Good work!
On Wed, Nov 16, 2011 at 05:09:41PM +0100, Remi Pointel wrote:
> Hi,
>
> this is the diff to update python.port.mk to permit to have both Python 2.x
> and 3.x working on OpenBSD.
>
> How it works:
> 1) Python2 port
> - all ports existing don't need to change, they still build with Python 2
>
> 2) Python2 and Python3 port
> - if you know that a port (and its dependencies...) work with Python 3 &&
> Python 2, you just need to add:
> IS_PY3 = Yes for all the ports. Be carefull to add ${MODPY_FLAVOR} to your
> dependencies (see examples at the end).
> Next, to build your port you will need to precise the correct flavor: python3.
>
> In this case, you must be very carreful with the conflict of the PLIST. If
> your port is a library, there is often no problems, but you will have problem
> with binaries/doc/examples/wub/...
> So you will have to "play" with post-install, in moving files which are
> conflicting by suffixing it (see examples at the end).
> FYI the port built with python3 will replace the prefix py- by py3-.
>
> 3) Python3 port
> - if you know that a port (and its dependencies) work with Python 3 only, you
> just need to add:
> IS_PY3 = Only, and it will automatically build this port with Python 3.
> FYI the port built with python3 follow the same logic that in python2, so if
> the port PKGNAME begins with py- it will automatically be replaced by py3-.
>
>
> More details about modifications needed:
> - remove the devel/py3-distribute, not used and useless to have py3 in the
> dir name (maybe a quirks thing to permit distribute -> py3-distribute? If not
> used actually, are modifications in quirks needed?)
> - some people don't want to replace py-setuptools by py-distribute, so keep
> py-setuptools (Python 2 only).
> - add the port devel/py-distribute, only used with Python3 ports (IS_PY3 =
> Only, will have the py3-distribute FULLPKGNAME. I attached the diff between
> actual py3-distribute and what we want, easier to understand).
> - remove the MODPY_DISTRIBUTE, useless. Keep the MODPY_SETUPTOOLS only,
> easier to maintain, even if we used distribute or setuptools after, it's not
> the problem of the porters.
>
>
> So, if your ports use:
> 1) Python 2 only
> - nothing to change
>
> 2) Python 2 and Python 3:
> - add IS_PY3 = Yes
> - add to your *_DEPENDS : ${MODPY_FLAVOR}, without comma (example:
> BUILD_DEPENDS: devel/py-distribute${MODPY_FLAVOR}).
> - make sure your PLIST will not be in conflict by adding special tasks in
> post-install. Example:
> post-install:
> mv ${WRKINST}/${LOCALBASE}/foo/bar
> ${WRKINST}/${LOCALBASE}/foo/bar${MODPY_BIN_SUFFIX}
>
> If you use the default FLAVOR (Python 2), MODPY_BIN_SUFFIX is "", so no
> modifications for people who use the default. If you use the FLAVOR Python 3,
> MODPY_BIN_SUFFIX = 3.
> Add ${MODPY_BIN_SUFFIX} to your PLIST.
>
> 3) Python 3:
> - add IS_PY3 = Only
>
> I think the best thing to do now is to patch python.port.mk and run a full
> bulk build to see if all ports are ok :).
>
> Cheers,
> --
> Remi
> Index: python.port.mk
> ===================================================================
> RCS file: /cvs/ports/lang/python/python.port.mk,v
> retrieving revision 1.47
> diff -u -r1.47 python.port.mk
> --- python.port.mk 17 Oct 2011 13:55:24 -0000 1.47
> +++ python.port.mk 16 Nov 2011 15:51:30 -0000
> @@ -7,23 +7,66 @@
>
> CATEGORIES+= lang/python
>
> -MODPY_VERSION?= 2.7
> +# define the default version
> +_MODPY_DEFAULT_VERSION = 2.7
>
> -.if ${MODPY_VERSION} == "2.4" || ${MODPY_VERSION} == "2.5" ||
> ${MODPY_VERSION} == "2.7" || ${MODPY_VERSION} == "3.2"
> -
> -. if ${MODPY_VERSION} < 2.6
> -MODPY_JSON = devel/py-simplejson
> -. else
> -MODPY_JSON =
> +.if !defined(MODPY_VERSION)
> +. if !defined(FLAVORS) && defined(IS_PY3)
> +. if ${IS_PY3:L:Myes}
> +FLAVORS?= python3
> +# force to use python3 if ports is python3 only
> +. elif ${IS_PY3:L:Monly}
> +FLAVORS?= python3
> +FLAVOR= python3
> +. else
> +ERRORS += "Fatal: please verify IS_PY3 is correctly defined: \n\
> + - set to Yes if your port can be build with python2 and python3 \n\
> + - set to Only if your port can be build only with python3 \n"
> +. endif
> . endif
>
> -. if ${MODPY_VERSION} < 3.2
> -MODPY_WANTLIB = python${MODPY_VERSION}
> -. else
> -MODPY_WANTLIB = python${MODPY_VERSION}m
> +FLAVOR?=
> +
> +. if empty(FLAVOR)
> +# without flavor, assume we use the default version
> +MODPY_VERSION?= ${_MODPY_DEFAULT_VERSION}
> +. elif ${FLAVOR:L:Mpython3}
> +# define default version 3
> +MODPY_VERSION?= 3.2
> . endif
> +
> +# verify if MODPY_VERSION forced is correct
> .else
> +. if ${MODPY_VERSION} != "2.4" && \
> + ${MODPY_VERSION} != "2.5" && \
> + ${MODPY_VERSION} != "2.7" && \
> + ${MODPY_VERSION} != "3.2"
> ERRORS += "Fatal: unknown or unsupported MODPY_VERSION: ${MODPY_VERSION}"
> +. endif
> +.endif
> +
> +_MODPY_MAJOR_VERSION = ${MODPY_VERSION:C/\.[1-9]*//g}
> +
> +.if ${_MODPY_MAJOR_VERSION} == 2
> +MODPY_LIB_SUFFIX =
> +MODPY_FLAVOR =
> +MODPY_BIN_SUFFIX =
> +
> +.elif ${_MODPY_MAJOR_VERSION} == 3
> +MODPY_LIB_SUFFIX = m
> +# replace py- prefix by py3-
> +FULLPKGNAME = ${PKGNAME:S/^py-/py3-/}
> +MODPY_FLAVOR = ,python3
> +# add the modpy_version without the '.' to the binaries to avoid conflict
> +MODPY_BIN_SUFFIX = ${_MODPY_MAJOR_VERSION}
> +.endif
> +
> +MODPY_WANTLIB = python${MODPY_VERSION}${MODPY_LIB_SUFFIX}
> +
> +.if ${MODPY_VERSION} < 2.6
> +MODPY_JSON = devel/py-simplejson
> +.else
> +MODPY_JSON =
> .endif
>
> MODPY_RUN_DEPENDS= lang/python/${MODPY_VERSION}
> @@ -41,15 +84,17 @@
> .endif
>
> MODPY_PRE_BUILD_STEPS = @:
> -.if (defined(MODPY_SETUPTOOLS) && ${MODPY_SETUPTOOLS:U} == YES) || \
> - (defined(MODPY_DISTRIBUTE) && ${MODPY_DISTRIBUTE:U} == YES)
> +.if (defined(MODPY_SETUPTOOLS) && ${MODPY_SETUPTOOLS:U} == YES)
> # The setuptools module provides a package locator (site.py) that is
> # required at runtime for the pkg_resources stuff to work
> -.if ${MODPY_SETUPTOOLS:U} == YES
> +. if ${_MODPY_MAJOR_VERSION} == 2
> MODPY_SETUPUTILS_DEPEND?=devel/py-setuptools
> -.else
> -MODPY_SETUPUTILS_DEPEND ?= devel/py3-distribute
> -.endif
> +. elif ${_MODPY_MAJOR_VERSION} == 3
> +MODPY_SETUPUTILS_DEPEND?=devel/py-distribute,python3
> +. else
> +ERRORS += "Fatal: unknown or unsupported _MODPY_MAJOR_VERSION:
> ${_MODPY_MAJOR_VERSION}"
> +. endif
> +
> MODPY_RUN_DEPENDS+= ${MODPY_SETUPUTILS_DEPEND}
> BUILD_DEPENDS+= ${MODPY_SETUPUTILS_DEPEND}
> MODPY_SETUPUTILS = Yes
> @@ -65,8 +110,7 @@
> ;mkdir -p ${_MODPY_SETUPUTILS_FAKE_DIR} \
> ;exec >${_MODPY_SETUPUTILS_FAKE_DIR}/__init__.py \
> ;echo 'def setup(*args, **kwargs):' \
> - ;echo ' msg = "OpenBSD ports: MODPY_SETUPTOOLS = Yes or\\n" \' \
> - ;echo ' "\\t\\t\\t MODPY_DISTRIBUTE = Yes required"' \
> + ;echo ' msg = "OpenBSD ports: MODPY_SETUPTOOLS = Yes is required"' \
> ;echo ' raise Exception(msg)' \
> ;echo 'Extension = Feature = find_packages = setup'
> MODPY_SETUPUTILS = No
> @@ -110,7 +154,7 @@
> _MODPY_CMD= @cd ${WRKSRC} && ${SETENV} ${MAKE_ENV} \
> ${MODPY_BIN} ./${MODPY_SETUP}
>
> -SUBST_VARS:= MODPY_BIN MODPY_EGG_VERSION MODPY_VERSION ${SUBST_VARS}
> +SUBST_VARS:= MODPY_BIN MODPY_BIN_SUFFIX MODPY_EGG_VERSION MODPY_VERSION
> ${SUBST_VARS}
>
> # set MODPY_BIN for executable scripts
> MODPY_BIN_ADJ= perl -pi \
> Index: Makefile
> ===================================================================
> RCS file: /cvs/ports/devel/py3-distribute/Makefile,v
> retrieving revision 1.3
> diff -u -p -r1.3 Makefile
> --- Makefile 25 Sep 2011 13:36:18 -0000 1.3
> +++ Makefile 16 Nov 2011 16:03:13 -0000
> @@ -2,10 +2,9 @@
>
> COMMENT = fork of setuptools Python packages
>
> -MODPY_EGG_VERSION = 0.6.21
> +MODPY_EGG_VERSION = 0.6.24
> DISTNAME = distribute-${MODPY_EGG_VERSION}
> -
> -REVISION = 0
> +PKGNAME = py-${DISTNAME}
>
> CATEGORIES = devel
>
> @@ -22,8 +21,9 @@ PERMIT_DISTFILES_FTP = Yes
> MASTER_SITES = ${MASTER_SITE_PYPI:=d/distribute/}
>
> MODULES = lang/python
> -MODPY_VERSION = 3.2
>
> NO_REGRESS = Yes
> +
> +IS_PY3 = Only
>
> .include <bsd.port.mk>
> Index: distinfo
> ===================================================================
> RCS file: /cvs/ports/devel/py3-distribute/distinfo,v
> retrieving revision 1.1.1.1
> diff -u -p -r1.1.1.1 distinfo
> --- distinfo 17 Sep 2011 12:15:40 -0000 1.1.1.1
> +++ distinfo 16 Nov 2011 16:03:13 -0000
> @@ -1,5 +1,5 @@
> -MD5 (distribute-0.6.21.tar.gz) = yM/P1C7Jq5APs5YKMwju8g==
> -RMD160 (distribute-0.6.21.tar.gz) = OiWB7Z6zOLF/J+KDu29gUM9i/xc=
> -SHA1 (distribute-0.6.21.tar.gz) = S8PfUkuh1oS6mXyqszRgQFUaOCA=
> -SHA256 (distribute-0.6.21.tar.gz) =
> HtS1iV5yKwb2cB9W3SJ91qoly/wMds4EZbdV7ZL1IJc=
> -SIZE (distribute-0.6.21.tar.gz) = 399934
> +MD5 (distribute-0.6.24.tar.gz) = F3IrIhQauoI1eH95gAzEUg==
> +RMD160 (distribute-0.6.24.tar.gz) = zEzpX74O8kmssu8uxqBra4NoN4g=
> +SHA1 (distribute-0.6.24.tar.gz) = BnC9u6K+aJL2em+UYll3b6gzFSU=
> +SHA256 (distribute-0.6.24.tar.gz) =
> xh/enziMlgDrjuVL1xaAOcX7dPozQTi8Sc32psE0Fic=
> +SIZE (distribute-0.6.24.tar.gz) = 620771
> Index: pkg/PLIST
> ===================================================================
> RCS file: /cvs/ports/devel/py3-distribute/pkg/PLIST,v
> retrieving revision 1.1.1.1
> diff -u -p -r1.1.1.1 PLIST
> --- pkg/PLIST 17 Sep 2011 12:15:40 -0000 1.1.1.1
> +++ pkg/PLIST 16 Nov 2011 16:03:13 -0000
> @@ -6,7 +6,6 @@ lib/python${MODPY_VERSION}/site-packages
>
> lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/SOURCES.txt
>
> lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/dependency_links.txt
>
> lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/entry_points.txt
> -lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/entry_points.txt.orig
>
> lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/top_level.txt
>
> lib/python${MODPY_VERSION}/site-packages/distribute-${MODPY_EGG_VERSION}-py${MODPY_VERSION}.egg-info/zip-safe
> lib/python${MODPY_VERSION}/site-packages/easy_install.py
> @@ -20,6 +19,8 @@ lib/python${MODPY_VERSION}/site-packages
> lib/python${MODPY_VERSION}/site-packages/setuptools/__init__.pyc
> lib/python${MODPY_VERSION}/site-packages/setuptools/archive_util.py
> lib/python${MODPY_VERSION}/site-packages/setuptools/archive_util.pyc
> +lib/python${MODPY_VERSION}/site-packages/setuptools/cli-32.exe
> +lib/python${MODPY_VERSION}/site-packages/setuptools/cli-64.exe
> lib/python${MODPY_VERSION}/site-packages/setuptools/cli.exe
> lib/python${MODPY_VERSION}/site-packages/setuptools/command/
> lib/python${MODPY_VERSION}/site-packages/setuptools/command/__init__.py
> @@ -72,6 +73,8 @@ lib/python${MODPY_VERSION}/site-packages
> lib/python${MODPY_VERSION}/site-packages/setuptools/dist.pyc
> lib/python${MODPY_VERSION}/site-packages/setuptools/extension.py
> lib/python${MODPY_VERSION}/site-packages/setuptools/extension.pyc
> +lib/python${MODPY_VERSION}/site-packages/setuptools/gui-32.exe
> +lib/python${MODPY_VERSION}/site-packages/setuptools/gui-64.exe
> lib/python${MODPY_VERSION}/site-packages/setuptools/gui.exe
> lib/python${MODPY_VERSION}/site-packages/setuptools/package_index.py
> lib/python${MODPY_VERSION}/site-packages/setuptools/package_index.pyc
--
Antoine