def _verify_toolchain(self): """Verify toolchain: check toolchain definition against dependencies of toolchain module.""" # determine direct toolchain dependencies mod_name = self.det_short_module_name() self.toolchain_dep_mods = dependencies_for(mod_name, self.modules_tool, depth=0) self.log.debug('prepare: list of direct toolchain dependencies: %s' % self.toolchain_dep_mods) # only retain names of toolchain elements, excluding toolchain name toolchain_definition = set([e for es in self.definition().values() for e in es if not e == self.name]) # filter out optional toolchain elements if they're not used in the module for elem_name in toolchain_definition.copy(): if self.is_required(elem_name) or self.is_dep_in_toolchain_module(elem_name): continue # not required and missing: remove from toolchain definition self.log.debug("Removing %s from list of optional toolchain elements." % elem_name) toolchain_definition.remove(elem_name) self.log.debug("List of toolchain dependencies from toolchain module: %s" % self.toolchain_dep_mods) self.log.debug("List of toolchain elements from toolchain definition: %s" % toolchain_definition) if all(map(self.is_dep_in_toolchain_module, toolchain_definition)): self.log.info("List of toolchain dependency modules and toolchain definition match!") else: raise EasyBuildError("List of toolchain dependency modules and toolchain definition do not match " "(found %s vs expected %s)", self.toolchain_dep_mods, toolchain_definition)
def _verify_toolchain(self): """Verify toolchain: check toolchain definition against dependencies of toolchain module.""" # determine direct toolchain dependencies mod_name = self.det_short_module_name() self.toolchain_dep_mods = dependencies_for(mod_name, self.modules_tool, depth=0) self.log.debug('prepare: list of direct toolchain dependencies: %s' % self.toolchain_dep_mods) # only retain names of toolchain elements, excluding toolchain name toolchain_definition = set([e for es in self.definition().values() for e in es if not e == self.name]) # filter out optional toolchain elements if they're not used in the module for elem_name in toolchain_definition.copy(): if self.is_required(elem_name) or self.is_dep_in_toolchain_module(elem_name): continue # not required and missing: remove from toolchain definition self.log.debug("Removing %s from list of optional toolchain elements." % elem_name) toolchain_definition.remove(elem_name) self.log.debug("List of toolchain dependencies from toolchain module: %s" % self.toolchain_dep_mods) self.log.debug("List of toolchain elements from toolchain definition: %s" % toolchain_definition) if all(map(self.is_dep_in_toolchain_module, toolchain_definition)): self.log.info("List of toolchain dependency modules and toolchain definition match!") else: raise EasyBuildError("List of toolchain dependency modules and toolchain definition do not match " "(found %s vs expected %s)", self.toolchain_dep_mods, toolchain_definition)
def prepare(self, onlymod=None): """ Prepare a set of environment parameters based on name/version of toolchain - load modules for toolchain and dependencies - generate extra variables and set them in the environment onlymod: Boolean/string to indicate if the toolchain should only load the environment with module (True) or also set all other variables (False) like compiler CC etc (If string: comma separated list of variables that will be ignored). """ if self.modules_tool is None: raise EasyBuildError("No modules tool defined in Toolchain instance.") if not self._toolchain_exists(): raise EasyBuildError("No module found for toolchain: %s", self.mod_short_name) if self.name == DUMMY_TOOLCHAIN_NAME: if self.version == DUMMY_TOOLCHAIN_VERSION: self.log.info('prepare: toolchain dummy mode, dummy version; not loading dependencies') else: self.log.info('prepare: toolchain dummy mode and loading dependencies') self._prepare_dependencies() return # Load the toolchain and dependencies modules self.log.debug("Loading toolchain module and dependencies...") # make sure toolchain is available using short module name by running 'module use' on module path subdir if self.init_modpaths: mod_path_suffix = build_option('suffix_modules_path') for modpath in self.init_modpaths: self.modules_tool.prepend_module_path(os.path.join(install_path('mod'), mod_path_suffix, modpath)) self.modules_tool.load([self.det_short_module_name()]) self._prepare_dependencies() # determine direct toolchain dependencies mod_name = self.det_short_module_name() self.toolchain_dep_mods = dependencies_for(mod_name, depth=0) self.log.debug('prepare: list of direct toolchain dependencies: %s' % self.toolchain_dep_mods) # only retain names of toolchain elements, excluding toolchain name toolchain_definition = set([e for es in self.definition().values() for e in es if not e == self.name]) # filter out optional toolchain elements if they're not used in the module for elem_name in toolchain_definition.copy(): if self.is_required(elem_name) or self.is_dep_in_toolchain_module(elem_name): continue # not required and missing: remove from toolchain definition self.log.debug("Removing %s from list of optional toolchain elements." % elem_name) toolchain_definition.remove(elem_name) self.log.debug("List of toolchain dependencies from toolchain module: %s" % self.toolchain_dep_mods) self.log.debug("List of toolchain elements from toolchain definition: %s" % toolchain_definition) if all(map(self.is_dep_in_toolchain_module, toolchain_definition)): self.log.info("List of toolchain dependency modules and toolchain definition match!") else: raise EasyBuildError("List of toolchain dependency modules and toolchain definition do not match " "(%s vs %s)", self.toolchain_dep_mods, toolchain_definition) # Generate the variables to be set self.set_variables() # set the variables # onlymod can be comma-separated string of variables not to be set if onlymod == True: self.log.debug("prepare: do not set additional variables onlymod=%s" % onlymod) self.generate_vars() else: self.log.debug("prepare: set additional variables onlymod=%s" % onlymod) # add LDFLAGS and CPPFLAGS from dependencies to self.vars self._add_dependency_variables() self.generate_vars() self._setenv_variables(onlymod)