Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
# optimized build, no error checking, timing or debug info
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 '
if impi_root:
# put wrappers for Intel MPI compiler wrappers in place
# (required to make sure license server and I_MPI_ROOT are found)
for compiler in (os.getenv('MPICC'), os.getenv('MPICXX')):
self.write_wrapper(wrapper_dir, compiler, os.getenv('I_MPI_ROOT'))
use_wrapper = True
# set correct value for MPI_HOME
mpi_home = os.path.join(impi_root, 'intel64')
else:
self.log.debug("MPI module name: %s", self.toolchain.MPI_MODULE_NAME[0])
mpi_home = get_software_root(self.toolchain.MPI_MODULE_NAME[0])
self.log.debug("Derived value for MPI_HOME: %s", mpi_home)
if use_wrapper:
env.setvar('PATH', os.pathsep.join([wrapper_dir, os.getenv('PATH')]))
self.prepare_python()
self.handle_jemalloc()
cuda_root = get_software_root('CUDA')
cudnn_root = get_software_root('cuDNN')
opencl_root = get_software_root('OpenCL')
tensorrt_root = get_software_root('TensorRT')
nccl_root = get_software_root('NCCL')
config_env_vars = {
'CC_OPT_FLAGS': os.getenv('CXXFLAGS'),
'MPI_HOME': mpi_home,
'PYTHON_BIN_PATH': self.python_cmd,
'PYTHON_LIB_PATH': os.path.join(self.installdir, self.pylibdir),
# avoid having special characters like '[' and ']' in the tmpdir pathname,
# it is known to cause problems (e.g., with Python install tools, CUDA's nvcc, etc.);
# only common characteris like alphanumeric, '_', '-', '.' and '/' are retained; others are converted to 'X'
special_chars_regex = r'[^\w/.-]'
if re.search(special_chars_regex, current_tmpdir):
current_tmpdir = re.sub(special_chars_regex, 'X', current_tmpdir)
_log.info("Detected special characters in path to temporary directory, replacing them to avoid trouble: %s")
try:
os.makedirs(current_tmpdir)
except OSError as err:
raise EasyBuildError("Failed to create path to temporary directory %s: %s", current_tmpdir, err)
_log.info("Temporary directory used in this EasyBuild run: %s" % current_tmpdir)
for var in ['TMPDIR', 'TEMP', 'TMP']:
env.setvar(var, current_tmpdir, verbose=False)
# reset to make sure tempfile picks up new temporary directory to use
tempfile.tempdir = None
# test if temporary directory allows to execute files, warn if it doesn't
try:
fd, tmptest_file = tempfile.mkstemp()
os.close(fd)
os.chmod(tmptest_file, 0o700)
if not run_cmd(tmptest_file, simple=True, log_ok=False, regexp=False, force_in_dry_run=True, trace=False,
stream_output=False):
msg = "The temporary directory (%s) does not allow to execute files. " % tempfile.gettempdir()
msg += "This can cause problems in the build process, consider using --tmpdir."
if raise_error:
raise EasyBuildError(msg)
else:
elif type(dontset) == list:
dontsetlist = dontset
for key, val in self.vars.items():
if key in dontsetlist:
self.log.debug("Not setting environment variable %s (value: %s)." % (key, val))
continue
self.log.debug("Setting environment variable %s to %s" % (key, val))
env.setvar(key, val)
# also set unique named variables that can be used in Makefiles
# - so you can have 'CFLAGS = $(EBVARCFLAGS)'
# -- 'CLFLAGS = $(CFLAGS)' gives '*** Recursive variable `CFLAGS'
# references itself (eventually). Stop' error
env.setvar("EBVAR%s" % key, val)
# complete template script and put it in place
cmd_wrapper_txt = read_file(rpath_wrapper_template) % {
'orig_cmd': orig_cmd,
'python': sys.executable,
'rpath_args_py': rpath_args_py,
'rpath_filter': rpath_filter,
'rpath_include': rpath_include,
'rpath_wrapper_log': rpath_wrapper_log,
'wrapper_dir': wrapper_dir,
}
write_file(cmd_wrapper, cmd_wrapper_txt)
adjust_permissions(cmd_wrapper, stat.S_IXUSR)
self.log.info("Wrapper script for %s: %s (log: %s)", orig_cmd, which(cmd), rpath_wrapper_log)
# prepend location to this wrapper to $PATH
setvar('PATH', '%s:%s' % (wrapper_dir, os.getenv('PATH')))
else:
self.log.debug("Not installing RPATH wrapper for non-existing command '%s'", cmd)
# workaround for mktmp: create tmp dir and use it
tmpdir = os.path.join(self.cfg['start_dir'], 'mytmpdir')
try:
os.makedirs(tmpdir)
except:
self.log.exception("Directory %s can't be created" % (tmpdir))
tmppathopt = ''
if self.cfg['usetmppath']:
env.setvar('TMP_PATH', tmpdir)
tmppathopt = "-t %s" % tmpdir
# set some extra env variables
env.setvar('LOCAL_INSTALL_VERBOSE','1')
env.setvar('VERBOSE_MODE', '1')
env.setvar('INSTALL_PATH', self.installdir)
# perform installation
cmd = "./install.sh %s -s %s" % (tmppathopt, silentcfg)
return run_cmd(cmd, log_all=True, simple=True)
def prepare_compiler_cache(self, cache_tool):
"""
Prepare for using specified compiler caching tool (e.g., ccache, f90cache)
:param cache_tool: name of compiler caching tool to prepare for
"""
compilers = self.comp_cache_compilers(cache_tool)
self.log.debug("Using compiler cache tool '%s' for compilers: %s", cache_tool, compilers)
# set paths that should be used by compiler caching tool
comp_cache_path = build_option('use_%s' % cache_tool)
setvar('%s_DIR' % cache_tool.upper(), comp_cache_path)
setvar('%s_TEMPDIR' % cache_tool.upper(), tempfile.mkdtemp())
cache_path = which(cache_tool)
if cache_path is None:
raise EasyBuildError("%s binary not found in $PATH, required by --use-compiler-cache", cache_tool)
else:
self.symlink_commands({cache_tool: (cache_path, compilers)})
self.cached_compilers.update(compilers)
self.log.debug("Cached compilers (after preparing for %s): %s", cache_tool, self.cached_compilers)
# create expected directories
abs_pylibdir = os.path.join(self.installdir, self.pylibdir)
mkdir(abs_pylibdir, parents=True)
# set PYTHONPATH as expected
pythonpath = os.getenv('PYTHONPATH')
env.setvar('PYTHONPATH', ":".join([x for x in [abs_pylibdir, pythonpath] if x is not None]))
# actually install Python package
tup = (self.cfg['preinstallopts'], self.installdir, self.cfg['installopts'])
cmd = "%s python setup.py install --prefix=%s %s" % tup
run_cmd(cmd, log_all=True, simple=True)
# restore PYTHONPATH if it was set
if pythonpath is not None:
env.setvar('PYTHONPATH', pythonpath)
dry_run_msg("Defining build environment...\n", silent=not verbose)
donotsetlist = []
if isinstance(donotset, str):
# TODO : more legacy code that should be using proper type
raise EasyBuildError("_setenv_variables: using commas-separated list. should be deprecated.")
elif isinstance(donotset, list):
donotsetlist = donotset
for key, val in sorted(self.vars.items()):
if key in donotsetlist:
self.log.debug("_setenv_variables: not setting environment variable %s (value: %s).", key, val)
continue
self.log.debug("_setenv_variables: setting environment variable %s to %s", key, val)
setvar(key, val, verbose=verbose)
# also set unique named variables that can be used in Makefiles
# - so you can have 'CFLAGS = $(EBVARCFLAGS)'
# -- 'CLFLAGS = $(CFLAGS)' gives '*** Recursive variable `CFLAGS'
# references itself (eventually). Stop' error
setvar("EBVAR%s" % key, val, verbose=False)