diff --git a/easybuild/framework/easyconfig/tools.py b/easybuild/framework/easyconfig/tools.py index 197f4e5484..6bd246630e 100644 --- a/easybuild/framework/easyconfig/tools.py +++ b/easybuild/framework/easyconfig/tools.py @@ -188,7 +188,7 @@ def mk_node_name(spec): all_nodes.add(spec['module']) spec['ec'].all_dependencies = [mk_node_name(s) for s in spec['ec'].all_dependencies] all_nodes.update(spec['ec'].all_dependencies) - + # Get the build dependencies for each spec so we can distinguish them later spec['ec'].build_dependencies = [mk_node_name(s) for s in spec['ec']['builddependencies']] all_nodes.update(spec['ec'].build_dependencies) diff --git a/easybuild/tools/docs.py b/easybuild/tools/docs.py index 283e6e13c6..221386a584 100644 --- a/easybuild/tools/docs.py +++ b/easybuild/tools/docs.py @@ -53,9 +53,10 @@ from easybuild.framework.easyconfig.templates import TEMPLATE_NAMES_EASYBLOCK_RUN_STEP, TEMPLATE_CONSTANTS from easybuild.framework.easyconfig.templates import TEMPLATE_SOFTWARE_VERSIONS from easybuild.framework.extension import Extension +from easybuild.tools.build_log import EasyBuildError from easybuild.tools.filetools import read_file from easybuild.tools.ordereddict import OrderedDict -from easybuild.tools.toolchain.utilities import search_toolchain +from easybuild.tools.toolchain.utilities import get_toolchain, search_toolchain from easybuild.tools.utilities import import_available_modules, quote_str @@ -556,6 +557,50 @@ def list_toolchains_txt(tcs): return '\n'.join(doc) +def avail_toolchain_opts(name, output_format=FORMAT_TXT): + """Show list of known options for given toolchain.""" + tc_class, _ = search_toolchain(name) + if not tc_class: + raise EasyBuildError("Couldn't find toolchain: '%s'. To see available toolchains, use --list-toolchains" % name) + tc = tc_class(version='1.0') # version doesn't matter here, but needs to be defined + + options = [tc.COMPILER_SHARED_OPTS, tc.COMPILER_UNIQUE_OPTS, tc.MPI_SHARED_OPTS, tc.MPI_UNIQUE_OPTS] + + tc_dict = {} + for opt in options: + if opt is not None: + tc_dict.update(opt) + + return generate_doc('avail_toolchain_opts_%s' % output_format, [name, tc_dict]) + + +def avail_toolchain_opts_rst(name, tc_dict): + """ Returns overview of toolchain options in rst format """ + title = "Available options for %s toolchain:" % name + + table_titles = ['option', 'description', 'default'] + + tc_items = sorted(tc_dict.items()) + table_values = [ + ['``%s``' % val[0] for val in tc_items], + ['%s' % val[1][1] for val in tc_items], + ['``%s``' % val[1][0] for val in tc_items], + ] + + doc = rst_title_and_table(title, table_titles, table_values) + + return '\n'.join(doc) + + +def avail_toolchain_opts_txt(name, tc_dict): + """ Returns overview of toolchain options in txt format """ + doc = ["Available options for %s toolchain:" % name] + for opt_name in sorted(tc_dict.keys()): + doc.append("%s%s: %s (default: %s)" % (INDENT_4SPACES, opt_name, tc_dict[opt_name][1], tc_dict[opt_name][0])) + + return '\n'.join(doc) + + def gen_easyblocks_overview_rst(package_name, path_to_examples, common_params={}, doc_functions=[]): """ Compose overview of all easyblocks in the given package in rst format diff --git a/easybuild/tools/options.py b/easybuild/tools/options.py index f6daa721a4..838677a3ba 100644 --- a/easybuild/tools/options.py +++ b/easybuild/tools/options.py @@ -58,7 +58,8 @@ from easybuild.tools.configobj import ConfigObj, ConfigObjError from easybuild.tools.docs import FORMAT_TXT, FORMAT_RST from easybuild.tools.docs import avail_cfgfile_constants, avail_easyconfig_constants, avail_easyconfig_licenses -from easybuild.tools.docs import avail_easyconfig_params, avail_easyconfig_templates, list_easyblocks, list_toolchains +from easybuild.tools.docs import avail_toolchain_opts, avail_easyconfig_params, avail_easyconfig_templates +from easybuild.tools.docs import list_easyblocks, list_toolchains from easybuild.tools.environment import restore_env, unset_env_vars from easybuild.tools.filetools import mkdir from easybuild.tools.github import GITHUB_EB_MAIN, GITHUB_EASYCONFIGS_REPO, HAVE_GITHUB_API, HAVE_KEYRING @@ -407,6 +408,7 @@ def informative_options(self): 'avail-easyconfig-templates': (("Show all template names and template constants " "that can be used in easyconfigs."), None, 'store_true', False), + 'avail-toolchain-opts': ("Show options for toolchain", 'str', 'store', None), 'check-conflicts': ("Check for version conflicts in dependency graphs", None, 'store_true', False), 'dep-graph': ("Create dependency graph", None, 'store', None, {'metavar': 'depgraph.'}), 'dump-env-script': ("Dump source script to set up build environment based on toolchain/dependencies", @@ -602,7 +604,7 @@ def postprocess(self): self.options.avail_easyconfig_constants, self.options.avail_easyconfig_licenses, self.options.avail_repositories, self.options.show_default_moduleclasses, self.options.avail_modules_tools, self.options.avail_module_naming_schemes, - self.options.show_default_configfiles, + self.options.show_default_configfiles, self.options.avail_toolchain_opts, ]): build_easyconfig_constants_dict() # runs the easyconfig constants sanity check self._postprocess_list_avail() @@ -713,6 +715,10 @@ def _postprocess_list_avail(self): if self.options.list_toolchains: msg += list_toolchains(self.options.output_format) + # dump known toolchain options + if self.options.avail_toolchain_opts: + msg += avail_toolchain_opts(self.options.avail_toolchain_opts, self.options.output_format) + # dump known repository types if self.options.avail_repositories: msg += self.avail_repositories()