diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2a60006e3a90406e0bfd92043b21ee3f4fd7d9fd..7b4d9888d781a730bbd55a489b2e4706d8ee114f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -28,7 +28,7 @@ stages:
     - while true; do sleep 300; x=$(oc get pods |grep $pod|awk '{ print $3}');if [ $x != "Running" ]; then break; fi; done 
     - oc logs jobs/simplejob${CI_PIPELINE_ID} | tee log.txt
     # if spack install has failed, fail the pipeline
-    # - if [ $(cat log.txt |grep "Error:"|wc -l) -gt 0 ]; then exit 1;fi;
+    - if [ $(cat log.txt |grep "No module available for package"|wc -l) -gt 0 ]; then exit 1;fi;
     # delete the job from OpenShift as we have the logs here
     - oc delete job simplejob${CI_PIPELINE_ID} || true
   tags:
@@ -143,7 +143,7 @@ deploy-exp-release-dev-cscs:
     refs:
       - schedules
     variables:
-      - $RELEASE == "experimental"
+      - $RELEASE == "experimental-dev"
   allow_failure: false
 
 # Deploy the experimental release of tools (sheduled pipeline)
diff --git a/create_JupyterLab_kernel.sh b/create_JupyterLab_kernel.sh
index aa5b61cb0c63ae3ca01451bc44bb3d47490a5b5e..078c786b51f6c22bdc9a207c7eea2d56f09e778a 100644
--- a/create_JupyterLab_kernel.sh
+++ b/create_JupyterLab_kernel.sh
@@ -26,6 +26,8 @@ source /srv/$INSTALLATION_ROOT/spack/var/spack/environments/$SPACKIFIED_ENV/load
 # by the user using pip
 export PYTHONPATH=$PYTHONPATH:/opt/app-root/src/.local/lib/python3.8/site-packages
 export PATH=$PATH:/opt/app-root/src/.local/bin
+# export also python modules installed in the base docker Collab image
+export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.8/dist-packages
 
 # capture the env after spack activation
 cd /opt/app-root/src
diff --git a/create_job.sh b/create_job.sh
index cc62cb605d73013e28818cfdf1495bce4d661bb2..b0177883bbd18b409c340b094fe92a09e1e36a0e 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -29,6 +29,7 @@ spec:
       containers:
       - name: simplejob
         image: ${BUILD_ENV_DOCKER_IMAGE}
+        imagePullPolicy: Always
         securityContext:
           runAsUser: ${OKD_CLUSTER_UID}
         volumeMounts:
@@ -40,6 +41,6 @@ spec:
           persistentVolumeClaim:
             claimName: shared-binaries
       restartPolicy: Never
-      #nodeSelector:
-      # kubernetes.io/hostname: okd-worker-1.dev.hbp.eu     
+      nodeSelector:
+        kubernetes.io/hostname: okd-worker-3.dev.hbp.eu     
 EOT
