Pythonpackage.py -rwxr-xr-x 2.4 KiB
1#!/usr/bin/env python
2
3import json
4import subprocess
5from glob import glob
6from os import path
7
8import ninja_syntax
9
10
11if __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"])