forked from OSchip/llvm-project
73 lines
2.2 KiB
Python
73 lines
2.2 KiB
Python
|
#!/usr/bin/env python3
|
||
|
|
||
|
# Converts clang-scan-deps output into response files.
|
||
|
# * For modules, arguments in the resulting response file are enough to build a PCM.
|
||
|
# * For translation units, the response file needs to be added to the original Clang invocation from compilation
|
||
|
# database.
|
||
|
#
|
||
|
# 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)
|
||
|
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:
|
||
|
cmd = full_deps.translation_units[args.tu_index]['command-line']
|
||
|
|
||
|
print(" ".join(map(quote, cmd)))
|
||
|
except:
|
||
|
print("Unexpected error:", sys.exc_info()[0])
|
||
|
raise
|
||
|
|
||
|
if __name__ == '__main__':
|
||
|
main()
|