spack/spack.spec

283 lines
9.9 KiB
RPMSpec

#
# spec file for package spack
#
# Copyright (c) 2020 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 spack_dir %_prefix/lib/spack/
%define spack_group spack
Name: spack
Version: 0.15.4
Release: 0
Summary: Package manager for HPC systems
License: Apache-2.0 AND MIT AND Python-2.0 AND BSD-3-Clause
URL: https://spack.io
Source0: https://github.com/spack/spack/archive/v%{version}.tar.gz#/spack-%{version}.tar.gz
Patch0: Make-spack-paths-compliant-to-distro-installation.patch
Patch1: fix-tumbleweed-naming.patch
BuildRequires: polkit
BuildRequires: fdupes
BuildRequires: python-base
BuildRequires: lua-lmod
Requires: %{name}-recipes = %{version}
Requires: curl
Requires: lua-lmod
Requires: pattern() = devel_basis
Requires: polkit
Requires: gcc-fortran
Requires: gpg2
Requires: xz
Requires: bzip2
Requires: spack-recipes
Recommends: spack-recipes = %version
BuildArch: noarch
%if 0%{?sle_version} <= 120500 && !0%{?is_opensuse}
%define __python3 python3
%endif
%description
Spack is a configurable Python-based HPC package manager, automating
the installation and fine-tuning of simulations and libraries.
It operates on a wide variety of HPC platforms and enables users
to build many code configurations. Software installed by Spack
runs correctly regardless of environment, and file management
is streamlined. Spack can install many variants of the same build
using different compilers, options, and MPI implementations.
This package provides a module file that must be loaded to use spack.
%package recipes
Summary: Spack built-in package recipes
Requires: %{name} >= %version
%description recipes
Spack is a configurable Python-based HPC package manager, automating
the installation and fine-tuning of simulations and libraries.
It operates on a wide variety of HPC platforms and enables users
to build many code configurations. Software installed by Spack
runs correctly regardless of environment, and file management
is streamlined. Spack can install many variants of the same build
using different compilers, options, and MPI implementations.
This package contains the built-in package recipes.
%prep
%setup -q
%autopatch -p1
%build
# Nothing to build
%install
# Fix some rpmlint warnings
## Remove files not required to run spack
rm -rf lib/spack/spack/test
rm -rf share/spack/qa
rm -rf var/spack/repos/builtin.mock var/spack/gpg.mock var/spack/mock_configs
rm -rf lib/spack/external/ruamel/yaml/.ruamel
find . -type f -name .gitignore -delete
find . -type f -name .nojekyll -delete
rm -f lib/spack/docs/_spack_root
ln -sf ../.. lib/spack/docs/_spack_root
## No need for the standalone scripts
rm -f lib/spack/external/macholib/macho_*.py
## Fix shebangs
sed -i 's@#!/bin/env sh@#!/bin/bash@' var/spack/repos/builtin/packages/beast-tracer/tracer
sed -i 's@#!/usr/bin/env bash@#!/bin/bash@' share/spack/docker/package-index/split.sh
sed -i 's@#! /usr/bin/env bash@ #!/bin/bash@' share/spack/docker/entrypoint.bash
mkdir -p %{buildroot}%{spack_dir}
mkdir -p %{buildroot}%{spack_dir}/opt
mkdir -p %{buildroot}%{spack_dir}/bin
mkdir -p %{buildroot}%{_datarootdir}/spack
mkdir -p %{buildroot}%{_datarootdir}/spack/modules
mkdir -p %{buildroot}%{_localstatedir}/lib/spack
mkdir -p %{buildroot}%{_localstatedir}/lib/spack/junit-report
mkdir -p %{buildroot}%{_localstatedir}/cache/spack
mkdir -p %{buildroot}%{_sysconfdir}/skel/.spack/
mkdir -p %{buildroot}/%{_bindir}
ln -sf %{buildroot}/%{_localstatedir}/cache/spack %{buildroot}%{_localstatedir}/lib/spack/cache
# Copy files to corresponding paths
cp -r etc lib %{buildroot}%{spack_dir}
cp -r share/spack/* %{buildroot}%{_datarootdir}/spack
cp -r var/spack/* %{buildroot}%{_localstatedir}/lib/spack
cp -r bin/sbang %{buildroot}/%{_bindir}
cp -r bin/spack* %{buildroot}%{spack_dir}/bin
cp etc/spack/defaults/config.yaml %{buildroot}%{_sysconfdir}/skel/.spack/
sed -i 's@\(\sinstall_tree:\).*@\1 ~/spack/packages@' %{buildroot}%{_sysconfdir}/skel/.spack/config.yaml
sed -i 's@\(\ssource_cache:\).*@\1 /var/tmp/$user/spack-cache@' %{buildroot}%{_sysconfdir}/skel/.spack/config.yaml
sed -i 's@\(\stcl:\).*@\1 ~/spack/modules@' %{buildroot}%{_sysconfdir}/skel/.spack/config.yaml
sed -i 's@\(\slmod:\).*@\1 ~/spack/lmod@' %{buildroot}%{_sysconfdir}/skel/.spack/config.yaml
# create spack scripts
echo -e '#!/bin/bash\n\nexec %{spack_dir}bin/$(basename $0) "${1+$@}"' > \
%{buildroot}%{_bindir}/spack
chmod 0755 %{buildroot}%{_bindir}/spack
ln -s spack %{buildroot}%{_bindir}/spack-python
ln -s %{_bindir}/sbang %{buildroot}%{spack_dir}/bin/sbang
# compile python files for python3
%py_compile .
# make shell scripts executeable
find %{buildroot}%{_localstatedir}/lib/spack/ -type f -name \*.sh -exec chmod 755 {} \;
# Create /etc/spack/compilers.yaml
mkdir -p %{buildroot}%{spack_dir}/etc/spack/
cat > %{buildroot}%{spack_dir}/etc/spack/compilers.yaml <<EOF
compilers:
- compiler:
spec: gcc@GCC_FULL_VERSION
paths:
cc: /usr/bin/gcc-GCC_VERSION
cxx: /usr/bin/g++-GCC_VERSION
f77: /usr/bin/gfortran-GCC_VERSION
fc: /usr/bin/gfortran-GCC_VERSION
flags: {}
operating_system: SUSE_VERSION
target: HOSTTYPE
modules: []
environment:
unset: []
extra_rpaths: []
EOF
# Create /etc/profile.d/spack.sh
# This file properly sets MODULEPATH so lua-lmod can find the modules created by spack
mkdir -p %{buildroot}/%{_sysconfdir}/profile.d
cat > %{buildroot}/%{_sysconfdir}/profile.d/spack.sh <<EOF
source /etc/os-release
if [ "\${ID}" == "opensuse-tumbleweed" ] ; then
SPACK_NAME="\${ID/-/}"
else
SPACK_NAME="\${ID/-/_}\${VERSION_ID/.*/}"
fi
export SPACK_ROOT=%{spack_dir}
export MODULEPATH=~/spack/lmod/linux-\${SPACK_NAME}-\${CPU}:%{_prefix}/share/spack/lmod/linux-\${SPACK_NAME}-\${CPU}:\${MODULEPATH}
# copy local configuration, if its not there
if [ ! -e ~/.spack/config.yaml ] ; then
# test if user is in spack group by touching database
if ! touch %{spack_dir}/.spack-db &> /dev/null ; then
test -e ~/.spack || mkdir -p ~/.spack
[ -e ~/.spack/config.yaml ] || \
cp -r %{_sysconfdir}/skel/.spack/config.yaml ~/.spack/
fi
fi
EOF
# Same for csh
cat > %{buildroot}/%{_sysconfdir}/profile.d/spack.csh <<EOF
# get ID
eval \`awk '/^ID=/ {sub("-","_"); printf("set %%s",\$0);}' /etc/os-release\`
# get VERSION_ID
eval \`awk '/^VERSION_ID=/ {sub("\\\\.[0-9]",""); printf("set %%s",\$0);}' /etc/os-release\`
if ( \$ID == "opensuse_tumbleweed" ) then
eval \`awk '/^ID=/ {sub("-",""); printf("set %%s",\$0);}' /etc/os-release\`
set SPACK_NAME=\$ID
else
set SPACK_NAME="\${ID}\${VERSION_ID}"
endif
set SPACK_ROOT="%{spack_dir}"
set MODULEPATH="~/spack/lmod/linux-\${SPACK_NAME}-\${CPU}:%{_prefix}/share/spack/lmod/linux-\${SPACK_NAME}-\${CPU}:\${MODULEPATH}"
if ( ! -e ~/.spack/config.yaml ) then
# test if user is in spack group by touching database
touch %{spack_dir}/.spack-db >& /dev/null
if ( \$? == 1 ) then
test -e ~/.spack || mkdir -p ~/.spack
test -e ~/.spack/config.yaml || \
cp -r %{_sysconfdir}/skel/.spack/config.yaml ~/.spack/
endif
endif
EOF
# Create modules.yaml file, so that hierarchy module files are created
cat > %{buildroot}%{spack_dir}/etc/spack/modules.yaml <<EOF
modules:
enable:
- lmod
lmod:
core_compilers:
- 'gcc@GCC_FULL_VERSION'
projections:
all: '{compiler.name}-{compiler.version}/{name}/{version}'
^mpi: '{compiler.name}-{compiler.version}/{^mpi.name}-{^mpi.version}/{name}/{version}'
EOF
# Fix link to not point into buildroot
rm -f %{buildroot}%{_localstatedir}/lib/spack/cache
ln -sf %{_localstatedir}/cache/spack %{buildroot}%{_localstatedir}/lib/spack/cache
%fdupes %{buildroot}%{spack_dir}
%fdupes %{buildroot}%{_datarootdir}/spack
%fdupes %{buildroot}%{_localstatedir}/lib/spack
%pre
getent group %spack_group >/dev/null || groupadd -r %spack_group
%post
# Replace /etc/spack/compilers.yaml
export GCC_VERSION=`gcc -dumpversion`
export GCC_FULL_VERSION=`gcc -dumpfullversion`
sed -i "s@GCC_FULL_VERSION@$GCC_FULL_VERSION@" %{spack_dir}/etc/spack/compilers.yaml
sed -i "s@GCC_FULL_VERSION@$GCC_FULL_VERSION@" %{spack_dir}/etc/spack/modules.yaml
sed -i "s@GCC_VERSION@$GCC_VERSION@" %{spack_dir}/etc/spack/compilers.yaml
if [ -e /etc/os-release ] ; then
source /etc/os-release
if [ "${ID}" == "opensuse-tumbleweed" ] ; then
export SPACK_NAME="${ID/-/}"
else
export SPACK_NAME="${ID/-/_}${VERSION_ID/.*/}"
fi
sed -i "s@SUSE_VERSION@$SPACK_NAME@" %{spack_dir}/etc/spack/compilers.yaml
sed -i "s@SUSE_VERSION@$SPACK_NAME@g" /etc/profile.d/spack.sh
fi
sed -i "s@HOSTTYPE@$HOSTTYPE@" %{spack_dir}/etc/spack/compilers.yaml
%files
%license COPYRIGHT LICENSE-APACHE LICENSE-MIT
%doc CHANGELOG.md NOTICE README.md
%{_bindir}/*
%attr(0775, root, spack) %{_localstatedir}/lib/spack/junit-report
%attr(0775, root, spack) %{spack_dir}/opt
%attr(0775, root, spack) %{_localstatedir}/cache/spack
%attr(0775, root, spack) %{_datarootdir}/spack/modules
%{_prefix}/lib/spack
%{_localstatedir}/cache/spack
%{_localstatedir}/lib/spack
%{_datarootdir}/spack
%config %{_sysconfdir}/profile.d/spack.sh
%config %{_sysconfdir}/profile.d/spack.csh
%dir %{_sysconfdir}/skel/.spack
%config %{_sysconfdir}/skel/.spack/config.yaml
# repos directory is installed in -recipes
%exclude %{_localstatedir}/lib/spack/repos
%files recipes
%license COPYRIGHT LICENSE-APACHE LICENSE-MIT
%doc CHANGELOG.md NOTICE README.md
%{_localstatedir}/lib/spack/repos
%changelog