File python-mpi4py.spec of Package python-mpi4py

#
# spec file for package python-mpi4py
#
# Copyright (c) 2025 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via https://bugs.opensuse.org/
#


%define plainpython python
Name:           python-mpi4py
Version:        4.0.3
Release:        1.1
Summary:        MPI for Python
License:        BSD-3-Clause
URL:            https://github.com/mpi4py/mpi4py
Source:         https://files.pythonhosted.org/packages/source/m/mpi4py/mpi4py-%{version}.tar.gz
BuildRequires:  %{python_module Cython >= 3}
BuildRequires:  %{python_module devel}
BuildRequires:  %{python_module pip}
BuildRequires:  %{python_module setuptools >= 42}
BuildRequires:  %{python_module wheel}
BuildRequires:  fdupes
BuildRequires:  openmpi-macros-devel
BuildRequires:  python-rpm-macros
# SECTION test dependencies
BuildRequires:  %{python_module numpy}
BuildRequires:  %{python_module PyYAML}
BuildRequires:  %{python_module cffi}
# /SECTION
%openmpi_requires
%python_subpackages

%description
This package provides Python bindings for the Message Passing
Interface (MPI) standard. It is implemented on top of the MPI-1/2/3
specification and exposes an API which grounds on the standard MPI-2
C++ bindings.

This package supports:
  + Communication of any picklable Python object
    * Point-to-point: send & receive
    * Collective: broadcast, scatter & gather, reductions
  + Communication of Python object exposing the Python buffer
    interface (NumPy arrays, builtin bytes/string/array objects)
    * Point-to-point: blocking/nonbloking/persistent send & receive
    * Collective: broadcast, block/vector scatter & gather, reductions
  + Process groups and communication domains
    * Creation of new intra/inter communicators
    * Cartesian & graph topologies
  + Parallel input/output:
    * read & write
    * blocking/nonbloking & collective/noncollective
    * individual/shared file pointers & explicit offset
  + Dynamic process management
    * spawn & spawn multiple
    * accept/connect
    * name publishing & lookup
  + One-sided operations
    * remote memory access: put, get, accumulate
    * passive target syncronization: start/complete & post/wait
    * active target syncronization: lock & unlock

%package        devel
Summary:        Development files for %{name}
Requires:       %{name} = %{version}
Requires:       %{name}-common-devel = %{version}
Requires:       python-devel
Requires:       %plainpython(abi) = %python_version

%description    devel
Development libraries and headers needed to build packages using %{name}.

%package     -n %{name}-common-devel
Summary:        Shared development files for %{name}
%openmpi_devel_requires
Provides:       %{python_module mpi4py-common-devel = %{version}}
BuildArch:      noarch

%description -n %{name}-common-devel
Development libraries and headers needed to build packages using %{name}.

You normally do not need to install this directly, it will be pulled in by
the python-specific devel package.

%package     -n %{name}-doc
Summary:        Documentation for %{name}
Provides:       %{python_module mpi4py-doc = %{version}}
BuildArch:      noarch

%description -n %{name}-doc
Documentation files and demos for %{name}.

%prep
%autosetup -p1 -n mpi4py-%{version}
sed -i '1!b;/^#!\/usr\/bin\/env python/d' demo/python-config
chmod a-x demo/python-config demo/check-mpiexec/run.sh
rm docs/source/make.bat

%build
%setup_openmpi

export CFLAGS="%{optflags} -fno-strict-aliasing"
export LANG=en_US.UTF-8
%pyproject_wheel

%install
export LANG=en_US.UTF-8
%pyproject_install

