openblas/openblas.spec
zhangshaoning 1133ab14ce Add sw_64 support
(cherry picked from commit 3e0d495d6d5232193788424e303be21d499e7248)
2025-03-05 13:59:44 +08:00

438 lines
15 KiB
RPMSpec

%bcond_with system_lapack
Name: openblas
Version: 0.3.25
Release: 6
Summary: An optimized BLAS library based on GotoBLAS2 1.13 BSD version
License: BSD-3-Clause
URL: https://github.com/xianyi/OpenBLAS/
Source0: https://github.com/xianyi/OpenBLAS/archive/v%{version}/openblas-%{version}.tar.gz
Patch0000: openblas-0.2.15-system_lapack.patch
Patch0001: openblas-0.2.5-libname.patch
Patch0002: openblas-0.3.11-tests.patch
Patch0003: OpenBLAS-0.3.25-sw.patch
BuildRequires: gcc gcc-gfortran perl-devel gcc-c++
%if %{with system_lapack}
BuildRequires: lapack-static lapack64-static
%global lapacke 0
%else
%global lapacke 1
Provides: bundled(lapack) = 3.9.0
%endif
Provides: openblas-serial = %{version}-%{release} openblas-openmp = %{version}-%{release}
Provides: openblas-threads = %{version}-%{release} openblas-serial64 = %{version}-%{release}
Provides: openblas-openmp64 = %{version}-%{release} openblas-threads64 = %{version}-%{release}
Provides: openblas-serial64_ = %{version}-%{release} openblas-openmp64_ = %{version}-%{release}
Provides: openblas-threads64_ = %{version}-%{release} openblas-Rblas = %{version}-%{release}
Provides: openblas-static = %{version}-%{release}
Obsoletes: openblas-serial < %{version}-%{release} openblas-openmp < %{version}-%{release}
Obsoletes: openblas-threads < %{version}-%{release} openblas-serial64 < %{version}-%{release}
Obsoletes: openblas-openmp64 < %{version}-%{release} openblas-threads64 < %{version}-%{release}
Obsoletes: openblas-serial64_ < %{version}-%{release} openblas-openmp64_ < %{version}-%{release}
Obsoletes: openblas-threads64_ < %{version}-%{release} openblas-Rblas < %{version}-%{release}
Obsoletes: openblas-static < %{version}-%{release}
ExclusiveArch: x86_64 aarch64 loongarch64 riscv64 ppc64le sw_64
%description
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD \
version. The Lab of Parallel Software and Computationla Science, ISCAS \
supports this project, see: http://www.rdcps.ac.cn
%package devel
Summary: Development headers and libraries for OpenBLAS
Requires: %{name} = %{version}-%{release} %{name}-srpm-macros
%description devel
This package contains the development headers and libraries for openblas.
%prep
%setup -q -c
cd OpenBLAS-%{version}
%if %{with system_lapack}
%patch0000 -p1 -b .system_lapack
%endif
%patch0001 -p1 -b .libname
%patch0002 -p1 -b .tests
%ifarch sw_64
%patch0003 -p1
%endif
# Set source permissions
find -name \*.f -exec chmod 644 {} \;
%if %{with system_lapack}
rm -rf lapack-netlib
%endif
# Make serial, threaded, OpenMP, 64-bit versions
# and an libRblas.so
cd ..
cp -ar OpenBLAS-%{version} openmp
cp -ar OpenBLAS-%{version} threaded
for d in {serial,threaded,openmp}64{,_}; do
cp -ar OpenBLAS-%{version} $d
done
cp -ar OpenBLAS-%{version} Rblas
mv OpenBLAS-%{version} serial
sed -i 's\.so.$(MAJOR_VERSION)\.so\g' Rblas/Makefile
sed -i 's\.so.$(MAJOR_VERSION)\.so\g' Rblas/exports/Makefile
sed -i 's\@ln -fs $(LIBSONAME) $(LIBPREFIX).so\#@ln -fs $(LIBSONAME) $(LIBPREFIX).so\g' Rblas/Makefile
%if %{with system_lapack}
mkdir netliblapack
cd netliblapack
ar x %{_libdir}/liblapack_pic.a
for f in laswp getf2 getrf potf2 potrf lauu2 lauum trti2 trtri getrs; do
\rm {c,d,s,z}$f.o
done
%if %{lapacke}
ar x %{_libdir}/liblapacke.a
%endif
# Create makefile
echo "TOPDIR = .." > Makefile
echo "include ../Makefile.system" >> Makefile
echo "COMMONOBJS = \\" >> Makefile
for i in *.o; do
echo "$i \\" >> Makefile
done
echo -e "\n\ninclude \$(TOPDIR)/Makefile.tail" >> Makefile
%if %{lapacke}
# Copy include files
cp -a %{_includedir}/lapacke .
%endif
cd ..
# Copy in place
for d in serial threaded openmp; do
cp -pr netliblapack $d
done
rm -rf netliblapack
# Setup 64-bit interface LAPACK
mkdir netliblapack64
cd netliblapack64
ar x %{_libdir}/liblapack64_pic.a
# Get rid of duplicate functions. See list in Makefile of lapack directory
for f in laswp getf2 getrf potf2 potrf lauu2 lauum trti2 trtri getrs; do
\rm {c,d,s,z}$f.o
done
# LAPACKE, no 64-bit interface
%if %{lapacke}
ar x %{_libdir}/liblapacke.a
%endif
# Create makefile for 64-bit interface
echo "TOPDIR = .." > Makefile
echo "include ../Makefile.system" >> Makefile
echo "COMMONOBJS = \\" >> Makefile
for i in *.o; do
echo "$i \\" >> Makefile
done
echo -e "\n\ninclude \$(TOPDIR)/Makefile.tail" >> Makefile
%if %{lapacke}
# Copy include files
cp -a %{_includedir}/lapacke .
%endif
cd ..
# Copy in place
for d in {serial,threaded,openmp}64{,_}; do
cp -pr netliblapack64 $d/netliblapack
done
rm -rf netliblapack64
%endif
%build
%define _lto_cflags %{nil}
%if !%{lapacke}
LAPACKE="NO_LAPACKE=1"
%endif
# Maximum possible amount of processors
NMAX="NUM_THREADS=128"
%ifarch x86_64
TARGET="TARGET=CORE2 DYNAMIC_ARCH=1 DYNAMIC_OLDER=1"
%endif
%ifarch aarch64
TARGET="TARGET=ARMV8 DYNAMIC_ARCH=1 DYNAMIC_OLDER=1"
%endif
%ifarch riscv64
TARGET="TARGET=RISCV64_GENERIC DYNAMIC_ARCH=0"
%endif
%ifarch ppc64le
TARGET="TARGET=POWER8 DYNAMIC_ARCH=0"
%endif
COMMON="%{optflags} -fPIC"
FCOMMON="%{optflags} -fPIC -frecursive"
export LDFLAGS="%{__global_ldflags}"
make %{_smp_mflags} -C Rblas $TARGET USE_THREAD=0 USE_LOCKING=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libRblas" LIBSONAME="libRblas.so" $AVX $LAPACKE INTERFACE64=0
# Declare some necessary build flags
COMMON="%{optflags} -fPIC"
FCOMMON="$COMMON -frecursive"
make %{_smp_mflags} -C serial $TARGET USE_THREAD=0 USE_LOCKING=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblas" $AVX $LAPACKE INTERFACE64=0
make %{_smp_mflags} -C threaded $TARGET USE_THREAD=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblasp" $AVX $LAPACKE INTERFACE64=0
# USE_THREAD determines use of SMP, not of pthreads
COMMON="%{optflags} -fPIC -fopenmp -pthread"
FCOMMON="$COMMON -frecursive"
make %{_smp_mflags} -C openmp $TARGET USE_THREAD=1 USE_OPENMP=1 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblaso" $AVX $LAPACKE INTERFACE64=0 %{with cpp_thread_check:CPP_THREAD_SAFETY_TEST=0}
COMMON="%{optflags} -fPIC"
FCOMMON="$COMMON -frecursive -fdefault-integer-8"
make %{_smp_mflags} -C serial64 $TARGET USE_THREAD=0 USE_LOCKING=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblas64" $AVX $LAPACKE INTERFACE64=1
make %{_smp_mflags} -C threaded64 $TARGET USE_THREAD=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblasp64" $AVX $LAPACKE INTERFACE64=1
COMMON="%{optflags} -fPIC -fopenmp -pthread"
FCOMMON="$COMMON -frecursive -fdefault-integer-8"
make %{_smp_mflags} -C openmp64 $TARGET USE_THREAD=1 USE_OPENMP=1 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblaso64" $AVX $LAPACKE INTERFACE64=1 CPP_THREAD_SAFETY_TEST=0
COMMON="%{optflags} -fPIC"
FCOMMON="$COMMON -frecursive -fdefault-integer-8"
make %{_smp_mflags} -C serial64_ $TARGET USE_THREAD=0 USE_LOCKING=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblas64_" $AVX $LAPACKE INTERFACE64=1 SYMBOLSUFFIX=64_
make %{_smp_mflags} -C threaded64_ $TARGET USE_THREAD=1 USE_OPENMP=0 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblasp64_" $AVX $LAPACKE INTERFACE64=1 SYMBOLSUFFIX=64_
COMMON="%{optflags} -fPIC -fopenmp -pthread"
FCOMMON="$COMMON -frecursive -fdefault-integer-8"
make %{_smp_mflags} -C openmp64_ $TARGET USE_THREAD=1 USE_OPENMP=1 FC=gfortran CC=gcc COMMON_OPT="$COMMON" FCOMMON_OPT="$FCOMMON" $NMAX LIBPREFIX="libopenblaso64_" $AVX $LAPACKE INTERFACE64=1 SYMBOLSUFFIX=64_ CPP_THREAD_SAFETY_TEST=0
wait
%install
rm -rf %{buildroot}
# Install serial library and headers
%ifarch riscv64
TARGET="TARGET=RISCV64_GENERIC DYNAMIC_ARCH=0"
%else
TARGET=
%endif
make %{_smp_mflags} -C serial $TARGET USE_THREAD=0 PREFIX=%{buildroot} OPENBLAS_LIBRARY_DIR=%{buildroot}%{_libdir} OPENBLAS_INCLUDE_DIR=%{buildroot}%{_includedir}/%name OPENBLAS_BINARY_DIR=%{buildroot}%{_bindir} OPENBLAS_CMAKE_DIR=%{buildroot}%{_libdir}/cmake install
# Copy lapacke include files
%if %{with system_lapack} && %{lapacke}
cp -a %{_includedir}/lapacke %{buildroot}%{_includedir}/%{name}
%endif
# Fix name of libraries
%ifarch loongarch64
suffix="_loongson3r5"
%endif
%ifarch riscv64
suffix="_riscv64_generic"
%endif
%ifarch ppc64le
suffix="_power8"
%endif
%ifarch sw_64
suffix="_sw6"
%endif
slibname=`basename %{buildroot}%{_libdir}/libopenblas${suffix}-*.so .so`
mv %{buildroot}%{_libdir}/${slibname}.a %{buildroot}%{_libdir}/lib%{name}.a
if [[ "$suffix" != "" ]]; then
sname=$(echo $slibname | sed "s|$suffix||g")
mv %{buildroot}%{_libdir}/${slibname}.so %{buildroot}%{_libdir}/${sname}.so
else
sname=${slibname}
fi
# Install the Rblas library
mkdir -p %{buildroot}%{_libdir}/R/lib/
install -p -m 755 Rblas/libRblas.so %{buildroot}%{_libdir}/R/lib/
# Install the OpenMP library
olibname=`echo ${slibname} | sed "s|lib%{name}|lib%{name}o|g"`
install -D -p -m 644 openmp/${olibname}.a %{buildroot}%{_libdir}/lib%{name}o.a
if [[ "$suffix" != "" ]]; then
oname=$(echo $olibname | sed "s|$suffix||g")
else
oname=${olibname}
fi
install -D -p -m 755 openmp/${olibname}.so %{buildroot}%{_libdir}/${oname}.so
# Install the threaded library
plibname=`echo ${slibname} | sed "s|lib%{name}|lib%{name}p|g"`
install -D -p -m 644 threaded/${plibname}.a %{buildroot}%{_libdir}/lib%{name}p.a
if [[ "$suffix" != "" ]]; then
pname=$(echo $plibname | sed "s|$suffix||g")
else
pname=${plibname}
fi
install -D -p -m 755 threaded/${plibname}.so %{buildroot}%{_libdir}/${pname}.so
# Install the 64-bit interface libraries
slibname64=`echo ${slibname} | sed "s|lib%{name}|lib%{name}64|g"`
install -D -p -m 644 serial64/${slibname64}.a %{buildroot}%{_libdir}/lib%{name}64.a
slibname64_=`echo ${slibname} | sed "s|lib%{name}|lib%{name}64_|g"`
install -D -p -m 644 serial64_/${slibname64_}.a %{buildroot}%{_libdir}/lib%{name}64_.a
if [[ "$suffix" != "" ]]; then
sname64=$(echo ${slibname64} | sed "s|$suffix||g")
sname64_=$(echo ${slibname64_} | sed "s|$suffix||g")
else
sname64=${slibname64}
sname64_=${slibname64_}
fi
install -D -p -m 755 serial64/${slibname64}.so %{buildroot}%{_libdir}/${sname64}.so
install -D -p -m 755 serial64_/${slibname64_}.so %{buildroot}%{_libdir}/${sname64_}.so
olibname64=`echo ${slibname} | sed "s|lib%{name}|lib%{name}o64|g"`
install -D -p -m 644 openmp64/${olibname64}.a %{buildroot}%{_libdir}/lib%{name}o64.a
olibname64_=`echo ${slibname} | sed "s|lib%{name}|lib%{name}o64_|g"`
install -D -p -m 644 openmp64_/${olibname64_}.a %{buildroot}%{_libdir}/lib%{name}o64_.a
if [[ "$suffix" != "" ]]; then
oname64=$(echo ${olibname64} | sed "s|$suffix||g")
oname64_=$(echo ${olibname64_} | sed "s|$suffix||g")
else
oname64=${olibname64}
oname64_=${olibname64_}
fi
install -D -p -m 755 openmp64/${olibname64}.so %{buildroot}%{_libdir}/${oname64}.so
install -D -p -m 755 openmp64_/${olibname64_}.so %{buildroot}%{_libdir}/${oname64_}.so
plibname64=`echo ${slibname} | sed "s|lib%{name}|lib%{name}p64|g"`
install -D -p -m 644 threaded64/${plibname64}.a %{buildroot}%{_libdir}/lib%{name}p64.a
plibname64_=`echo ${slibname} | sed "s|lib%{name}|lib%{name}p64_|g"`
install -D -p -m 644 threaded64_/${plibname64_}.a %{buildroot}%{_libdir}/lib%{name}p64_.a
if [[ "$suffix" != "" ]]; then
pname64=$(echo $plibname64 | sed "s|$suffix||g")
pname64_=$(echo $plibname64_ | sed "s|$suffix||g")
else
pname64=${plibname64}
pname64_=${plibname64_}
fi
install -D -p -m 755 threaded64/${plibname64}.so %{buildroot}%{_libdir}/${pname64}.so
install -D -p -m 755 threaded64_/${plibname64_}.so %{buildroot}%{_libdir}/${pname64_}.so
# Fix symlinks
cd %{buildroot}%{_libdir}
# Serial libraries
ln -sf ${sname}.so lib%{name}.so
ln -sf ${sname}.so lib%{name}.so.0
# OpenMP libraries
ln -sf ${oname}.so lib%{name}o.so
ln -sf ${oname}.so lib%{name}o.so.0
# Threaded libraries
ln -sf ${pname}.so lib%{name}p.so
ln -sf ${pname}.so lib%{name}p.so.0
# 64bit Serial libraries
ln -sf ${sname64}.so lib%{name}64.so
ln -sf ${sname64}.so lib%{name}64.so.0
ln -sf ${sname64_}.so lib%{name}64_.so
ln -sf ${sname64_}.so lib%{name}64_.so.0
# 64bit OpenMP libraries
ln -sf ${oname64}.so lib%{name}o64.so
ln -sf ${oname64}.so lib%{name}o64.so.0
ln -sf ${oname64_}.so lib%{name}o64_.so
ln -sf ${oname64_}.so lib%{name}o64_.so.0
# 64bit Threaded libraries
ln -sf ${pname64}.so lib%{name}p64.so
ln -sf ${pname64}.so lib%{name}p64.so.0
ln -sf ${pname64_}.so lib%{name}p64_.so
ln -sf ${pname64_}.so lib%{name}p64_.so.0
# Get rid of generated CMake config
rm -rf %{buildroot}%{_libdir}/cmake
# Variables overrided above lead to include buildroot path,
# which we need to get rid of in the resulting pkgconf file
sed -i -e 's|%{buildroot}||' "%{buildroot}%{_libdir}/pkgconfig/%{name}.pc"
%post
/sbin/ldconfig
%postun
/sbin/ldconfig
%files
%license serial/LICENSE
%doc serial/Changelog.txt serial/GotoBLAS*
%{_libdir}/lib%{name}*-*.so
%{_libdir}/lib%{name}*.so.*
%{_libdir}/R/lib/libRblas.so
%{_libdir}/lib%{name}*.a
%{_libdir}/pkgconfig/%{name}.pc
%files devel
%{_includedir}/%{name}/
%{_libdir}/lib%{name}.so
%{_libdir}/lib%{name}o.so
%{_libdir}/lib%{name}p.so
%{_libdir}/lib%{name}*64.so
%{_libdir}/lib%{name}*64_.so
%changelog
* Tue Feb 25 2025 zhangshaoning <zhangshaoning@uniontech.com> - 0.3.25-6
- Add sw_64 support
* Mon Nov 11 2024 Kai Liu <kai.liu@windriver.com> - 0.3.25-5
- Don't run make tasks in background sub-shell, as this causes
severe issue. Use the _smp_mflags macro instead. See issue
IB3EV0 for more detail.
* Sat Sep 7 2024 Liu Chao <liuchao173@huawei.com> - 0.3.25-4
- delete the dependency on the devel package
* Wed Feb 21 2024 Liu Chao <liuchao173@huawei.com> - 0.3.25-3
- Include pkgconf file
* Tue Jan 16 2024 jiahua.yu <jiahua.yu@shingroup.cn> - 0.3.25-2
- init support for arch ppc64le
* Mon Jan 08 2024 xu_ping <707078654@qq.com> - 0.3.25-1
- Update to 0.3.25
* Thu Aug 24 2023 yaoxin <yao_xin001@hoperun.com> - 0.3.21-1
- Update to 0.3.21
* Fri Jun 30 2023 xiaoqianlv <xiaoqian@nj.iscas.ac.cn>- 0.3.18-4
- add support for riscv
* Thu Mar 9 2023 zhaozhen <zhaozhen@loongson.cn> - 0.3.18-3
- add loongarch support for openblas
* Wed May 11 2022 wulei <wulei80@h-partners.com> - 0.3.18-2
- License compliance rectification
* Mon Dec 27 2021 zhouwenpei <zhouwenpei1@huawei.com>- 0.3.18-1
- Upgrade to 0.3.18
* Mon Dec 20 2021 houyingchao <houyingchao@huawei.com>- 0.3.13-4
- Fix CVE-2021-4048
* Fri Oct 15 2021 zhangweiguo <zhangweiguo2@huawei.com> -0.3.13-3
- Disable CPP_THREAD_SAFETY_TEST
* Thu Oct 14 2021 zhangweiguo <zhangweiguo2@huawei.com> -0.3.13-3
- parallelize compilation targets
* Wed Jun 30 2021 zhouwenpei <zhouwenpei1@huawei.com> -0.3.13-2
- add buildrequire gcc-c++
* Mon Feb 1 2021 xinghe <xinghe1@huawei.com> - 0.3.13-1
- Upgrade to 0.3.13
* Tue Aug 18 2020 xinghe <xinghe1@huawei.com> - 0.3.10-1
- Upgrade to 0.3.10
* Wed Nov 13 2019 Alex Chao <zhaolei746@huawei.com> - 0.3.3-3
- Package init