From 8553e364c44d5d6559d7215d8847ca1f0a5b4a51 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Fri, 11 Feb 2022 14:40:23 +0100
Subject: [PATCH 01/24] distinguish scheduled jobs for dev and prod envs

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2a60006e..739b6aa9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -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)
-- 
GitLab


From d8903d1365798caccc5edc97cb25b7551f159d91 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Feb 2022 11:31:49 +0000
Subject: [PATCH 02/24] remove py-torch for now as variant is causing issues

---
 spack.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spack.yaml b/spack.yaml
index 96b5c418..708b73ea 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -34,5 +34,5 @@ spack:
     # 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
+    #- py-torch~mkldnn~cuda~cudnn~onnx_ml~rocm~tensorpipe~mpi~distributed ^protobuf@:3.17.999 %gcc@10.3.0
   concretization: together
-- 
GitLab


From 7ad5af0b767effab39ade11d6d5eb846674bf89d Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Fri, 18 Feb 2022 11:02:25 +0100
Subject: [PATCH 03/24] bump py-idna

---
 spack.yaml | 1 +
 1 file changed, 1 insertion(+)

diff --git a/spack.yaml b/spack.yaml
index 708b73ea..abfa026a 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -16,6 +16,7 @@ spack:
     - py-pandas %gcc@10.3.0
     - py-seaborn %gcc@10.3.0
     - py-matplotlib %gcc@10.3.0
+    - py-idna@2.8 %gcc@10.3.0
     # EBRAINS simulators
     - nest@3.2 +python +gsl +mpi %gcc@10.3.0
     - arbor +python +mpi ^python@3:3.9 %gcc@10.3.0
-- 
GitLab


From dd0e51d77bbe201fc006145d3544dc0b0e0de6b3 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Mon, 21 Feb 2022 13:45:14 +0100
Subject: [PATCH 04/24] Update spack.yaml

---
 spack.yaml | 1 -
 1 file changed, 1 deletion(-)

diff --git a/spack.yaml b/spack.yaml
index abfa026a..708b73ea 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -16,7 +16,6 @@ spack:
     - py-pandas %gcc@10.3.0
     - py-seaborn %gcc@10.3.0
     - py-matplotlib %gcc@10.3.0
-    - py-idna@2.8 %gcc@10.3.0
     # EBRAINS simulators
     - nest@3.2 +python +gsl +mpi %gcc@10.3.0
     - arbor +python +mpi ^python@3:3.9 %gcc@10.3.0
-- 
GitLab


From f224eb19089c4194dd02f0480954587e3e91e549 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 24 Feb 2022 09:01:43 +0000
Subject: [PATCH 05/24] removed py-pybind11 contributed months ago by
 brainscales team as it limited the version selection for the package, updated
 image pull policy for the build job in the okd cluster and updated
 information for releases

---
 create_job.sh                   |  1 +
 packages/py-pybind11/package.py | 91 ---------------------------------
 spack_releases_info.txt         | 19 +++++++
 3 files changed, 20 insertions(+), 91 deletions(-)
 delete mode 100644 packages/py-pybind11/package.py

diff --git a/create_job.sh b/create_job.sh
index cc62cb60..a88b7995 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:
diff --git a/packages/py-pybind11/package.py b/packages/py-pybind11/package.py
deleted file mode 100644
index a353ce63..00000000
--- 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/spack_releases_info.txt b/spack_releases_info.txt
index 77c63a6a..82fc59e3 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
-- 
GitLab


From 85fd874773317b784a6d145c2adee28ab91b5c37 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 24 Feb 2022 17:11:39 +0100
Subject: [PATCH 06/24] export also python modules installed in the base docker
 Collab image

---
 create_JupyterLab_kernel.sh | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/create_JupyterLab_kernel.sh b/create_JupyterLab_kernel.sh
index aa5b61cb..078c786b 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
-- 
GitLab


From 530fb690d8b9ccd1f3a0eeb36b2b2a4b4adcc3a8 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 24 Feb 2022 17:13:01 +0100
Subject: [PATCH 07/24] remove py-jupyter as it is breaking

