make/rules/test/%.mk:
python3 make/test_rules.py $<
-ifdef NOSKIP
-SKIP_COMMAND := echo "NOSKIP was set, treating this as an error"; echo; false
-else
-SKIP_COMMAND := echo
-endif
-
ifneq (help,$(MAKECMDGOALS))
# This should run every time but only trigger anything depending on it whenever
print(f"{out_file}: {checked_dir}", file=output)
for test in tests:
- print(f"make/rules/test/{test}.mk: {test} make/rules/found_tools", file=output)
+ print(f"make/rules/test/{test}.mk: {test}", file=output)
for ext in [".sh", ".py"]:
script_file = test.parent / (test.stem + ext)
if script_file.exists():
}
+def found_tools():
+ with open("make/rules/found_tools") as found_tools_file:
+ return [tool.strip() for tool in found_tools_file.readlines()]
+
+
if __name__ == "__main__":
import subprocess
import sys
+ import os
from pathlib import Path
+ args = sys.argv[1:]
+
+ if args and args[0] == "run":
+ target, command, *required_tools = args[1:]
+
+ with open("make/rules/found_tools") as found_tools_file:
+ found_tools = set(tool.strip() for tool in found_tools_file.readlines())
+
+ missing_tools = sorted(
+ f"`{tool}`" for tool in required_tools if tool not in found_tools
+ )
+ if missing_tools:
+ noskip = "NOSKIP" in os.environ.get("MAKEFLAGS", "")
+ print()
+ print(f"SKIPPING {target}: {', '.join(missing_tools)} not found")
+ if noskip:
+ print("NOSKIP was set, treating this as an error")
+ print()
+ exit(noskip)
+
+ print(command, flush=True)
+ exit(subprocess.call(command, shell=True))
+
found_tools = []
check_tools = set()
for tools in REQUIRED_TOOLS.values():
with open("make/rules/found_tools", "w") as found_tools_file:
found_tools_file.write(found_tools)
-else:
- with open("make/rules/found_tools") as found_tools_file:
- found_tools = [tool.strip() for tool in found_tools_file.readlines()]
import os
import subprocess
import json
+import shlex
from pathlib import Path
-from required_tools import REQUIRED_TOOLS, found_tools
+from required_tools import REQUIRED_TOOLS
sby_file = Path(sys.argv[1])
sby_dir = sby_file.parent
solvers.add(solver)
engine_solvers.add((engine, solver))
+ required_tools = sorted(required_tools)
+
print(f".PHONY: {target}", file=rules)
print(f"{target}:", file=rules)
shell_script = sby_dir / f"{sby_file.stem}.sh"
- missing_tools = sorted(
- f"`{tool}`" for tool in required_tools if tool not in found_tools
- )
-
- if missing_tools:
- print(
- f"\t@echo; echo 'SKIPPING {target}: {', '.join(missing_tools)} not found'; $(SKIP_COMMAND)",
- file=rules,
- )
-
- elif shell_script.exists():
- print(
- f"\tcd {sby_dir} && SBY_FILE={sby_file.name} WORKDIR={workdirname} TASK={task} bash {shell_script.name}",
- file=rules,
- )
+ if shell_script.exists():
+ command = f"cd {sby_dir} && SBY_FILE={sby_file.name} WORKDIR={workdirname} TASK={task} bash {shell_script.name}"
else:
- print(
- f"\tcd {sby_dir} && python3 $(SBY_MAIN) -f {sby_file.name} {task}",
- file=rules,
- )
+ command = f"cd {sby_dir} && python3 $(SBY_MAIN) -f {sby_file.name} {task}"
+
+ print(f"\t@python3 make/required_tools.py run {target} {shlex.quote(command)} {shlex.join(required_tools)}", file=rules)
print(f".PHONY: clean-{target}", file=rules)
print(f"clean-{target}:", file=rules)