Index: include_rsp.py |
diff --git a/include_rsp.py b/include_rsp.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..13f1cd4adc8cb1a16d589715ced4ea4e7d9cb9e1 |
--- /dev/null |
+++ b/include_rsp.py |
@@ -0,0 +1,69 @@ |
+import os |
+import re |
+import json |
+import sys |
+ |
+ |
+_NINJA_MSVC_WRAPPER = re.compile('ninja -t msvc -e .+? -- ') |
+_RSP_RE = re.compile(r' (@(.+?\.rsp)) ') |
+ |
+ |
+def process_arg(arg): |
+ if not arg.startswith('/'): |
+ return arg |
+ if arg == '/c': |
+ return '-c' |
+ if arg.startswith('/Fo'): |
+ return arg.replace('/Fo', '-o ', 1) |
+ return '' |
+ |
+ |
+def process_entry(e): |
+ # Strip off the ninja -t msvc wrapper. |
+ e['command'] = _NINJA_MSVC_WRAPPER.sub('', e['command']) |
+ |
+ # Expand the contents of the response file, if any. |
+ try: |
+ match = _RSP_RE.search(e['command']) |
+ rsp_path = os.path.join(e['directory'], match.group(2)) |
+ rsp_contents = file(rsp_path).read() |
+ e['command'] = e['command'][:match.start(1)] + rsp_contents + e['command'][match.end(1):] |
+ except IOError: |
+ pass |
+ |
+ # TODO(dcheng): This should be implemented as an argument adjuster. |
+ # Convert a limited subset of MSVC arguments to clang-style arguments and |
+ # remove the rest. |
+ e['command'] = ' '.join([process_arg(arg) for arg in e['command'].split(' ')]) |
+ e['command'] += ' -fms-compatibility -fms-extensions' |
+ e['command'] += ' -target i686-pc-windows-msvc' |
+ # e['command'] += ' --driver-mode=cl' |
+ |
+ # TODO(dcheng): This should be implemented in Clang tooling. |
+ # Finally, use slashes instead of backslashes to avoid bad escaping by the |
+ # tooling. This should really only matter for command, but we do it for all keys |
+ # for consistency. |
+ e['directory'] = e['directory'].replace('\\', '/') |
+ e['command'] = e['command'].replace('\\', '/') |
+ e['file'] = e['file'].replace('\\', '/') |
+ |
+ return e |
+ |
+ |
+def main(argv): |
+ compile_db = json.loads(file('out/Debug/compile_commands.json').read()) |
+ print 'Read in %d entries from the compile db' % len(compile_db) |
+ compile_db = [process_entry(e) for e in compile_db] |
+ prefilter_len = len(compile_db) |
+ # Filter out entries that still have RSP in them. |
+ compile_db = [e for e in compile_db if e['command'].find('.obj.rsp') == -1] |
+ print 'Filtered out %d entries' % (prefilter_len - len(compile_db)) |
+ compile_db_with_rsp = json.dumps(compile_db, indent=2) |
+ f = file('out/Debug/compile_commands_with_rsp.json', 'w') |
+ f.write(compile_db_with_rsp) |
+ print 'Wrote out new compile db with rsp inline' |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv[1:])) |
+ |