File: module-deps-to-rsp.py

package info (click to toggle)
llvm-toolchain-13 1%3A13.0.1-11
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,418,840 kB
  • sloc: cpp: 5,290,826; ansic: 996,570; asm: 544,593; python: 188,212; objc: 72,027; lisp: 30,291; f90: 25,395; sh: 24,898; javascript: 9,780; pascal: 9,398; perl: 7,484; ml: 5,432; awk: 3,523; makefile: 2,913; xml: 953; cs: 573; fortran: 539
file content (72 lines) | stat: -rwxr-xr-x 2,204 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/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()