diff --git a/packages/llvm/llvm-gcc11.patch b/packages/llvm/llvm-gcc11.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8e081e876ee33a20c74aef54208c8cc0eb600007
--- /dev/null
+++ b/packages/llvm/llvm-gcc11.patch
@@ -0,0 +1,9 @@
+--- a/llvm/utils/benchmark/src/benchmark_register.h
++++ b/llvm/utils/benchmark/src/benchmark_register.h
+@@ -2,6 +2,7 @@
+ #define BENCHMARK_REGISTER_H
+ 
+ #include <vector>
++#include <limits>
+ 
+ #include "check.h"
diff --git a/packages/llvm/llvm-version-suffix-macro.patch b/packages/llvm/llvm-version-suffix-macro.patch
new file mode 100644
index 0000000000000000000000000000000000000000..62e9684386b34501a2da7e5c31ea00ac393387c8
--- /dev/null
+++ b/packages/llvm/llvm-version-suffix-macro.patch
@@ -0,0 +1,14 @@
+diff --git a/llvm/include/llvm/Config/llvm-config.h.cmake b/llvm/include/llvm/Config/llvm-config.h.cmake
+index 4493bb65d444..e2b3c61b3c33 100644
+--- a/llvm/include/llvm/Config/llvm-config.h.cmake
++++ b/llvm/include/llvm/Config/llvm-config.h.cmake
+@@ -74,6 +74,9 @@
+ /* Patch version of the LLVM API */
+ #define LLVM_VERSION_PATCH ${LLVM_VERSION_PATCH}
+ 
++/* LLVM version suffix */
++#cmakedefine LLVM_VERSION_SUFFIX "${LLVM_VERSION_SUFFIX}"
++
+ /* LLVM version string */
+ #define LLVM_VERSION_STRING "${PACKAGE_VERSION}"
+ 
diff --git a/packages/llvm/llvm4-lld-ELF-Symbols.patch b/packages/llvm/llvm4-lld-ELF-Symbols.patch
new file mode 100644
index 0000000000000000000000000000000000000000..1a86cda35828115c11acde8ff3ce5f08a4cb862f
--- /dev/null
+++ b/packages/llvm/llvm4-lld-ELF-Symbols.patch
@@ -0,0 +1,112 @@
+--- a/lldb/include/lldb/Utility/TaskPool.h
++++ b/lldb/include/lldb/Utility/TaskPool.h
+@@ -33,6 +33,7 @@
+ #include <queue>
+ #include <thread>
+ #include <vector>
++#include <functional>
+ 
+ // Global TaskPool class for running tasks in parallel on a set of worker thread
+ // created the first
+# Fix lld templates: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230463
+--- a/lld/ELF/LTO.cpp
++++ b/lld/ELF/LTO.cpp
+@@ -158,7 +158,7 @@
+   return Ret;
+ }
+ 
+-template void BitcodeCompiler::template add<ELF32LE>(BitcodeFile &);
+-template void BitcodeCompiler::template add<ELF32BE>(BitcodeFile &);
+-template void BitcodeCompiler::template add<ELF64LE>(BitcodeFile &);
+-template void BitcodeCompiler::template add<ELF64BE>(BitcodeFile &);
++template void BitcodeCompiler::add<ELF32LE>(BitcodeFile &);
++template void BitcodeCompiler::add<ELF32BE>(BitcodeFile &);
++template void BitcodeCompiler::add<ELF64LE>(BitcodeFile &);
++template void BitcodeCompiler::add<ELF64BE>(BitcodeFile &);
+--- a/lld/ELF/Symbols.cpp
++++ b/lld/ELF/Symbols.cpp
+@@ -343,45 +343,45 @@
+ template bool SymbolBody::hasThunk<ELF64LE>() const;
+ template bool SymbolBody::hasThunk<ELF64BE>() const;
+ 
+-template uint32_t SymbolBody::template getVA<ELF32LE>(uint32_t) const;
+-template uint32_t SymbolBody::template getVA<ELF32BE>(uint32_t) const;
+-template uint64_t SymbolBody::template getVA<ELF64LE>(uint64_t) const;
+-template uint64_t SymbolBody::template getVA<ELF64BE>(uint64_t) const;
+-
+-template uint32_t SymbolBody::template getGotVA<ELF32LE>() const;
+-template uint32_t SymbolBody::template getGotVA<ELF32BE>() const;
+-template uint64_t SymbolBody::template getGotVA<ELF64LE>() const;
+-template uint64_t SymbolBody::template getGotVA<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getGotOffset<ELF32LE>() const;
+-template uint32_t SymbolBody::template getGotOffset<ELF32BE>() const;
+-template uint64_t SymbolBody::template getGotOffset<ELF64LE>() const;
+-template uint64_t SymbolBody::template getGotOffset<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getGotPltVA<ELF32LE>() const;
+-template uint32_t SymbolBody::template getGotPltVA<ELF32BE>() const;
+-template uint64_t SymbolBody::template getGotPltVA<ELF64LE>() const;
+-template uint64_t SymbolBody::template getGotPltVA<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getThunkVA<ELF32LE>() const;
+-template uint32_t SymbolBody::template getThunkVA<ELF32BE>() const;
+-template uint64_t SymbolBody::template getThunkVA<ELF64LE>() const;
+-template uint64_t SymbolBody::template getThunkVA<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getGotPltOffset<ELF32LE>() const;
+-template uint32_t SymbolBody::template getGotPltOffset<ELF32BE>() const;
+-template uint64_t SymbolBody::template getGotPltOffset<ELF64LE>() const;
+-template uint64_t SymbolBody::template getGotPltOffset<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getPltVA<ELF32LE>() const;
+-template uint32_t SymbolBody::template getPltVA<ELF32BE>() const;
+-template uint64_t SymbolBody::template getPltVA<ELF64LE>() const;
+-template uint64_t SymbolBody::template getPltVA<ELF64BE>() const;
+-
+-template uint32_t SymbolBody::template getSize<ELF32LE>() const;
+-template uint32_t SymbolBody::template getSize<ELF32BE>() const;
+-template uint64_t SymbolBody::template getSize<ELF64LE>() const;
+-template uint64_t SymbolBody::template getSize<ELF64BE>() const;
++template uint32_t SymbolBody::getVA<ELF32LE>(uint32_t) const;
++template uint32_t SymbolBody::getVA<ELF32BE>(uint32_t) const;
++template uint64_t SymbolBody::getVA<ELF64LE>(uint64_t) const;
++template uint64_t SymbolBody::getVA<ELF64BE>(uint64_t) const;
++
++template uint32_t SymbolBody::getGotVA<ELF32LE>() const;
++template uint32_t SymbolBody::getGotVA<ELF32BE>() const;
++template uint64_t SymbolBody::getGotVA<ELF64LE>() const;
++template uint64_t SymbolBody::getGotVA<ELF64BE>() const;
++
++template uint32_t SymbolBody::getGotOffset<ELF32LE>() const;
++template uint32_t SymbolBody::getGotOffset<ELF32BE>() const;
++template uint64_t SymbolBody::getGotOffset<ELF64LE>() const;
++template uint64_t SymbolBody::getGotOffset<ELF64BE>() const;
++
++template uint32_t SymbolBody::getGotPltVA<ELF32LE>() const;
++template uint32_t SymbolBody::getGotPltVA<ELF32BE>() const;
++template uint64_t SymbolBody::getGotPltVA<ELF64LE>() const;
++template uint64_t SymbolBody::getGotPltVA<ELF64BE>() const;
++
++template uint32_t SymbolBody::getThunkVA<ELF32LE>() const;
++template uint32_t SymbolBody::getThunkVA<ELF32BE>() const;
++template uint64_t SymbolBody::getThunkVA<ELF64LE>() const;
++template uint64_t SymbolBody::getThunkVA<ELF64BE>() const;
++
++template uint32_t SymbolBody::getGotPltOffset<ELF32LE>() const;
++template uint32_t SymbolBody::getGotPltOffset<ELF32BE>() const;
++template uint64_t SymbolBody::getGotPltOffset<ELF64LE>() const;
++template uint64_t SymbolBody::getGotPltOffset<ELF64BE>() const;
++
++template uint32_t SymbolBody::getPltVA<ELF32LE>() const;
++template uint32_t SymbolBody::getPltVA<ELF32BE>() const;
++template uint64_t SymbolBody::getPltVA<ELF64LE>() const;
++template uint64_t SymbolBody::getPltVA<ELF64BE>() const;
++
++template uint32_t SymbolBody::getSize<ELF32LE>() const;
++template uint32_t SymbolBody::getSize<ELF32BE>() const;
++template uint64_t SymbolBody::getSize<ELF64LE>() const;
++template uint64_t SymbolBody::getSize<ELF64BE>() const;
+ 
+ template class elf::Undefined<ELF32LE>;
+ template class elf::Undefined<ELF32BE>;
diff --git a/packages/llvm/llvm5-lld-ELF-Symbols.patch b/packages/llvm/llvm5-lld-ELF-Symbols.patch
new file mode 100644
index 0000000000000000000000000000000000000000..727647d3b8f1c18140649caf52ec3c0506e62ed8
--- /dev/null
+++ b/packages/llvm/llvm5-lld-ELF-Symbols.patch
@@ -0,0 +1,33 @@
+# Fix lld templates: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230463
+--- a/lld/ELF/Symbols.cpp
++++ b/lld/ELF/Symbols.cpp
+@@ -383,17 +383,17 @@
+   return B.getName();
+ }
+ 
+-template uint32_t SymbolBody::template getSize<ELF32LE>() const;
+-template uint32_t SymbolBody::template getSize<ELF32BE>() const;
+-template uint64_t SymbolBody::template getSize<ELF64LE>() const;
+-template uint64_t SymbolBody::template getSize<ELF64BE>() const;
++template uint32_t SymbolBody::getSize<ELF32LE>() const;
++template uint32_t SymbolBody::getSize<ELF32BE>() const;
++template uint64_t SymbolBody::getSize<ELF64LE>() const;
++template uint64_t SymbolBody::getSize<ELF64BE>() const;
+ 
+-template bool DefinedRegular::template isMipsPIC<ELF32LE>() const;
+-template bool DefinedRegular::template isMipsPIC<ELF32BE>() const;
+-template bool DefinedRegular::template isMipsPIC<ELF64LE>() const;
+-template bool DefinedRegular::template isMipsPIC<ELF64BE>() const;
++template bool DefinedRegular::isMipsPIC<ELF32LE>() const;
++template bool DefinedRegular::isMipsPIC<ELF32BE>() const;
++template bool DefinedRegular::isMipsPIC<ELF64LE>() const;
++template bool DefinedRegular::isMipsPIC<ELF64BE>() const;
+ 
+-template uint32_t SharedSymbol::template getAlignment<ELF32LE>() const;
+-template uint32_t SharedSymbol::template getAlignment<ELF32BE>() const;
+-template uint32_t SharedSymbol::template getAlignment<ELF64LE>() const;
+-template uint32_t SharedSymbol::template getAlignment<ELF64BE>() const;
++template uint32_t SharedSymbol::getAlignment<ELF32LE>() const;
++template uint32_t SharedSymbol::getAlignment<ELF32BE>() const;
++template uint32_t SharedSymbol::getAlignment<ELF64LE>() const;
++template uint32_t SharedSymbol::getAlignment<ELF64BE>() const;
diff --git a/packages/llvm/llvm5-sanitizer-ustat.patch b/packages/llvm/llvm5-sanitizer-ustat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..531a3c5d6ded693076a18894dc11c1d3553f5188
--- /dev/null
+++ b/packages/llvm/llvm5-sanitizer-ustat.patch
@@ -0,0 +1,25 @@
+# <sys/ustat.h> has been removed from glibc 2.28,
+# backport fix from llvm-6.0.1:
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
+@@ -159,1 +159,0 @@
+-#include <sys/ustat.h>
+@@ -252,5 +252,17 @@
+ 
+ #if SANITIZER_LINUX && !SANITIZER_ANDROID
+-  unsigned struct_ustat_sz = sizeof(struct ustat);
++  // Use pre-computed size of struct ustat to avoid <sys/ustat.h> which
++  // has been removed from glibc 2.28.
++#if defined(__aarch64__) || defined(__s390x__) || defined (__mips64) \
++  || defined(__powerpc64__) || defined(__arch64__) || defined(__sparcv9) \
++  || defined(__x86_64__)
++#define SIZEOF_STRUCT_USTAT 32
++#elif defined(__arm__) || defined(__i386__) || defined(__mips__) \
++  || defined(__powerpc__) || defined(__s390__)
++#define SIZEOF_STRUCT_USTAT 20
++#else
++#error Unknown size of struct ustat
++#endif
++  unsigned struct_ustat_sz = SIZEOF_STRUCT_USTAT;
+   unsigned struct_rlimit64_sz = sizeof(struct rlimit64);
+   unsigned struct_statvfs64_sz = sizeof(struct statvfs64);
diff --git a/packages/llvm/missing-includes.patch b/packages/llvm/missing-includes.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e88b8fcfde190c3cfbf6e507e0a700a2137f0460
--- /dev/null
+++ b/packages/llvm/missing-includes.patch
@@ -0,0 +1,23 @@
+# https://github.com/spack/spack/issues/24270 (This hunk is upstream since llvm-10)
+--- a/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
++++ b/llvm/include/llvm/Demangle/MicrosoftDemangleNodes.h
+@@ -4,6 +4,8 @@
+ #include "llvm/Demangle/Compiler.h"
+ #include "llvm/Demangle/StringView.h"
+ #include <array>
++#include <cstdint>
++#include <string>
+ 
+ class OutputStream;
+ 
+# https://github.com/spack/spack/pull/27233
+--- a/llvm/utils/benchmark/src/benchmark_register.h
++++ b/llvm/utils/benchmark/src/benchmark_register.h
+@@ -2,6 +2,7 @@
+ #define BENCHMARK_REGISTER_H
+ 
+ #include <vector>
++#include <limits>
+ 
+ #include "check.h"
+ 
diff --git a/packages/llvm/no_cyclades.patch b/packages/llvm/no_cyclades.patch
new file mode 100644
index 0000000000000000000000000000000000000000..10f9d0796b600dbe6bb947a3582ca72c93b41b82
--- /dev/null
+++ b/packages/llvm/no_cyclades.patch
@@ -0,0 +1,81 @@
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+@@ -370,15 +370,6 @@
+ 
+ #if SANITIZER_GLIBC
+   // _(SIOCDEVPLIP, WRITE, struct_ifreq_sz); // the same as EQL_ENSLAVE
+-  _(CYGETDEFTHRESH, WRITE, sizeof(int));
+-  _(CYGETDEFTIMEOUT, WRITE, sizeof(int));
+-  _(CYGETMON, WRITE, struct_cyclades_monitor_sz);
+-  _(CYGETTHRESH, WRITE, sizeof(int));
+-  _(CYGETTIMEOUT, WRITE, sizeof(int));
+-  _(CYSETDEFTHRESH, NONE, 0);
+-  _(CYSETDEFTIMEOUT, NONE, 0);
+-  _(CYSETTHRESH, NONE, 0);
+-  _(CYSETTIMEOUT, NONE, 0);
+   _(EQL_EMANCIPATE, WRITE, struct_ifreq_sz);
+   _(EQL_ENSLAVE, WRITE, struct_ifreq_sz);
+   _(EQL_GETMASTRCFG, WRITE, struct_ifreq_sz);
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+@@ -983,7 +983,6 @@
+ 
+ #if SANITIZER_LINUX && !SANITIZER_ANDROID
+ extern unsigned struct_ax25_parms_struct_sz;
+-extern unsigned struct_cyclades_monitor_sz;
+ extern unsigned struct_input_keymap_entry_sz;
+ extern unsigned struct_ipx_config_data_sz;
+ extern unsigned struct_kbdiacrs_sz;
+@@ -1328,15 +1327,6 @@
+ #endif  // SANITIZER_LINUX
+ 
+ #if SANITIZER_LINUX && !SANITIZER_ANDROID
+-extern unsigned IOCTL_CYGETDEFTHRESH;
+-extern unsigned IOCTL_CYGETDEFTIMEOUT;
+-extern unsigned IOCTL_CYGETMON;
+-extern unsigned IOCTL_CYGETTHRESH;
+-extern unsigned IOCTL_CYGETTIMEOUT;
+-extern unsigned IOCTL_CYSETDEFTHRESH;
+-extern unsigned IOCTL_CYSETDEFTIMEOUT;
+-extern unsigned IOCTL_CYSETTHRESH;
+-extern unsigned IOCTL_CYSETTIMEOUT;
+ extern unsigned IOCTL_EQL_EMANCIPATE;
+ extern unsigned IOCTL_EQL_ENSLAVE;
+ extern unsigned IOCTL_EQL_GETMASTRCFG;
+diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp
+@@ -143,7 +143,6 @@
+ # include <sys/procfs.h>
+ #endif
+ #include <sys/user.h>
+-#include <linux/cyclades.h>
+ #include <linux/if_eql.h>
+ #include <linux/if_plip.h>
+ #include <linux/lp.h>
+@@ -460,7 +459,6 @@
+ 
+ #if SANITIZER_GLIBC
+   unsigned struct_ax25_parms_struct_sz = sizeof(struct ax25_parms_struct);
+-  unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor);
+ #if EV_VERSION > (0x010000)
+   unsigned struct_input_keymap_entry_sz = sizeof(struct input_keymap_entry);
+ #else
+@@ -824,15 +822,6 @@
+ #endif // SANITIZER_LINUX
+ 
+ #if SANITIZER_LINUX && !SANITIZER_ANDROID
+-  unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH;
+-  unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT;
+-  unsigned IOCTL_CYGETMON = CYGETMON;
+-  unsigned IOCTL_CYGETTHRESH = CYGETTHRESH;
+-  unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT;
+-  unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH;
+-  unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT;
+-  unsigned IOCTL_CYSETTHRESH = CYSETTHRESH;
+-  unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT;
+   unsigned IOCTL_EQL_EMANCIPATE = EQL_EMANCIPATE;
+   unsigned IOCTL_EQL_ENSLAVE = EQL_ENSLAVE;
+   unsigned IOCTL_EQL_GETMASTRCFG = EQL_GETMASTRCFG;
diff --git a/packages/llvm/no_cyclades9.patch b/packages/llvm/no_cyclades9.patch
new file mode 100644
index 0000000000000000000000000000000000000000..7532865e6de87f444ac7ed8aa4ddeea16e7974b9
--- /dev/null
+++ b/packages/llvm/no_cyclades9.patch
@@ -0,0 +1,42 @@
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors_ioctl.inc
+@@ -370,9 +370,0 @@
+-  _(CYGETDEFTHRESH, WRITE, sizeof(int));
+-  _(CYGETDEFTIMEOUT, WRITE, sizeof(int));
+-  _(CYGETMON, WRITE, struct_cyclades_monitor_sz);
+-  _(CYGETTHRESH, WRITE, sizeof(int));
+-  _(CYGETTIMEOUT, WRITE, sizeof(int));
+-  _(CYSETDEFTHRESH, NONE, 0);
+-  _(CYSETDEFTIMEOUT, NONE, 0);
+-  _(CYSETTHRESH, NONE, 0);
+-  _(CYSETTIMEOUT, NONE, 0);
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h
+@@ -986,1 +986,0 @@
+-  extern unsigned struct_cyclades_monitor_sz;
+@@ -1331,9 +1327,0 @@
+-  extern unsigned IOCTL_CYGETDEFTHRESH;
+-  extern unsigned IOCTL_CYGETDEFTIMEOUT;
+-  extern unsigned IOCTL_CYGETMON;
+-  extern unsigned IOCTL_CYGETTHRESH;
+-  extern unsigned IOCTL_CYGETTIMEOUT;
+-  extern unsigned IOCTL_CYSETDEFTHRESH;
+-  extern unsigned IOCTL_CYSETDEFTIMEOUT;
+-  extern unsigned IOCTL_CYSETTHRESH;
+-  extern unsigned IOCTL_CYSETTIMEOUT;
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
+@@ -143,1 +143,0 @@
+-#include <linux/cyclades.h>
+@@ -460,1 +459,0 @@
+-  unsigned struct_cyclades_monitor_sz = sizeof(struct cyclades_monitor);
+@@ -824,9 +822,0 @@
+-  unsigned IOCTL_CYGETDEFTHRESH = CYGETDEFTHRESH;
+-  unsigned IOCTL_CYGETDEFTIMEOUT = CYGETDEFTIMEOUT;
+-  unsigned IOCTL_CYGETMON = CYGETMON;
+-  unsigned IOCTL_CYGETTHRESH = CYGETTHRESH;
+-  unsigned IOCTL_CYGETTIMEOUT = CYGETTIMEOUT;
+-  unsigned IOCTL_CYSETDEFTHRESH = CYSETDEFTHRESH;
+-  unsigned IOCTL_CYSETDEFTIMEOUT = CYSETDEFTIMEOUT;
+-  unsigned IOCTL_CYSETTHRESH = CYSETTHRESH;
+-  unsigned IOCTL_CYSETTIMEOUT = CYSETTIMEOUT;
diff --git a/packages/llvm/package.py b/packages/llvm/package.py
index f9f1d6ba2e227605ef5c55f073d9bc8e1e54395f..4d0226b73eadec1074649cc1c671aa32f2cace15 100644
--- a/packages/llvm/package.py
+++ b/packages/llvm/package.py
@@ -1,13 +1,15 @@
-# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
+import os
 import os.path
 import re
 import sys
 
 import llnl.util.tty as tty
 
