ENH: improved openfoam module creation (issue #4942)

- post-install module settings for openfoam-com and foam-extend.
This commit is contained in:
Mark Olesen 2017-12-20 08:39:12 +01:00 committed by scheibelp
parent 6ea4614dbd
commit 235c3c1025
3 changed files with 146 additions and 19 deletions

View file

@ -58,10 +58,12 @@
import os import os
from spack import * from spack import *
from spack.environment import EnvironmentModifications
from spack.pkg.builtin.openfoam_com import OpenfoamArch from spack.pkg.builtin.openfoam_com import OpenfoamArch
from spack.pkg.builtin.openfoam_com import add_extra_files from spack.pkg.builtin.openfoam_com import add_extra_files
from spack.pkg.builtin.openfoam_com import write_environ from spack.pkg.builtin.openfoam_com import write_environ
from spack.pkg.builtin.openfoam_com import rewrite_environ_files from spack.pkg.builtin.openfoam_com import rewrite_environ_files
import llnl.util.tty as tty
class FoamExtend(Package): class FoamExtend(Package):
@ -140,14 +142,77 @@ class FoamExtend(Package):
# #
def setup_environment(self, spack_env, run_env): def setup_environment(self, spack_env, run_env):
"""Add environment variables to the generated module file.
These environment variables come from running:
.. code-block:: console
$ . $WM_PROJECT_DIR/etc/bashrc
"""
# NOTE: Spack runs setup_environment twice.
# 1) pre-build to set up the build environment
# 2) post-install to determine runtime environment variables
# The etc/bashrc is only available (with corrrect content)
# post-installation.
bashrc = join_path(self.projectdir, 'etc', 'bashrc')
minimal = True
if os.path.isfile(bashrc):
# post-install: source the installed bashrc
try:
mods = EnvironmentModifications.from_sourcing_file(
bashrc,
clean=True, # Remove duplicate entries
blacklist=[ # Blacklist these
# Inadvertent changes
# -------------------
'PS1', # Leave unaffected
'MANPATH', # Leave unaffected
# Unneeded bits
# -------------
'FOAM_INST_DIR', # Possibly incorrect
'FOAM_(APP|ETC|SRC|SOLVERS|UTILITIES)',
'FOAM_TEST_.*_DIR',
'WM_NCOMPPROCS',
# 'FOAM_TUTORIALS', # can be useful
# Lots of third-party cruft
# -------------------------
'[A-Z].*_(BIN|LIB|INCLUDE)_DIR',
'[A-Z].*_SYSTEM',
'WM_THIRD_PARTY_.*',
'(BISON|FLEX|CMAKE|ZLIB)_DIR',
'(METIS|PARMETIS|PARMGRIDGEN|SCOTCH)_DIR',
# User-specific
# -------------
'FOAM_RUN',
'(FOAM|WM)_.*USER_.*',
],
whitelist=[ # Whitelist these
'MPI_ARCH_PATH', # Can be needed for compilation
'PYTHON_BIN_DIR',
])
run_env.extend(mods)
minimal = False
tty.info('foam-extend env: {0}'.format(bashrc))
except Exception:
minimal = True
if minimal:
# pre-build or minimal environment
tty.info('foam-extend minimal env {0}'.format(self.prefix))
run_env.set('FOAM_INST_DIR', os.path.dirname(self.projectdir)), run_env.set('FOAM_INST_DIR', os.path.dirname(self.projectdir)),
run_env.set('FOAM_PROJECT_DIR', self.projectdir) run_env.set('FOAM_PROJECT_DIR', self.projectdir)
run_env.set('WM_PROJECT_DIR', self.projectdir) run_env.set('WM_PROJECT_DIR', self.projectdir)
for d in ['wmake', self.archbin]: # bin already added automatically for d in ['wmake', self.archbin]: # bin added automatically
run_env.prepend_path('PATH', join_path(self.projectdir, d)) run_env.prepend_path('PATH', join_path(self.projectdir, d))
def setup_dependent_environment(self, spack_env, run_env, dependent_spec): def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
"""Provide location of the OpenFOAM project. """Location of the OpenFOAM project.
This is identical to the WM_PROJECT_DIR value, but we avoid that This is identical to the WM_PROJECT_DIR value, but we avoid that
variable since it would mask the normal OpenFOAM cleanup of variable since it would mask the normal OpenFOAM cleanup of
previous versions. previous versions.

View file

@ -64,6 +64,7 @@
import os import os
from spack import * from spack import *
from spack.environment import EnvironmentModifications
import llnl.util.tty as tty import llnl.util.tty as tty
@ -150,8 +151,9 @@ def _write_environ_file(output, environ, formatter):
Also descends into sub-dict and sub-list, but drops the key. Also descends into sub-dict and sub-list, but drops the key.
""" """
with open(output, 'w') as outfile: with open(output, 'w') as outfile:
outfile.write('# SPACK settings\n\n') outfile.write('# spack generated\n')
_write_environ_entries(outfile, environ, formatter) _write_environ_entries(outfile, environ, formatter)
outfile.write('# spack\n')
def write_environ(environ, **kwargs): def write_environ(environ, **kwargs):
@ -260,6 +262,7 @@ class OpenfoamCom(Package):
in 2004. in 2004.
""" """
maintainers = ['olesenm']
homepage = "http://www.openfoam.com/" homepage = "http://www.openfoam.com/"
baseurl = "https://sourceforge.net/projects/openfoamplus/files/" baseurl = "https://sourceforge.net/projects/openfoamplus/files/"
gitrepo = "https://develop.openfoam.com/Development/OpenFOAM-plus.git" gitrepo = "https://develop.openfoam.com/Development/OpenFOAM-plus.git"
@ -367,13 +370,72 @@ class OpenfoamCom(Package):
# #
def setup_environment(self, spack_env, run_env): def setup_environment(self, spack_env, run_env):
"""Add environment variables to the generated module file.
These environment variables come from running:
.. code-block:: console
$ . $WM_PROJECT_DIR/etc/bashrc
"""
# NOTE: Spack runs setup_environment twice.
# 1) pre-build to set up the build environment
# 2) post-install to determine runtime environment variables
# The etc/bashrc is only available (with corrrect content)
# post-installation.
bashrc = join_path(self.projectdir, 'etc', 'bashrc')
minimal = True
if os.path.isfile(bashrc):
# post-install: source the installed bashrc
try:
mods = EnvironmentModifications.from_sourcing_file(
bashrc,
clean=True, # Remove duplicate entries
blacklist=[ # Blacklist these
# Inadvertent changes
# -------------------
'PS1', # Leave unaffected
'MANPATH', # Leave unaffected
# Unneeded bits
# -------------
'FOAM_SETTINGS', # Do not use with modules
'FOAM_INST_DIR', # Old
'FOAM_(APP|ETC|SRC|SOLVERS|UTILITIES)',
# 'FOAM_TUTORIALS', # can be useful
'WM_OSTYPE', # Purely optional value
# Third-party cruft - only used for orig compilation
# -----------------
'[A-Z].*_ARCH_PATH',
'(KAHIP|METIS|SCOTCH)_VERSION',
# User-specific
# -------------
'FOAM_RUN',
'(FOAM|WM)_.*USER_.*',
],
whitelist=[ # Whitelist these
'MPI_ARCH_PATH', # Can be needed for compilation
])
run_env.extend(mods)
minimal = False
tty.info('OpenFOAM bashrc env: {0}'.format(bashrc))
except Exception:
minimal = True
if minimal:
# pre-build or minimal environment
tty.info('OpenFOAM minimal env {0}'.format(self.prefix))
run_env.set('FOAM_PROJECT_DIR', self.projectdir) run_env.set('FOAM_PROJECT_DIR', self.projectdir)
run_env.set('WM_PROJECT_DIR', self.projectdir) run_env.set('WM_PROJECT_DIR', self.projectdir)
for d in ['wmake', self.archbin]: # bin already added automatically for d in ['wmake', self.archbin]: # bin added automatically
run_env.prepend_path('PATH', join_path(self.projectdir, d)) run_env.prepend_path('PATH', join_path(self.projectdir, d))
def setup_dependent_environment(self, spack_env, run_env, dependent_spec): def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
"""Provide location of the OpenFOAM project. """Location of the OpenFOAM project directory.
This is identical to the WM_PROJECT_DIR value, but we avoid that This is identical to the WM_PROJECT_DIR value, but we avoid that
variable since it would mask the normal OpenFOAM cleanup of variable since it would mask the normal OpenFOAM cleanup of
previous versions. previous versions.
@ -468,6 +530,7 @@ def configure(self, spec, prefix):
], ],
'scotch': {}, 'scotch': {},
'metis': {}, 'metis': {},
'ensight': {}, # Disable settings
'paraview': [], 'paraview': [],
'gperftools': [], # Currently unused 'gperftools': [], # Currently unused
} }
@ -613,12 +676,6 @@ def install_links(self):
]: ]:
os.symlink(f, os.path.basename(f)) os.symlink(f, os.path.basename(f))
def openfoam_run_environment(self, projdir):
# This seems to bomb out with an ImportError 'site'!
# mods = EnvironmentModifications.from_sourcing_files(
# join_path(projdir, 'etc/bashrc'))
pass
# ----------------------------------------------------------------------------- # -----------------------------------------------------------------------------