%{python_expand # De-duplicate includes and also put them in a more generally-accessible location.
rm -Rf %{buildroot}/%{_includedir}/mpi4py/include
rm -Rf %{buildroot}/%{_includedir}/mpi4py/*.h
mkdir -p -m 755 %{buildroot}/%{_includedir}/mpi4py/include
# Keep directory structure intact, e.g. mpi4py.h includes "../../MPI_api.h"
mv %{buildroot}%{$python_sitearch}/mpi4py/include/mpi4py %{buildroot}/%{_includedir}/mpi4py/include/mpi4py
mv %{buildroot}%{$python_sitearch}/mpi4py/*.h %{buildroot}/%{_includedir}/mpi4py/
ln -s %{_includedir}/mpi4py/include/mpi4py %{buildroot}%{$python_sitearch}/mpi4py/include/mpi4py
for f in %{_includedir}/mpi4py/{MPI,MPI_api}.h; do ln -s ${f} %{buildroot}%{$python_sitearch}/mpi4py/; done
%fdupes %{buildroot}%{$python_sitearch}
}
%fdupes %{buildroot}/%{_includedir}

mkdir -p %{buildroot}%{_docdir}%{name}
cp -r docs %{buildroot}%{_docdir}%{name}/
cp -r demo %{buildroot}%{_docdir}%{name}/
%fdupes %{buildroot}%{_docdir}%{name}

# Don't run tests in s390x, mpiexec is not too reliable running in the
# OBS virtual machine environment. bsc#1218604#c1
%ifnarch s390x
%check
export PYTHONDONTWRITEBYTECODE=1
export LANG=en_US.UTF-8
# https://mpi4py.readthedocs.io/en/stable/develop.html#testing
# obs server: no communication between processes?
donttest="-x test_spawn"
donttest+=" -x test_apply"
donttest+=" -x test_async_error_callback"
donttest+=" -x test_empty_iterable"
donttest+=" -x test_imap"
donttest+=" -x test_istarmap"
donttest+=" -x test_map"
donttest+=" -x test_starmap"
donttest+=" -x test_pool_worker_lifetime_early_close"
donttest+=" -x test_terminate"
# osc build local: hangs or takes too long?
donttest+=" -x test_p2p_obj"
donttest+=" -x testGetStatusAll"
donttest+=" -x testIMProbe"
donttest+=" -x testIS"
donttest+=" -x testMProbe"
donttest+=" -x testMessageProbeIProbe"
donttest+=" -x testProbe"
donttest+=" -x testTestAll"
donttest+=" -x testAll"
donttest+=" -x testWaitAll"
%ifarch %ix86
# https://github.com/mpi4py/mpi4py/issues/105
donttest+=" -x test_io"
# There are more broken tests in i586: https://github.com/mpi4py/mpi4py/issues/279
donttest+=" -x test_file -x test_subclass -x test_errhandler -x test_threads"
%endif
%setup_openmpi
%{python_expand export PYTHONPATH=%{buildroot}%{$python_sitearch}
rm -rf build _build.*
%{openmpi_prefix}/bin/mpiexec -n 1 $python -B test/main.py -v $donttest
}
%endif

%files %{python_files}
%doc CHANGES.rst DESCRIPTION.rst README.rst
%license LICENSE.rst
%{python_sitearch}/mpi4py
%{python_sitearch}/mpi4py-%{version}.dist-info
%exclude %{python_sitearch}/mpi4py/include/
%exclude %{python_sitearch}/mpi4py/*.h

%files %{python_files devel}
%license LICENSE.rst
%{python_sitearch}/mpi4py/include/
%{python_sitearch}/mpi4py/*.h

%files -n %{name}-common-devel
%license LICENSE.rst
%{_includedir}/mpi4py/

%files -n %{name}-doc
%license LICENSE.rst
%dir %{_docdir}%{name}
%{_docdir}%{name}/docs/
%{_docdir}%{name}/demo/

%changelog
* Tue Mar  4 2025 Atri Bhattacharya <badshah400@gmail.com>
- Update to version 4.0.3:
  * Fix DLPack v1.0 support.
- Changes from version 4.0.2:
  * Support MPI-4 features within Intel MPI 2021.14.
  * Various fixes and updates to tests.
  * Minor fixes to typing support.
  * Minor fix to documentation.
* Sun Dec 22 2024 Stefan Brüns <stefan.bruens@rwth-aachen.de>
- Fix packaging of header files, breaking VTK openmpi builds.
  E.g. mpi4py.h requires the MPI_api.h in a specific relative
  location.
* Fri Nov 22 2024 Ben Greiner <code@bnavigator.de>
- Update to 4.0.1
  [#]# Update support for Python 3.13:
  * Enable Cython 3.1 support for free-threaded CPython.
  * Allow compiling Cython-generated C sources with the full Python
    C-API.
  * Fix MPI DLL path workarounds on Windows after changes to
    locals().
  [#]# Enhancements to test suite:
  * Support XML reports via unittest-xml-reporting.
  * Add command line options to exclude tests by patterns and
    files.
  * Refactor Python 2 code to use Python 3 constructs using
    pyupgrade.
  [#]# Miscellaneous:
  * Minor and mostly inconsequential subclass fix in
    mpi4py.util.pkl5.
  * Update compatibility workarounds for legacy MPICH 3.0 release.
- Release 4.0.0
  [#]# New features:
  [#]## Add support for the MPI-4.0 standard.
  * Use large count MPI-4 routines.
  * Add persistent collective communication.
  * Add partitioned point-to-point communication.
  * Add new communicator constructors.
  * Add the Session class and its methods.
  [#]## Add support for the MPI-4.1 standard.
  * Add non-destructive completion test for multiple requests.
  * Add value-index datatype constructor.
  * Add communicator/session buffer attach/detach/flush.
  * Support for removal of error classes/codes/strings.
  * Support for querying hardware resource information.
  [#]## Add preliminary support for the upcoming MPI-5.0 standard.
  * User-level failure mitigation (ULFM).
  * mpi4py.util.pool: New drop-in replacement for
    multiprocessing.pool.
  * mpi4py.util.sync: New synchronization utilities.
  * Add runtime check for mismatch between mpiexec and MPI library.
  * Support scikit-build-core as an alternative build backend.
  * Support meson-python as an alternative build backend.
  [#]# Enhancements:
  * mpi4py.futures: Support for parallel tasks.
  * mpi4py.futures: Report exception tracebacks in workers.
  * mpi4py.util.pkl5: Add support for collective communication.
  * Add methods Datatype.fromcode(), Datatype.tocode() and
    attributes Datatype.typestr, Datatype.typechar to simplify
    NumPy interoperability for simple cases.
  * Add methods Comm.Create_errhandler(), Win.Create_errhandler(),
    and File.Create_errhandler() to create custom error handlers.
  * Add support for pickle serialization of instances of MPI types.
    All instances of Datatype, Info, and Status can be serialized.
    Instances of Op can be serialized only if created through
    mpi4py by calling Op.Create(). Instances of other MPI types can
    be serialized only if they reference predefined handles.
  * Add handle attribute and fromhandle() class method to MPI
    classes to ease interoperability with external code. The handle
    value is an unsigned integer guaranteed to fit on the
    platform's uintptr_t C type.
  * Add lowercase free() method to MPI classes to ease MPI object
    deallocation and cleanup. This method eventually attempts to
    call Free(), but only if the object's MPI handle is not a null
    or predefined handle, and such call is allowed within the World
    Model init/finalize.
  [#]# Backward-incompatible changes:
  * Python 2 is no longer supported, Python 3.6+ is required, but
    typing stubs are supported for Python 3.8+.
  * The Intracomm.Create_group() method is no longer defined in the
    base Comm class.
  * Group.Compare() and Comm.Compare() are no longer class methods
    but instance methods. Existing codes using the former class
    methods are expected to continue working.
  * Group.Translate_ranks() is no longer a class method but an
    instance method. Existing codes using the former class method
    are expected to continue working.
  * The LB and UB datatypes are no longer available, use
    Datatype.Create_resized() instead.
  * The HOST predefined attribute key is no longer available.
  * The MPI.memory class has been renamed to MPI.buffer. The old
    name is still available as an alias to the new name.
  * The mpi4py.dl module is no longer available.
  * The mpi4py.get_config function returns an empty dictionary.
  [#]# Miscellaneous:
  * The project is now licensed under the BSD-3-Clause license.
    This change is fairly inconsequential for users and
    distributors. It simply adds an additional clause against using
    contributor names for promotional purposes without their
    consent.
  * Add a new guidelines section to documentation laying out new
    fair play rules. These rules ask companies and outside
    developers to refrain from reusing the mpi4py name in
    unaffiliated projects, publishing binary mpi4py wheels on the
    main Python Package Index (PyPI), and distributing modified
    versions with incompatible or extended API changes. The primary
    motivation of these rules is to avoid fragmentation and
    end-user confusion.
- Skip failing tests: test fails are different on server and local
  machines. TODO: Investigate
- Remove unused rpm macro file: Static %%mpi4py_mpi_ver is not used
  anywhere (and had a strange name for value 'openmpi')
* Fri May 10 2024 Dirk Müller <dmueller@suse.com>
- update to 3.1.6:
  * This is the last release supporting Python 2.
  * Fix various build issues.
* Fri Jan 19 2024 Daniel Garcia <daniel.garcia@suse.com>
- Don't run tests in s390x, mpiexec is not too reliable running in the
  OBS virtual machine environment. bsc#1218604#c1
* Thu Dec  7 2023 Dirk Müller <dmueller@suse.com>
- update to 3.1.5:
  * Rebuild C sources with Cython 0.29.36 to support Python 3.12.
* Sat Sep 23 2023 Ben Greiner <code@bnavigator.de>
- Limit to Cython 0: gh#mpi4py/mpi4py#383
- PEP517: build wheel instead of deprecated setup.py install
* Thu Nov 10 2022 Daniel Garcia <daniel.garcia@suse.com>
- Disable current broken tests for i586. gh#mpi4py/mpi4py#279
- Increase memory size in constraints
* Thu Nov 10 2022 Daniel Garcia <daniel.garcia@suse.com>
- Add rpmlintrc as source in the spec file
* Thu Nov 10 2022 Daniel Garcia <daniel.garcia@suse.com>
- Remove exec perms from demo/python-config
- Add python-mpi4py-rpmlintrc to filter no-binary erros for devel, common-devel
  and doc subpackages
* Tue Nov  8 2022 Daniel Garcia <daniel.garcia@suse.com>
- Remove pml/ob1 option for tests, bsc#1205139
- Remove python_module macro definition
- Update shebang string replacement
* Mon Nov  7 2022 Daniel Garcia <daniel.garcia@suse.com>
- Use pml/ob1 for tests
- Update to 3.1.4
  * Rebuild C sources with Cython 0.29.32 to support Python 3.11.
  * Fix contiguity check for DLPack and CAI buffers.
  * Workaround build failures with setuptools v60.
* Mon Oct 17 2022 Steve Kowalik <steven.kowalik@suse.com>
- Add patch support-numpy-1.22.patch:
  * Support NumPy 1.22+
* Sun Jan  2 2022 Ben Greiner <code@bnavigator.de>
- Update to 3.1.3
  * Add missing support for MPI.BOTTOM to generalized all-to-all
    collectives.
- Release 3.1.2
  * mpi4py.futures: Add _max_workers property to MPIPoolExecutor.
  * mpi4py.util.dtlib: Fix computation of alignment for predefined
    datatypes.
  * mpi4py.util.pkl5: Fix deadlock when using ssend() + mprobe().
  * mpi4py.util.pkl5: Add environment variable
    MPI4PY_PICKLE_THRESHOLD.
  * mpi4py.rc: Interpret "y" and "n" strings as boolean values.
  * Fix/add typemap/typestr for MPI.WCHAR/MPI.COUNT datatypes.
  * Minor fixes and additions to documentation.
  * Minor fixes to typing support.
  * Support for local version identifier (PEP-440).
- skip io tests on i586: gh#mpi4py/mpi4py#105
* Thu Sep 30 2021 Nicolas Morey-Chaisemartin <nmoreychaisemartin@suse.com>
- Use openmpi macros to always build with the default openmpi version (bsc#1190810)
* Sun Sep 26 2021 Hans-Peter Jansen <hpj@urpla.net>
- Update to 3.1.1
  + Warning
  + This is the last release supporting Python 2.
  * Fix typo in Requires-Python package metadata.
  * Regenerate C sources with Cython 0.29.24.
- Update to 3.1.0
  + Warning
  + This is the last release supporting Python 2.
  * New features:
  * mpi4py.util: New package collecting miscellaneous utilities.
  * Enhancements:
  * Add pickle-based Request.waitsome() and Request.testsome().
  * Add lowercase methods Request.get_status() and
    Request.cancel().
  * Support for passing Python GPU arrays compliant with the
    DLPack data interchange mechanism (link) and the
    __cuda_array_interface__ (CAI) standard (link) to uppercase
    methods. This support requires that mpi4py is built against
    CUDA-aware MPI implementations. This feature is currently
    experimental and subject to future changes.
  * mpi4py.futures: Add support for initializers and canceling
    futures at shutdown. Environment variables names now follow
    the pattern MPI4PY_FUTURES_*, the previous MPI4PY_* names are
    deprecated.
  * Add type annotations to Cython code. The first line of the
    docstring of functions and methods displays a signature
    including type annotations.
  * Add companion stub files to support type checkers.
  * Support for weak references.
  * Miscellaneous:
  * Add a new mpi4py publication (link) to the citation listing.
- Minor packaging cleanups
- Disable Python2 builds
* Sat Sep 18 2021 Christoph Junghans <junghans@votca.org>
- Reactivate test_msgspec, disable test_spawn
* Fri Sep 17 2021 Christoph Junghans <junghans@votca.org>
- Build against openmpi4
* Thu Feb 25 2021 andy great <andythe_great@pm.me>
- Skip python 3.6 because numpy no longer support it.
* Tue Nov 19 2019 Todd R <toddrme2178@gmail.com>
- Update to 3.0.3
  * Regenerate Cython wrappers to support Python 3.8.
- Drop upstream-included fix_window_size.patch
* Sun Aug  4 2019 Todd R <toddrme2178@gmail.com>
- Add fix_window_size.patch
  Fixes unit tests
  See: https://bitbucket.org/mpi4py/mpi4py/issues/137/
* Wed Jul 31 2019 Todd R <toddrme2178@gmail.com>
- Update to 3.0.2
  * Bug fixes:
    + Fix handling of readonly buffers in support for Pytho
    2 legacy buffer interface. The issue triggers only when using
    a buffer-like object that is readonly and does not export
    the new Python 3 buffer interface.
    + Fix build issues with Open MPI 4.0.x series related to
    removal of many MPI-1 symbols deprecated in MPI-2 and removed
    in MPI-3.
    + Minor documentation fixes.
* Wed Feb 27 2019 Bernhard Wiedemann <bwiedemann@suse.com>
- Use openmpi2 for releases that support it.
* Mon Feb 25 2019 Tomáš Chvátal <tchvatal@suse.com>
- Update to 3.0.1:
  * Bug fixes:
    + Fix ``Comm.scatter()`` and other collectives corrupting input send
    list. Add safety measures to prevent related issues in global
    reduction operations.
    + Fix error-checking code for counts in ``Op.Reduce_local()``.
  * Enhancements:
    + Map size-specific Python/NumPy typecodes to MPI datatypes.
    + Allow partial specification of target list/tuple arguments in the
    various ``Win`` RMA methods.
    + Workaround for removal of ``MPI_{LB|UB}`` in Open MPI 4.0.
    + Support for Microsoft MPI v10.0.
- Add numpy as build dependency used in tests
* Thu Nov 15 2018 Todd R <toddrme2178@gmail.com>
- Use openmpi3 for releases that support it.
* Wed Jun 13 2018 toddrme2178@gmail.com
- Update to version 3.0.0
  * New features:
    + `mpi4py.futures`: Execute computations asynchronously using a pool
    of MPI processes. This package is based on ``concurrent.futures``
    from the Python standard library.
    + `mpi4py.run`: Run Python code and abort execution in case of
    unhandled exceptions to prevent deadlocks.
    + `mpi4py.bench`: Run basic MPI benchmarks and tests.
  * Enhancements:
    + Lowercase, pickle-based collective communication calls are now
    thread-safe through the use of fine-grained locking.
    + The ``MPI`` module now exposes a ``memory`` type which is a
    lightweight variant of the builtin ``memoryview`` type, but
    exposes both the legacy Python 2 and the modern Python 3 buffer
    interface under a Python 2 runtime.
    + The ``MPI.Comm.Alltoallw()`` method now uses ``count=1`` and
    ``displ=0`` as defaults, assuming that messages are specified
    through user-defined datatypes.
    + The ``Request.Wait[all]()`` methods now return ``True`` to match
    the interface of ``Request.Test[all]()``.
    + The ``Win`` class now implements the Python buffer interface.
  * Backward-incompatible changes:
    + The ``buf`` argument of the ``MPI.Comm.recv()`` method is
    deprecated, passing anything but ``None`` emits a warning.
    + The ``MPI.Win.memory`` property was removed, use the
    ``MPI.Win.tomemory()`` method instead.
    + Executing ``python -m mpi4py`` in the command line is now
    equivalent to ``python -m mpi4py.run``. For the former behavior,
    use ``python -m mpi4py.bench``.
    + Python 2.6 and 3.2 are no longer supported. The ``mpi4py.MPI``
    module may still build and partially work, but other pure-Python
    modules under the ``mpi4py`` namespace will not.
    + Windows: Remove support for legacy MPICH2, Open MPI, and DeinoMPI.
- Switch to recommended openmpi2 for distributions that support it.
* Wed Oct 25 2017 junghans@votca.org
- adapt to new openlmi package - source mpivars.h during build
* Tue May 23 2017 toddrme2178@gmail.com
- Implement single-spec version
- Fix source URL.
- Package docs
* Wed Jan 25 2017 jengelh@inai.de
- Update description. Drop redundant %%clean.
* Tue Jan 24 2017 junghans@votca.org
- install LICENSE.rst as suggest in request#445611
* Sun Dec 11 2016 junghans@votca.org
- Update to version 2.0.0
  * Support for MPI-3 features.
  * Support for MPI-2 features not included in previous releases.
  * New scalable implementation of reduction operations for Python objects.
* Thu Oct 24 2013 toddrme2178@gmail.com
- Update to version 1.3.1
  * Regenerate C wrappers with Cython 0.19.1 to support Python 3.3.
  * Install ``*.pxd`` files in ``<site-packages>/mpi4py`` to ease the
    support for Cython's ``cimport`` statement in code requiring to
    access mpi4py internals.
  * As a side-effect of using Cython 0.19.1, ancient Python 2.3 is no
    longer supported. If you really need it, you can install an older
    Cython and run ``python setup.py build_src --force``.
* Tue May 22 2012 toddrme2178@gmail.com
- Update to version 1.3
- Add Python 3 package
* Sat Feb 25 2012 scorot@free.fr
- fix build for SLE-11
* Fri Jan  6 2012 toddrme2178@gmail.com
- Update to version 1.2.2
- Clean up spec file
- Switch to .changes file
* Tue May  5 2009 felix.richter2@uni-rostock.de
- Initial specfile generated by python distutils,
- adapted for SUSE Build Service
openSUSE Build Service is sponsored by