[Python-modules-team] Bug#671361: pyicu: Please enable Python 3 support
Colin Watson
cjwatson at ubuntu.com
Fri May 4 10:13:23 UTC 2012
On Thu, May 03, 2012 at 03:16:17PM +0100, Colin Watson wrote:
> The following patch is hopefully self-explanatory, and works for me.
I made one slight mistake here: I used ${python:*} substvars rather than
${python3:*}. The following revised patch fixes that.
* Add Python 3 packages.
* Replace ICUtzinfo-not-heap-type.dpatch with upstream r191, which
restores Python 3 compatibility.
* Drop manual cleaning of python-pyicu-dbg, since dh_python2 handles this.
diff -u pyicu-1.3/debian/control pyicu-1.3/debian/control
--- pyicu-1.3/debian/control
+++ pyicu-1.3/debian/control
@@ -3,7 +3,7 @@
Priority: optional
Maintainer: Debian Python Modules Team <python-modules-team at lists.alioth.debian.org>
Uploaders: Bernd Zeimetz <bzed at debian.org>
-Build-Depends: dpatch, debhelper (>= 5.0.37.3), python-all-dev (>= 2.6.6-3~), python-all-dbg (>= 2.6.6-3~), libicu-dev
+Build-Depends: dpatch, debhelper (>= 5.0.37.3), python-all-dev (>= 2.6.6-3~), python-all-dbg (>= 2.6.6-3~), python3-all-dev (>= 3.2), python3-all-dbg (>= 3.2), libicu-dev
Build-Conflicts: python-pyicu
Vcs-Svn: svn://svn.debian.org/python-modules/packages/pyicu/trunk/
Vcs-Browser: http://svn.debian.org/viewsvn/python-modules/packages/pyicu/trunk/
@@ -33,0 +34,23 @@
+
+Package: python3-pyicu
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}
+Provides: ${python3:Provides}
+Description: Python 3 extension wrapping the ICU C++ API
+ ICU is a C++ and C library that provides robust and full-featured
+ Unicode and locale support. This package provides an extension for
+ Python 3 which wraps the ICU C++ API.
+
+Package: python3-pyicu-dbg
+Section: debug
+Architecture: any
+Priority: extra
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python3:Depends}, python3-pyicu (= ${binary:Version}), python3-dbg
+Provides: ${python3:Provides}
+Description: Python 3 extension wrapping the ICU C++ API (debug extension)
+ ICU is a C++ and C library that provides robust and full-featured
+ Unicode and locale support. This package provides an extension for
+ Python 3 which wraps the ICU C++ API.
+ .
+ This package contains the extension built for the Python 3 debug
+ interpreter.
diff -u pyicu-1.3/debian/rules pyicu-1.3/debian/rules
--- pyicu-1.3/debian/rules
+++ pyicu-1.3/debian/rules
@@ -4,7 +4,9 @@
#export DH_VERBOSE=1
PKGNAME:=python-pyicu
+PKG3NAME=python3-pyicu
PYVERS:=$(shell pyversions -vr)
+PY3VERS:=$(shell py3versions -vr)
-include /usr/share/python/python.mk
ifeq (,$(py_sitename))
@@ -21,20 +23,29 @@
build-stamp:
dh_testdir
+ # setup.py modifies test source files when building for Python 3, so
+ # build out of tree.
+ rm -rf build-py2 build-py3
+ mkdir -p build-py2 build-py3
+ cp -a $(filter-out build-py2 build-py3 debian,$(wildcard *)) build-py2/
+ cp -a $(filter-out build-py2 build-py3 debian,$(wildcard *)) build-py3/
+
set -e; \
- for py in $(PYVERS); do \
+ for py in $(PYVERS) $(PY3VERS); do \
+ (cd build-py$${py%%.*}; \
python$$py setup.py build; \
- python$$py-dbg setup.py build; \
+ python$$py-dbg setup.py build); \
done
ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
set -ex ;\
for test in `ls test/*.py`; do \
- for py in $(PYVERS); do \
- PYTHONPATH=`ls -d $(CURDIR)/build/lib.*-$$py` \
+ for py in $(PYVERS) $(PY3VERS); do \
+ (cd build-py$${py%%.*}; \
+ PYTHONPATH=`ls -d $$(pwd)/build/lib.*-$$py` \
python$$py $$test ;\
- PYTHONPATH=`ls -d $(CURDIR)/build/lib_d.*-$$py || ls -d $(CURDIR)/build/lib.*-$$py-pydebug` \
- python$$py-dbg $$test ;\
+ PYTHONPATH=`ls -d $$(pwd)/build/lib_d.*-$$py || ls -d $$(pwd)/build/lib.*-$$py-pydebug` \
+ python$$py-dbg $$test) ;\
done ;\
done
endif
@@ -46,11 +57,8 @@
dh_testdir
dh_testroot
rm -f install-stamp build-stamp
- -for py in $(PYVERS); do \
- python$$py setup.py clean; \
- done
- find . -name "*.pyc" -print0 | xargs -0 rm -f
- rm -rf build
+ find . \( -name "*.pyc" -o -name __pycache__ \) -print0 | xargs -0 rm -f
+ rm -rf build-py2 build-py3
dh_clean
install: install-stamp
@@ -61,12 +69,15 @@
dh_installdirs
set -e; \
for py in $(PYVERS); do \
+ (cd build-py2; \
python$$py setup.py install --root=$(CURDIR)/debian/$(PKGNAME) --prefix=/usr $(py_setup_install_args) ;\
- python$$py-dbg setup.py install --root=$(CURDIR)/debian/$(PKGNAME)-dbg --prefix=/usr $(py_setup_install_args) ;\
+ python$$py-dbg setup.py install --root=$(CURDIR)/debian/$(PKGNAME)-dbg --prefix=/usr $(py_setup_install_args)) ;\
+ done
+ for py in $(PY3VERS); do \
+ (cd build-py3; \
+ python$$py setup.py install --root=$(CURDIR)/debian/$(PKG3NAME) --prefix=/usr $(py_setup_install_args) ;\
+ python$$py-dbg setup.py install --root=$(CURDIR)/debian/$(PKG3NAME)-dbg --prefix=/usr $(py_setup_install_args)) ;\
done
- find $(CURDIR)/debian/$(PKGNAME)-dbg -name "*.pyc" -print0 | xargs -0 rm -f
- find $(CURDIR)/debian/$(PKGNAME)-dbg -name "*.py" -print0 | xargs -0 rm -f
- find $(CURDIR)/debian/$(PKGNAME)-dbg -name "*.egg-info" -print0 | xargs -0 rm -f
dh_installdocs
dh_installexamples
@@ -81,10 +92,14 @@
dh_installchangelogs CHANGES
dh_compress -X.py
dh_strip -p$(PKGNAME) --dbg-package=$(PKGNAME)-dbg
+ dh_strip -p$(PKG3NAME) --dbg-package=$(PKG3NAME)-dbg
dh_fixperms
dh_python2
+ dh_python3
rm -rf debian/$(PKGNAME)-dbg/usr/share/doc/$(PKGNAME)-dbg
ln -s $(PKGNAME) debian/$(PKGNAME)-dbg/usr/share/doc/$(PKGNAME)-dbg
+ rm -rf debian/$(PKG3NAME)-dbg/usr/share/doc/$(PKG3NAME)-dbg
+ ln -s $(PKG3NAME) debian/$(PKG3NAME)-dbg/usr/share/doc/$(PKG3NAME)-dbg
dh_installdeb
dh_shlibdeps
dh_gencontrol
diff -u pyicu-1.3/debian/patches/ICUtzinfo-not-heap-type.dpatch pyicu-1.3/debian/patches/ICUtzinfo-not-heap-type.dpatch
--- pyicu-1.3/debian/patches/ICUtzinfo-not-heap-type.dpatch
+++ pyicu-1.3/debian/patches/ICUtzinfo-not-heap-type.dpatch
@@ -1,13 +1,74 @@
#! /bin/sh /usr/share/dpatch/dpatch-run
## ICUtzinfo-not-heap-type.dpatch by Jakub Wilk <jwilk at debian.org>
##
-## DP: Revert upstream change to make ICUtzinfo a heap type.
+## DP: Fix bug with default tzinfo set on ICUtzinfo type.
## DP: See https://bugzilla.osafoundation.org/show_bug.cgi?id=13038
+diff --git a/common.cpp b/common.cpp
+index e9d704f..84099eb 100644
+--- a/common.cpp
++++ b/common.cpp
+@@ -33,6 +33,7 @@
+
+ static PyObject *utcoffset_NAME;
+ static PyObject *toordinal_NAME;
++static PyObject *getDefault_NAME;
+
+
+ typedef struct {
+@@ -355,7 +356,7 @@ EXPORT UDate PyObject_AsUDate(PyObject *object)
+ PyObject *m = PyImport_ImportModule("icu");
+ PyObject *cls = PyObject_GetAttrString(m, "ICUtzinfo");
+
+- tzinfo = PyObject_GetAttrString(cls, "default");
++ tzinfo = PyObject_CallMethodObjArgs(cls, getDefault_NAME, NULL);
+ Py_DECREF(cls);
+ Py_DECREF(m);
+
+@@ -1241,4 +1242,5 @@ void _init_common(PyObject *m)
+
+ utcoffset_NAME = PyString_FromString("utcoffset");
+ toordinal_NAME = PyString_FromString("toordinal");
++ getDefault_NAME = PyString_FromString("getDefault");
+ }
+diff --git a/setup.py b/setup.py
+index 86d0253..329ce57 100644
+--- a/setup.py
++++ b/setup.py
+@@ -25,6 +25,15 @@ CFLAGS = {
+ 'sunos5': ['-DPYICU_VER="%s"' %(VERSION)],
+ }
+
++# added to CFLAGS when setup is invoked with --debug
++DEBUG_CFLAGS = {
++ 'darwin': ['-O0', '-g', '-DDEBUG'],
++ 'linux': ['-O0', '-g', '-DDEBUG'],
++ 'freebsd7': ['-O0', '-g', '-DDEBUG'],
++ 'win32': ['/Od', '/DDEBUG'],
++ 'sunos5': ['-DDEBUG'],
++}
++
+ LFLAGS = {
+ 'darwin': ['-L/usr/local/lib'],
+ 'linux': [],
+@@ -55,6 +64,12 @@ if 'PYICU_CFLAGS' in os.environ:
+ else:
+ _cflags = CFLAGS[platform]
+
++if '--debug' in sys.argv:
++ if 'PYICU_DEBUG_CFLAGS' in os.environ:
++ _cflags += os.environ['PYICU_DEBUG_CFLAGS'].split(os.pathsep)
++ else:
++ _cflags += DEBUG_CFLAGS[platform]
++
+ if 'PYICU_LFLAGS' in os.environ:
+ _lflags = os.environ['PYICU_LFLAGS'].split(os.pathsep)
+ else:
diff --git a/tzinfo.cpp b/tzinfo.cpp
+index 2113b82..046faf1 100644
--- a/tzinfo.cpp
+++ b/tzinfo.cpp
-@@ -122,7 +122,6 @@
+@@ -122,7 +122,6 @@ PyTypeObject TZInfoType = {
0, /* tp_setattro */
0, /* tp_as_buffer */
(Py_TPFLAGS_DEFAULT |
@@ -18,10 +79,40 @@
-@@ -445,7 +444,7 @@
+@@ -445,7 +444,6 @@ static PyObject *t_tzinfo__resetDefault(PyTypeObject *cls)
Py_XDECREF((PyObject *) _default);
_default = (t_tzinfo *) tzinfo;
- PyObject_SetAttrString((PyObject *)&TZInfoType, "default", tzinfo);
-+ PyDict_SetItemString(TZInfoType.tp_dict, "default", tzinfo);
Py_RETURN_NONE;
}
-
+@@ -488,7 +486,6 @@ static PyObject *t_tzinfo_setDefault(PyTypeObject *cls, PyObject *arg)
+
+ Py_INCREF(arg);
+ _default = (t_tzinfo *) arg;
+- PyDict_SetItemString(TZInfoType.tp_dict, "default", arg);
+
+ if (prev)
+ return prev;
+@@ -719,10 +716,7 @@ void _init_tzinfo(PyObject *m)
+ PyObject_Call((PyObject *) &FloatingTZType, args, NULL);
+
+ if (floating && PyObject_TypeCheck(floating, &FloatingTZType))
+- {
+ _floating = (t_tzinfo *) floating;
+- PyDict_SetItemString(TZInfoType.tp_dict, "floating", floating);
+- }
+ else
+ Py_XDECREF(floating);
+ Py_DECREF(args);
+diff --git a/tzinfo.h b/tzinfo.h
+index e129465..182459f 100644
+--- a/tzinfo.h
++++ b/tzinfo.h
+@@ -24,8 +24,6 @@
+ #ifndef _tzinfo_h
+ #define _tzinfo_h
+
+-extern PyTypeObject TZInfoType;
+-
+ void _init_tzinfo(PyObject *m);
+
+ #endif /* _tzinfo_h */
Thanks,
--
Colin Watson [cjwatson at ubuntu.com]
More information about the Python-modules-team
mailing list