Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# JasPer dependency check + setting env vars
jasper = get_software_root('JasPer')
jasperlibdir = os.path.join(jasper, "lib")
if jasper:
env.set('JASPERINC', os.path.join(jasper, "include"))
env.set('JASPERLIB', jasperlibdir)
else:
if os.getenv('JASPERINC') or os.getenv('JASPERLIB'):
self.log.error("JasPer module not loaded, but JASPERINC and/or JASPERLIB still set?")
else:
self.log.info("JasPer module not loaded, assuming that's OK...")
# enable support for large file support in netCDF
env.set('WRFIO_NCD_LARGE_FILE_SUPPORT', '1')
# patch arch/Config_new.pl script, so that run_cmd_qa receives all output to answer questions
patch_perl_script_autoflush(os.path.join("arch", "Config_new.pl"))
# determine build type option to look for
build_type_option = None
self.comp_fam = self.toolkit().comp_family()
if self.comp_fam == toolkit.INTEL:
build_type_option = "Linux x86_64 i486 i586 i686, ifort compiler with icc"
elif self.comp_fam == toolkit.GCC:
build_type_option = "x86_64 Linux, gfortran compiler with gcc"
else:
self.log.error("Don't know how to figure out build type to select.")
def prepare(self, *args, **kwargs):
"""Prepare to use this toolchain; define $CRAYPE_LINK_TYPE if 'dynamic' toolchain option is enabled."""
super(CrayPECompiler, self).prepare(*args, **kwargs)
if self.options['dynamic'] or self.options['shared']:
self.log.debug("Enabling building of shared libs/dynamically linked executables via $CRAYPE_LINK_TYPE")
env.setvar('CRAYPE_LINK_TYPE', 'dynamic')
(True, lambda x: env.reset_changes),
(True, lambda x: x.handle_iterate_opts),
def install_step(self):
"""CPLEX has an interactive installer, so use Q&A"""
tmpdir = os.path.join(self.builddir, 'tmp')
try:
os.chdir(self.builddir)
os.makedirs(tmpdir)
except OSError, err:
self.log.exception("Failed to prepare for installation: %s" % err)
env.setvar('IATEMPDIR', tmpdir)
dst = os.path.join(self.builddir, self.src[0]['name'])
# Run the source
cmd = "%s -i console" % dst
qanda = {
"PRESS TO CONTINUE:":"",
'Press Enter to continue viewing the license agreement, or enter' \
' "1" to accept the agreement, "2" to decline it, "3" to print it,' \
' or "99" to go back to the previous screen.:':'1',
'ENTER AN ABSOLUTE PATH, OR PRESS TO ACCEPT THE DEFAULT :':self.installdir,
'IS THIS CORRECT? (Y/N):':'y',
'PRESS TO INSTALL:':"",
"PRESS TO EXIT THE INSTALLER:":"",
"CHOOSE LOCALE BY NUMBER:":"",
"Choose Instance Management Option:":""
def sanity_check_rpath(self, rpath_dirs=None):
"""Sanity check binaries/libraries w.r.t. RPATH linking."""
fails = []
# hard reset $LD_LIBRARY_PATH before running RPATH sanity check
orig_env = env.unset_env_vars(['LD_LIBRARY_PATH'])
self.log.debug("$LD_LIBRARY_PATH during RPATH sanity check: %s", os.getenv('LD_LIBRARY_PATH', '(empty)'))
self.log.debug("List of loaded modules: %s", self.modules_tool.list())
not_found_regex = re.compile('not found', re.M)
readelf_rpath_regex = re.compile('(RPATH)', re.M)
if rpath_dirs is None:
rpath_dirs = ['bin', 'lib', 'lib64']
self.log.info("Using default subdirs for binaries/libraries to verify RPATH linking: %s", rpath_dirs)
else:
self.log.info("Using specified subdirs for binaries/libraries to verify RPATH linking: %s", rpath_dirs)
for dirpath in [os.path.join(self.installdir, d) for d in rpath_dirs]:
if os.path.exists(dirpath):
self.log.debug("Sanity checking RPATH for files in %s", dirpath)
sys.stdout.write(line)
except IOError, err:
self.log.error("Failed to patch %s script: %s" % (self.compile_script, err))
# libpng dependency check
libpng = get_software_root('libpng')
libpnginc = "%s/include" % libpng
libpnglibdir = "%s/lib" % libpng
if not libpng:
self.log.error("libpng module not loaded?")
# JasPer dependency check + setting env vars
jasper = get_software_root('JasPer')
jasperlibdir = os.path.join(jasper, "lib")
if jasper:
env.set('JASPERINC', os.path.join(jasper, "include"))
env.set('JASPERLIB', jasperlibdir)
else:
self.log.error("JasPer module not loaded?")
# patch ungrib Makefile so that JasPer is found
fn = os.path.join("ungrib", "src", "Makefile")
jasperlibs = "-L%s -ljasper -L%s -lpng" % (jasperlibdir, libpnglibdir)
try:
for line in fileinput.input(fn, inplace=1, backup='.orig.JasPer'):
line = re.sub(r"^(\s*-L\.\s*-l\$\(LIBTARGET\))(\s*;.*)$", r"\1 %s\2" % jasperlibs, line)
line = re.sub(r"^(\s*\$\(COMPRESSION_LIBS\))(\s*;.*)$", r"\1 %s\2" % jasperlibs, line)
sys.stdout.write(line)
except IOError, err:
self.log.error("Failed to patch %s: %s" % (fn, err))
# patch arch/Config.pl script, so that run_cmd_qa receives all output to answer questions
Usage: module load name, which loads the module you want to use. $EBDEVELNAME should then be the full path
to the devel module file. So now you can module load $EBDEVELNAME.
WARNING: you cannot unload using $EBDEVELNAME (for now: use module unload `basename $EBDEVELNAME`)
"""
self.log.info("Making devel module...")
# load fake module
fake_mod_data = self.load_fake_module(purge=True)
mod_gen = ModuleGenerator(self)
header = "#%Module\n"
env_txt = ""
for (key, val) in env.changes.items():
# check if non-empty string
# TODO: add unset for empty vars?
if val.strip():
env_txt += mod_gen.set_environment(key, val)
load_txt = ""
# capture all the EBDEVEL vars
# these should be all the dependencies and we should load them
for key in os.environ:
# legacy support
if key.startswith(DEVEL_ENV_VAR_NAME_PREFIX) or key.startswith("SOFTDEVEL"):
if key.startswith("SOFTDEVEL"):
self.log.deprecated("Environment variable SOFTDEVEL* being relied on", "2.0")
if not key.endswith(convert_name(self.name, upper=True)):
path = os.environ[key]
if os.path.isfile(path):
def set_netcdf_env_vars(log):
"""Set netCDF environment variables used by other software."""
netcdf = get_software_root('netCDF')
if not netcdf:
log.error("netCDF module not loaded?")
else:
env.setvar('NETCDF', netcdf)
log.debug("Set NETCDF to %s" % netcdf)
netcdff = get_software_root('netCDF-Fortran')
netcdf_ver = get_software_version('netCDF')
if not netcdff:
if LooseVersion(netcdf_ver) >= LooseVersion("4.2"):
log.error("netCDF v4.2 no longer supplies Fortran library, also need netCDF-Fortran")
else:
env.setvar('NETCDFF', netcdff)
log.debug("Set NETCDFF to %s" % netcdff)
fail_msg = "Failed to run 'readelf %s': %s" % (path, out)
self.log.warning(fail_msg)
fails.append(fail_msg)
elif not readelf_rpath_regex.search(out):
fail_msg = "No '(RPATH)' found in 'readelf -d' output for %s: %s" % (path, out)
self.log.warning(fail_msg)
fails.append(fail_msg)
else:
self.log.debug("Output of 'readelf -d %s' checked, looks OK", path)
else:
self.log.debug("%s is not dynamically linked, so skipping it in RPATH sanity check", path)
else:
self.log.debug("Not sanity checking files in non-existing directory %s", dirpath)
env.restore_env_vars(orig_env)
return fails
add_configopts += '--enable-fast '
# enable shared libraries, using GCC and GNU ld options
add_configopts += '--enable-shared --enable-sharedlibs=gcc '
# enable Fortran 77/90 and C++ bindings
add_configopts += '--enable-f77 --enable-fc --enable-cxx '
# MVAPICH configure script complains when F90 or F90FLAGS are set,
# they should be replaced with FC/FCFLAGS instead
for (envvar, new_envvar) in [("F90", "FC"), ("F90FLAGS", "FCFLAGS")]:
envvar_val = os.getenv(envvar)
if envvar_val:
if not os.getenv(new_envvar):
env.setvar(new_envvar, envvar_val)
env.setvar(envvar, '')
else:
self.log.error("Both %(ev)s and %(nev)s set, can I overwrite %(nev)s with %(ev)s (%(evv)s) ?" %
{
'ev': envvar,
'nev': new_envvar,
'evv': envvar_val
})
# enable specific support options (if desired)
if self.cfg['withmpe']:
add_configopts += '--enable-mpe '
if self.cfg['withlimic2']:
add_configopts += '--enable-limic2 '
if self.cfg['withchkpt']:
add_configopts += '--enable-checkpointing --with-hydra-ckpointlib=blcr '