Skip to content

Commit 9f0f01c

Browse files
authored
Merge pull request #1161 from douglasjacobsen/trap-unused-compiler
Add checking for unused compiler definitions
2 parents 09a2b32 + 37cdbe7 commit 9f0f01c

File tree

3 files changed

+73
-18
lines changed

3 files changed

+73
-18
lines changed

.github/workflows/spelling.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
name: ramble spelling
22

33
on:
4-
pull_request: []
4+
pull_request:
5+
types:
6+
- 'opened'
7+
- 'reopened'
8+
- 'synchronize'
59
push:
610
branches-ignore:
711
- main

lib/ramble/ramble/cmd/software_definitions.py

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
section = "developer"
1919
level = "long"
2020

21+
unused_compilers = {}
2122
definitions = {}
2223
conflicts = {}
2324
used_by = {}
@@ -56,7 +57,12 @@ def collect_definitions():
5657
"""
5758
top_level_attrs = ["compilers", "software_specs"]
5859

59-
types_to_print = [ramble.repository.ObjectTypes.applications]
60+
types_to_print = [
61+
ramble.repository.ObjectTypes.applications,
62+
ramble.repository.ObjectTypes.modifiers,
63+
ramble.repository.ObjectTypes.workflow_managers,
64+
ramble.repository.ObjectTypes.package_managers,
65+
]
6066

6167
for object_type in types_to_print:
6268
obj_path = ramble.repository.paths[object_type]
@@ -65,6 +71,20 @@ def collect_definitions():
6571

6672
obj_namespace = f"{obj_repo.full_namespace}.{obj_inst.name}"
6773

74+
for compiler_name in obj_inst.compilers:
75+
used = False
76+
for pkg_defs in obj_inst.software_specs.values():
77+
for pkg_def in pkg_defs:
78+
if (
79+
getattr(pkg_def, "compiler", "__rmb_no_compiler_attr__")
80+
== compiler_name
81+
):
82+
used = True
83+
if not used:
84+
if compiler_name not in unused_compilers:
85+
unused_compilers[compiler_name] = []
86+
unused_compilers[compiler_name].append(obj_namespace)
87+
6888
for top_level_attr in top_level_attrs:
6989
if hasattr(obj_inst, top_level_attr):
7090
for pkg_name, pkg_defs in getattr(obj_inst, top_level_attr).items():
@@ -110,26 +130,36 @@ def count_conflicts():
110130
num_conflicts = 0
111131
for pkg_name in conflicts:
112132
num_conflicts += len(conflicts[pkg_name])
133+
for object_names in unused_compilers.values():
134+
num_conflicts += len(object_names)
113135
return num_conflicts
114136

115137

116138
def print_conflicts():
117139
"""Print conflict information, if any exist"""
118-
if len(conflicts) > 0:
119-
color.cprint(section_title("Software Definition Conflicts:"))
120-
for pkg_name in conflicts:
121-
122-
color.cprint(f'{nested_1("Package")}: {pkg_name}:')
123-
color.cprint("\tDefined as:")
124-
for attr in ["pkg_spec", "compiler_spec", "compiler"]:
125-
if hasattr(definitions[pkg_name], attr):
126-
attr_def = getattr(definitions[pkg_name], attr)
127-
if attr_def:
128-
color.cprint(f'\t\t{attr} = {attr_def.replace("@", "@@")}')
129-
color.cprint("\tIn objects:")
130-
colify(used_by[pkg_name], indent=24, output=sys.stdout)
131-
color.cprint("\tConflicts with objects:")
132-
colify(conflicts[pkg_name], indent=24, output=sys.stdout)
140+
if len(conflicts) > 0 or len(unused_compilers) > 0:
141+
if len(conflicts) > 0:
142+
color.cprint(section_title("Software Definition Conflicts:"))
143+
for pkg_name in conflicts:
144+
145+
color.cprint(f'{nested_1("Package")}: {pkg_name}:')
146+
color.cprint("\tDefined as:")
147+
for attr in ["pkg_spec", "compiler_spec", "compiler"]:
148+
if hasattr(definitions[pkg_name], attr):
149+
attr_def = getattr(definitions[pkg_name], attr)
150+
if attr_def:
151+
color.cprint(f'\t\t{attr} = {attr_def.replace("@", "@@")}')
152+
color.cprint("\tIn objects:")
153+
colify(used_by[pkg_name], indent=24, output=sys.stdout)
154+
color.cprint("\tConflicts with objects:")
155+
colify(conflicts[pkg_name], indent=24, output=sys.stdout)
156+
157+
if len(unused_compilers) > 0:
158+
color.cprint(section_title("Unused Compilers:"))
159+
for compiler_name, object_names in unused_compilers.items():
160+
color.cprint(nested_1(f" Compiler {compiler_name} is not used in packages:"))
161+
colify(object_names, indent=8, output=sys.stdout)
162+
color.cprint("\n")
133163
else:
134164
color.cprint(section_title("No Conflicts Detected"))
135165

@@ -164,5 +194,8 @@ def software_definitions(parser, args, unknown_args):
164194

165195
if args.error_on_conflict:
166196
num_conflicts = count_conflicts()
167-
color.cprint(f"{num_conflicts} conflicts detected.")
197+
if num_conflicts == 1:
198+
color.cprint(f"{num_conflicts} conflict detected.")
199+
else:
200+
color.cprint(f"{num_conflicts} conflicts detected.")
168201
sys.exit(num_conflicts)

lib/ramble/ramble/workspace/workspace.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1481,6 +1481,7 @@ def concretize(self, force=False, quiet=False):
14811481
if app_inst.package_manager is None:
14821482
continue
14831483

1484+
compiler_packages = {}
14841485
compiler_dicts = [app_inst.compilers]
14851486
for mod_inst in app_inst._modifier_instances:
14861487
compiler_dicts.append(mod_inst.compilers)
@@ -1510,6 +1511,7 @@ def concretize(self, force=False, quiet=False):
15101511
newly_created_packages.add(comp)
15111512
packages_dict[comp] = syaml.syaml_dict()
15121513

1514+
compiler_packages[comp] = False
15131515
packages_dict[comp].update(info.to_dict(prefix=spec_prefix))
15141516
for conf in info.config_opts():
15151517
ramble.config.add(conf, scope=self.ws_file_config_scope_name())
@@ -1549,6 +1551,10 @@ def concretize(self, force=False, quiet=False):
15491551
):
15501552
packages_dict[spec_name] = syaml.syaml_dict()
15511553

1554+
# Check for usage of compilers
1555+
if info.compiler in compiler_packages:
1556+
compiler_packages[info.compiler] = True
1557+
15521558
packages_dict[spec_name].update(info.to_dict(prefix=spec_prefix))
15531559

15541560
if spec_name not in app_packages:
@@ -1560,6 +1566,18 @@ def concretize(self, force=False, quiet=False):
15601566

15611567
environments_dict[env_name][namespace.packages] = app_packages.copy()
15621568

1569+
# Ensure all compilers in this experiment are used.
1570+
comp_list = []
1571+
for name, used in compiler_packages.items():
1572+
if not used:
1573+
comp_list.append(name)
1574+
if comp_list:
1575+
logger.warn(
1576+
"Unused compiler(s) found in experiment: "
1577+
+ app_inst.expander.experiment_namespace
1578+
)
1579+
logger.warn(f" {comp_list}")
1580+
15631581
ramble.config.config.update_config(
15641582
namespace.software, full_software_dict, scope=self.ws_file_config_scope_name()
15651583
)

0 commit comments

Comments
 (0)