Blob Blame History Raw
# We used to build with Theano support.  However, we no longer have a compatible
# version of Theano in Fedora.  If aesara is ever packaged for Fedora, we can
# use it instead.

# We are archful (see below), but there are no ELF objects in the binary RPM.
%global debug_package %{nil}

Name:           sympy
Version:        1.12
Release:        %autorelease
Summary:        A Python library for symbolic mathematics

# The project as a whole is BSD-3-Clause.
# The files in sympy/parsing/latex are MIT.
License:        BSD-3-Clause AND MIT
URL:            https://sympy.org/
VCS:            https://github.com/sympy/sympy
Source0:        %{vcs}/archive/%{name}-%{version}.tar.gz
# Skip tests that require a display
Patch0:         %{name}-circuitplot.patch
# Adapt to python 3.12
# https://github.com/sympy/sympy/pull/26386
Patch1:         %{name}-python3.12.patch
# Fix incompatible pointers, which are an error with GCC 14
# https://github.com/sympy/sympy/pull/25968
Patch2:         %{name}-incompatible-pointer.patch

# This package used to be noarch, and should still be noarch.  However, because
# there is no JDK available on i686 anymore, the antlr4 package is also not
# available on i686.  When we can stop building on i686 altogether, we can bring
# this back.  In the meantime, we cannot claim to be noarch, because the i686
# build is different from the other arches in lacking BuildRequires: antlr4.
# BuildArch:      noarch

%ifarch %{java_arches}
BuildRequires:  antlr4
%endif
BuildRequires:  gcc
BuildRequires:  gcc-c++
BuildRequires:  gcc-gfortran
BuildRequires:  python3-devel
BuildRequires:  %{py3_dist cython}
BuildRequires:  %{py3_dist gmpy2}
BuildRequires:  %{py3_dist llvmlite}
BuildRequires:  %{py3_dist matplotlib}
BuildRequires:  %{py3_dist matplotlib-inline}
BuildRequires:  %{py3_dist myst-parser}
BuildRequires:  %{py3_dist numexpr}
BuildRequires:  python3-numpy-f2py
BuildRequires:  %{py3_dist scipy}
BuildRequires:  %{py3_dist wurlitzer}

# Documentation
BuildRequires:  graphviz
BuildRequires:  ImageMagick
BuildRequires:  librsvg2-tools
BuildRequires:  make
BuildRequires:  %{py3_dist furo}
BuildRequires:  %{py3_dist linkify-it-py}
BuildRequires:  %{py3_dist mpmath}
BuildRequires:  %{py3_dist numpydoc}
BuildRequires:  %{py3_dist sphinx-autobuild}
BuildRequires:  %{py3_dist sphinx-copybutton}
BuildRequires:  %{py3_dist sphinx-math-dollar}
BuildRequires:  %{py3_dist sphinx-reredirects}
BuildRequires:  %{py3_dist sphinxcontrib-jquery}
BuildRequires:  python-mpmath-doc
BuildRequires:  tex(latex)
BuildRequires:  tex-dvipng

# Tests
BuildRequires:  parallel
BuildRequires:  %{py3_dist autowrap}
BuildRequires:  xorg-x11-fonts-Type1
BuildRequires:  xorg-x11-server-Xvfb

%global _description\
SymPy aims to become a full-featured computer algebra system (CAS)\
while keeping the code as simple as possible in order to be\
comprehensible and easily extensible. SymPy is written entirely in\
Python and does not require any external libraries.

%description %_description

%package -n python3-%{name}
Summary:        A Python3 library for symbolic mathematics
Recommends:     tex(latex)
Recommends:     tex(amsfonts.sty)
Recommends:     tex(amsmath.sty)
Recommends:     tex(euler.sty)
Recommends:     tex(eulervm.sty)
Recommends:     tex(standalone.cls)
%ifarch %{java_arches}
Recommends:     %{py3_dist antlr4-python3-runtime}
%endif
Recommends:     %{py3_dist cython}
Recommends:     %{py3_dist gmpy2}
Recommends:     %{py3_dist matplotlib}
Recommends:     %{py3_dist numexpr}
Recommends:     %{py3_dist pyglet}
Recommends:     %{py3_dist scipy}

# This can be removed when F38 reaches EOL
Obsoletes:      sympy-texmacs < 1.8

%description -n python3-%{name}
SymPy aims to become a full-featured computer algebra system (CAS)
while keeping the code as simple as possible in order to be
comprehensible and easily extensible. SymPy is written entirely in
Python and does not require any external libraries.

%package examples
License:        BSD-3-Clause
Summary:        Sympy examples
Requires:       python3-%{name} = %{version}-%{release}

%description examples
This package contains example input for sympy.

