[arch-commits] Commit in python-mpi4py/trunk (PKGBUILD python-3.8.patch)

Evangelos Foutras foutrelis at archlinux.org
Fri Oct 25 19:47:16 UTC 2019


    Date: Friday, October 25, 2019 @ 19:47:15
  Author: foutrelis
Revision: 519587

Fix build with Python 3.8

Added:
  python-mpi4py/trunk/python-3.8.patch
Modified:
  python-mpi4py/trunk/PKGBUILD

------------------+
 PKGBUILD         |   14 ++++-
 python-3.8.patch |  132 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 143 insertions(+), 3 deletions(-)

Modified: PKGBUILD
===================================================================
--- PKGBUILD	2019-10-25 19:06:28 UTC (rev 519586)
+++ PKGBUILD	2019-10-25 19:47:15 UTC (rev 519587)
@@ -13,13 +13,21 @@
 arch=(x86_64)
 url="https://bitbucket.org/mpi4py/mpi4py"
 license=(BSD)
-makedepends=(python-setuptools python2-setuptools openmpi)
+makedepends=(python-setuptools python2-setuptools openmpi cython)
 checkdepends=(inetutils)
-source=("https://files.pythonhosted.org/packages/source/m/${_pkg}/${_pkg}-${pkgver}.tar.gz")
-sha256sums=('f8d629d1e3e3b7b89cb99d0e3bc5505e76cc42089829807950d5c56606ed48e0')
+source=("https://files.pythonhosted.org/packages/source/m/${_pkg}/${_pkg}-${pkgver}.tar.gz"
+        'python-3.8.patch')
+sha256sums=('f8d629d1e3e3b7b89cb99d0e3bc5505e76cc42089829807950d5c56606ed48e0'
+            '44f7f5816a91f3cc0d61553b1316094873f22a9193d87b3cd397b7cb1c974e59')
 
 prepare() {
     cp -a ${_pkg}-${pkgver}{,-py2}
+
+    # https://bitbucket.org/mpi4py/mpi4py/commits/62a7b879051f
+    patch -Np1 -d ${_pkg}-${pkgver} <python-3.8.patch
+
+    # Force recreation of Cython-generated files for Python 3.8 compatibility
+    rm $(grep -rl '/\* Generated by Cython' ${_pkg}-${pkgver})
 }
 
 build() {

Added: python-3.8.patch
===================================================================
--- python-3.8.patch	                        (rev 0)
+++ python-3.8.patch	2019-10-25 19:47:15 UTC (rev 519587)
@@ -0,0 +1,132 @@
+From 62a7b879051f2029fe46618f8bf9a019bdb96845 Mon Sep 17 00:00:00 2001
+From: Lisandro Dalcin <dalcinl at gmail.com>
+Date: Fri, 25 Oct 2019 12:22:41 +0300
+Subject: [PATCH] mpi4py.futures: Fixes to support Python 3.8
+
+---
+ demo/futures/test_futures.py   |  7 +++++--
+ src/mpi4py/futures/__init__.py | 10 ++++++++++
+ src/mpi4py/futures/_base.py    | 25 +++++++++++++++++++++++--
+ 3 files changed, 38 insertions(+), 4 deletions(-)
+
+diff --git a/demo/futures/test_futures.py b/demo/futures/test_futures.py
+index 925544d..7e03003 100644
+--- a/demo/futures/test_futures.py
++++ b/demo/futures/test_futures.py
+@@ -1157,7 +1157,9 @@ class ThenTest(unittest.TestCase):
+         def transform(a):
+             try:
+                 f = chain.pop(0)
+-                f.set_result(transform(a))
++                r = transform(a)
++                f.__init__()
++                f.set_result(r)
+                 return f
+             except IndexError:
+                 return 42
+@@ -1176,7 +1178,8 @@ class ThenTest(unittest.TestCase):
+         self.assert_(new_f.exception())
+         with self.assertRaises(RuntimeError) as catcher:
+             new_f.result()
+-        assert 'Circular future chain detected' in catcher.exception.args[0]
++        self.assert_('Circular future chain detected'
++                     in catcher.exception.args[0])
+ 
+ 
+ SKIP_POOL_TEST = False
+diff --git a/src/mpi4py/futures/__init__.py b/src/mpi4py/futures/__init__.py
+index d8c00bc..0518d7a 100644
+--- a/src/mpi4py/futures/__init__.py
++++ b/src/mpi4py/futures/__init__.py
+@@ -15,6 +15,14 @@ try:
+         wait,
+         as_completed,
+     )
++    try:  # Python 3.7
++        from concurrent.futures import BrokenExecutor
++    except ImportError:  # pragma: no cover
++        BrokenExecutor = RuntimeError
++    try:  # Python 3.8
++        from concurrent.futures import InvalidStateError
++    except ImportError:  # pragma: no cover
++        InvalidStateError = CancelledError.__base__
+ except ImportError:  # pragma: no cover
+     from ._base import (
+         FIRST_COMPLETED,
+@@ -22,6 +30,8 @@ except ImportError:  # pragma: no cover
+         ALL_COMPLETED,
+         CancelledError,
+         TimeoutError,
++        InvalidStateError,
++        BrokenExecutor,
+         Future,
+         Executor,
+         wait,
+diff --git a/src/mpi4py/futures/_base.py b/src/mpi4py/futures/_base.py
+index cfbd2c0..3eaa512 100644
+--- a/src/mpi4py/futures/_base.py
++++ b/src/mpi4py/futures/_base.py
+@@ -1,4 +1,4 @@
+-# Backport of concurrent.futures._base from Python 3.7
++# Backport of concurrent.futures._base from Python 3.8
+ # pylint: skip-file
+ 
+ # Copyright 2009 Brian Quinlan. All Rights Reserved.
+@@ -61,6 +61,10 @@ class TimeoutError(Error):
+     """The operation exceeded the given deadline."""
+     pass
+ 
++class InvalidStateError(Error):
++    """The operation is not allowed in this state."""
++    pass
++
+ class _Waiter(object):
+     """Provides the event that wait() and as_completed() block on."""
+     def __init__(self):
+@@ -414,7 +418,14 @@ class Future(object):
+             if self._state not in [CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED]:
+                 self._done_callbacks.append(fn)
+                 return
+-        fn(self)
++        try:
++            fn(self)
++        except Exception:
++            LOGGER.exception('exception calling callback for %r', self)
++        except BaseException:
++            raise
++        except:  # old-style exception objects
++            LOGGER.exception('exception calling callback for %r', self)
+ 
+     def result(self, timeout=None):
+         """Return the result of the call that the future represents.
+@@ -527,6 +538,8 @@ class Future(object):
+         Should only be used by Executor implementations and unit tests.
+         """
+         with self._condition:
++            if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}:
++                raise InvalidStateError('{}: {!r}'.format(self._state, self))
+             self._result = result
+             self._state = FINISHED
+             for waiter in self._waiters:
+@@ -540,6 +553,8 @@ class Future(object):
+         Should only be used by Executor implementations and unit tests.
+         """
+         with self._condition:
++            if self._state in {CANCELLED, CANCELLED_AND_NOTIFIED, FINISHED}:
++                raise InvalidStateError('{}: {!r}'.format(self._state, self))
+             self._exception = exception
+             self._state = FINISHED
+             for waiter in self._waiters:
+@@ -625,3 +640,9 @@ class Executor(object):
+     def __exit__(self, exc_type, exc_val, exc_tb):
+         self.shutdown(wait=True)
+         return False
++
++
++class BrokenExecutor(RuntimeError):
++    """
++    Raised when a executor has become non-functional after a severe failure.
++    """
+-- 
+2.10.5
+



More information about the arch-commits mailing list