---
 spack.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spack.yaml b/spack.yaml
index 708b73ea..a80cc4b0 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
-- 
GitLab


From 17962d12a6d4a658ea16ab26b33f96d98448e685 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Wed, 9 Mar 2022 14:16:03 +0000
Subject: [PATCH 08/24] changes to conclude to a successful build

---
 spack.yaml | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/spack.yaml b/spack.yaml
index a80cc4b0..d951abb9 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -22,7 +22,7 @@ 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
@@ -30,9 +30,9 @@ spack:
     - 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-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
+    #- 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
   concretization: together
-- 
GitLab


From c940d9a1dc62f82ab0f47868480e1b61db205ae4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Thu, 10 Mar 2022 18:20:42 +0100
Subject: [PATCH 09/24] Integrate upstream llvm package (from a8d440d3)

---
 packages/llvm/llvm-gcc11.patch                |   9 +
 packages/llvm/llvm-version-suffix-macro.patch |  14 +
 packages/llvm/llvm4-lld-ELF-Symbols.patch     | 112 +++++
 packages/llvm/llvm5-lld-ELF-Symbols.patch     |  33 ++
 packages/llvm/llvm5-sanitizer-ustat.patch     |  25 +
 packages/llvm/missing-includes.patch          |  23 +
 packages/llvm/no_cyclades.patch               |  81 ++++
 packages/llvm/no_cyclades9.patch              |  42 ++
 packages/llvm/package.py                      | 442 ++++++++++++------
 packages/llvm/sanitizer-ipc_perm_mode.patch   |   9 +
 packages/llvm/xray_buffer_queue-cstddef.patch |   5 +
 11 files changed, 641 insertions(+), 154 deletions(-)
 create mode 100644 packages/llvm/llvm-gcc11.patch
 create mode 100644 packages/llvm/llvm-version-suffix-macro.patch
 create mode 100644 packages/llvm/llvm4-lld-ELF-Symbols.patch
 create mode 100644 packages/llvm/llvm5-lld-ELF-Symbols.patch
 create mode 100644 packages/llvm/llvm5-sanitizer-ustat.patch
 create mode 100644 packages/llvm/missing-includes.patch
 create mode 100644 packages/llvm/no_cyclades.patch
 create mode 100644 packages/llvm/no_cyclades9.patch
 create mode 100644 packages/llvm/sanitizer-ipc_perm_mode.patch
 create mode 100644 packages/llvm/xray_buffer_queue-cstddef.patch

diff --git a/packages/llvm/llvm-gcc11.patch b/packages/llvm/llvm-gcc11.patch
new file mode 100644
index 00000000..8e081e87
--- /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 00000000..62e96843
--- /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 00000000..1a86cda3
--- /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 00000000..727647d3
--- /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 00000000..531a3c5d
--- /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 00000000..e88b8fcf
--- /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 00000000..10f9d079
--- /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 00000000..7532865e
--- /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 f9f1d6ba..4d0226b7 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 00000000..8f91703a
--- /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 00000000..b5ca841e
--- /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>
-- 
GitLab


From 42237ea25f457dc4d186c3c7b7dd0de390f5a724 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Tue, 15 Mar 2022 10:33:51 +0100
Subject: [PATCH 10/24] Fix: pynn-brainscales build depends on py-pyyaml

(Before we somehow used the runtime dependency on py-pyyaml.)
---
 packages/pynn-brainscales/package.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index bd42fdc9..44582985 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -14,6 +14,7 @@ class PynnBrainscales(WafPackage):
 
     version('2.0-rc1', branch='waf')
     depends_on('meta-brainscales', type=('build', 'link', 'run'))
+    depends_on('py-pyyaml', type=('build'))
     extends('python')
 
     def setup_build_environment(self, env):
@@ -26,6 +27,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 +36,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 +45,7 @@ class PynnBrainscales(WafPackage):
             query = self.spec[dep.name]
             try:
                 path.append(query.prefix.bin)
