mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
96 lines
3.0 KiB
Python
Executable File
96 lines
3.0 KiB
Python
Executable File
#!/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()
|