+import spack.build_environment
 import spack.util.executable
 
 
@@ -19,16 +21,21 @@ class Llvm(CMakePackage, CudaPackage):
        is not an acronym; it is the full name of the project.
     """
 
-    homepage = "http://llvm.org/"
+    homepage = "https://llvm.org/"
     url = "https://github.com/llvm/llvm-project/archive/llvmorg-7.1.0.tar.gz"
-    list_url = "http://releases.llvm.org/download.html"
+    list_url = "https://releases.llvm.org/download.html"
     git = "https://github.com/llvm/llvm-project"
-    maintainers = ['trws', 'naromero77']
+    maintainers = ['trws', 'haampie']
+
+    tags = ['e4s']
+
+    generator = 'Ninja'
 
     family = "compiler"  # Used by lmod
 
     # fmt: off
     version('main', branch='main')
+    version('13.0.0', sha256='a1131358f1f9f819df73fa6bff505f2c49d176e9eef0a3aedd1fdbce3b4630e8')
     version('12.0.1', sha256='66b64aa301244975a4aea489f402f205cde2f53dd722dad9e7b77a0459b4c8df')
     version('12.0.0', sha256='8e6c99e482bb16a450165176c2d881804976a2d770e0445af4375e78a1fbf19c')
     version('11.1.0', sha256='53a0719f3f4b0388013cfffd7b10c7d5682eece1929a9553c722348d1f866e79')
@@ -126,10 +133,19 @@ class Llvm(CMakePackage, CudaPackage):
         "components in a single shared library",
     )
     variant(
-        "all_targets",
+        "link_llvm_dylib",
         default=False,
-        description="Build all supported targets, default targets "
-        "<current arch>,NVPTX,AMDGPU,CppBackend",
+        description="Link LLVM tools against the LLVM shared library",
+    )
+    variant(
+        "targets",
+        default="none",
+        description=("What targets to build. Spack's target family is always added "
+                     "(e.g. X86 is automatically enabled when targeting znver2)."),
+        values=("all", "none", "aarch64", "amdgpu", "arm", "avr", "bpf", "cppbackend",
+                "hexagon", "lanai", "mips", "msp430", "nvptx", "powerpc", "riscv",
+                "sparc", "systemz", "webassembly", "x86", "xcore"),
+        multi=True
     )
     variant(
         "build_type",
@@ -142,10 +158,30 @@ class Llvm(CMakePackage, CudaPackage):
         default=False,
         description="Build with OpenMP capable thread sanitizer",
     )
+    variant(
+        "omp_as_runtime",
+        default=True,
+        description="Build OpenMP runtime via ENABLE_RUNTIME by just-built Clang",
+    )
     variant('code_signing', default=False,
             description="Enable code-signing on macOS")
     variant("python", default=False, description="Install python bindings")
 
+    variant('version_suffix', default='none', description="Add a symbol suffix")
+    variant('z3', default=False, description='Use Z3 for the clang static analyzer')
+
+    provides('libllvm@13', when='@13.0.0:13')
+    provides('libllvm@12', when='@12.0.0:12')
+    provides('libllvm@11', when='@11.0.0:11')
+    provides('libllvm@10', when='@10.0.0:10')
+    provides('libllvm@9', when='@9.0.0:9')
+    provides('libllvm@8', when='@8.0.0:8')
+    provides('libllvm@7', when='@7.0.0:7')
+    provides('libllvm@6', when='@6.0.0:6')
+    provides('libllvm@5', when='@5.0.0:5')
+    provides('libllvm@4', when='@4.0.0:4')
+    provides('libllvm@3', when='@3.0.0:3')
+
     extends("python", when="+python")
 
     variant('visionary', default=False,
@@ -194,14 +230,16 @@ class Llvm(CMakePackage, CudaPackage):
 
     # Build dependency
     depends_on("cmake@3.4.3:", type="build")
-    depends_on("python@2.7:2.8", when="@:4.999 ~python", type="build")
+    depends_on('cmake@3.13.4:', type='build', when='@12:')
+    depends_on("ninja", type="build")
+    depends_on("python@2.7:2.8", when="@:4 ~python", type="build")
     depends_on("python", when="@5: ~python", type="build")
     depends_on("pkgconfig", type="build")
 
     # Universal dependency
-    depends_on("python@2.7:2.8", when="@:4.999+python")
+    depends_on("python@2.7:2.8", when="@:4+python")
     depends_on("python", when="@5:+python")
-    depends_on("z3", when="@9:")
+    depends_on('z3', when='@8:+clang+z3')
 
     # openmp dependencies
     depends_on("perl-data-dumper", type=("build"))
@@ -221,25 +259,54 @@ class Llvm(CMakePackage, CudaPackage):
     depends_on("binutils+gold+ld+plugins", when="+gold")
 
     # polly plugin
-    depends_on("gmp", when="@:3.6.999 +polly")
-    depends_on("isl", when="@:3.6.999 +polly")
+    depends_on("gmp", when="@:3.6 +polly")
+    depends_on("isl", when="@:3.6 +polly")
 
     conflicts("+llvm_dylib", when="+shared_libs")
+    conflicts("+link_llvm_dylib", when="~llvm_dylib")
     conflicts("+lldb", when="~clang")
     conflicts("+libcxx", when="~clang")
     conflicts("+internal_unwind", when="~clang")
     conflicts("+compiler-rt", when="~clang")
     conflicts("+flang", when="~clang")
     # Introduced in version 11 as a part of LLVM and not a separate package.
-    conflicts("+flang", when="@:10.999")
+    conflicts("+flang", when="@:10")
+
+    conflicts('~mlir', when='+flang', msg='Flang requires MLIR')
 
-    # Older LLVM do not build with newer GCC
-    conflicts("%gcc@11:", when="@:7")
+    # Older LLVM do not build with newer compilers, and vice versa
     conflicts("%gcc@8:", when="@:5")
-    conflicts("%gcc@:5.0.999", when="@8:")
+    conflicts("%gcc@:5.0", when="@8:")
+    # clang/lib: a lambda parameter cannot shadow an explicitly captured entity
+    conflicts("%clang@8:", when="@:4")
+
+    # When these versions are concretized, but not explicitly with +libcxx, these
+    # conflicts will enable clingo to set ~libcxx, making the build successful:
+
+    # libc++ of LLVM13, see https://libcxx.llvm.org/#platform-and-compiler-support
+    # @13 does not support %gcc@:10 https://bugs.llvm.org/show_bug.cgi?id=51359#c1
+    # GCC    11     - latest stable release per GCC release page
+    # Clang: 11, 12 - latest two stable releases per LLVM release page
+    # AppleClang 12 - latest stable release per Xcode release page
+    conflicts("%gcc@:10",         when="@13:+libcxx")
+    conflicts("%clang@:10",       when="@13:+libcxx")
+    conflicts("%apple-clang@:11", when="@13:+libcxx")
+
+    # libcxx-4 and compiler-rt-4 fail to build with "newer" clang and gcc versions:
+    conflicts('%gcc@7:',         when='@:4+libcxx')
+    conflicts('%clang@6:',       when='@:4+libcxx')
+    conflicts('%apple-clang@6:', when='@:4+libcxx')
+    conflicts('%gcc@7:',         when='@:4+compiler-rt')
+    conflicts('%clang@6:',       when='@:4+compiler-rt')
+    conflicts('%apple-clang@6:', when='@:4+compiler-rt')
 
     # OMP TSAN exists in > 5.x
-    conflicts("+omp_tsan", when="@:5.99")
+    conflicts("+omp_tsan", when="@:5")
+
+
+    # OpenMP via ENABLE_RUNTIME restrictions
+    conflicts("+omp_as_runtime", when="~clang", msg="omp_as_runtime requires clang being built.")
+    conflicts("+omp_as_runtime", when="@:11.1", msg="omp_as_runtime works since LLVM 12.")
 
     # cuda_arch value must be specified
     conflicts("cuda_arch=none", when="+cuda", msg="A value for cuda_arch must be specified.")
@@ -265,13 +332,30 @@ class Llvm(CMakePackage, CudaPackage):
     # Fixed in upstream versions of both
     conflicts('^cmake@3.19.0', when='@6.0.0:11.0.0')
 
+    # Starting in 3.9.0 CppBackend is no longer a target (see
+    # LLVM_ALL_TARGETS in llvm's top-level CMakeLists.txt for
+    # the complete list of targets)
+    conflicts("targets=cppbackend", when='@3.9.0:')
+
     # Github issue #4986
     patch("llvm_gcc7.patch", when="@4.0.0:4.0.1+lldb %gcc@7.0:")
 
-    # https://github.com/spack/spack/issues/24270
-    patch('https://src.fedoraproject.org/rpms/llvm10/raw/7ce7ebd066955ea95ba2b491c41fbc6e4ee0643a/f/llvm10-gcc11.patch',
-          sha256='958c64838c9d469be514eef195eca0f8c3ab069bc4b64a48fad59991c626bab8',
-          when='@8:10 %gcc@11:')
+    # sys/ustat.h has been removed in favour of statfs from glibc-2.28. Use fixed sizes:
+    patch('llvm5-sanitizer-ustat.patch', when="@4:6+compiler-rt")
+
+    # Fix lld templates: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=230463
+    patch('llvm4-lld-ELF-Symbols.patch', when="@4+lld%clang@6:")
+    patch('llvm5-lld-ELF-Symbols.patch', when="@5+lld%clang@7:")
+
+    # Fix missing std:size_t in 'llvm@4:5' when built with '%clang@7:'
+    patch('xray_buffer_queue-cstddef.patch', when="@4:5+compiler-rt%clang@7:")
+
+    # https://github.com/llvm/llvm-project/commit/947f9692440836dcb8d88b74b69dd379d85974ce
+    patch('sanitizer-ipc_perm_mode.patch', when="@5:7+compiler-rt%clang@11:")
+    patch('sanitizer-ipc_perm_mode.patch', when="@5:9+compiler-rt%gcc@9:")
+
+    # github.com/spack/spack/issues/24270: MicrosoftDemangle for %gcc@10: and %clang@13:
+    patch('missing-includes.patch', when='@8')
 
     # Backport from llvm master + additional fix
     # see  https://bugs.llvm.org/show_bug.cgi?id=39696
@@ -298,6 +382,17 @@ class Llvm(CMakePackage, CudaPackage):
     # Workaround for issue https://github.com/spack/spack/issues/18197
     patch('llvm7_intel.patch', when='@7 %intel@18.0.2,19.0.4')
 
+    # Remove cyclades support to build against newer kernel headers
+    # https://reviews.llvm.org/D102059
+    patch('no_cyclades.patch', when='@10:12.0.0')
+    patch('no_cyclades9.patch', when='@6:9')
+
+    patch('llvm-gcc11.patch', when='@9:11%gcc@11:')
+
+    # Add LLVM_VERSION_SUFFIX
+    # https://reviews.llvm.org/D115818
+    patch('llvm-version-suffix-macro.patch', when='@:13.0.0')
+
     # The functions and attributes below implement external package
     # detection for LLVM. See:
     #
@@ -461,6 +556,17 @@ class Llvm(CMakePackage, CudaPackage):
             return(None, flags, None)
         return(flags, None, None)
 
+    def setup_build_environment(self, env):
+        """When using %clang, add only its ld.lld-$ver and/or ld.lld to our PATH"""
+        if self.compiler.name in ['clang', 'apple-clang']:
+            for lld in 'ld.lld-{0}'.format(self.compiler.version.version[0]), 'ld.lld':
+                bin = os.path.join(os.path.dirname(self.compiler.cc), lld)
+                sym = os.path.join(self.stage.path, 'ld.lld')
+                if os.path.exists(bin) and not os.path.exists(sym):
+                    mkdirp(self.stage.path)
+                    os.symlink(bin, sym)
+            env.prepend_path('PATH', self.stage.path)
+
     def setup_run_environment(self, env):
         if "+clang" in self.spec:
             env.set("CC", join_path(self.spec.prefix.bin, "clang"))
@@ -473,71 +579,87 @@ class Llvm(CMakePackage, CudaPackage):
 
     def cmake_args(self):
         spec = self.spec
+        define = CMakePackage.define
+        from_variant = self.define_from_variant
+
         python = spec['python']
         cmake_args = [
-            "-DLLVM_REQUIRES_RTTI:BOOL=ON",
-            "-DLLVM_ENABLE_RTTI:BOOL=ON",
-            "-DLLVM_ENABLE_EH:BOOL=ON",
-            "-DCLANG_DEFAULT_OPENMP_RUNTIME:STRING=libomp",
-            "-DPYTHON_EXECUTABLE:PATH={0}".format(python.command.path),
-            "-DLIBOMP_USE_HWLOC:BOOL=ON",
-            "-DLIBOMP_HWLOC_INSTALL_DIR={0}".format(spec["hwloc"].prefix),
+            define("LLVM_REQUIRES_RTTI", True),
+            define("LLVM_ENABLE_RTTI", True),
+            define("LLVM_ENABLE_EH", True),
+            define("CLANG_DEFAULT_OPENMP_RUNTIME", "libomp"),
+            define("PYTHON_EXECUTABLE", python.command.path),
+            define("LIBOMP_USE_HWLOC", True),
+            define("LIBOMP_HWLOC_INSTALL_DIR", spec["hwloc"].prefix),
         ]
 
-        if python.version >= Version("3.0.0"):
-            cmake_args.append("-DPython3_EXECUTABLE={0}".format(
-                              python.command.path))
+        version_suffix = spec.variants['version_suffix'].value
+        if version_suffix != 'none':
+            cmake_args.append(define('LLVM_VERSION_SUFFIX', version_suffix))
+
+        if python.version >= Version("3"):
+            cmake_args.append(define("Python3_EXECUTABLE", python.command.path))
         else:
-            cmake_args.append("-DPython2_EXECUTABLE={0}".format(
-                              python.command.path))
+            cmake_args.append(define("Python2_EXECUTABLE", python.command.path))
 
         projects = []
+        runtimes = []
 
         if "+cuda" in spec:
-            cmake_args.extend(
-                [
-                    "-DCUDA_TOOLKIT_ROOT_DIR:PATH=" + spec["cuda"].prefix,
-                    "-DLIBOMPTARGET_NVPTX_COMPUTE_CAPABILITIES={0}".format(
-                        ",".join(spec.variants["cuda_arch"].value)
-                    ),
-                    "-DCLANG_OPENMP_NVPTX_DEFAULT_ARCH=sm_{0}".format(
-                        spec.variants["cuda_arch"].value[-1]
-                    ),
-                ]
-            )
+            cmake_args.extend([
+                define("CUDA_TOOLKIT_ROOT_DIR", spec["cuda"].prefix),
+                define("LIBOMPTARGET_NVPTX_COMPUTE_CAPABILITIES",
+                       ",".join(spec.variants["cuda_arch"].value)),
+                define("CLANG_OPENMP_NVPTX_DEFAULT_ARCH",
+                       "sm_{0}".format(spec.variants["cuda_arch"].value[-1])),
+            ])
+            if "+omp_as_runtime" in spec:
+                cmake_args.extend([
+                    define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True),
+                    # work around bad libelf detection in libomptarget
+                    define("LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR",
+                           spec["libelf"].prefix.include),
+                ])
         else:
             # still build libomptarget but disable cuda
-            cmake_args.extend(
-                [
-                    "-DCUDA_TOOLKIT_ROOT_DIR:PATH=IGNORE",
-                    "-DCUDA_SDK_ROOT_DIR:PATH=IGNORE",
-                    "-DCUDA_NVCC_EXECUTABLE:FILEPATH=IGNORE",
-                    "-DLIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES:STRING=IGNORE",
-                ]
-            )
-
-        if "+omp_debug" in spec:
-            cmake_args.append("-DLIBOMPTARGET_ENABLE_DEBUG:Bool=ON")
+            cmake_args.extend([
+                define("CUDA_TOOLKIT_ROOT_DIR", "IGNORE"),
+                define("CUDA_SDK_ROOT_DIR", "IGNORE"),
+                define("CUDA_NVCC_EXECUTABLE", "IGNORE"),
+                define("LIBOMPTARGET_DEP_CUDA_DRIVER_LIBRARIES", "IGNORE"),
+            ])
 
-        if "+python" in spec and "+lldb" in spec and spec.satisfies("@5.0.0:"):
-            cmake_args.append("-DLLDB_USE_SYSTEM_SIX:Bool=TRUE")
+        cmake_args.append(from_variant("LIBOMPTARGET_ENABLE_DEBUG", "omp_debug"))
 
-        if "+lldb" in spec and spec.satisfies("@:9.9.9"):
-            cmake_args.append("-DLLDB_DISABLE_PYTHON:Bool={0}".format(
-                'ON' if '~python' in spec else 'OFF'))
-        if "+lldb" in spec and spec.satisfies("@10.0.0:"):
-            cmake_args.append("-DLLDB_ENABLE_PYTHON:Bool={0}".format(
-                'ON' if '+python' in spec else 'OFF'))
+        if "+lldb" in spec:
+            if spec.version >= Version('10'):
+                cmake_args.append(from_variant("LLDB_ENABLE_PYTHON", 'python'))
+            else:
+                cmake_args.append(define("LLDB_DISABLE_PYTHON",
+                                         '~python' in spec))
+            if spec.satisfies("@5.0.0: +python"):
+                cmake_args.append(define("LLDB_USE_SYSTEM_SIX", True))
 
         if "+gold" in spec:
             cmake_args.append(
-                "-DLLVM_BINUTILS_INCDIR=" + spec["binutils"].prefix.include
+                define("LLVM_BINUTILS_INCDIR", spec["binutils"].prefix.include)
             )
 
         if "+clang" in spec:
             projects.append("clang")
             projects.append("clang-tools-extra")
-            projects.append("openmp")
+            if "+omp_as_runtime" in spec:
+                runtimes.append("openmp")
+            else:
+                projects.append("openmp")
+
+            if self.spec.satisfies("@8"):
+                cmake_args.append(define('CLANG_ANALYZER_ENABLE_Z3_SOLVER',
+                                         self.spec.satisfies('@8+z3')))
+            if self.spec.satisfies("@9:"):
+                cmake_args.append(define('LLVM_ENABLE_Z3_SOLVER',
+                                         self.spec.satisfies('@9:+z3')))
+
         if "+flang" in spec:
             projects.append("flang")
         if "+lldb" in spec:
@@ -555,52 +677,24 @@ class Llvm(CMakePackage, CudaPackage):
             projects.append("libunwind")
         if "+polly" in spec:
             projects.append("polly")
-            cmake_args.append("-DLINK_POLLY_INTO_TOOLS:Bool=ON")
-
-        if "+shared_libs" in spec:
-            cmake_args.append("-DBUILD_SHARED_LIBS:Bool=ON")
-        if "+llvm_dylib" in spec:
-            cmake_args.append("-DLLVM_BUILD_LLVM_DYLIB:Bool=ON")
-        if "+omp_debug" in spec:
-            cmake_args.append("-DLIBOMPTARGET_ENABLE_DEBUG:Bool=ON")
-
-        if "+split_dwarf" in spec:
-            cmake_args.append("-DLLVM_USE_SPLIT_DWARF:Bool=ON")
-
-        if "+all_targets" not in spec:  # all is default on cmake
-
-            targets = ["NVPTX", "AMDGPU"]
-            if spec.version < Version("3.9.0"):
-                # Starting in 3.9.0 CppBackend is no longer a target (see
-                # LLVM_ALL_TARGETS in llvm's top-level CMakeLists.txt for
-                # the complete list of targets)
-                targets.append("CppBackend")
-
-            if spec.target.family == "x86" or spec.target.family == "x86_64":
-                targets.append("X86")
-            elif spec.target.family == "arm":
-                targets.append("ARM")
-            elif spec.target.family == "aarch64":
-                targets.append("AArch64")
-            elif (
-                spec.target.family == "sparc"
-                or spec.target.family == "sparc64"
-            ):
-                targets.append("Sparc")
-            elif (
-                spec.target.family == "ppc64"
-                or spec.target.family == "ppc64le"
-                or spec.target.family == "ppc"
-                or spec.target.family == "ppcle"
-            ):
-                targets.append("PowerPC")
+            cmake_args.append(define("LINK_POLLY_INTO_TOOLS", True))
 
-            cmake_args.append(
-                "-DLLVM_TARGETS_TO_BUILD:STRING=" + ";".join(targets)
-            )
+        cmake_args.extend([
+            from_variant("BUILD_SHARED_LIBS", "shared_libs"),
+            from_variant("LLVM_BUILD_LLVM_DYLIB", "llvm_dylib"),
+            from_variant("LLVM_LINK_LLVM_DYLIB", "link_llvm_dylib"),
+            from_variant("LLVM_USE_SPLIT_DWARF", "split_dwarf"),
+            # By default on Linux, libc++.so is a ldscript. CMake fails to add
+            # CMAKE_INSTALL_RPATH to it, which fails. Statically link libc++abi.a
+            # into libc++.so, linking with -lc++ or -stdlib=libc++ is enough.
+            define('LIBCXX_ENABLE_STATIC_ABI_LIBRARY', True)
+        ])
+
+        cmake_args.append(define(
+            "LLVM_TARGETS_TO_BUILD",
+            get_llvm_targets_to_build(spec)))
 
-        if "+omp_tsan" in spec:
-            cmake_args.append("-DLIBOMP_TSAN_SUPPORT=ON")
+        cmake_args.append(from_variant("LIBOMP_TSAN_SUPPORT", "omp_tsan"))
 
         if self.compiler.name == "gcc":
             compiler = Executable(self.compiler.cc)
@@ -613,77 +707,70 @@ class Llvm(CMakePackage, CudaPackage):
                     gcc_prefix = line.split(":")[1].strip()
                     gcc_prefix = ancestor(gcc_prefix, 4)
                     break
-            cmake_args.append("-DGCC_INSTALL_PREFIX=" + gcc_prefix)
-
-        if spec.satisfies("@4.0.0:"):
-            if spec.satisfies("platform=cray") or spec.satisfies(
-                "platform=linux"
-            ):
-                cmake_args.append("-DCMAKE_BUILD_WITH_INSTALL_RPATH=1")
+            cmake_args.append(define("GCC_INSTALL_PREFIX", gcc_prefix))
 
         if self.spec.satisfies("~code_signing platform=darwin"):
-            cmake_args.append('-DLLDB_USE_SYSTEM_DEBUGSERVER=ON')
+            cmake_args.append(define('LLDB_USE_SYSTEM_DEBUGSERVER', True))
 
         # Semicolon seperated list of projects to enable
-        cmake_args.append(
-            "-DLLVM_ENABLE_PROJECTS:STRING={0}".format(";".join(projects))
-        )
+        cmake_args.append(define("LLVM_ENABLE_PROJECTS", projects))
 
-        return cmake_args
+        # Semicolon seperated list of runtimes to enable
+        if runtimes:
+            cmake_args.append(define("LLVM_ENABLE_RUNTIMES", runtimes))
 
-    @run_before("build")
-    def pre_install(self):
-        with working_dir(self.build_directory):
-            # When building shared libraries these need to be installed first
-            make("install-LLVMTableGen")
-            if self.spec.version >= Version("4.0.0"):
-                # LLVMDemangle target was added in 4.0.0
-                make("install-LLVMDemangle")
-            make("install-LLVMSupport")
+        return cmake_args
 
     @run_after("install")
     def post_install(self):
         spec = self.spec
+        define = CMakePackage.define
 
-        # unnecessary if we get bootstrap builds in here
-        if "+cuda" in self.spec:
+        # unnecessary if we build openmp via LLVM_ENABLE_RUNTIMES
+        if "+cuda ~omp_as_runtime" in self.spec:
             ompdir = "build-bootstrapped-omp"
+            prefix_paths = spack.build_environment.get_cmake_prefix_path(self)
+            prefix_paths.append(str(spec.prefix))
             # rebuild libomptarget to get bytecode runtime library files
             with working_dir(ompdir, create=True):
                 cmake_args = [
-                    self.stage.source_path + "/openmp",
-                    "-DCMAKE_C_COMPILER:PATH={0}".format(
-                        spec.prefix.bin + "/clang"
-                    ),
-                    "-DCMAKE_CXX_COMPILER:PATH={0}".format(
-                        spec.prefix.bin + "/clang++"
-                    ),
-                    "-DCMAKE_INSTALL_PREFIX:PATH={0}".format(spec.prefix),
+                    '-G', 'Ninja',
+                    define('CMAKE_BUILD_TYPE', spec.variants['build_type'].value),
+                    define("CMAKE_C_COMPILER", spec.prefix.bin + "/clang"),
+                    define("CMAKE_CXX_COMPILER", spec.prefix.bin + "/clang++"),
+                    define("CMAKE_INSTALL_PREFIX", spec.prefix),
+                    define('CMAKE_PREFIX_PATH', prefix_paths)
                 ]
                 cmake_args.extend(self.cmake_args())
-                cmake_args.append(
-                    "-DLIBOMPTARGET_NVPTX_ENABLE_BCLIB:BOOL=TRUE"
-                )
-
-                # work around bad libelf detection in libomptarget
-                cmake_args.append(
-                    "-DLIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR:String={0}".format(
-                        spec["libelf"].prefix.include
-                    )
-                )
+                cmake_args.extend([
+                    define("LIBOMPTARGET_NVPTX_ENABLE_BCLIB", True),
+                    define("LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR",
+                           spec["libelf"].prefix.include),
+                    self.stage.source_path + "/openmp",
+                ])
 
                 cmake(*cmake_args)
-                make()
-                make("install")
+                ninja()
+                ninja("install")
         if "+python" in self.spec:
-            install_tree("llvm/bindings/python", site_packages_dir)
+            install_tree("llvm/bindings/python", python_platlib)
 
             if "+clang" in self.spec:
-                install_tree("clang/bindings/python", site_packages_dir)
+                install_tree("clang/bindings/python", python_platlib)
 
         with working_dir(self.build_directory):
             install_tree("bin", join_path(self.prefix, "libexec", "llvm"))
 
+    def llvm_config(self, *args, **kwargs):
+        lc = Executable(self.prefix.bin.join('llvm-config'))
+        if not kwargs.get('output'):
+            kwargs['output'] = str
+        ret = lc(*args, **kwargs)
+        if kwargs.get('output') == "list":
+            return ret.split()
+        return ret
+
+    # ECM: might be not needed anymore?
     def add_files_to_view(self, view, merge_map):
         # we remove libgomp-related files from views as they conflict with
         # gcc-ones
@@ -697,3 +784,50 @@ class Llvm(CMakePackage, CudaPackage):
                     del merge_map[path]
 
         super(Llvm, self).add_files_to_view(view, merge_map)
+
+def get_llvm_targets_to_build(spec):
+    targets = spec.variants['targets'].value
+
+    # Build everything?
+    if 'all' in targets:
+        return 'all'
+
+    # Convert targets variant values to CMake LLVM_TARGETS_TO_BUILD array.
+    spack_to_cmake = {
+        "aarch64": "AArch64",
+        "amdgpu": "AMDGPU",
+        "arm": "ARM",
+        "avr": "AVR",
+        "bpf": "BPF",
+        "cppbackend": "CppBackend",
+        "hexagon": "Hexagon",
+        "lanai": "Lanai",
+        "mips": "Mips",
+        "msp430": "MSP430",
+        "nvptx": "NVPTX",
+        "powerpc": "PowerPC",
+        "riscv": "RISCV",
+        "sparc": "Sparc",
+        "systemz": "SystemZ",
+        "webassembly": "WebAssembly",
+        "x86": "X86",
+        "xcore": "XCore"
+    }
+
+    if 'none' in targets:
+        llvm_targets = set()
+    else:
+        llvm_targets = set(spack_to_cmake[target] for target in targets)
+
+    if spec.target.family in ("x86", "x86_64"):
+        llvm_targets.add("X86")
+    elif spec.target.family == "arm":
+        llvm_targets.add("ARM")
+    elif spec.target.family == "aarch64":
+        llvm_targets.add("AArch64")
+    elif spec.target.family in ("sparc", "sparc64"):
+        llvm_targets.add("Sparc")
+    elif spec.target.family in ("ppc64", "ppc64le", "ppc", "ppcle"):
+        llvm_targets.add("PowerPC")
+
+    return list(llvm_targets)
diff --git a/packages/llvm/sanitizer-ipc_perm_mode.patch b/packages/llvm/sanitizer-ipc_perm_mode.patch
new file mode 100644
index 0000000000000000000000000000000000000000..8f91703a323e87a1c42b294d2c574db53d54ef2a
--- /dev/null
+++ b/packages/llvm/sanitizer-ipc_perm_mode.patch
@@ -0,0 +1,9 @@
+# ipc_perm.mode is not used and has changed from short to int over architecures
+# and versions. The last change was in glibc-2.31.
+# LLVM upstream decided to not check ipc_perm.mode below glibc-2.31,
+# because it is not actually used in the sanitizer:
+# github.com/llvm/llvm-project/commit/947f9692440836dcb8d88b74b69dd379d85974ce
+--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
++++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cc
+@@ -1143,1 +1143,0 @@
+-CHECK_SIZE_AND_OFFSET(ipc_perm, mode);
diff --git a/packages/llvm/xray_buffer_queue-cstddef.patch b/packages/llvm/xray_buffer_queue-cstddef.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b5ca841e3e10f954ce5785e40c7ad447721c1190
--- /dev/null
+++ b/packages/llvm/xray_buffer_queue-cstddef.patch
@@ -0,0 +1,5 @@
+# Fix missing std:size_t in 'llvm@4:5' for build with '%clang@7:'
+--- a/compiler-rt/lib/xray/xray_buffer_queue.h
++++ b/compiler-rt/lib/xray/xray_buffer_queue.h
+@@ -18,0 +18,1 @@
++#include <cstddef>
diff --git a/packages/meta-brainscales/package.py b/packages/meta-brainscales/package.py
deleted file mode 100644
index bed34fc8b4d71cac88e53e235a5c743cb1aa03df..0000000000000000000000000000000000000000
--- a/packages/meta-brainscales/package.py
+++ /dev/null
@@ -1,68 +0,0 @@
-# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other
-# Spack Project Developers. See the top-level COPYRIGHT file for details.
-#
-# SPDX-License-Identifier: (Apache-2.0 OR MIT)
-
-from spack import *
-
-
-class MetaBrainscales(Package):
-    """Core package that contains dependencies of the core DLS software
-    ONLY!"""
-
-    homepage = ''
-    # some random tarball, to make `spack fetch --dependencies visionary-defaults` work
-    url = 'https://github.com/electronicvisions/spack/archive/v0.8.tar.gz'
-
-    # This is only a dummy tarball (see difference between version numbers)
-    # TODO: as soon as a MetaPackage-concept has been merged, please update this package
-    version('1.0', '372ce038842f20bf0ae02de50c26e85d', url='https://github.com/electronicvisions/spack/archive/v0.8.tar.gz')
-
-    # PPU compiler dependencies
-    depends_on('gettext')
-    depends_on('zlib')
-    depends_on('bison')
-    depends_on('flex')
-    depends_on('m4')
-    depends_on('texinfo')
-    depends_on('wget')
-    conflicts('flex', when='@2.6.3', msg='Binutils 2.25 for Nux doesn\'t build with flex 2.6.3.')
-
-    # host software dependencies
-    depends_on('bitsery')
-    depends_on('binutils+gold+ld+plugins') # specialize
-    depends_on('boost@1.69.0: +graph+icu+mpi+python+numpy+coroutine+context cxxstd=17') # specialize boost (non-clingo)
-    depends_on('cereal')
-    depends_on('cppcheck')
-    depends_on('doxygen+graphviz')
-    depends_on('genpybind@ebrains')
-    depends_on('gflags')
-    depends_on('googletest@1.11.0: +gmock') # variadic templates needed
-    depends_on('intel-tbb')  # ppu gdbserver
-    depends_on('libelf')
-    depends_on('liblockfile')
-    depends_on('llvm')
-    depends_on('log4cxx')
-    depends_on('pkg-config')
-    depends_on('python@3.7.0:') # BrainScaleS(-2) only supports Python >= 3.7
-    depends_on('py-h5py') # PyNN tests need it
-    depends_on('py-matplotlib')
-    depends_on('py-nose')
-    depends_on('py-numpy')
-    depends_on('py-pybind11')
-    depends_on('py-pybind11-stubgen')
-    depends_on('py-pycodestyle')
-    depends_on('py-pyelftools')
-    depends_on('py-pylint')
-    depends_on('py-pynn@0.9.4:')
-    depends_on('py-pyyaml')
-    depends_on('py-scipy')
-    depends_on('py-sqlalchemy')
-    depends_on('util-linux')
-    depends_on('yaml-cpp+shared')
-
-
-    # dummy installer; it's a "meta" package
-    def install(self, spec, prefix):
-        mkdirp(prefix.etc)
-        install(__file__, join_path(prefix.etc, spec.name + '.py'))
diff --git a/packages/py-pybind11/package.py b/packages/py-pybind11/package.py
deleted file mode 100644
index a353ce632ee5a6285bf02e822714e071becf18b2..0000000000000000000000000000000000000000
--- a/packages/py-pybind11/package.py
+++ /dev/null
@@ -1,91 +0,0 @@
-# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
-# Spack Project Developers. See the top-level COPYRIGHT file for details.
-#
-# SPDX-License-Identifier: (Apache-2.0 OR MIT)
-
-import os
-
-from spack import *
-
-
-class PyPybind11(CMakePackage):
-    """pybind11 -- Seamless operability between C++11 and Python.
-
-    pybind11 is a lightweight header-only library that exposes C++ types in
-    Python and vice versa, mainly to create Python bindings of existing C++
-    code. Its goals and syntax are similar to the excellent Boost.Python
-    library by David Abrahams: to minimize boilerplate code in traditional
-    extension modules by inferring type information using compile-time
-    introspection."""
-
-    homepage = "https://pybind11.readthedocs.io"
-    url      = "https://github.com/pybind/pybind11/archive/v2.6.2.tar.gz"
-    git      = "https://github.com/pybind/pybind11.git"
-
-    maintainers = ['ax3l']
-
-    version('master', branch='master')
-    version('2.7.0', sha256='6cd73b3d0bf3daf415b5f9b87ca8817cc2e2b64c275d65f9500250f9fee1677e')
-    version('2.6.2', sha256='8ff2fff22df038f5cd02cea8af56622bc67f5b64534f1b83b9f133b8366acff2')
-    version('2.6.1', sha256='cdbe326d357f18b83d10322ba202d69f11b2f49e2d87ade0dc2be0c5c34f8e2a')
-    version('2.5.0', sha256='97504db65640570f32d3fdf701c25a340c8643037c3b69aec469c10c93dc8504')
-    version('2.4.3', sha256='1eed57bc6863190e35637290f97a20c81cfe4d9090ac0a24f3bbf08f265eb71d')
-    version('2.3.0', sha256='0f34838f2c8024a6765168227ba587b3687729ebf03dc912f88ff75c7aa9cfe8')
-    version('2.2.4', sha256='b69e83658513215b8d1443544d0549b7d231b9f201f6fc787a2b2218b408181e')
-    version('2.2.3', sha256='3a3b7b651afab1c5ba557f4c37d785a522b8030dfc765da26adc2ecd1de940ea')
-    version('2.2.2', sha256='b639a2b2cbf1c467849660801c4665ffc1a4d0a9e153ae1996ed6f21c492064e')
-    version('2.2.1', sha256='f8bd1509578b2a1e7407d52e6ee8afe64268909a1bbda620ca407318598927e7')
-    version('2.2.0', sha256='1b0fda17c650c493f5862902e90f426df6751da8c0b58c05983ab009951ed769')
-    version('2.1.1', sha256='f2c6874f1ea5b4ad4ffffe352413f7d2cd1a49f9050940805c2a082348621540')
-    version('2.1.0', sha256='2860f2b8d0c9f65f0698289a161385f59d099b7ead1bf64e8993c486f2b93ee0')
-
-    depends_on('py-setuptools', type='build')
-    depends_on('py-pytest', type='test')
-
-    extends('python')
-
-    # compiler support
-    conflicts('%gcc@:4.7')
-    conflicts('%clang@:3.2')
-    conflicts('%intel@:16')
-
-    def cmake_args(self):
-        args = []
-        args.append('-DPYTHON_EXECUTABLE:FILEPATH=%s'
-                    % self.spec['python'].command.path)
-        args += [
-            self.define('PYBIND11_TEST', self.run_tests)
-        ]
-        return args
-
-    def setup_build_environment(self, env):
-        env.set('PYBIND11_USE_CMAKE', 1)
-
-    # https://github.com/pybind/pybind11/pull/1995
-    @when('@:2.4.99')
-    def patch(self):
-        """ see https://github.com/spack/spack/issues/13559 """
-        filter_file('import sys',
-                    'import sys; return "{0}"'.format(self.prefix.include),
-                    'pybind11/__init__.py',
-                    string=True)
-
-    def install(self, spec, prefix):
-        super(PyPybind11, self).install(spec, prefix)
-        setup_py('install', '--single-version-externally-managed', '--root=/',
-                 '--prefix={0}'.format(prefix))
-
-    @run_after('install')
-    @on_package_attributes(run_tests=True)
-    def install_test(self):
-        with working_dir('spack-test', create=True):
-            # test include helper points to right location
-            python = self.spec['python'].command
-            py_inc = python(
-                '-c',
-                'import pybind11 as py; ' +
-                self.spec['python'].package.print_string('py.get_include()'),
-                output=str).strip()
-            for inc in [py_inc, self.prefix.include]:
-                inc_file = join_path(inc, 'pybind11', 'pybind11.h')
-                assert os.path.isfile(inc_file)
diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index bd42fdc988a72060c571e85c78f4aefd920a7752..68dbdeff7dcf1f2d5ed17cc6a4c8e091c8bdbb71 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -1,4 +1,4 @@
-# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
 # Spack Project Developers. See the top-level COPYRIGHT file for details.
 #
 # SPDX-License-Identifier: (Apache-2.0 OR MIT)
