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

Reply via email to