| #!/usr/bin/env python3 |
| |
| # Converts clang-scan-deps output into response files. |
| # |
| # Usage: |
| # |
| # clang-scan-deps -compilation-database compile_commands.json ... > deps.json |
| # module-deps-to-rsp.py deps.json --module-name=ModuleName > module_name.cc1.rsp |
| # module-deps-to-rsp.py deps.json --tu-index=0 > tu.rsp |
| # clang @module_name.cc1.rsp |
| # clang @tu.rsp |
| |
| import argparse |
| import json |
| import sys |
| |
| |
| class ModuleNotFoundError(Exception): |
| def __init__(self, module_name): |
| self.module_name = module_name |
| |
| |
| class FullDeps: |
| def __init__(self): |
| self.modules = {} |
| self.translation_units = [] |
| |
| |
| def findModule(module_name, full_deps): |
| for m in full_deps.modules.values(): |
| if m["name"] == module_name: |
| return m |
| raise ModuleNotFoundError(module_name) |
| |
| |
| def parseFullDeps(json): |
| ret = FullDeps() |
| for m in json["modules"]: |
| ret.modules[m["name"] + "-" + m["context-hash"]] = m |
| ret.translation_units = json["translation-units"] |
| return ret |
| |
| |
| def quote(str): |
| return '"' + str.replace("\\", "\\\\") + '"' |
| |
| |
| def main(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument( |
| "full_deps_file", help="Path to the full dependencies json file", type=str |
| ) |
| action = parser.add_mutually_exclusive_group(required=True) |
| action.add_argument( |
| "--module-name", help="The name of the module to get arguments for", type=str |
| ) |
| action.add_argument( |
| "--tu-index", |
| help="The index of the translation unit to get arguments for", |
| type=int, |
| ) |
| parser.add_argument( |
| "--tu-cmd-index", |
| help="The index of the command within the translation unit (default=0)", |
| type=int, |
| default=0, |
| ) |
| args = parser.parse_args() |
| |
| full_deps = parseFullDeps(json.load(open(args.full_deps_file, "r"))) |
| |
| try: |
| cmd = [] |
| |
| if args.module_name: |
| cmd = findModule(args.module_name, full_deps)["command-line"] |
| elif args.tu_index != None: |
| tu = full_deps.translation_units[args.tu_index] |
| cmd = tu["commands"][args.tu_cmd_index]["command-line"] |
| |
| print(" ".join(map(quote, cmd))) |
| except: |
| print("Unexpected error:", sys.exc_info()[0]) |
| raise |
| |
| |
| if __name__ == "__main__": |
| main() |