@@ -13,7 +13,49 @@ class PynnBrainscales(WafPackage):
     git      = "https://github.com/electronicvisions/pynn-brainscales.git"
 
     version('2.0-rc1', branch='waf')
-    depends_on('meta-brainscales', type=('build', 'link', 'run'))
+
+    # PPU compiler dependencies
+    depends_on('gettext')
+    depends_on('zlib')
+    depends_on('bison')
+    depends_on('flex')
+    depends_on('m4')
+    depends_on('texinfo')
+    depends_on('wget')
+    conflicts('flex', when='@2.6.3', msg='Binutils 2.25 for Nux doesn\'t build with flex 2.6.3.')
+
+    # host software dependencies
+    depends_on('bitsery', type=('build', 'link', 'run'))
+    depends_on('binutils+gold+ld+plugins', type=('build', 'link', 'run')) # specialize
+    depends_on('boost@1.69.0: +graph+icu+mpi+python+numpy+coroutine+context cxxstd=17', type=('build', 'link', 'run')) # specialize boost (non-clingo, type=('build', 'link', 'run'))
+    depends_on('cereal', type=('build', 'link', 'run'))
+    depends_on('cppcheck', type=('build', 'link', 'run'))
+    depends_on('doxygen+graphviz', type=('build', 'link', 'run'))
+    depends_on('genpybind@ebrains', type=('build', 'link', 'run'))
+    depends_on('gflags', type=('build', 'link', 'run'))
+    depends_on('googletest@1.11.0: +gmock', type=('build', 'link', 'run')) # variadic templates needed
+    depends_on('intel-tbb', type=('build', 'link', 'run'))  # ppu gdbserver
+    depends_on('libelf', type=('build', 'link', 'run'))
+    depends_on('liblockfile', type=('build', 'link', 'run'))
+    depends_on('llvm', type=('build', 'link', 'run'))
+    depends_on('log4cxx', type=('build', 'link', 'run'))
+    depends_on('pkg-config', type=('build', 'link', 'run'))
+    depends_on('python@3.7.0:', type=('build', 'link', 'run')) # BrainScaleS(-2, type=('build', 'link', 'run')) only supports Python >= 3.7
+    depends_on('py-h5py', type=('build', 'link', 'run')) # PyNN tests need it
+    depends_on('py-matplotlib', type=('build', 'link', 'run'))
+    depends_on('py-nose', type=('build', 'link', 'run'))
+    depends_on('py-numpy', type=('build', 'link', 'run'))
+    depends_on('py-pybind11', type=('build', 'link', 'run'))
+    depends_on('py-pybind11-stubgen', type=('build', 'link', 'run'))
+    depends_on('py-pycodestyle', type=('build', 'link', 'run'))
+    depends_on('py-pyelftools', type=('build', 'link', 'run'))
+    depends_on('py-pylint', type=('build', 'link', 'run'))
+    depends_on('py-pynn@0.9.4:', type=('build', 'link', 'run'))
+    depends_on('py-pyyaml', type=('build', 'link', 'run'))
+    depends_on('py-scipy', type=('build', 'link', 'run'))
+    depends_on('py-sqlalchemy', type=('build', 'link', 'run'))
+    depends_on('util-linux', type=('build', 'link', 'run'))
+    depends_on('yaml-cpp+shared', type=('build', 'link', 'run'))
     extends('python')
 
     def setup_build_environment(self, env):
