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