def environment_modifications(self): """List of environment modifications to be processed.""" # Modifications guessed inspecting the spec prefix env = spack.environment.inspect_path( self.spec.prefix, prefix_inspections, exclude=spack.util.environment.is_system_path) # Modifications that are coded at package level _ = spack.environment.EnvironmentModifications() # TODO : the code down below is quite similar to # TODO : build_environment.setup_package and needs to be factored out # TODO : to a single place # Let the extendee/dependency modify their extensions/dependencies # before asking for package-specific modifications for item in dependencies(self.spec, 'all'): package = self.spec[item.name].package modules = build_environment.parent_class_modules(package.__class__) for mod in modules: build_environment.set_module_variables_for_package( package, mod) build_environment.set_module_variables_for_package( package, package.module) package.setup_dependent_package(self.spec.package.module, self.spec) package.setup_dependent_environment(_, env, self.spec) # Package specific modifications build_environment.set_module_variables_for_package( self.spec.package, self.spec.package.module) self.spec.package.setup_environment(_, env) # Modifications required from modules.yaml env.extend(self.conf.env) # List of variables that are blacklisted in modules.yaml blacklist = self.conf.environment_blacklist # We may have tokens to substitute in environment commands # Prepare a suitable transformation dictionary for the names # of the environment variables. This means turn the valid # tokens uppercase. transform = {} for token in _valid_tokens: transform[token] = str.upper for x in env: # Ensure all the tokens are valid in this context msg = 'some tokens cannot be expanded in an environment variable name' # noqa: E501 _check_tokens_are_valid(x.name, message=msg) # Transform them x.name = self.spec.format(x.name, transform=transform) try: # Not every command has a value x.value = self.spec.format(x.value) except AttributeError: pass x.name = str(x.name).replace('-', '_') return [(type(x).__name__, x) for x in env if x.name not in blacklist]
def environment_modifications(self): """List of environment modifications to be processed.""" # Modifications guessed inspecting the spec prefix env = spack.environment.inspect_path( self.spec.prefix, prefix_inspections, exclude=spack.util.environment.is_system_path) # Modifications that are coded at package level _ = spack.environment.EnvironmentModifications() # TODO : the code down below is quite similar to # TODO : build_environment.setup_package and needs to be factored out # TODO : to a single place # Let the extendee/dependency modify their extensions/dependencies # before asking for package-specific modifications for item in dependencies(self.spec, 'all'): package = self.spec[item.name].package modules = build_environment.parent_class_modules(package.__class__) for mod in modules: build_environment.set_module_variables_for_package( package, mod) build_environment.set_module_variables_for_package( package, package.module) package.setup_dependent_package(self.spec.package.module, self.spec) package.setup_dependent_environment(_, env, self.spec) # Package specific modifications build_environment.set_module_variables_for_package( self.spec.package, self.spec.package.module) self.spec.package.setup_environment(_, env) # Modifications required from modules.yaml env.extend(self.conf.env) # List of variables that are blacklisted in modules.yaml blacklist = self.conf.environment_blacklist # We may have tokens to substitute in environment commands for x in env: x.name = self.spec.format(x.name) try: # Not every command has a value x.value = self.spec.format(x.value) except AttributeError: pass x.name = str(x.name).replace('-', '_').upper() return [(type(x).__name__, x) for x in env if x.name not in blacklist]
def environment_modifications(self): """List of environment modifications to be processed.""" # Modifications guessed inspecting the spec prefix env = spack.environment.inspect_path( self.spec.prefix, prefix_inspections, exclude=spack.util.environment.is_system_path ) # Modifications that are coded at package level _ = spack.environment.EnvironmentModifications() # TODO : the code down below is quite similar to # TODO : build_environment.setup_package and needs to be factored out # TODO : to a single place # Let the extendee/dependency modify their extensions/dependencies # before asking for package-specific modifications for item in dependencies(self.spec, 'all'): package = self.spec[item.name].package modules = build_environment.parent_class_modules(package.__class__) for mod in modules: build_environment.set_module_variables_for_package( package, mod ) build_environment.set_module_variables_for_package( package, package.module ) package.setup_dependent_package( self.spec.package.module, self.spec ) package.setup_dependent_environment(_, env, self.spec) # Package specific modifications build_environment.set_module_variables_for_package( self.spec.package, self.spec.package.module ) self.spec.package.setup_environment(_, env) # Modifications required from modules.yaml env.extend(self.conf.env) # List of variables that are blacklisted in modules.yaml blacklist = self.conf.environment_blacklist # We may have tokens to substitute in environment commands # Prepare a suitable transformation dictionary for the names # of the environment variables. This means turn the valid # tokens uppercase. transform = {} for token in _valid_tokens: transform[token] = str.upper for x in env: # Ensure all the tokens are valid in this context msg = 'some tokens cannot be expanded in an environment variable name' # noqa: E501 _check_tokens_are_valid(x.name, message=msg) # Transform them x.name = self.spec.format(x.name, transform=transform) try: # Not every command has a value x.value = self.spec.format(x.value) except AttributeError: pass x.name = str(x.name).replace('-', '_') return [(type(x).__name__, x) for x in env if x.name not in blacklist]
def write(self): """ Writes out a module file for this object. This method employs a template pattern and expects derived classes to: - override the header property - provide formats for autoload, prerequisites and environment changes """ if self.blacklisted: return tty.debug("\tWRITE : %s [%s]" % (self.spec.cshort_spec, self.file_name)) module_dir = os.path.dirname(self.file_name) if not os.path.exists(module_dir): mkdirp(module_dir) # Environment modifications guessed by inspecting the # installation prefix env = inspect_path(self.spec.prefix) # Let the extendee/dependency modify their extensions/dependencies # before asking for package-specific modifications spack_env = EnvironmentModifications() # TODO : the code down below is quite similar to # TODO : build_environment.setup_package and needs to be factored out # TODO : to a single place for item in dependencies(self.spec, 'all'): package = self.spec[item.name].package modules = parent_class_modules(package.__class__) for mod in modules: set_module_variables_for_package(package, mod) set_module_variables_for_package(package, package.module) package.setup_dependent_package(self.pkg.module, self.spec) package.setup_dependent_environment(spack_env, env, self.spec) # Package-specific environment modifications set_module_variables_for_package(self.pkg, self.pkg.module) self.spec.package.setup_environment(spack_env, env) # Parse configuration file module_configuration, conf_env = parse_config_options(self) env.extend(conf_env) filters = module_configuration.get('filter', {}).get('environment_blacklist', {}) # Build up the module file content module_file_content = self.header for x in filter_blacklisted(module_configuration.pop('autoload', []), self.name): module_file_content += self.autoload(x) for x in filter_blacklisted( module_configuration.pop('prerequisites', []), self.name): module_file_content += self.prerequisite(x) for line in self.process_environment_command( filter_environment_blacklist(env, filters)): module_file_content += line for line in self.module_specific_content(module_configuration): module_file_content += line # Dump to file with open(self.file_name, 'w') as f: f.write(module_file_content)
def write(self): """ Writes out a module file for this object. This method employs a template pattern and expects derived classes to: - override the header property - provide formats for autoload, prerequisites and environment changes """ if self.blacklisted: return tty.debug("\tWRITE : %s [%s]" % (self.spec.cshort_spec, self.file_name)) module_dir = os.path.dirname(self.file_name) if not os.path.exists(module_dir): mkdirp(module_dir) # Environment modifications guessed by inspecting the # installation prefix env = inspect_path(self.spec.prefix) # Let the extendee/dependency modify their extensions/dependencies # before asking for package-specific modifications spack_env = EnvironmentModifications() # TODO : the code down below is quite similar to # TODO : build_environment.setup_package and needs to be factored out # TODO : to a single place for item in dependencies(self.spec, 'all'): package = self.spec[item.name].package modules = parent_class_modules(package.__class__) for mod in modules: set_module_variables_for_package(package, mod) set_module_variables_for_package(package, package.module) package.setup_dependent_package(self.pkg.module, self.spec) package.setup_dependent_environment(spack_env, env, self.spec) # Package-specific environment modifications set_module_variables_for_package(self.pkg, self.pkg.module) self.spec.package.setup_environment(spack_env, env) # Parse configuration file module_configuration, conf_env = parse_config_options(self) env.extend(conf_env) filters = module_configuration.get('filter', {}).get( 'environment_blacklist', {}) # Build up the module file content module_file_content = self.header for x in filter_blacklisted( module_configuration.pop('autoload', []), self.name): module_file_content += self.autoload(x) for x in filter_blacklisted( module_configuration.pop('prerequisites', []), self.name): module_file_content += self.prerequisite(x) for line in self.process_environment_command( filter_environment_blacklist(env, filters)): module_file_content += line for line in self.module_specific_content(module_configuration): module_file_content += line # Dump to file with open(self.file_name, 'w') as f: f.write(module_file_content)