openblas/openblas.spec
Dmitry Roshchin f01ba9789b Accepting request 699559 from home:marxin:branches:science
- Update to version 0.3.6 (boo#1122186)
  common:
    * the build tools now check that a given cpu TARGET is actually valid
    * the build-time check of system features (c_check) has been made
      less dependent on particular perl features (this should mainly
      benefit building on Windows)
    * several problems with ReLAPACK and its integration were fixed,
      including INTERFACE64 support and building a shared library
    * building with CMAKE on BSD systems was improved
    * a non-absolute SUM function was added based on the
      existing optimized code for ASUM
    * CBLAS interfaces to the IxMIN and IxMAX functions were added
    * a name clash between LAPACKE and BOOST headers was resolved
    * CMAKE builds with OpenMP failed to include the appropriate getrf_parallel
      kernels
    * a crash on thread (key) deletion with the USE_TLS=1 memory management
      option was fixed
    * restored several earlier fixes, in particular for OpenMP performance,
      building on BSD, and calling fork on CYGWIN, which had inadvertently
      been dropped in the 0.3.3 rewrite of the memory management code.
  POWER:
    * single precision BLAS1/2 functions have received optimized POWER8 kernels
    * POWER9 is now a separate target, with an optimized DGEMM/DTRMM kernel
    * building on PPC970 systems under OSX Leopard or Tiger is now supported
    * out-of-bounds memory accesses in the gemm_beta microkernels were fixed
    * building a shared library on AIX is now supported for POWER6
    * DYNAMIC_ARCH support has been added for POWER6 and newer
  ARMV7:
    * corrected xDOT behaviour with zero INC_X or INC_Y 
    * a bug in the IMIN implementation made it return the result of IMAX
  ARMV8:
    * added support for HiSilicon TSV110 cpus
    * the CMAKE build system now recognizes 32bit userspace on 64bit hardware 
    * cross-compilation with CMAKE now works again
    * a bug in the IMIN implementation made it return the result of IMAX
    * ARMV8 builds with the BINARY=32 option are now automatically handled as ARMV7
  x86_64:
    * the AVX512 DGEMM kernel has been disabled again due to unsolved problems
    * building with old versions of MSVC was fixed
    * it is now possible to build a static library on Windows with CMAKE
    * accessing environment variables on CYGWIN at run time was fixed
    * the CMAKE build system now recognizes 32bit userspace on 64bit hardware
    * Intel "Denverton" atom and Hygon "Dhyana" zen CPUs are now autodetected
    * building for DYNAMIC_ARCH with a DYNAMIC_LIST of targets is now supported
      with CMAKE as well
    * building for DYNAMIC_ARCH with GENERIC as the default target is now supported
    * a buffer overflow in the SSE GEMM kernel for Intel Nano targets was fixed
    * assembly bugs involving undeclared modification of input operands were fixed
      in the AXPY, DOT, GEMV, GER, SCAL, SYMV and TRSM microkernels for Nehalem, 
      Sandybridge, Haswell, Bulldozer and Piledriver. These would typically cause
      test failures or segfaults when compiled with recent versions of gcc from 8 onward.
    * a similar bug was fixed in the blas_quickdivide code used to split workloads
      in most functions
    * a bug in the IxMIN implementation for the GENERIC target made it return the result of IxMAX
    * fixed building on SkylakeX systems when either the compiler or the (emulated) operating 
      environment does not support AVX512
    * improved GEMM performance on ZEN targets
  x86:
    * build failures caused by the recently added checks for AVX512 were fixed
    * an inline assembly bug involving undeclared modification of an input argument was
      fixed in the blas_quickdivide code used to split workloads in most functions
    * a bug in the IMIN implementation for the GENERIC target made it return the result of IMAX
  MIPS32:
    * a bug in the IMIN implementation made it return the result of IMAX
  IBM Z:
    * optimized microkernels for single precicion BLAS1/2 functions have been added for Z13 and Z14
  - Rebase openblas-noexecstack.patch and openblas-s390.patch patches.
  - Remove 0001-Add-a-register-to-the-clobber-list-for-the-mul-instr.patch.

OBS-URL: https://build.opensuse.org/request/show/699559
OBS-URL: https://build.opensuse.org/package/show/science/openblas?expand=0&rev=79
2019-05-04 08:29:45 +00:00

484 lines
13 KiB
RPMSpec

#
# spec file for package openblas
#
# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
#
# 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/
#
%global flavor @BUILD_FLAVOR@%{nil}
%define _vers 0_3_6
%define vers 0.3.6
%define pname openblas
%bcond_with ringdisabled
%if "%flavor" == ""
%define package_name %{pname}
ExclusiveArch: do_not_build
%endif
%global build_flags USE_THREAD=1 USE_OPENMP=1
%if "%flavor" == "serial"
%define build_flags USE_THREAD=0 USE_OPENMP=0
%define openblas_so_prio 20
# we build devel packages only from one flavor
%define build_devel 1
%{bcond_with hpc}
%endif
%if "%flavor" == "pthreads"
%define build_flags USE_THREAD=1 USE_OPENMP=0
%ifarch %ix86 x86_64
%define openblas_so_prio 50
%else
%define openblas_so_prio 20
%endif
%{bcond_with hpc}
%endif
%if "%flavor" == "openmp"
%ifarch %ix86 x86_64
%define openblas_so_prio 20
%else
%define openblas_so_prio 50
%endif
%{bcond_with hpc}
%endif
%if "%flavor" == "gnu-hpc"
%define compiler_family gnu
%undefine c_f_ver
%{bcond_without hpc}
%endif
%if "%flavor" == "gnu7-hpc"
%define compiler_family gnu
%define c_f_ver 7
%{bcond_without hpc}
%endif
%if "%flavor" == "gnu-hpc-pthreads"
%define compiler_family gnu
%undefine c_f_ver
%define ext pthreads
%define build_flags USE_THREAD=1 USE_OPENMP=0
%{bcond_without hpc}
%endif
%if "%flavor" == "gnu7-hpc-pthreads"
%define compiler_family gnu
%define c_f_ver 7
%define ext pthreads
%define build_flags USE_THREAD=1 USE_OPENMP=0
%{bcond_without hpc}
%endif
%if %{without hpc}
%if 0%{!?package_name:1}
%define package_name %{pname}_%{flavor}
%endif
%define so_v 0
%define p_prefix %_prefix
%define p_includedir %_includedir/%pname
%define p_libdir %_libdir
%define p_cmakedir %{p_libdir}/cmake/%{pname}
%define num_threads 64
%else
# Magic for OBS Staging. Only build the flavors required by
# other packages in the ring.
%if %{with ringdisabled}
ExclusiveArch: do_not_build
%endif
%define package_name %{hpc_package_name %_vers}
%define p_prefix %hpc_prefix
%define p_includedir %hpc_includedir
%define p_libdir %hpc_libdir
%define p_cmakedir %{hpc_libdir}/cmake
%define num_threads 256
%{hpc_init -c %{compiler_family} %{?c_f_ver:-v %{c_f_ver}} %{?ext:-e %{ext}}}
%endif
Name: %{package_name}
Version: %vers
Release: 0
Summary: An optimized BLAS library based on GotoBLAS2
License: BSD-3-Clause
Group: Productivity/Scientific/Math
Url: http://www.openblas.net
Source0: https://github.com/xianyi/OpenBLAS/archive/v%{version}.tar.gz#/OpenBLAS-%{version}.tar.gz
Source1: README.SUSE
Source2: README.HPC.SUSE
# PATCH-FIX-UPSTREAM openblas-noexecstack.patch
Patch1: openblas-noexecstack.patch
# PATCH-FIX-UPSTREADM fix-arm64-cpuid-return.patch
Patch2: fix-arm64-cpuid-return.patch
# PATCH port
Patch3: openblas-s390.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%if %{without hpc}
BuildRequires: gcc-fortran
BuildRequires: update-alternatives
Requires(post): update-alternatives
Requires(preun): update-alternatives
%else
BuildRequires: %{compiler_family}%{?c_f_ver}-compilers-hpc-macros-devel
BuildRequires: lua-lmod
BuildRequires: suse-hpc
%global dep_summary %{summary}
%endif
%description
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
%package -n lib%{name}%{?so_v}
Summary: An optimized BLAS library based on GotoBLAS2, %{flavor} version
Group: System/Libraries
%if %{without hpc}
Requires(post): update-alternatives
Requires(preun): update-alternatives
%if "%flavor" == "serial"
Obsoletes: lib%{pname}%{so_v} < %{version}
Provides: lib%{pname}%{so_v} = %{version}
%else
Obsoletes: lib%{pname}0
%endif
%if "%flavor" == "pthreads"
Obsoletes: lib%{pname}p0
%endif
%if "%flavor" == "openmp"
Obsoletes: lib%{pname}o0
%endif
%else # with hpc
%hpc_requires
%endif
%description -n lib%{name}%{?so_v}
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
%{?with_hpc:%{hpc_master_package -l -L}}
%package -n lib%{name}-devel
Summary: Development libraries for OpenBLAS, %{flavor} version
Group: Development/Libraries/C and C++
Requires: lib%{name}%{?so_v} = %{version}
%if %{without hpc}
Requires: %{pname}-devel-headers = %{version}
%else
%hpc_requires_devel
%endif
%description -n lib%{name}-devel
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
This package contains the development libraries for serial OpenBLAS version.
%{?with_hpc:%{hpc_master_package -l -L devel}}
%package devel-static
Summary: Static version of OpenBLAS
Group: Development/Libraries/C and C++
%if %{without hpc}
Requires: %{pname}-devel = %{version}
%else
Requires: lib%{name}-devel = %{version}
%endif
%description devel-static
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
This package contains the static libraries.
%package -n %{pname}-devel
Summary: Development headers and libraries for OpenBLAS
Group: Development/Libraries/C and C++
Requires: %{pname}-devel-headers = %{version}
%ifarch %ix86 x86_64
Requires: lib%{pname}_pthreads-devel = %{version}
%else
Requires: lib%{pname}_openmp-devel = %{version}
%endif
%description -n %{pname}-devel
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
%package -n %{pname}-devel-headers
Summary: Development headers for OpenBLAS
Group: Development/Libraries/C and C++
Conflicts: %{pname}-devel < %{version}
BuildArch: noarch
%description -n %{pname}-devel-headers
OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.
This package contains headers for OpenBLAS.
%prep
%setup -q -n OpenBLAS-%{version}
%patch1 -p1
%patch2 -p1
%patch3 -p1
%ifarch s390
sed -i -e "s@m32@m31@" Makefile.system
%endif
%if %{without hpc}
cp %{SOURCE1} .
%else
cp %{SOURCE2} .
%endif
%build
%if %{with hpc}
%hpc_debug
%hpc_setup_compiler
%endif
# Only x86/x86-64/ARMv8 CPUs support DYNAMIC_ARCH
%ifarch %ix86 x86_64
%define openblas_target DYNAMIC_ARCH=1
%endif
%ifarch aarch64
%if !(0%{?suse_version} > 1500)
# Temporary fix, SLE/Leap15.x compiler segfaults for -mtune=cortex-a57 with kernel/arm/axpby.c (boo#1128794)
%define openblas_target TARGET=ARMV8
%else
%define openblas_target DYNAMIC_ARCH=1
%endif
%endif
# force -mvsx for ppc64 to avoid build failure:
# ../kernel/power/sasum_microk_power8.c:41:3: error: '__vector' undeclared (first use in this function); did you mean '__cpow'?
# TODO why is it required ? (and not for ppc64le)
%ifarch ppc64
%define addopt -mvsx
%endif
# Make serial, threaded and OpenMP versions
make %{?_smp_mflags} %{?openblas_target} %{?build_flags} \
COMMON_OPT="%{optflags} %{?addopt}" \
NUM_THREADS=%{num_threads} V=1 \
OPENBLAS_LIBRARY_DIR=%{p_libdir} \
OPENBLAS_INCLUDE_DIR=%{hpc_includedir} \
OPENBLAS_CMAKE_DIR=%{p_cmakedir} \
PREFIX=%{p_prefix} \
%{!?with_hpc:LIBNAMESUFFIX=%flavor FC=gfortran CC=gcc}
%install
%if %{with hpc}
%hpc_setup_compiler
%endif
# Install serial library and headers
%make_install %{?build_flags} \
OPENBLAS_LIBRARY_DIR=%{p_libdir} \
OPENBLAS_INCLUDE_DIR=%{p_includedir} \
OPENBLAS_CMAKE_DIR=%{p_cmakedir} \
PREFIX=%{p_prefix} \
%{!?with_hpc:LIBNAMESUFFIX=%flavor}
# Delete info about OBS host cpu
%ifarch %ix86 x86_64
sed -i '/#define OPENBLAS_NEEDBUNDERSCORE/,/#define OPENBLAS_VERSION/{//!d}' \
%{buildroot}%{p_includedir}/openblas_config.h
%endif
%if %{without hpc}
%if 0%{!?build_devel:1}
# We need the includes only once
rm -rf %{buildroot}%{p_includedir}/
rm -rf %{buildroot}%{p_libdir}/cmake/
%else
# Fix cmake config file
sed -i 's|%{buildroot}||g' %{buildroot}%{p_cmakedir}/*.cmake
sed -i 's|_serial||g' %{buildroot}%{p_cmakedir}/*.cmake
%endif
# Put libraries in correct location
rm -rf %{buildroot}%{p_libdir}/lib%{name}*
# Install the serial library
install -D -p -m 755 lib%{name}.so %{buildroot}%{p_libdir}/lib%{name}.so.0
install -D -p -m 644 lib%{name}.a %{buildroot}%{p_libdir}/lib%{name}.a
# Fix source permissions (also applies to LAPACK)
find -name \*.f -exec chmod 644 {} +
# Remove pkgconfig file, it can't be configured for different library suffixes we use and, as such, is useless
rm -fr %{buildroot}%{p_libdir}/pkgconfig/
# Dummy target for update-alternatives
install -d %{buildroot}/%{_sysconfdir}/alternatives
ln -s lib%{pname}.so.0 %{buildroot}/%{p_libdir}/lib%{pname}.so.0
ln -s lib%{pname}.so.0 %{buildroot}/%{_sysconfdir}/alternatives/lib%{pname}.so.0
ln -s lib%{pname}.so.0 %{buildroot}/%{p_libdir}/libblas.so.3
ln -s lib%{pname}.so.0 %{buildroot}/%{p_libdir}/libcblas.so.3
ln -s lib%{pname}.so.0 %{buildroot}/%{p_libdir}/liblapack.so.3
ln -s lib%{pname}.so.0 %{buildroot}/%{_sysconfdir}/alternatives/libblas.so.3
ln -s lib%{pname}.so.0 %{buildroot}/%{_sysconfdir}/alternatives/libcblas.so.3
ln -s lib%{pname}.so.0 %{buildroot}/%{_sysconfdir}/alternatives/liblapack.so.3
# Fix symlinks
pushd %{buildroot}%{p_libdir}
%if 0%{?build_devel}
ln -sf lib%{pname}.so.0 lib%{pname}.so
%endif
ln -sf lib%{name}.so.0 lib%{name}.so
%else # with hpc
# HPC module file
%hpc_write_modules_files
#%%Module1.0#####################################################################
proc ModulesHelp { } {
puts stderr " "
puts stderr "This module loads the %{pname} library built with the %{compiler_family} compiler toolchain."
puts stderr "\nVersion %{version}\n"
}
module-whatis "Name: %{hpc_upcase %pname} built with %{compiler_family} toolchain"
module-whatis "Version: %{version}"
module-whatis "Category: runtime library"
module-whatis "Description: %{dep_summary}"
module-whatis "%{url}"
set version %{version}
prepend-path LD_LIBRARY_PATH %{p_libdir}
setenv %{hpc_upcase %pname}_DIR %{hpc_prefix}
if {[file isdirectory %{hpc_includedir}]} {
prepend-path LIBRARY_PATH %{p_libdir}
prepend-path CPATH %{p_includedir}
prepend-path C_INCLUDE_PATH %{p_includedir}
prepend-path CPLUS_INCLUDE_PATH %{p_includedir}
prepend-path INCLUDE %{p_includedir}
%hpc_modulefile_add_pkgconfig_path
setenv %{hpc_upcase %pname}_DIR %{hpc_prefix}
setenv %{hpc_upcase %pname}_LIB %{p_libdir}
setenv %{hpc_upcase %pname}_INC %{p_includedir}
}
family "openblas"
EOF
%{hpc_write_pkgconfig -l %{pname}}
%endif # with hpc
%if %{without hpc}
%post -n lib%{name}%{so_v}
%{_sbindir}/update-alternatives --install \
%{p_libdir}/libblas.so.3 libblas.so.3 %{p_libdir}/lib%{name}.so.%{so_v} 20
%{_sbindir}/update-alternatives --install \
%{p_libdir}/libcblas.so.3 libcblas.so.3 %{p_libdir}/lib%{name}.so.%{so_v} 20
%{_sbindir}/update-alternatives --install \
%{p_libdir}/liblapack.so.3 liblapack.so.3 %{p_libdir}/lib%{name}.so.%{so_v} 20
%{_sbindir}/update-alternatives --install \
%{p_libdir}/lib%{pname}.so.%{so_v} lib%{name}.so.%{so_v} %{p_libdir}/lib%{name}.so.%{so_v} %openblas_so_prio
/sbin/ldconfig
%preun -n lib%{name}%{so_v}
if [ "$1" = 0 ] ; then
%{_sbindir}/update-alternatives --remove libblas.so.3 %{p_libdir}/lib%{name}.so.%{so_v}
%{_sbindir}/update-alternatives --remove libcblas.so.3 %{p_libdir}/lib%{name}.so.%{so_v}
%{_sbindir}/update-alternatives --remove liblapack.so.3 %{p_libdir}/lib%{name}.so.%{so_v}
%{_sbindir}/update-alternatives --remove lib%{name}.so.0 %{p_libdir}/lib%{name}.so.%{so_v}
fi
%postun -n lib%{name}%{so_v} -p /sbin/ldconfig
%posttrans -n lib%{name}%{so_v}
if [ "$1" = 0 ] ; then
if ! [ -f %{p_libdir}/lib%{name}.so.%{so_v} ] ; then
%{_sbindir}/update-alternatives --auto lib%{pname}.so.%{so_v}
fi
fi
%else
%postun -n lib%{name}
%hpc_module_delete_if_default
%endif
%if %{without hpc}
%define libname %name
%else
%define libname %pname
%endif
%files -n lib%{name}%{?so_v}
%defattr(-,root,root,-)
%{p_libdir}/lib%{libname}.so.0
%if %{without hpc}
%ghost %{p_libdir}/lib%{pname}.so.%{so_v}
%ghost %{p_libdir}/libblas.so.3
%ghost %{p_libdir}/libcblas.so.3
%ghost %{p_libdir}/liblapack.so.3
%ghost %{_sysconfdir}/alternatives/lib%{pname}.so.%{so_v}
%ghost %{_sysconfdir}/alternatives/libblas.so.3
%ghost %{_sysconfdir}/alternatives/libcblas.so.3
%ghost %{_sysconfdir}/alternatives/liblapack.so.3
%else
%hpc_dirs
%{p_libdir}/libopenblas*r*.so
%hpc_modules_files
%endif
%files -n lib%{name}-devel
%defattr(-,root,root,-)
%{p_libdir}/lib%{libname}.so
%if %{with hpc}
%license LICENSE
%doc Changelog.txt GotoBLAS* README.md README.HPC.SUSE
%hpc_pkgconfig_file
%{p_cmakedir}/
%{p_includedir}/
%endif
%files devel-static
%defattr(-,root,root,-)
#%%{p_libdir}/lib%{libname}.a
%{p_libdir}/libopenblas*.a
%if 0%{?build_devel}
%files -n %{pname}-devel
%defattr(-,root,root,-)
%license LICENSE
%doc Changelog.txt GotoBLAS* README.md README.SUSE
%{p_libdir}/libopenblas.so
%dir %{p_libdir}/cmake
%{p_cmakedir}/
%files -n %{pname}-devel-headers
%defattr(-,root,root,-)
%{p_includedir}/
%endif
%changelog