From 8cdea723f79a923dd9b4fe37011b8b62e48dced4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Eric=20M=C3=BCller?= <mueller@kip.uni-heidelberg.de>
Date: Fri, 3 Feb 2023 15:26:03 +0100
Subject: [PATCH] BrainScaleS: Exclude system paths from build env

This should fix problems with finding system-installed headers instead of the
spack-provided ones (e.g. googletest). (In some cases sites might inject
include paths via compiler settings (or other means)).
---
 packages/hxtorch/package.py          | 29 ++++++++++++----------------
 packages/pynn-brainscales/package.py | 18 ++++++++++++-----
 2 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/packages/hxtorch/package.py b/packages/hxtorch/package.py
index 26930de5..240e09ee 100644
--- a/packages/hxtorch/package.py
+++ b/packages/hxtorch/package.py
@@ -61,6 +61,7 @@ class Hxtorch(WafPackage):
         configuration."""
 
         include = []
+        include_exclude_dirs = set(['/usr/include'])
         for dep in self.spec.traverse(deptype='build'):
             query = self.spec[dep.name]
             try:
@@ -70,30 +71,24 @@ class Hxtorch(WafPackage):
                         if os.path.exists(d):
                             env.remove_path('SPACK_INCLUDE_DIRS', d)
                     continue
-                include.extend(query.headers.directories)
-                print('headers (', dep.name, '):', query.headers.directories, "\n")
+                assert(isinstance(query.headers.directories, list))
+                include_dirs = set(query.headers.directories)
+                include_dirs -= include_exclude_dirs
+                print('headers (', dep.name, '):', include_dirs, "\n")
+                include.extend(list(include_dirs))
             except:
                 pass
 
         library = []
+        library_exclude_dirs = set(['/lib', '/lib64', '/usr/lib', '/usr/lib64'])
         for dep in self.spec.traverse(deptype=('link', 'run')):
             query = self.spec[dep.name]
-            # we probably should skip/remove the entries for the same
-            # dependencies as above; however, ".libs" relies on the package
-            # name being the same as the library name (e.g. approx.
-            # libPACKAGE.so) so we are just moving googletest to the front
-            if dep.name == 'googletest':
-                for d in [self.spec['googletest'].prefix.lib64, self.spec['googletest'].prefix.lib]:
-                    if os.path.exists(d):
-                        print('moving to front of SPACK_{LINK,RPATH}_DIRS\n', d)
-                        env.remove_path('SPACK_LINK_DIRS', d)
-                        env.prepend_path('SPACK_LINK_DIRS', d)
-                        env.remove_path('SPACK_RPATH_DIRS', d)
-                        env.prepend_path('SPACK_RPATH_DIRS', d)
             try:
-                print('libs (', dep.name, '):', query.libs.directories, "\n")
-                # extend at front
-                library = query.libs.directories + library
+                assert(isinstance(query.libs.directories, list))
+                library_dirs = set(query.libs.directories)
+                library_dirs -= library_exclude_dirs
+                print('libs (', dep.name, '):', library_dirs, "\n")
+                library.extend(list(library_dirs))
             except:
                 pass
 
diff --git a/packages/pynn-brainscales/package.py b/packages/pynn-brainscales/package.py
index 2f61e734..d90a7e37 100644
--- a/packages/pynn-brainscales/package.py
+++ b/packages/pynn-brainscales/package.py
@@ -60,20 +60,28 @@ class PynnBrainscales(WafPackage):
         configuration."""
 
         include = []
+        include_exclude_dirs = set(['/usr/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")
+                assert(isinstance(query.headers.directories, list))
+                include_dirs = set(query.headers.directories)
+                include_dirs -= include_exclude_dirs
+                print('headers (', dep.name, '):', include_dirs, "\n")
+                include.extend(list(include_dirs))
             except:
                 pass
 
         library = []
+        library_exclude_dirs = set(['/lib', '/lib64', '/usr/lib', '/usr/lib64'])
         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")
+                assert(isinstance(query.libs.directories, list))
+                library_dirs = set(query.libs.directories)
+                library_dirs -= library_exclude_dirs
+                print('libs (', dep.name, '):', library_dirs, "\n")
+                library.extend(list(library_dirs))
             except:
                 pass
 
@@ -82,7 +90,7 @@ class PynnBrainscales(WafPackage):
             query = self.spec[dep.name]
             try:
                 path.append(query.prefix.bin)
-                print('bin:', query.prefix.bin, "\n")
+                print('bin (', dep.name, '):', query.prefix.bin, "\n")
             except:
                 pass
 
-- 
GitLab