| #!/usr/bin/env python |
| # split-cmdline - Split swift compiler command lines ------------*- python -*- |
| # |
| # This source file is part of the Swift.org open source project |
| # |
| # Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| # Licensed under Apache License v2.0 with Runtime Library Exception |
| # |
| # See https://swift.org/LICENSE.txt for license information |
| # See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| # |
| # ---------------------------------------------------------------------------- |
| # |
| # Split swift compiler command lines into multiple lines. |
| # |
| # Reads the command line from stdin an outputs the split line to stdout. |
| # Example: |
| # |
| # $ swiftc -c hello.swift -### | split-cmdline |
| # /path-to-swift/bin/swift \ |
| # -frontend \ |
| # -c \ |
| # -primary-file hello.swift \ |
| # -target x86_64-apple-macosx10.9 \ |
| # -enable-objc-interop \ |
| # -color-diagnostics \ |
| # -module-name hello \ |
| # -o hello.o |
| # |
| # Example usage in vim: |
| # *) make sure that split-cmdline is in the $PATH |
| # *) copy-paste the swift command line the text buffer |
| # *) select the command line |
| # *) go to the command prompt (= press ':') |
| # :'<,'>!split-cmdline |
| # |
| # ---------------------------------------------------------------------------- |
| |
| from __future__ import print_function |
| |
| import re |
| import sys |
| import os |
| import shlex |
| |
| def main(): |
| for line in sys.stdin: |
| first = True |
| is_arg_param = False |
| # Handle escaped spaces |
| args = shlex.split(line) |
| for arg in args: |
| if arg == '': |
| continue |
| if not first: |
| # Print option arguments in the same line |
| print(' ' if is_arg_param else ' \\\n ', end='') |
| first = False |
| |
| # Expand @ option files |
| m = re.match('^@(\S+\.txt)$', arg) |
| if m: |
| cmd_file = m.group(1) |
| if os.path.isfile(cmd_file): |
| with open(cmd_file) as f: |
| for ln in f.readlines(): |
| for name in ln.rstrip().split(';'): |
| if name != '': |
| print(name + ' \\') |
| first = True |
| continue |
| |
| if ' ' in arg: |
| print('"' + arg + '"', end='') |
| else: |
| print(arg, end='') |
| |
| # A hard-coded list of options which expect a parameter |
| is_arg_param = (arg in [ |
| '-o', '-target', '-isysroot', '-emit-sil', '-emit-ir', '-module-name', |
| '-framework', '-Xlinker', '-arch', '-D', '-sdk', '-module-cache-path', |
| '-F', '-output-file-map', '-emit-module-path', '-Xcc', '-I', '-iquote', |
| '-emit-objc-header-path', '-Xfrontend', '-filelist', '-num-threads', |
| '-Xclang', '-x', '-L', '-rpath', '-macosx_version_min', |
| '-syslibroot', '-add_ast_path', '-import-objc-header', |
| '-serialize-diagnostics-path', '-emit-dependencies-path', |
| '-emit-reference-dependencies-path', '-primary-file', '-resource-dir', |
| '--sdk', '--toolchain', '-emit-module-doc-path', '-module-link-name', |
| '-group-info-path', '-fileno', '-swift-version', '-Xllvm']) |
| |
| # Print 2 new lines after each command line |
| print('\n') |
| |
| if __name__ == '__main__': |
| main() |