%package doc
# This project is BSD-3-Clause.  Other files bundled with the documentation
# have the following licenses:
# - searchindex.js: BSD-2-Clause
# - _static/basic.css: BSD-2-Clause
# - _static/clipboard.min.js: MIT
# - _static/copy*: MIT
# - _static/doctools.js: BSD-2-Clause
# - _static/graphviz.js: BSD-2-Clause
# - _static/jquery*.js: MIT
# - _static/language_data.js: BSD-2-Clause
# - _static/plot_directive.css: PSF-2.0 (see note)
# - _static/pygments.css: BSD-2-Clause
# - _static/scripts/*: MIT
# - _static/searchtools.js: BSD-2-Clause
# - _static/styles/*: MIT
# - _static/underscore*.js: MIT
#
# NOTE: The license of _static/plot_directive.css is the same as the license of
# matplotlib.  The matplotlib license is functionally identical to PSF-2.0, but
# uses different organization and project names.  I am using the PSF-2.0
# identifier for now, because there is no valid SPDX choice.  Revisit this.
License:        BSD-3-Clause AND BSD-2-Clause AND MIT AND PSF-2.0
Summary:        Documentation for sympy
Provides:       bundled(js-jquery)
Provides:       bundled(js-underscore)

%description doc
HTML documentation for sympy.

%prep
%autosetup -p1 -n %{name}-%{name}-%{version}

fixtimestamp() {
  touch -r $1.orig $1
  rm -f $1.orig
}

# Do not depend on env
for fil in $(grep -rl "^#\![[:blank:]]*%{_bindir}/env" .); do
  sed -i.orig 's,^\(#\![[:blank:]]*%{_bindir}/\)env python,\1python3,' $fil
  fixtimestamp $fil
done

# Remove bogus shebangs
for fil in sympy/physics/mechanics/models.py \
           sympy/physics/optics/polarization.py; do
  sed -i.orig '/env python/d' $fil
  fixtimestamp $fil
done

# Use local objects.inv for intersphinx
sed -e "s|\('https://mpmath\.org/doc/current/', \)None|\1'%{_docdir}/python-mpmath-doc/html/objects.inv'|" \
    -i doc/src/conf.py

%generate_buildrequires
%pyproject_buildrequires

%build
%ifarch %{java_arches}
# Regenerate the ANTLR files
%{python3} setup.py antlr
%endif

# Build
%pyproject_wheel

# Build the documentation
pushd doc
make html SPHINXOPTS=%{?_smp_mflags} PYTHON=%{python3}
make cheatsheet
popd

%install
%pyproject_install
%pyproject_save_files isympy sympy

## Remove extra files
rm -f %{buildroot}%{_bindir}/{,doc}test

# Don't let an executable script go into the documentation
chmod -R a-x+X examples

# Fix permissions
chmod 0755 %{buildroot}%{python3_sitelib}/sympy/benchmarks/bench_symbench.py \
      %{buildroot}%{python3_sitelib}/sympy/testing/tests/diagnose_imports.py

# Install the HTML documentation
mkdir -p %{buildroot}%{_docdir}/%{name}-doc
cp -a doc/_build/html %{buildroot}%{_docdir}/%{name}-doc
rm -f %{buildroot}%{_docdir}/%{name}-doc/html/.buildinfo
rm -fr %{buildroot}%{_docdir}/%{name}-doc/i18n

# Try to get rid of pyc files, which aren't useful for documentation
find examples/ -name '*.py[co]' -print -delete

%check
# Many tests assume they are running on an x86_64 machine.  Some assume that
# native 64-bit integers are available.  Some assume that 80-bit floating point
# numbers are available.  Some assume that certain operations always produce
# numpy float64 values (but produce float32 values on some architectures).  I
# used to try to keep the test suite working on all architectures, but it has
# become too much of a burden.  Only run tests if we happen to build on x86_64.
# We cannot use %%ifarch here because this is a noarch package.
if [ "$(uname -m)" = "x86_64" ]; then
  # Split into many small chunks to reduce waiting in the end-game
  jobs=%{?_smp_mflags}; jobs=${jobs#-j}; jobs=$((jobs * 3))

  xvfb-run -d \
      parallel %{?_smp_mflags} \
      %{python3} bin/test -v --split {}/$jobs \
      ::: $(bash -c "echo {1..$jobs}")
fi

%files -n python3-%{name} -f %{pyproject_files}
%doc AUTHORS README.md
%doc doc/_build/cheatsheet/cheatsheet.pdf
%doc doc/_build/cheatsheet/combinatoric_cheatsheet.pdf
%{_bindir}/isympy
%{_mandir}/man1/isympy.1*

%files examples
%doc examples/*

%files doc
%docdir %{_docdir}/%{name}-doc/html
%{_docdir}/%{name}-doc/html

%changelog
%autochangelog