+                print('bin:', query.prefix.bin, "\n")
             except:
                 pass
 
-- 
GitLab


From adb9ffe921f71be43471acd9432fe5262d6809a9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Tue, 15 Mar 2022 13:15:36 +0100
Subject: [PATCH 11/24] Drop meta-brainscales (move dependencies into
 pynn-brainscales)

---
 packages/meta-brainscales/package.py | 68 ---------------------
 packages/pynn-brainscales/package.py | 90 +++++++++++++---------------
 2 files changed, 43 insertions(+), 115 deletions(-)
 delete mode 100644 packages/meta-brainscales/package.py

diff --git a/packages/meta-brainscales/package.py b/packages/meta-brainscales/package.py
deleted file mode 100644
index bed34fc8..00000000
--- 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/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index 44582985..8a510de7 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,55 +13,51 @@ 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'))
-    depends_on('py-pyyaml', type=('build'))
-    extends('python')
-
-    def setup_build_environment(self, env):
-        """waf needs to find headers and libraries by itself (mostly `boost`
-        tool, but also `gtest`); it also needs to run executables during
-        configuration."""
-
-        include = []
-        for dep in self.spec.traverse(deptype='build'):
-            query = self.spec[dep.name]
-            try:
-                include.extend(query.headers.directories)
-                print('headers:', query.headers.directories, "\n")
-            except:
-                pass
 
-        library = []
-        for dep in self.spec.traverse(deptype=('link', 'run')):
-            query = self.spec[dep.name]
-            try:
-                library.extend(query.libs.directories)
-                print('libs:', query.libs.directories, "\n")
-            except:
-                pass
+    # 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.')
 
-        path = []
-        for dep in self.spec.traverse(deptype=('build', 'link', 'run')):
-            query = self.spec[dep.name]
-            try:
-                path.append(query.prefix.bin)
-                print('bin:', query.prefix.bin, "\n")
-            except:
-                pass
-
-        # llvm might be built with ~shared_libs but still builds shared libs
-        if not any('llvm' in lib for lib in library):
-            library.append(self.spec['llvm'].prefix.lib)
-
-        env.set('CPATH', ':'.join(include))
-        env.set('C_INCLUDE_PATH', ':'.join(include))
-        env.set('CPLUS_INCLUDE_PATH', ':'.join(include))
-        env.set('LIBRARY_PATH', ':'.join(library))
-        env.set('LD_LIBRARY_PATH', ':'.join(library))
-        env.prepend_path('PATH', ':'.join(path))
+    # 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_run_environment(self, env):
-        env.prepend_path('PYTHONPATH', self.prefix.lib)
 
     # override configure step as we perform a project setup first
     def configure(self, spec, prefix):
-- 
GitLab


From 3e3143f4fd855f03ea89001a79c769ef66b81915 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Tue, 15 Mar 2022 12:53:38 +0000
Subject: [PATCH 12/24] remove meta-brainscales from spack.yaml

---
 .gitlab-ci.yml | 2 +-
 spack.yaml     | 1 -
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 739b6aa9..fa5e7567 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 "Error: 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:
diff --git a/spack.yaml b/spack.yaml
index d951abb9..a21c5f54 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -27,7 +27,6 @@ spack:
     - 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-lfpy@2.2.3 %gcc@10.3.0
     #- biobb-common %gcc@10.3.0
-- 
GitLab


