Blacklist implicit packages for modulefile generation (#2603)

Add the ability to the modules generation process to blacklist
packages that were installed implicitly.  One can still whitelist
modules that were installed implicitly.

This changes adds a `blacklist_implicts` boolean as a peer to the
`whitelist` and `blacklist` arrays, e.g.:

```
modules:
  enable::
    - lmod
  lmod:
    whitelist:
      - 'lua'
      - 'py-setuptools'
    blacklist:
      -  '%gcc@4.8.3'
    blacklist_implicits: True
```

It adds a small helper in `spec.py` and then touches up the package
filtering code in `modules.py`.
This commit is contained in:
George Hartzell 2017-02-03 15:42:46 -08:00 committed by Todd Gamblin
parent acb9281dbf
commit 5a836fd06e
2 changed files with 21 additions and 1 deletions

View File

@ -327,6 +327,10 @@ def blacklisted(self):
blacklist_matches = [x blacklist_matches = [x
for x in configuration.get('blacklist', []) for x in configuration.get('blacklist', [])
if self.spec.satisfies(x)] if self.spec.satisfies(x)]
blacklist_implicits = configuration.get('blacklist_implicits')
installed_implicitly = not self.spec._installed_explicitly()
blacklisted_as_implicit = blacklist_implicits and installed_implicitly
if whitelist_matches: if whitelist_matches:
message = '\tWHITELIST : %s [matches : ' % self.spec.cshort_spec message = '\tWHITELIST : %s [matches : ' % self.spec.cshort_spec
for rule in whitelist_matches: for rule in whitelist_matches:
@ -341,7 +345,13 @@ def blacklisted(self):
message += ' ]' message += ' ]'
tty.debug(message) tty.debug(message)
if not whitelist_matches and blacklist_matches: if blacklisted_as_implicit:
message = '\tBLACKLISTED_AS_IMPLICIT : %s' % \
self.spec.cshort_spec
tty.debug(message)
is_blacklisted = blacklist_matches or blacklisted_as_implicit
if not whitelist_matches and is_blacklisted:
return True return True
return False return False

View File

@ -2596,6 +2596,16 @@ def _install_status(self):
except KeyError: except KeyError:
return None return None
def _installed_explicitly(self):
"""Helper for tree to print DB install status."""
if not self.concrete:
return None
try:
record = spack.store.db.get_record(self)
return record.explicit
except KeyError:
return None
def tree(self, **kwargs): def tree(self, **kwargs):
"""Prints out this spec and its dependencies, tree-formatted """Prints out this spec and its dependencies, tree-formatted
with indentation.""" with indentation."""