diff --git a/.gitignore b/.gitignore index c624a1f..707f265 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,9 @@ /3.5.1.tar.gz /sleef-3.5.1.tar.gz +/sleef-3.5.1-filtered.tar.xz +/sleef-3.5.1-filtered.tar.zst +/sleef-3.6-filtered.tar.zst +/sleef-3.6.1-filtered.tar.zst +/sleef-3.7-filtered.tar.zst +/sleef-3.8-filtered.tar.zst +/sleef-3.9.0-filtered.tar.zst diff --git a/changelog b/changelog new file mode 100644 index 0000000..1969b77 --- /dev/null +++ b/changelog @@ -0,0 +1,11 @@ +* Mon May 17 2021 Dave Love - 3.5.1-4 +- Support epel7 + +* Wed Mar 17 2021 Benjamin A. Beasley - 3.5.1-3 +- Improve source URL + +* Thu Dec 24 2020 Benjamin A. Beasley - 3.5.1-2 +- Drop explicit pkgconfig dependency; providing a .pc file implies it + +* Fri Dec 18 2020 Benjamin A. Beasley - 3.5.1-1 +- Initial spec file diff --git a/get_source.sh b/get_source.sh new file mode 100755 index 0000000..3745066 --- /dev/null +++ b/get_source.sh @@ -0,0 +1,66 @@ +#!/bin/sh +set -o nounset +set -o errexit + +FORGEURL='https://github.com/shibatch/sleef' + +print_help() +{ + cat <&2 + print_help "${0}" + exit 1 +elif [ "${1-}" = '-h' ] || [ "${1-}" = '--help' ] +then + print_help "${0}" + exit 0 +fi + +VERSION="${1}" +SOURCE0="${FORGEURL}/archive/${VERSION}/sleef-${VERSION}.tar.gz" +TARNAME="$(basename "${SOURCE0}")" +TARDIR="$(basename "${SOURCE0}" '.tar.gz')" +NEWTAR="${TARDIR}-filtered.tar.zst" + +SAVEDIR="${PWD}" +XDIR="$(mktemp -d)" +trap "rm -rf '${XDIR}'" INT TERM EXIT + +cd "${XDIR}" +curl -L -O "${SOURCE0}" +tar -xzf "${TARNAME}" +MTIME="$(stat -c '%Y' "${TARDIR}")" +rm -rvf "${TARDIR}/src/gencoef/" +if grep -ErinI 'Attribution 4\.0' . +then + echo 'ERROR: did not properly remove problematic content' 1>&2 + exit 1 +fi +# https://www.gnu.org/software/tar/manual/html_section/Reproducibility.html +# We reset all mtimes to that of the top-level extracted directory; since git +# archives don’t have meaningful per-file mtimes, nothing useful is lost. +TZ=UTC LC_ALL=C tar \ + --create \ + --sort=name \ + --format=posix \ + --numeric-owner --owner=0 --group=0 \ + --mode=go+u,go-w \ + --pax-option='delete=atime,delete=ctime' \ + --clamp-mtime --mtime="@${MTIME}" \ + "${TARDIR}/" | + zstdmt --ultra -22 > "${NEWTAR}" +touch -d @"${MTIME}" "${NEWTAR}" + +cd "${SAVEDIR}" +mv -v "${XDIR}/${NEWTAR}" . diff --git a/sleef.rpmlintrc b/sleef.rpmlintrc new file mode 100644 index 0000000..7a1f9b5 --- /dev/null +++ b/sleef.rpmlintrc @@ -0,0 +1,12 @@ +# These are not real spelling errors... +addFilter(r"sleef-gnuabi\..*: spelling-error \('(lib(sleefgnuabi|mvec)|glibc)', ") +# All of the documentation is in the -doc subpackage. +addFilter(r" no-documentation") +# This Source cannot be a URL because we must filter out certain files. +addFilter(r" invalid-url Source[0-9]+: sleef-.*-filtered\.tar\.zst") +# Bogus; it is a perfectly fine zstandard file. +addFilter(r" inconsistent-file-extension sleef-.*-filtered\.tar\.zst") +# We are not sure why some files from docs/ are duplicated in docs/src/. The +# files are small compared to the documentation overall, so it does not seem +# worth too much investigation, and hardlinking them would be a little tedious. +addFilter(r" files-duplicate /.*/docs/src/") diff --git a/sleef.spec b/sleef.spec index 622ed6a..ea7b1d4 100644 --- a/sleef.spec +++ b/sleef.spec @@ -1,53 +1,96 @@ -# We do not ship the DFT library since it has undiagnosed test failures on -# Fedora at -O2, and is not well-supported upstream. Additionally, it uses -# illegal instructions on ARM and s390x, at least on the Fedora build machines. -# See https://github.com/shibatch/sleef/issues/214. -%bcond_with dft -# We would like to ship the quad-precision library, but since it is still -# considered experimental, it may have breaking ABI or API changes without an -# soversion bump, which is a no-no in Fedora. Rather than contorting ourselves -# to accommodate this, we disable it until it stabilizes or some dependent -# package appears. -%bcond_with quad -# Similarly, Fedora packages should not ship static libraries unless absolutely -# required. Some software, like pytorch, really does rely on the inline headers -# and accompanying static support library for exceptional performance -# requirements, but no such software exists in Fedora at the moment. We will -# leave this feature disabled until someone asks for it. -%bcond_with static +%bcond dft 1 +%bcond quad 1 +# Fedora packages should not ship static libraries unless absolutely required. +# Some software may really rely on the inline headers and accompanying static +# support library for exceptional performance requirements, but we will leave +# this feature disabled until someone asks for it. +%bcond static 0 + +# Adds a BuildRequires on tlfloat and enables more tests +%bcond tlfloat 1 Name: sleef -Version: 3.5.1 -Release: 3%{?dist} +Version: 3.9.0 +%global tag %{version} +%global so_version 3 +Release: %autorelease Summary: Vectorized math library -License: Boost +# The entire source is BSL-1.0, except the following gencoef tool sources, +# which are CC-BY-4.0: +# src/gencoef/dp.h +# src/gencoef/gencoef.c +# src/gencoef/ld.h +# src/gencoef/qp.h +# src/gencoef/simplexfr.c +# src/gencoef/sp.h +# Since CC-BY-4.0 is allowed for content but not for code, these are removed +# before uploading the source to the lookaside cache. +License: BSL-1.0 URL: https://sleef.org -Source0: https://github.com/shibatch/%{name}/archive/%{version}/%{name}-%{version}.tar.gz +# This is a filtered version of: +# https://github.com/shibatch/sleef/archive/%%{tag}/sleef-%%{tag}.tar.gz +# See the comment above License for why this is necessary. The archive is +# produced by using the script in Source1: +# ./get_source.sh ${VERSION} +Source0: sleef-%{tag}-filtered.tar.zst +Source1: get_source.sh + +# https://fedoraproject.org/wiki/Changes/EncourageI686LeafRemoval +ExcludeArch: %{ix86} + +# On aarch64, since 3.9.0, we cannot link at least bin/tester3svenofma when LTO +# is enabled, due to confusion about SVE. +# +# /builddir/build/BUILD/sleef-3.9.0-build/sleef-3.9.0/src/common/testerutil.c: +# In function ‘memrand.constprop’: +# /builddir/build/BUILD/sleef-3.9.0-build/sleef-3.9.0/src/common/testerutil.c:101:6: +# error: this operation requires the SVE ISA extension +# 101 | void memrand(void *p, int size) { +# | ^ +# /builddir/build/BUILD/sleef-3.9.0-build/sleef-3.9.0/src/common/testerutil.c:101:6: +# note: you can enable SVE using the command-line option ‘-march’, or by +# using the ‘target’ attribute or pragma +# /builddir/build/BUILD/sleef-3.9.0-build/sleef-3.9.0/src/common/testerutil.c:101: +# confused by earlier errors, bailing out +# +# This might be an upstream bug, but it is hard to understand. Upstream +# provides their own LTO option, SLEEF_ENABLE_LTO, but for does not support it +# in combination with shared libraries. +# +# - We could still build the library with LTO and not test it +# (-DSLEEF_BUILD_TESTS:BOOL=FALSE) on aarch64. +# - It’s not clear how we could disable LTO *only for the tests*. +# - We choose to disable LTO entirely on aarch64, because we really want to run +# the tests. We hope that the performance impact is not significant. It +# currently does not seem necessary to disable LTO on other architectures. +%ifarch %{arm64} +%global _lto_cflags %{nil} +%endif BuildRequires: cmake >= 3.4.3 BuildRequires: gcc +BuildRequires: gcc-c++ BuildRequires: ninja-build # For tests only: -BuildRequires: mpfr-devel -BuildRequires: openssl-devel +BuildRequires: pkgconfig(mpfr) +BuildRequires: pkgconfig(gmp) +BuildRequires: pkgconfig(libssl) +BuildRequires: pkgconfig(libcrypto) %if %{with dft} -BuildRequires: fftw-devel +BuildRequires: pkgconfig(fftw3) +%endif +%if %{with tlfloat} +BuildRequires: pkgconfig(tlfloat) %endif -%global so_version %(echo %{version} | cut -d . -f 1) -# Only out-of-source builds are supported. This is the default for F33 and -# later, but we must be explicit on older releases, including EPEL8. -%undefine __cmake_in_source_build # See https://sleef.org/additional.xhtml#gnuabi. The gnuabi version of the # library only applies to these architectures. -%global gnuabi_arches %{ix86} x86_64 aarch64 +%global gnuabi_arches %{ix86} %{x86_64} %{arm64} # See https://github.com/shibatch/sleef/pull/283. -%ifnarch %{arm32} %if %{with static} %global inline_enabled 1 %endif -%endif %description SLEEF stands for SIMD Library for Evaluating Elementary Functions. It @@ -65,37 +108,37 @@ outputs, the functions return correct results as specified in the C99 standard. %package devel -Summary: Development files for %{name} -Requires: %{name}%{?_isa} = %{version}-%{release} +Summary: Development files for sleef +Requires: sleef%{?_isa} = %{version}-%{release} %description devel -The %{name}-devel package contains libraries and header files for -developing applications that use %{name}. +The sleef-devel package contains libraries and header files for +developing applications that use sleef. %if 0%{?inline_enabled} %package static -Summary: Inline headers and static library for %{name} -Requires: %{name}-devel%{?_isa} = %{version}-%{release} +Summary: Inline headers and static library for sleef +Requires: sleef-devel%{?_isa} = %{version}-%{release} %description static -The %{name}-static package contains libraries and header files for -developing applications that use %{name}. +The sleef-static package contains libraries and header files for +developing applications that use sleef. %endif %package doc -Summary: Documentation for %{name} +Summary: Documentation for sleef BuildArch: noarch %description doc -The %{name}-doc package contains detailed API documentation for developing -applications that use %{name}. +The sleef-doc package contains detailed API documentation for developing +applications that use sleef. %ifarch %{gnuabi_arches} %package gnuabi -Summary: GNUABI version of %{name} +Summary: GNUABI version of sleef %global gnuabi_enabled 1 @@ -107,12 +150,12 @@ Vector ABI. %package gnuabi-devel -Summary: Development files for GNUABI version of %{name} -Requires: %{name}-gnuabi%{?_isa} = %{version}-%{release} +Summary: Development files for GNUABI version of sleef +Requires: sleef-gnuabi%{?_isa} = %{version}-%{release} %description gnuabi-devel -The %{name}-gnuabi-devel package contains libraries for developing applications -that use the GNUABI version of %{name}. Note that this package does not contain +The sleef-gnuabi-devel package contains libraries for developing applications +that use the GNUABI version of sleef. Note that this package does not contain any header files. %endif @@ -120,7 +163,7 @@ any header files. %if %{with dft} %package dft Summary: Discrete Fourier Transform (DFT) library -Requires: %{name}%{?_isa} = %{version}-%{release} +Requires: sleef%{?_isa} = %{version}-%{release} %description dft SLEEF includes subroutines for discrete Fourier transform(DFT). These @@ -131,12 +174,12 @@ migration. The subroutines can utilize long vectors up to 2048 bits. %package dft-devel -Summary: Development files for %{name}-dft -Requires: %{name}-dft%{?_isa} = %{version}-%{release} +Summary: Development files for sleef-dft +Requires: sleef-dft%{?_isa} = %{version}-%{release} %description dft-devel -The %{name}-dft-devel package contains libraries and header files for -developing applications that use %{name}-dft. +The sleef-dft-devel package contains libraries and header files for +developing applications that use sleef-dft. %endif @@ -149,25 +192,26 @@ An experimental quad-precision library %package quad-devel -Summary: Development files for %{name}-quad -Requires: %{name}-quad%{?_isa} = %{version}-%{release} +Summary: Development files for sleef-quad +Requires: sleef-quad%{?_isa} = %{version}-%{release} %description quad-devel -The %{name}-quad-devel package contains libraries and header files for -developing applications that use %{name}-quad. +The sleef-quad-devel package contains libraries and header files for +developing applications that use sleef-quad. %endif %prep -%autosetup +%autosetup -n sleef-%{tag} -p1 +# Remove an unwanted hidden file from the docs +find docs/ -type f -name .nojekyll -print -delete -%build -# -GNinja: Upstream prominently states that parallel build is only supported -# with the Ninja generator for cmake, not with the make one. See -# https://sleef.org/compile.xhtml. +%conf +# -GNinja: This used to be required for parallel builds; it is still faster. # # -DENFORCE_TESTER3: The build should fail if we cannot build all tests. +# -DENFORCE_TESTER4: Likewise, except that tester4 requires tlfloat. # # -DBUILD_INLINE_HEADERS: Do not build the “inline” headers. This would provide # an arch-specific collection of sleefinline_*.h headers in _includedir, as @@ -176,13 +220,30 @@ developing applications that use %{name}-quad. # and would thus also be treated as a static library in the Fedora # guidelines) should be omitted unless something in Fedora absolutely # requires them. +# +# -DSLEEFDFT_ENABLE_STREAM: The author writes, “The recommended value for +# SLEEFDFT_ENABLE_STREAM depends on the architecture, and it is only +# recommended to be turned on on x86_64.” +# https://github.com/shibatch/sleef/discussions/654#discussioncomment-12860550 %cmake \ -GNinja \ - -DENFORCE_TESTER3:BOOL=TRUE \ - -DBUILD_INLINE_HEADERS:BOOL=%{?inline_enabled:TRUE}%{?!inline_enabled:FALSE} \ - -DBUILD_GNUABI_LIBS:BOOL=%{?gnuabi_enabled:TRUE}%{?!gnuabi_enabled:FALSE} \ - -DBUILD_DFT:BOOL=%{?with_dft:TRUE}%{?!with_dft:FALSE} \ - -DBUILD_QUAD:BOOL=%{?with_quad:TRUE}%{?!with_quad:FALSE} + -DSLEEF_BUILD_DFT:BOOL=%{?with_dft:TRUE}%{?!with_dft:FALSE} \ + -DSLEEF_ENFORCE_DFT:BOOL=%{?with_dft:TRUE}%{?!with_dft:FALSE} \ +%ifarch %{x86_64} + -DSLEEFDFT_ENABLE_STREAM:BOOL=TRUE \ +%else + -DSLEEFDFT_ENABLE_STREAM:BOOL=FALSE \ +%endif + -DSLEEF_BUILD_GNUABI_LIBS:BOOL=%{?gnuabi_enabled:TRUE}%{?!gnuabi_enabled:FALSE} \ + -DSLEEF_BUILD_INLINE_HEADERS:BOOL=%{?inline_enabled:TRUE}%{?!inline_enabled:FALSE} \ + -DSLEEF_BUILD_QUAD:BOOL=%{?with_quad:TRUE}%{?!with_quad:FALSE} \ + -DSLEEF_BUILD_SHARED_LIBS:BOOL=TRUE \ + -DSLEEF_ENFORCE_TESTER3:BOOL=TRUE \ + -DSLEEF_ENFORCE_TESTER4:BOOL=%{?with_tlfloat:TRUE}%{?!with_tlfloat:FALSE} \ + -DSLEEF_ENABLE_TLFLOAT:BOOL=%{?with_tlfloat:TRUE}%{?!with_tlfloat:FALSE} + + +%build %cmake_build @@ -191,29 +252,44 @@ developing applications that use %{name}-quad. %check -# Note that test coverage of SIMD extensions will be limited to those available -# on the build host; there is no way around this. We attempt to record the CPU -# features in the build log: -grep -m 1 -E '^f(lags|eatures)\b' /proc/cpuinfo || : +# Logging CPU features is helpful for debugging, especially in COPR builds +# where the builder hardware information is not necessarily logged separately. +echo '==== Build host CPU features ====' +cat /proc/cpuinfo skips='^($.' -%ifarch s390x -# Two tests fail on s390x only, at least for the z13 (features: vx in -# /proc/cpuinfo) CPUs currently used in the Fedora s390x infrastructure. See -# https://github.com/shibatch/sleef/issues/317#issuecomment-724625861, which -# indicates this is known upstream. -skips="${skips}|iut[yi]?purecfma_scalar" + +%ifarch %{arm64} +# Some tests are specifically for SVE code. We can only run these tests on +# builder hardware that has the SVE extensions, which are not part of the +# aarch64 baseline. +if ! grep -E '[Ff](lags|eatures).*\bsve\b' /proc/cpuinfo >/dev/null +then + skips="${skips}|gnuabi_compatibility_SVE(_masked)?|qiutsve" +fi %endif -%if %{with dft} -# The DFT library has known test failures -# (https://github.com/shibatch/sleef/issues/214). -skips="${skips}|fftwtest2d[ds]p_(4_4|8_8|10_10|5_15)" -%ifarch %{arm32} aarch64 s390x -# Plus, it uses illegal instructions: -skips="${skips}|naivetest[ds]p_([2345]|10)" -skips="${skips}|fftwtest(1d[ds]p_1[26]|2d[ds]p_2_2)" +%ifarch %{power64} +# Some tests are specifically for VSX3 code. We can only run these tests on +# builder hardware that has the VSX3 extensions (POWER 9 or later), which are +# not part of the ppc64le baseline (POWER 8). +if grep -E -i '\bPOWER8\b' /proc/cpuinfo >/dev/null +then + skips="${skips}|.*vsx3(nofma)?" +fi +%endif + +%ifarch %{x86_64} +%if %{undefined fc43} && %{undefined fc42} && %{undefined el10} +# At least one test within this executable fails since GCC 16 landed in Fedora +# 44. It’s not very easy to tell exactly what is going wrong, and upstream is +# not likely to be interested since (as determined by bisection) the failure +# was resolved upstream by the removal of no-FMA helpers in +# https://github.com/shibatch/sleef/pull/685. Let’s just skip this while we +# await the next upstream release. +skips="${skips}|tester4ypurec_scalar" %endif %endif + skips="${skips})$" %ctest --exclude-regex "${skips}" --extra-verbose @@ -221,74 +297,63 @@ skips="${skips})$" %files %license LICENSE.txt -%{_libdir}/lib%{name}.so.%{so_version} -%{_libdir}/lib%{name}.so.%{so_version}.* +%{_libdir}/libsleef.so.%{so_version}{,.*} %files devel -%{_includedir}/%{name}.h -%{_libdir}/lib%{name}.so -%{_libdir}/pkgconfig/*.pc +%{_includedir}/sleef.h +%{_libdir}/libsleef.so +%{_libdir}/pkgconfig/sleef.pc +%{_libdir}/cmake/sleef/ %if 0%{?inline_enabled} %files static -%{_includedir}/%{name}inline_*.h -%{_libdir}/lib%{name}inline.a +%{_includedir}/sleefinline_*.h +%{_libdir}/libsleefinline.a %endif %files doc %license LICENSE.txt %doc CHANGELOG.md -%doc CONTRIBUTORS.md -%doc README.md -%doc doc/html +%doc README.adoc +%doc docs/ %ifarch %{gnuabi_arches} %files gnuabi %license LICENSE.txt -%{_libdir}/lib%{name}gnuabi.so.%{so_version} -%{_libdir}/lib%{name}gnuabi.so.%{so_version}.* +%{_libdir}/libsleefgnuabi.so.%{so_version}{,.*} %files gnuabi-devel -%{_libdir}/lib%{name}gnuabi.so +%{_libdir}/libsleefgnuabi.so %endif %if %{with dft} %files dft -%{_libdir}/lib%{name}dft.so.%{so_version} -%{_libdir}/lib%{name}dft.so.%{so_version}.* +%{_libdir}/libsleefdft.so.%{so_version}{,.*} %files dft-devel -%{_includedir}/%{name}dft.h -%{_libdir}/lib%{name}dft.so +%{_includedir}/sleefdft.h +%{_libdir}/libsleefdft.so %endif %if %{with quad} %files quad %license LICENSE.txt -%{_libdir}/lib%{name}quad.so.%{so_version} -%{_libdir}/lib%{name}quad.so.%{so_version}.* +%{_libdir}/libsleefquad.so.%{so_version}{,.*} %files quad-devel -%{_includedir}/%{name}quad.h -%{_libdir}/lib%{name}quad.so +%{_includedir}/sleefquad.h +%{_libdir}/libsleefquad.so %endif %changelog -* Wed Mar 17 2021 Benjamin A. Beasley - 3.5.1-3 -- Improve source URL - -* Thu Dec 24 2020 Benjamin A. Beasley - 3.5.1-2 -- Drop explicit pkgconfig dependency; providing a .pc file implies it - -* Fri Dec 18 2020 Benjamin A. Beasley - 3.5.1-1 -- Initial spec file +%autochangelog diff --git a/sources b/sources index 50ff76c..a0b715a 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (sleef-3.5.1.tar.gz) = e8e4e5028db52998c6b82bd462622c08d670e4e85273327f1c3bdbd900827dd7793b217c2876ca1229b6f672493bb96f40140e14366390cccea0e6780689e128 +SHA512 (sleef-3.9.0-filtered.tar.zst) = 4c55c310795569debed8c771cf0251a126e8291515bf562e6ac4b611dafe6df5fd0024d129dbeaf2c6bce39112bb8a826acabd762beebdd17de86259394b5933