From e2f6ecdb2cb2b582581bc00ea736fd35645edc17 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Tue, 15 Mar 2022 13:13:17 +0000
Subject: [PATCH 13/24] minor correction

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index fa5e7567..829d6d29 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: No module available for package"|wc -l) -gt 0 ]; then exit 1;fi;
+    - if [ $(cat log.txt |grep 'Error":" 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:
-- 
GitLab


From 120c6393851f476e6387a8ca9328c459c1088d13 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Tue, 15 Mar 2022 15:27:03 +0100
Subject: [PATCH 14/24] minor correction

---
 .gitlab-ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 829d6d29..7b4d9888 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":" No module available for package'|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:
-- 
GitLab


From db8bd7adf5666c9555c8a7e2f739e17ec5f4d08e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Tue, 15 Mar 2022 17:54:41 +0100
Subject: [PATCH 15/24] =?UTF-8?q?Re-add=20setup=5Fbuild=5Fenvironment(?=
 =?UTF-8?q?=E2=80=A6)=20in=20pynn-brainscales?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 packages/pynn-brainscales/package.py | 45 ++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)

diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index 8a510de7..68dbdeff 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -58,6 +58,51 @@ class PynnBrainscales(WafPackage):
     depends_on('yaml-cpp+shared', type=('build', 'link', 'run'))
     extends('python')
 
+    def setup_build_environment(self, env):
+        """waf needs to find headers and libraries by itself (mostly `boost`
+        tool, but also `gtest`); it also needs to run executables during
+        configuration."""
+
+        include = []
+        for dep in self.spec.traverse(deptype='build'):
+            query = self.spec[dep.name]
+            try:
+                include.extend(query.headers.directories)
+                print('headers:', query.headers.directories, "\n")
+            except:
+                pass
+
+        library = []
+        for dep in self.spec.traverse(deptype=('link', 'run')):
+            query = self.spec[dep.name]
+            try:
+                library.extend(query.libs.directories)
+                print('libs:', query.libs.directories, "\n")
+            except:
+                pass
+
+        path = []
+        for dep in self.spec.traverse(deptype=('build', 'link', 'run')):
+            query = self.spec[dep.name]
+            try:
+                path.append(query.prefix.bin)
+                print('bin:', query.prefix.bin, "\n")
+            except:
+                pass
+
+        # llvm might be built with ~shared_libs but still builds shared libs
+        if not any('llvm' in lib for lib in library):
+            library.append(self.spec['llvm'].prefix.lib)
+
+        env.set('CPATH', ':'.join(include))
+        env.set('C_INCLUDE_PATH', ':'.join(include))
+        env.set('CPLUS_INCLUDE_PATH', ':'.join(include))
+        env.set('LIBRARY_PATH', ':'.join(library))
+        env.set('LD_LIBRARY_PATH', ':'.join(library))
+        env.prepend_path('PATH', ':'.join(path))
+
+    def setup_run_environment(self, env):
+        env.prepend_path('PYTHONPATH', self.prefix.lib)
 
     # override configure step as we perform a project setup first
     def configure(self, spec, prefix):
-- 
GitLab


From 968151b9f5276094863d6e54b7476f2bae51259d Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 12:47:57 +0100
Subject: [PATCH 16/24] select worker node

---
 create_job.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index a88b7995..4a58ace2 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -41,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-1.dev.hbp.eu     
 EOT
-- 
GitLab


From 26375ce2b38c79e23e44943bfb1a849396541d89 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:06:41 +0100
Subject: [PATCH 17/24] changed some parameters in okd build job

---
 create_job.sh | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index 4a58ace2..13f4a649 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -32,6 +32,11 @@ spec:
         imagePullPolicy: Always
         securityContext:
           runAsUser: ${OKD_CLUSTER_UID}
+        resources:
+          requests:
+            ephemeral-storage: "80Gi"
+          limits:
+            ephemeral-storage: "100Gi"
         volumeMounts:
           - name: sharedbin
             mountPath: /srv
@@ -41,6 +46,6 @@ spec:
           persistentVolumeClaim:
             claimName: shared-binaries
       restartPolicy: Never
-      nodeSelector:
-        kubernetes.io/hostname: okd-worker-1.dev.hbp.eu     
+      #nodeSelector:
+      #  kubernetes.io/hostname: okd-worker-1.dev.hbp.eu     
 EOT
-- 
GitLab


From 6160f807c22fe854caf903788147052ebe55bbca Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:08:13 +0100
Subject: [PATCH 18/24] Update create_job.sh

---
 create_job.sh | 2 --
 1 file changed, 2 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index 13f4a649..d7523b1f 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -35,8 +35,6 @@ spec:
         resources:
           requests:
             ephemeral-storage: "80Gi"
-          limits:
-            ephemeral-storage: "100Gi"
         volumeMounts:
           - name: sharedbin
             mountPath: /srv
-- 
GitLab


From 5e0dd2e96bedac5fd0e423dfa554dceeaada007d Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:21:45 +0100
Subject: [PATCH 19/24] Update create_job.sh

---
 create_job.sh | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index d7523b1f..3f43ff39 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -32,9 +32,6 @@ spec:
         imagePullPolicy: Always
         securityContext:
           runAsUser: ${OKD_CLUSTER_UID}
-        resources:
-          requests:
-            ephemeral-storage: "80Gi"
         volumeMounts:
           - name: sharedbin
             mountPath: /srv
@@ -44,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-5.dev.hbp.eu     
 EOT
-- 
GitLab


From 0d73b0a9628f7c33374e679ff53358006e13bd64 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:25:32 +0100
Subject: [PATCH 20/24] Update create_job.sh

---
 create_job.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/create_job.sh b/create_job.sh
index 3f43ff39..68146a2b 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -42,5 +42,5 @@ spec:
             claimName: shared-binaries
       restartPolicy: Never
       nodeSelector:
-        kubernetes.io/hostname: okd-worker-5.dev.hbp.eu     
+        kubernetes.io/hostname: okd-worker-4.dev.hbp.eu     
 EOT
-- 
GitLab


From 94d2a9de2660e053e2eb0cc52906cbd30a2c10dd Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:54:50 +0100
Subject: [PATCH 21/24] Update create_job.sh

---
 create_job.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index 68146a2b..906e1ba3 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -41,6 +41,6 @@ spec:
           persistentVolumeClaim:
             claimName: shared-binaries
       restartPolicy: Never
-      nodeSelector:
-        kubernetes.io/hostname: okd-worker-4.dev.hbp.eu     
+      #nodeSelector:
+      #  kubernetes.io/hostname: okd-worker-3.dev.hbp.eu     
 EOT
-- 
GitLab


From 53ed08158a5cdff261a68d71ab7b262aaedc1f37 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 17 Mar 2022 17:57:10 +0100
Subject: [PATCH 22/24] Update create_job.sh

---
 create_job.sh | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/create_job.sh b/create_job.sh
index 906e1ba3..b0177883 100644
--- a/create_job.sh
+++ b/create_job.sh
@@ -41,6 +41,6 @@ spec:
           persistentVolumeClaim:
             claimName: shared-binaries
       restartPolicy: Never
-      #nodeSelector:
-      #  kubernetes.io/hostname: okd-worker-3.dev.hbp.eu     
+      nodeSelector:
+        kubernetes.io/hostname: okd-worker-3.dev.hbp.eu     
 EOT
-- 
GitLab


From 81243dc89b8a504a9328afe100bc32f686a4c535 Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 24 Mar 2022 08:35:26 +0100
Subject: [PATCH 23/24] check if py-torch works

---
 spack.yaml | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/spack.yaml b/spack.yaml
index a21c5f54..9d167f67 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -28,10 +28,9 @@ spack:
     - py-formencode %gcc@10.3.0
     - tvb-framework ^binutils+ld+gold %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
     # 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
   concretization: together
-- 
GitLab


From c565c3ea89894309f2448c776d1619e749edfd1c Mon Sep 17 00:00:00 2001
From: Athanasios Karmas <karmas@athenarc.gr>
Date: Thu, 24 Mar 2022 14:07:55 +0100
Subject: [PATCH 24/24] Update spack.yaml

---
 spack.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/spack.yaml b/spack.yaml
index 9d167f67..dd048a31 100644
--- a/spack.yaml
+++ b/spack.yaml
@@ -28,7 +28,7 @@ spack:
     - py-formencode %gcc@10.3.0
     - tvb-framework ^binutils+ld+gold %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-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
     # demo for codejam12
-- 
GitLab