@@ -26,6 +68,7 @@ class PynnBrainscales(WafPackage):
             query = self.spec[dep.name]
             try:
                 include.extend(query.headers.directories)
+                print('headers:', query.headers.directories, "\n")
             except:
                 pass
 
@@ -34,7 +77,7 @@ class PynnBrainscales(WafPackage):
             query = self.spec[dep.name]
             try:
                 library.extend(query.libs.directories)
-                print(query.libs.directories, "\n")
+                print('libs:', query.libs.directories, "\n")
             except:
                 pass
 
@@ -43,6 +86,7 @@ class PynnBrainscales(WafPackage):
             query = self.spec[dep.name]
             try:
                 path.append(query.prefix.bin)
+                print('bin:', query.prefix.bin, "\n")
             except:
                 pass
 
diff --git a/spack.yaml b/spack.yaml
index 96b5c418eddd2933888dd9c2b6f7b63add70bcee..dd048a31914287bfe55f3ae16e9fbf61e38f0bf5 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -3,7 +3,7 @@ spack:
     # Base
     - python@3.8.11 %gcc@10.3.0
     # Notebook
-    - py-jupyter %gcc@10.3.0
+    #- py-jupyter %gcc@10.3.0
     - py-ipython %gcc@10.3.0
     - py-ipykernel %gcc@10.3.0
     - py-notebook %gcc@10.3.0