View file

@ -137,13 +137,18 @@ class OpenfoamOrg(Package):
# #
def setup_environment(self, spack_env, run_env): def setup_environment(self, spack_env, run_env):
# This should be similar to the openfoam-com package,
# but sourcing the etc/bashrc here seems to exit with an error.
# ... this needs to be examined in more detail.
#
# Minimal environment only.
run_env.set('FOAM_PROJECT_DIR', self.projectdir) run_env.set('FOAM_PROJECT_DIR', self.projectdir)
run_env.set('WM_PROJECT_DIR', self.projectdir) run_env.set('WM_PROJECT_DIR', self.projectdir)
for d in ['wmake', self.archbin]: # bin already added automatically for d in ['wmake', self.archbin]: # bin already added automatically
run_env.prepend_path('PATH', join_path(self.projectdir, d)) run_env.prepend_path('PATH', join_path(self.projectdir, d))
def setup_dependent_environment(self, spack_env, run_env, dependent_spec): def setup_dependent_environment(self, spack_env, run_env, dependent_spec):
"""Provide location of the OpenFOAM project. """Location of the OpenFOAM project directory.
This is identical to the WM_PROJECT_DIR value, but we avoid that This is identical to the WM_PROJECT_DIR value, but we avoid that
variable since it would mask the normal OpenFOAM cleanup of variable since it would mask the normal OpenFOAM cleanup of
previous versions. previous versions.