1 | #!/usr/bin/env python
|
2 |
|
3 | import json
|
4 | import subprocess
|
5 | from glob import glob
|
6 | from os import path
|
7 |
|
8 | import ninja_syntax
|
9 |
|
10 |
|
11 | if __name__ == "__main__":
|
12 | with open("grammars.json", "r") as fp:
|
13 | grammars = json.loads(fp.read())
|
14 |
|
15 | with open("package.ninja", "w") as fp:
|
16 | w = ninja_syntax.Writer(fp)
|
17 | w.comment("automatically generated, do not edit.")
|
18 | w.rule("copy", command="cp $in $out")
|
19 | w.rule("mkdir", command="mkdir -p $out")
|
20 | w.rule("sed-fix", command=f"cat $in | sed -f fixes.sed > $out")
|
21 | w.build("target", "mkdir")
|
22 | for grammar in grammars:
|
23 | base_path = grammar["path"]
|
24 | target_dir = path.join("target", grammar["name"])
|
25 | w.build(target_dir, "mkdir")
|
26 | if "queries" in grammar and grammar["queries"]:
|
27 | queries = glob(grammar["queries"])
|
28 | else:
|
29 | queries = glob(base_path + "/queries/*.scm")
|
30 | for query in queries:
|
31 | filename = path.basename(query)
|
32 | query_target = path.join(target_dir, "queries", filename)
|
33 | w.build(query_target, "copy", inputs=[query])
|
34 | if "includes" in grammar and grammar["includes"]:
|
35 | includes = []
|
36 | for include in grammar["includes"]:
|
37 | includes += glob(include)
|
38 | unique_dirs = set(
|
39 | [
|
40 | path.join(target_dir, path.basename(path.dirname(include)))
|
41 | for include in includes
|
42 | ]
|
43 | )
|
44 | for unique_dir in unique_dirs:
|
45 | w.build(unique_dir, "mkdir", unique_dir)
|
46 | for include in includes:
|
47 | include_target_dir = path.basename(path.dirname(include))
|
48 | target_path = path.join(
|
49 | target_dir, include_target_dir, path.basename(include)
|
50 | )
|
51 | w.build(target_path, "sed-fix", inputs=[include])
|
52 | source_dir = path.join(base_path, "src")
|
53 | sources = []
|
54 | sources += glob(source_dir + "/*.c")
|
55 | sources += glob(source_dir + "/*.h")
|
56 | for source in sources:
|
57 | filename = path.basename(source)
|
58 | source_target = path.join(target_dir, filename)
|
59 | w.build(source_target, "sed-fix", inputs=[source])
|
60 | w.close()
|
61 |
|
62 | subprocess.call(["ninja", "-f", "package.ninja"])
|