@@ -22,17 +22,15 @@ spack:
     - neuron +mpi %gcc@10.3.0
     - py-pynn@0.9.6 %gcc@10.3.0
     - tvb-data %gcc@10.3.0
-    - tvb-library ^binutils+ld+gold %gcc@10.3.0
+    - tvb-library ^py-numba@0.54.0 ^binutils+ld+gold %gcc@10.3.0
     - tvb-storage ^binutils+ld+gold %gcc@10.3.0
     - py-pyaescrypt %gcc@10.3.0
     - py-formencode %gcc@10.3.0
     - tvb-framework ^binutils+ld+gold %gcc@10.3.0
-    - meta-brainscales %gcc@10.3.0
     - pynn-brainscales@2.0-rc1 ^log4cxx@0.10.0 ^googletest@1.11.0:+gmock %gcc@10.3.0
+    #- py-torch~mkldnn~cuda~cudnn~onnx_ml~rocm~tensorpipe~mpi~distributed ^protobuf@:3.17.999 %gcc@10.3.0
     #- py-lfpy@2.2.3 %gcc@10.3.0
-    - biobb-common %gcc@10.3.0
+    #- biobb-common %gcc@10.3.0
     # demo for codejam12
-    - funniest1022 %gcc@10.3.0
-    # NRP
-    - py-torch~mkldnn~cuda~cudnn~onnx_ml~rocm~tensorpipe~mpi~distributed ^protobuf@:3.17.999 %gcc@10.3.0
+    #- funniest1022 %gcc@10.3.0
   concretization: together
