73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #!/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()
 |