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