diff --git a/spack_releases_info.txt b/spack_releases_info.txt
index 77c63a6aaf4fd8af1f78e82449fb03ffc672f5ad..82fc59e37b09601af98c52c299b0ef41bf4f0019 100644
--- a/spack_releases_info.txt
+++ b/spack_releases_info.txt
@@ -1,4 +1,23 @@
+### Prod ###
+
 # release_v0.1_202109
+Spack upstream commit sha -> 9853fd50e2dc6253a2c80b38fc3bad8f226ce94e
+"display_name": "EBRAINS_release_v0.1_202109"
+spack env: release_v0_1_202109
+
 # release_v0.1_202109_hotfix
 Spack upstream commit sha -> 9853fd50e2dc6253a2c80b38fc3bad8f226ce94e
 "display_name": "EBRAINS_release_v0.1_202109"
+spack env: release_v0_1_202109_hotfix
+
+### Experimental ###
+# experimental_rel
+Spack upstream commit sha -> 9853fd50e2dc6253a2c80b38fc3bad8f226ce94e
+"display_name": "EBRAINS_experimental_release"
+spack env: experimental
+
+### Int release  ### 
+# master
+Spack upstream commit sha -> a8d440d3ababcdec20d665ad938ab880cd9b9d17
+"display_name": "EBRAINS_release_v0.2_202112"
+spack env: release_v0_2_202112