#!/usr/bin/env sh set -o errexit set -o pipefail set -o nounset source ${CI_PROJECT_DIR}/ci/stack_env.sh mkdir -p ${STACK_LOCATION} cd ${STACK_LOCATION} echo "Setting up spack" if [ ! -d spack/.git ]; then git clone https://github.com/spack/spack.git else git -C spack fetch # git -C spack pull fi git -C spack checkout $SPACK_VERSION echo "Adding spack system config file" if [ ! -e ${SPACK_SYSTEM_CONFIG_PATH}/spack.yaml ] then spack/bin/spack env create ${environment} fi echo "Copying cp ${STACK_CONFIG_PATH}/spack.yaml to ${SPACK_SYSTEM_CONFIG_PATH}/" cp ${STACK_CONFIG_PATH}/spack.yaml ${SPACK_SYSTEM_CONFIG_PATH} cp -r "${STACK_CONFIG_PATH}/templates" ${SPACK_SYSTEM_CONFIG_PATH} declare -A file_mapping file_mapping["_common"]="" file_mapping["_stack"]="_stack" file_mapping["_acc_${acc_type}"]="_accel" file_mapping["_${environment}"]="_env" declare -A placeholders placeholders["{target}"]="${target}" placeholders["{gcc_version}"]=$(jq -Mrc '.stack.compilers.gcc.version' ${STACK_CONFIG}) if [ "${accelerator}" != "none" ] then placeholders["{${acc_type}_arch}"]="${acc_arch}" fi echo blip for file in mirrors packages concretizer config definitions modules do for suffix in ${!file_mapping[@]} do src=${STACK_CONFIG_PATH}/${file}${suffix}.yaml dst=${SPACK_SYSTEM_CONFIG_PATH}/${file}"${file_mapping[$suffix]}".yaml if [ -e "${STACK_CONFIG_PATH}/${file}${suffix}.yaml" ] then echo "Copying $src to $dst" cp "$src" "$dst" for ph in ${!placeholders[@]} do rep=${placeholders[$ph]} sed -i -e "s/$ph/$rep/g" "$dst" done fi done done cat <<EOF > ${SPACK_SYSTEM_CONFIG_PATH}/config_stack.yaml config: template_dirs: - ${SPACK_SYSTEM_CONFIG_PATH}/templates EOF cat <<EOF > ${SPACK_SYSTEM_CONFIG_PATH}/modules_stack.yaml modules: default: roots: lmod: ${STACK_LOCATION}/spack/share/spack/lmod/${environment} tcl: ${STACK_LOCATION}/spack/share/spack/modules/${environment} EOF mirrors=$(jq -Mrc ' .spack.mirrors | to_entries | map(select(.value.type="relative")) | map(" \(.key): \(env.STACK_LOCATION)/\(.value.url)") | .[] ' ${STACK_CONFIG}) cat <<EOF > ${SPACK_SYSTEM_CONFIG_PATH}/mirrors.yaml mirrors: ${mirrors} EOF echo "Setting up packages" if [ -e ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml ] then mv ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml packages.yaml.old fi echo "packages:" > ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml export system_compiler=$(jq -Mrc ' .stack | .system_compiler | to_entries | .[].value | "\(.compiler)@\(.version)" ' ${STACK_CONFIG}) export system_arch=$(jq -Mrc ' .stack.system_arch ' ${STACK_CONFIG}) jq -Mrc ' .stack.system_packages | map(" \(.):\n require:\n - \"%\(env.system_compiler)\"\n - \"\(env.system_arch)\"") | .[] ' ${STACK_CONFIG} >> ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml if [ -e packages.yaml.old ] then yq eval-all --inplace 'select(fileIndex==0) *+ select(fileIndex==1)' \ ${SPACK_SYSTEM_CONFIG_PATH}/packages.yaml packages.yaml.old rm packages.yaml.old fi echo "Setting up extra repos" EXTERNAL_REPOS=$(jq -r '.spack.repos | keys[]' ${STACK_CONFIG}) spack_external_repos="${SPACK_SYSTEM_CONFIG_PATH}/external_repos" mkdir -p ${spack_external_repos} echo "repos:" > ${SPACK_SYSTEM_CONFIG_PATH}/repos.yaml for repo in ${EXTERNAL_REPOS} do repo_branch=$(jq -r ".spack.repos.\"${repo}\".branch" ${STACK_CONFIG}) echo " - ${spack_external_repos}/${repo}" echo " - ${spack_external_repos}/${repo}" >> ${SPACK_SYSTEM_CONFIG_PATH}/repos.yaml if [ ! -d ${spack_external_repos}/${repo} ]; then echo "Cloning repo: ${repo}" url_branch=$(jq -r ".spack.repos.\"${repo}\".url" ${STACK_CONFIG}) git clone -b ${repo_branch} ${url_branch} ${spack_external_repos}/${repo} else echo "Update repo: ${repo}" git -C ${spack_external_repos}/$repo fetch git -C ${spack_external_repos}/$repo checkout ${repo_branch} git -C ${spack_external_repos}/$repo pull fi done for file in mirrors packages concretizer config modules repos do if [ -e "${SPACK_SYSTEM_CONFIG_PATH}/${file}.yaml" ] then cp "${SPACK_SYSTEM_CONFIG_PATH}/${file}.yaml" spack/etc/spack fi done echo "Setting up buildcache" spack/bin/spack gpg trust \ $GPG_PRIVATE_KEY if [ ! -d ${MOUNT_POINT}/buildcache/build_cache ]; then spack/bin/spack gpg publish \ -d ${MOUNT_POINT}/buildcache fi if ! spack/bin/spack mirror list | grep buildcache; then echo "Add buildcache in mirrors" spack/bin/spack mirror add \ --type binary \ --scope system \ buildcache file://${MOUNT_POINT}/buildcache fi spack/bin/spack buildcache keys \ --install \ --trust #spack/bin/spack buildcache update-index /buildcache