From e529ff484dfcf265d8632c68610cd89c2c602fd7 Mon Sep 17 00:00:00 2001 From: Philipp Spilger <philipp.spilger@kip.uni-heidelberg.de> Date: Wed, 14 Feb 2024 16:51:32 +0100 Subject: [PATCH] feat: Use config scope for spack settings Change-Id: Ied2a324aed7d46806230466b3b2733719ad981fa --- .ci/Jenkinsfile | 3 ++- bin/yashchiki | 26 ++++++++++++++++++- lib/yashchiki/bootstrap_spack.sh | 26 +++++++------------ lib/yashchiki/commons.sh | 11 ++++---- ..._install_routine_called_in_post_as_root.sh | 2 +- lib/yashchiki/fetch.sh | 2 +- lib/yashchiki/install_spack.sh | 6 ++--- lib/yashchiki/restore_spack_user_settings.sh | 15 +++-------- share/yashchiki/styles/asic/create_recipe.sh | 4 +++ .../styles/asic/spack_custom_view.sh | 2 +- .../styles/visionary/create_recipe.sh | 5 ++++ .../styles/visionary/spack_custom_view.sh | 14 +++++----- 12 files changed, 68 insertions(+), 48 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index be188bca..2e99d2b5 100755 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -136,7 +136,8 @@ pipeline { "--recipe-filename=${WORKSPACE}/visionary_recipe.def " + "--build-cache-on-failure-name=${YASHCHIKI_BUILD_CACHE_ON_FAILURE_NAME} " + (with_debug ? "--debug " : "") + - (with_spack_verbose ? "--spack-verbose " : "") + (with_spack_verbose ? "--spack-verbose " : "") + + "--jobs=" + jesh(script: "nproc", returnStdout: true).trim() + " " } catch (Throwable t) { archiveArtifacts "errors_concretization.log" throw t diff --git a/bin/yashchiki b/bin/yashchiki index 734a8432..94ecb715 100644 --- a/bin/yashchiki +++ b/bin/yashchiki @@ -103,6 +103,9 @@ parser.add_argument( "<CACHES_DIR>/build_caches/failed/<BUILD_CACHE_NAME> and is " "postfix'ed with an ascending integer.") # optional options +parser.add_argument( + "-j", "--jobs", type=int, default=1, + help="Number of parallel jobs to use when concurt execution of tasks is available.") parser.add_argument( "--debug", action="store_true", help="Enable debug-level logging.") @@ -165,6 +168,7 @@ env = { "YASHCHIKI_BUILD_CACHE_NAME": args.build_cache_name, "TMPDIR": os.path.join(tempfile.gettempdir(), args.tmp_subdir), "YASHCHIKI_CACHES_ROOT": args.caches_dir, + "YASHCHIKI_JOBS": str(args.jobs), } | os.environ if args.build_cache_on_failure_name: @@ -210,8 +214,28 @@ def run(script: str, env: dict, script_args: list = []): with tempfile.TemporaryDirectory(prefix="spack-", dir=env["TMPDIR"]) \ as temporary_directory_spack, \ - tempfile.TemporaryDirectory() as temporary_directory: + tempfile.TemporaryDirectory() as temporary_directory, \ + tempfile.TemporaryDirectory() as temporary_directory_spack_config: temporary_directory = pathlib.Path(temporary_directory) + temporary_directory_spack_config = \ + pathlib.Path(temporary_directory_spack_config) + + # set spack config directory + env = env | {"YASHCHIKI_SPACK_CONFIG": temporary_directory_spack_config} + + # make spack config directory readable for all users (i.e., spack) + temporary_directory_spack_config.chmod(0o755) + + # set spack config + spack_config = { + "config": { + "build_jobs": args.jobs, + "ccache": True, + } + } + with temporary_directory_spack_config.joinpath("config.yaml").open("wt") \ + as spack_config_file: + spack_config_file.write(yaml.dump(spack_config)) env = env | {"JOB_TMP_SPACK": temporary_directory_spack} diff --git a/lib/yashchiki/bootstrap_spack.sh b/lib/yashchiki/bootstrap_spack.sh index efe45e67..18bfa9de 100755 --- a/lib/yashchiki/bootstrap_spack.sh +++ b/lib/yashchiki/bootstrap_spack.sh @@ -22,32 +22,26 @@ fi ccache -s -# activate ccache -sed -i '/ccache:/c\ ccache: true' "${MY_SPACK_FOLDER}/etc/spack/defaults/config.yaml" - -# build with all available processes -sed -i "/# build_jobs:/c\ build_jobs: $(nproc)" "${MY_SPACK_FOLDER}/etc/spack/defaults/config.yaml" - # add system compiler -${MY_SPACK_BIN} compiler add --scope site /usr/bin +${MY_SPACK_CMD} compiler add --scope site /usr/bin # provide spack support for environment modules echo "BOOTSTRAPPING" # add build_cache -${MY_SPACK_BIN} mirror add --scope site build_mirror file://${BUILD_CACHE_DIR} +${MY_SPACK_CMD} mirror add --scope site build_mirror file://${BUILD_CACHE_DIR} install_from_buildcache "${spack_bootstrap_dependencies[@]}" # We install all packages needed by boostrap here for bootstrap_spec in "${spack_bootstrap_dependencies[@]}"; do - ${MY_SPACK_BIN} "${SPACK_ARGS_INSTALL[@]+"${SPACK_ARGS_INSTALL[@]}"}" install --no-cache --show-log-on-error "${bootstrap_spec}" + ${MY_SPACK_CMD} "${SPACK_ARGS_INSTALL[@]+"${SPACK_ARGS_INSTALL[@]}"}" install --no-cache --show-log-on-error "${bootstrap_spec}" done -num_packages_pre_boostrap="$(${MY_SPACK_BIN} find 2>&1 | head -n 1 | awk '/installed packages/ { print $2 }')" +num_packages_pre_boostrap="$(${MY_SPACK_CMD} find 2>&1 | head -n 1 | awk '/installed packages/ { print $2 }')" -num_packages_post_boostrap="$(${MY_SPACK_BIN} find 2>&1 | head -n 1 | awk '/installed packages/ { print $2 }')" +num_packages_post_boostrap="$(${MY_SPACK_CMD} find 2>&1 | head -n 1 | awk '/installed packages/ { print $2 }')" if (( num_packages_pre_boostrap < num_packages_post_boostrap )); then cat <<EOF | tr '\n' ' ' >&2 @@ -64,19 +58,19 @@ if [ ${YASHCHIKI_BUILD_SPACK_GCC} -eq 1 ]; then install_from_buildcache "${spec_compiler}" # remember system compiler versions (to be removed later) - system_compilers="$(${MY_SPACK_BIN} compiler list --scope site | grep \@)" + system_compilers="$(${MY_SPACK_CMD} compiler list --scope site | grep \@)" # upgrade to newer gcc echo "INSTALL NEW GCC" set -x - ${MY_SPACK_BIN} "${SPACK_ARGS_INSTALL[@]}" install --no-cache --show-log-on-error "${spec_compiler}" + ${MY_SPACK_CMD} "${SPACK_ARGS_INSTALL[@]}" install --no-cache --show-log-on-error "${spec_compiler}" # remove system compilers from spack to avoid conflicting concretization - echo "$(${MY_SPACK_BIN} compiler list)" + echo "$(${MY_SPACK_CMD} compiler list)" for system_compiler in ${system_compilers}; do - ${MY_SPACK_BIN} compiler rm --scope site "${system_compiler}" + ${MY_SPACK_CMD} compiler rm --scope site "${system_compiler}" done # add fresh compiler to spack - ${MY_SPACK_BIN} compiler add --scope site ${MY_SPACK_FOLDER}/opt/spack/linux-*/*/gcc-${YASHCHIKI_SPACK_GCC_VERSION}-* + ${MY_SPACK_CMD} compiler add --scope site ${MY_SPACK_FOLDER}/opt/spack/linux-*/*/gcc-${YASHCHIKI_SPACK_GCC_VERSION}-* fi diff --git a/lib/yashchiki/commons.sh b/lib/yashchiki/commons.sh index 7c15c391..bb532f3e 100755 --- a/lib/yashchiki/commons.sh +++ b/lib/yashchiki/commons.sh @@ -73,6 +73,7 @@ set_debug_output_from_env export MY_SPACK_FOLDER=/opt/spack export MY_SPACK_BIN=/opt/spack/bin/spack +export MY_SPACK_CMD="${MY_SPACK_BIN} --config-scope ${YASHCHIKI_SPACK_CONFIG}" export MY_SPACK_VIEW_PREFIX="/opt/spack_views" export LOCK_FILENAME=lock @@ -253,7 +254,7 @@ populate_views() { local dependencies="${spack_add_to_view_with_dependencies["${addition}"]}" { for viewname in ${spack_add_to_view["${addition}"]}; do - echo "${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[*]+"${SPACK_ARGS_VIEW[*]}"} view -d ${dependencies} symlink -i \"${MY_SPACK_VIEW_PREFIX}/${viewname}\" \"${addition}\"" + echo "${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[*]+"${SPACK_ARGS_VIEW[*]}"} view -d ${dependencies} symlink -i \"${MY_SPACK_VIEW_PREFIX}/${viewname}\" \"${addition}\"" done } | parallel_cmds done @@ -362,7 +363,7 @@ get_hashes_in_buildcache() { get_hashes_in_spack() { # we only return hashes that are actually IN spack, i.e., that reside under /opt/spack/opt/spack - ${MY_SPACK_BIN} find --no-groups -Lp | awk '$3 ~ /^\/opt\/spack\/opt\/spack\// { print $1 }' | sort + ${MY_SPACK_CMD} find --no-groups -Lp | awk '$3 ~ /^\/opt\/spack\/opt\/spack\// { print $1 }' | sort } @@ -412,7 +413,7 @@ get_specfiles() { local idx=0 for package in "${@}"; do if [ ! -f "${specfiles[${idx}]}" ]; then - echo "${MY_SPACK_BIN} spec -y \"${package}\" > ${specfiles[${idx}]}" + echo "${MY_SPACK_CMD} spec -y \"${package}\" > ${specfiles[${idx}]}" fi idx=$((idx + 1)) done @@ -495,7 +496,7 @@ _install_from_buildcache() { < "${FILE_HASHES_TO_INSTALL_FROM_BUILDCACHE}" # have spack reindex its install contents to find the new packages - ${MY_SPACK_BIN} "${SPACK_ARGS_REINDEX[@]+"${SPACK_ARGS_REINDEX[@]}"}" reindex + ${MY_SPACK_CMD} "${SPACK_ARGS_REINDEX[@]+"${SPACK_ARGS_REINDEX[@]}"}" reindex } ############# @@ -525,6 +526,6 @@ get_latest_hash() { printf("%s%%%s%s /%s\\n", substr(\$2, 0, idx-1), compiler, substr(\$2, idx), \$1) } EOF - ${MY_SPACK_BIN} find -vL "$@" | awk -f "${FILE_AWK}"| sort -V | cut -d ' ' -f 2 | tail -n 1 + ${MY_SPACK_CMD} find -vL "$@" | awk -f "${FILE_AWK}"| sort -V | cut -d ' ' -f 2 | tail -n 1 rm "${FILE_AWK}" } diff --git a/lib/yashchiki/complete_spack_install_routine_called_in_post_as_root.sh b/lib/yashchiki/complete_spack_install_routine_called_in_post_as_root.sh index 3625537e..b39dde97 100755 --- a/lib/yashchiki/complete_spack_install_routine_called_in_post_as_root.sh +++ b/lib/yashchiki/complete_spack_install_routine_called_in_post_as_root.sh @@ -15,7 +15,7 @@ source "${SOURCE_DIR}/commons.sh" sudo -Eu spack "${SPACK_INSTALL_SCRIPTS}/bootstrap_spack.sh" sudo -Eu spack "${SPACK_INSTALL_SCRIPTS}/install_spack.sh" && \ -sudo -Eu spack ${MY_SPACK_BIN} compiler add --scope site /usr/bin && \ +sudo -Eu spack ${MY_SPACK_CMD} compiler add --scope site /usr/bin && \ sudo -Eu spack "${SPACK_INSTALL_SCRIPTS}/restore_spack_user_settings.sh" && \ # remove temporary cache folder rm -rfv /opt/spack/.spack diff --git a/lib/yashchiki/fetch.sh b/lib/yashchiki/fetch.sh index 3892f826..289c9c1f 100755 --- a/lib/yashchiki/fetch.sh +++ b/lib/yashchiki/fetch.sh @@ -20,7 +20,7 @@ export MY_SPACK_FOLDER="${YASHCHIKI_SPACK_PATH}" # the inside-container location is defined export MY_SPACK_BIN="${MY_SPACK_FOLDER}/bin/spack" # therefore we also need to redefine this command variable -export MY_SPACK_CMD="${MY_SPACK_BIN} --config-scope ${tmp_config_scope}" +export MY_SPACK_CMD="${MY_SPACK_BIN} --config-scope ${YASHCHIKI_SPACK_CONFIG} --config-scope ${tmp_config_scope}" # Add fake system compiler (needed for fetching) # We create a compilers.yaml file in a temporary directory and diff --git a/lib/yashchiki/install_spack.sh b/lib/yashchiki/install_spack.sh index a693509e..a9e2a150 100755 --- a/lib/yashchiki/install_spack.sh +++ b/lib/yashchiki/install_spack.sh @@ -33,7 +33,7 @@ for package in "${spack_packages[@]+"${spack_packages[@]}"}"; do exit 1 fi echo "Installing: ${package}" >&2 - ${MY_SPACK_BIN} "${SPACK_ARGS_INSTALL[@]+"${SPACK_ARGS_INSTALL[@]}"}" install --fresh --no-cache --show-log-on-error --file "${specfile}" + ${MY_SPACK_CMD} "${SPACK_ARGS_INSTALL[@]+"${SPACK_ARGS_INSTALL[@]}"}" install --fresh --no-cache --show-log-on-error --file "${specfile}" done # create the filesystem views (exposed via singularity --app option) @@ -79,6 +79,6 @@ umask ${OLD_UMASK} # $ singularity shell -s /opt/shell/${SHELL} /containers/stable/latest # which is independent of any app. Especially, this allows custom loading of # modules within the container. -if ${MY_SPACK_BIN} location -i zsh; then - ln -s "$(${MY_SPACK_BIN} location -i zsh)/bin/zsh" /opt/shell/zsh +if ${MY_SPACK_CMD} location -i zsh; then + ln -s "$(${MY_SPACK_CMD} location -i zsh)/bin/zsh" /opt/shell/zsh fi diff --git a/lib/yashchiki/restore_spack_user_settings.sh b/lib/yashchiki/restore_spack_user_settings.sh index f807e125..b41c53ed 100755 --- a/lib/yashchiki/restore_spack_user_settings.sh +++ b/lib/yashchiki/restore_spack_user_settings.sh @@ -12,10 +12,10 @@ source "${sourcedir}/commons.sh" source "${sourcedir}/setup_env_spack.sh" # rebuild all modules -${MY_SPACK_BIN} module tcl refresh -y +${MY_SPACK_CMD} module tcl refresh -y # remove the generated cache again to avoid permission problems in the final # container -${MY_SPACK_BIN} clean --misc-cache +${MY_SPACK_CMD} clean --misc-cache # non-spack user/group shall be allowed to read/execute everything we installed here chmod -R o+rX "${MY_SPACK_VIEW_PREFIX}" @@ -26,7 +26,7 @@ find "${MY_SPACK_FOLDER}" \ \) -o -not -type l -exec chmod o+rX '{}' \; # remove build_cache again (prior to changing modules) -${MY_SPACK_BIN} mirror rm --scope site build_mirror +${MY_SPACK_CMD} mirror rm --scope site build_mirror # allow non-spack users to install new packages # Note: modified packages can be loaded by bind-mounting the /var-subdirectory @@ -38,12 +38,3 @@ chmod -R 777 ${MY_SPACK_FOLDER}/share/spack/modules || /bin/true # Make db accessible for all to allow for spack modifications within container chmod -R 777 /opt/spack/opt/spack/.spack-db - -# disable ccache after everything has been build -> make manual spack overlay -# builds oe step less manual -sed -i '/ccache:/c\ ccache: false'\ - "${MY_SPACK_FOLDER}/etc/spack/defaults/config.yaml" - -# Restore default build_jobs setting -sed -i '/build_jobs:/c\ # build_jobs: 4'\ - "${MY_SPACK_FOLDER}/etc/spack/defaults/config.yaml" diff --git a/share/yashchiki/styles/asic/create_recipe.sh b/share/yashchiki/styles/asic/create_recipe.sh index b080e55c..d89ecddc 100755 --- a/share/yashchiki/styles/asic/create_recipe.sh +++ b/share/yashchiki/styles/asic/create_recipe.sh @@ -29,6 +29,9 @@ From: ${DOCKER_BASE_IMAGE} # bind-mount tmp-folder mkdir -p "\${SINGULARITY_ROOTFS}/tmp/spack" mount --no-mtab --bind "${JOB_TMP_SPACK}" "\${SINGULARITY_ROOTFS}/tmp/spack" + # bind-mount spack config tmp-folder + mkdir -p "\${SINGULARITY_ROOTFS}/tmp/spack_config" + mount --no-mtab --bind "${YASHCHIKI_SPACK_CONFIG}" "\${SINGULARITY_ROOTFS}/tmp/spack_config" # copy install scripts mkdir "\${SINGULARITY_ROOTFS}/${SPACK_INSTALL_SCRIPTS}" rsync -av --chmod 0755 "${ROOT_DIR}"/share/yashchiki/styles/asic/*.sh "\${SINGULARITY_ROOTFS}/${SPACK_INSTALL_SCRIPTS}" @@ -233,6 +236,7 @@ From: ${DOCKER_BASE_IMAGE} export YASHCHIKI_BUILD_SPACK_GCC="${YASHCHIKI_BUILD_SPACK_GCC}" export YASHCHIKI_SPACK_GCC="${YASHCHIKI_SPACK_GCC}" export YASHCHIKI_SPACK_GCC_VERSION="${YASHCHIKI_SPACK_GCC_VERSION}" + export YASHCHIKI_SPACK_CONFIG="/tmp/spack_config" export CONTAINER_STYLE="${CONTAINER_STYLE}" "${SPACK_INSTALL_SCRIPTS}/complete_spack_install_routine_called_in_post_as_root.sh" wait diff --git a/share/yashchiki/styles/asic/spack_custom_view.sh b/share/yashchiki/styles/asic/spack_custom_view.sh index 794bbe63..88371aad 100644 --- a/share/yashchiki/styles/asic/spack_custom_view.sh +++ b/share/yashchiki/styles/asic/spack_custom_view.sh @@ -1,4 +1,4 @@ cat <<EOF # just visionary-asic -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-asic $(get_latest_hash "visionary-asic") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-asic $(get_latest_hash "visionary-asic") EOF diff --git a/share/yashchiki/styles/visionary/create_recipe.sh b/share/yashchiki/styles/visionary/create_recipe.sh index d078fdf5..d0d4fe8a 100755 --- a/share/yashchiki/styles/visionary/create_recipe.sh +++ b/share/yashchiki/styles/visionary/create_recipe.sh @@ -34,6 +34,9 @@ From: ${DOCKER_BASE_IMAGE} # bind-mount tmp-folder mkdir -p "\${SINGULARITY_ROOTFS}/tmp/spack" mount --no-mtab --bind "${JOB_TMP_SPACK}" "\${SINGULARITY_ROOTFS}/tmp/spack" + # bind-mount spack config tmp-folder + mkdir -p "\${SINGULARITY_ROOTFS}/tmp/spack_config" + mount --no-mtab --bind "${YASHCHIKI_SPACK_CONFIG}" "\${SINGULARITY_ROOTFS}/tmp/spack_config" # copy install scripts mkdir "\${SINGULARITY_ROOTFS}/${SPACK_INSTALL_SCRIPTS}" rsync -av --chmod 0755 "${ROOT_DIR}"/share/yashchiki/styles/visionary/*.sh "\${SINGULARITY_ROOTFS}/${SPACK_INSTALL_SCRIPTS}" @@ -74,6 +77,8 @@ From: ${DOCKER_BASE_IMAGE} export YASHCHIKI_BUILD_SPACK_GCC=${YASHCHIKI_BUILD_SPACK_GCC} export YASHCHIKI_SPACK_GCC="${YASHCHIKI_SPACK_GCC}" export YASHCHIKI_SPACK_GCC_VERSION="${YASHCHIKI_SPACK_GCC_VERSION}" + export YASHCHIKI_SPACK_CONFIG="/tmp/spack_config" + export YASHCHIKI_CACHES_ROOT="${YASHCHIKI_CACHES_ROOT}" export CONTAINER_STYLE="${CONTAINER_STYLE}" # Improve efficiency by installing system packages in the background (even # though we set the number of worker to \$(nproc), often times - e.g. when diff --git a/share/yashchiki/styles/visionary/spack_custom_view.sh b/share/yashchiki/styles/visionary/spack_custom_view.sh index 68c2764b..16c55f37 100644 --- a/share/yashchiki/styles/visionary/spack_custom_view.sh +++ b/share/yashchiki/styles/visionary/spack_custom_view.sh @@ -3,24 +3,24 @@ cat <<EOF # Packages still plagued by gccxml # #################################### -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-wafer $(get_latest_hash visionary-wafer+dev~gccxml) -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-wafer-nodev $(get_latest_hash visionary-wafer~dev~gccxml) +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-wafer $(get_latest_hash visionary-wafer+dev~gccxml) +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-wafer-nodev $(get_latest_hash visionary-wafer~dev~gccxml) ################################################## # Strong independent packages who need no gccxml # ################################################## -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls-core $(get_latest_hash visionary-dls-core "^${DEPENDENCY_PYTHON}") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls-core $(get_latest_hash visionary-dls-core "^${DEPENDENCY_PYTHON}") -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls $(get_latest_hash visionary-dls+dev "^${DEPENDENCY_PYTHON}") -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls-nodev $(get_latest_hash visionary-dls~dev "^${DEPENDENCY_PYTHON}") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls $(get_latest_hash visionary-dls+dev "^${DEPENDENCY_PYTHON}") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dls-nodev $(get_latest_hash visionary-dls~dev "^${DEPENDENCY_PYTHON}") # slurvmiz needs no dev-tools because it is not for end-users -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-slurmviz $(get_latest_hash "visionary-slurmviz %${YASHCHIKI_SPACK_GCC}") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-slurmviz $(get_latest_hash "visionary-slurmviz %${YASHCHIKI_SPACK_GCC}") ############# # dev tools # ############# -${MY_SPACK_BIN} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dev-tools $(get_latest_hash "visionary-dev-tools ^${DEPENDENCY_PYTHON} %${YASHCHIKI_SPACK_GCC}") +${MY_SPACK_CMD} ${SPACK_ARGS_VIEW[@]+"${SPACK_ARGS_VIEW[@]}"} view -d yes symlink -i ${MY_SPACK_VIEW_PREFIX}/visionary-dev-tools $(get_latest_hash "visionary-dev-tools ^${DEPENDENCY_PYTHON} %${YASHCHIKI_SPACK_GCC}") EOF -- GitLab