blob: 736b1a20cec7eac3b2535bc473c708f442cbd703 [file] [log] [blame]
#!/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()