#!/usr/bin/env python import json import subprocess from glob import glob from os import path import ninja_syntax if __name__ == "__main__": with open("grammars.json", "r") as fp: grammars = json.loads(fp.read()) with open("package.ninja", "w") as fp: w = ninja_syntax.Writer(fp) w.comment("automatically generated, do not edit.") w.rule("copy", command="cp $in $out") w.rule("mkdir", command="mkdir -p $out") w.rule("sed-fix", command=f"cat $in | sed -f fixes.sed > $out") w.build("target", "mkdir") for grammar in grammars: base_path = grammar["path"] target_dir = path.join("target", grammar["name"]) w.build(target_dir, "mkdir") if "queries" in grammar and grammar["queries"]: queries = glob(grammar["queries"]) else: queries = glob(base_path + "/queries/*.scm") for query in queries: filename = path.basename(query) query_target = path.join(target_dir, "queries", filename) w.build(query_target, "copy", inputs=[query]) if "includes" in grammar and grammar["includes"]: includes = [] for include in grammar["includes"]: includes += glob(include) unique_dirs = set( [ path.join(target_dir, path.basename(path.dirname(include))) for include in includes ] ) for unique_dir in unique_dirs: w.build(unique_dir, "mkdir", unique_dir) for include in includes: include_target_dir = path.basename(path.dirname(include)) target_path = path.join( target_dir, include_target_dir, path.basename(include) ) w.build(target_path, "sed-fix", inputs=[include]) source_dir = path.join(base_path, "src") sources = [] sources += glob(source_dir + "/*.c") sources += glob(source_dir + "/*.h") for source in sources: filename = path.basename(source) source_target = path.join(target_dir, filename) w.build(source_target, "sed-fix", inputs=[source]) w.close() subprocess.call(["ninja", "-f", "package.ninja"])