Skip to content
Snippets Groups Projects
Commit 39772e4c authored by Denis Davydov's avatar Denis Davydov Committed by Todd Gamblin
Browse files

filter system paths (#2083)

* add filter_system_paths()

* filter system paths in set_build_environment_variables()

* two function: lib/inc + bin

* reverse order in bin

* fix order

* minor

* improvements of the code

* more cleanup

* alternative solution for filter_bins

* fiddle base alalazo's approach

* minor

* minor
parent 3de26ff3
No related branches found
No related tags found
No related merge requests found
...@@ -251,6 +251,8 @@ def set_build_environment_variables(pkg, env, dirty=False): ...@@ -251,6 +251,8 @@ def set_build_environment_variables(pkg, env, dirty=False):
if os.path.isdir(ci): if os.path.isdir(ci):
env_paths.append(ci) env_paths.append(ci)
env_paths = filter_system_paths(env_paths)
for item in reversed(env_paths): for item in reversed(env_paths):
env.prepend_path('PATH', item) env.prepend_path('PATH', item)
env.set_path(SPACK_ENV_PATH, env_paths) env.set_path(SPACK_ENV_PATH, env_paths)
...@@ -258,12 +260,14 @@ def set_build_environment_variables(pkg, env, dirty=False): ...@@ -258,12 +260,14 @@ def set_build_environment_variables(pkg, env, dirty=False):
# Prefixes of all of the package's dependencies go in SPACK_DEPENDENCIES # Prefixes of all of the package's dependencies go in SPACK_DEPENDENCIES
dep_prefixes = [d.prefix for d in dep_prefixes = [d.prefix for d in
pkg.spec.traverse(root=False, deptype=('build', 'link'))] pkg.spec.traverse(root=False, deptype=('build', 'link'))]
dep_prefixes = filter_system_paths(dep_prefixes)
env.set_path(SPACK_DEPENDENCIES, dep_prefixes) env.set_path(SPACK_DEPENDENCIES, dep_prefixes)
# These variables control compiler wrapper behavior # These variables control compiler wrapper behavior
env.set_path(SPACK_RPATH_DEPS, [d.prefix for d in get_rpath_deps(pkg)]) env.set_path(SPACK_RPATH_DEPS, filter_system_paths([
env.set_path(SPACK_LINK_DEPS, [ d.prefix for d in get_rpath_deps(pkg)]))
d.prefix for d in pkg.spec.traverse(root=False, deptype=('link'))]) env.set_path(SPACK_LINK_DEPS, filter_system_paths([
d.prefix for d in pkg.spec.traverse(root=False, deptype=('link'))]))
# Add dependencies to CMAKE_PREFIX_PATH # Add dependencies to CMAKE_PREFIX_PATH
env.set_path('CMAKE_PREFIX_PATH', dep_prefixes) env.set_path('CMAKE_PREFIX_PATH', dep_prefixes)
...@@ -298,6 +302,7 @@ def set_build_environment_variables(pkg, env, dirty=False): ...@@ -298,6 +302,7 @@ def set_build_environment_variables(pkg, env, dirty=False):
# Add bin directories from dependencies to the PATH for the build. # Add bin directories from dependencies to the PATH for the build.
bin_dirs = reversed(filter(os.path.isdir, [ bin_dirs = reversed(filter(os.path.isdir, [
'%s/bin' % d.prefix for d in pkg.spec.dependencies(deptype='build')])) '%s/bin' % d.prefix for d in pkg.spec.dependencies(deptype='build')]))
bin_dirs = filter_system_bin_paths(bin_dirs)
for item in bin_dirs: for item in bin_dirs:
env.prepend_path('PATH', item) env.prepend_path('PATH', item)
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
from spack.environment import EnvironmentModifications from spack.environment import EnvironmentModifications
from spack.environment import SetEnv, UnsetEnv from spack.environment import SetEnv, UnsetEnv
from spack.environment import RemovePath, PrependPath, AppendPath from spack.environment import RemovePath, PrependPath, AppendPath
from spack.util.environment import filter_system_paths, filter_system_bin_paths
class EnvironmentTest(unittest.TestCase): class EnvironmentTest(unittest.TestCase):
...@@ -59,6 +60,41 @@ def test_unset(self): ...@@ -59,6 +60,41 @@ def test_unset(self):
env.apply_modifications() env.apply_modifications()
self.assertRaises(KeyError, os.environ.__getitem__, 'UNSET_ME') self.assertRaises(KeyError, os.environ.__getitem__, 'UNSET_ME')
def test_filter_system_paths(self):
filtered = filter_system_paths([
'/usr/local/Cellar/gcc/5.3.0/lib',
'/usr/local/lib',
'/usr/local/include',
'/usr/local/lib64',
'/usr/local/opt/some-package/lib',
'/usr/opt/lib',
'/lib',
'/lib64',
'/include',
'/opt/some-package/include',
])
self.assertEqual(filtered,
['/usr/local/Cellar/gcc/5.3.0/lib',
'/usr/local/opt/some-package/lib',
'/usr/opt/lib',
'/opt/some-package/include'])
filtered = filter_system_bin_paths([
'/usr/local/Cellar/gcc/5.3.0/bin',
'/usr/local/bin',
'/usr/local/opt/some-package/bin',
'/usr/opt/bin',
'/bin',
'/opt/some-package/bin',
])
self.assertEqual(filtered,
['/usr/local/bin',
'/bin',
'/usr/local/Cellar/gcc/5.3.0/bin',
'/usr/local/opt/some-package/bin',
'/usr/opt/bin',
'/opt/some-package/bin'])
def test_set_path(self): def test_set_path(self):
env = EnvironmentModifications() env = EnvironmentModifications()
env.set_path('A', ['foo', 'bar', 'baz']) env.set_path('A', ['foo', 'bar', 'baz'])
......
...@@ -24,6 +24,24 @@ ...@@ -24,6 +24,24 @@
############################################################################## ##############################################################################
import os import os
system_paths = ['/', '/usr/', '/usr/local']
suffixes = ['lib', 'lib64', 'include']
system_dirs = [os.path.join(p, s) for s in suffixes for p in system_paths]
system_bins = [os.path.join(p, 'bin') for p in system_paths]
def filter_system_paths(paths):
return [p for p in paths if p not in system_dirs]
def filter_system_bin_paths(paths):
# Turn the iterable into a list. Assume it's a list from here on.
_paths = list(paths)
bins = [p for p in _paths if p in system_bins]
nobins = [p for p in _paths if p not in system_bins]
# put bins infront as PATH is set by: prepend_path('PATH', item)
return bins + nobins
def get_path(name): def get_path(name):
path = os.environ.get(name, "").strip() path = os.environ.get(name, "").strip()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment