#!/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()