зеркало из https://github.com/microsoft/clang.git
Improvements to ccc. Patch by Shantonu Sen.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46501 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
65cac139a0
Коммит
d125bb191f
133
utils/ccc
133
utils/ccc
|
@ -15,11 +15,11 @@ import sys
|
|||
import subprocess
|
||||
|
||||
def error(message):
|
||||
print 'ccc: ' + message
|
||||
print >> sys.stderr, 'ccc: ' + message
|
||||
sys.exit(1)
|
||||
|
||||
def run(args):
|
||||
print ' '.join(args)
|
||||
print >> sys.stderr, ' '.join(args)
|
||||
code = subprocess.call(args)
|
||||
if code:
|
||||
sys.exit(code)
|
||||
|
@ -36,38 +36,102 @@ def link(args):
|
|||
command = 'llvm-ld -native'.split()
|
||||
run(command + args)
|
||||
|
||||
def extension(path):
|
||||
return path.rpartition(".")[2]
|
||||
|
||||
def changeextension(path, newext):
|
||||
components = path.rpartition(".")
|
||||
return "".join([components[0], components[1], newext])
|
||||
|
||||
def inferlanguage(extension):
|
||||
if extension == "c":
|
||||
return "c"
|
||||
elif extension == "i":
|
||||
return "c-cpp-output"
|
||||
elif extension == "m":
|
||||
return "objective-c"
|
||||
elif extension == "mi":
|
||||
return "objective-c-cpp-output"
|
||||
else:
|
||||
return "unknown"
|
||||
|
||||
def main(args):
|
||||
action = 'link'
|
||||
output = ''
|
||||
compile_opts = []
|
||||
link_opts = []
|
||||
files = []
|
||||
|
||||
save_temps = 0
|
||||
language = ''
|
||||
|
||||
i = 0
|
||||
while i < len(args):
|
||||
arg = args[i]
|
||||
|
||||
# Modes ccc supports
|
||||
if arg == '-E':
|
||||
action = 'preprocess'
|
||||
if arg == '-c':
|
||||
action = 'compile'
|
||||
if arg.startswith('-print-prog-name'):
|
||||
action = 'print-prog-name'
|
||||
if arg == '-o':
|
||||
output = args[i+1]
|
||||
if arg == '-save-temps':
|
||||
save_temps = 1
|
||||
|
||||
# Options with no arguments that should pass through
|
||||
if arg in ['-v']:
|
||||
compile_opts.append(arg)
|
||||
link_opts.append(arg)
|
||||
|
||||
# Options with one argument that should be ignored
|
||||
if arg in ['--param', '-arch']:
|
||||
i += 1
|
||||
if arg == '--param':
|
||||
i += 1
|
||||
if arg[:2] in ['-D', '-I', '-U']:
|
||||
|
||||
# Prefix matches for the compile mode
|
||||
if arg[:2] in ['-D', '-I', '-U', '-F']:
|
||||
if not arg[2:]:
|
||||
arg += args[i+1]
|
||||
i += 1
|
||||
compile_opts.append(arg)
|
||||
if arg[:2] in ['-l', '-L', '-O']:
|
||||
if arg[:5] in ['-std=']:
|
||||
compile_opts.append(arg)
|
||||
|
||||
# Options with one argument that should pass through
|
||||
if arg in ['-include']:
|
||||
compile_opts.append(arg)
|
||||
compile_opts.append(args[i+1])
|
||||
i += 1
|
||||
|
||||
# Prefix matches for the link mode
|
||||
if arg[:2] in ['-l', '-L', '-O', '-F']:
|
||||
if arg == '-O': arg = '-O1'
|
||||
if arg == '-Os': arg = '-O2'
|
||||
link_opts.append(arg)
|
||||
|
||||
# Options with one argument that should pass through
|
||||
if arg in ['-framework']:
|
||||
link_opts.append(arg)
|
||||
link_opts.append(args[i+1])
|
||||
i += 1
|
||||
|
||||
# Input files
|
||||
if arg == '-filelist':
|
||||
f = open(args[i+1])
|
||||
for line in f:
|
||||
files.append(line.strip())
|
||||
f.close()
|
||||
i += 1
|
||||
if arg == '-x':
|
||||
language = args[i+1]
|
||||
i += 1
|
||||
if arg[0] != '-':
|
||||
files.append(arg)
|
||||
|
||||
# Output file
|
||||
if arg == '-o':
|
||||
output = args[i+1]
|
||||
i += 1
|
||||
|
||||
i += 1
|
||||
|
||||
if action == 'print-prog-name':
|
||||
|
@ -78,21 +142,50 @@ def main(args):
|
|||
if not files:
|
||||
error('no input files')
|
||||
|
||||
if action == 'preprocess':
|
||||
args = compile_opts + files
|
||||
preprocess(args)
|
||||
if action == 'preprocess' or save_temps:
|
||||
for i, file in enumerate(files):
|
||||
if not language:
|
||||
language = inferlanguage(extension(file))
|
||||
if save_temps and action != 'preprocess':
|
||||
# Need a temporary output file
|
||||
if language == 'c':
|
||||
poutput = changeextension(file, "i");
|
||||
elif language == 'objective-c':
|
||||
poutput = changeextension(file, "mi");
|
||||
else:
|
||||
poutput = changeextension(file, "tmp." + extension(file))
|
||||
files[i] = poutput
|
||||
else:
|
||||
poutput = output
|
||||
if poutput:
|
||||
args = ['-x', language, '-o', poutput, file] + compile_opts
|
||||
else:
|
||||
args = ['-x', language, file] + compile_opts
|
||||
preprocess(args)
|
||||
# Discard the explicit language after used once
|
||||
language = ''
|
||||
|
||||
if action == 'compile':
|
||||
if not output:
|
||||
output = files[0].replace('.c', '.o')
|
||||
args = ['-o', output] + compile_opts + files
|
||||
compile(args)
|
||||
if action == 'compile' or save_temps:
|
||||
for i, file in enumerate(files):
|
||||
if not language:
|
||||
language = inferlanguage(extension(file))
|
||||
if save_temps and action != "compile":
|
||||
# Need a temporary output file
|
||||
coutput = changeextension(file, "o");
|
||||
files[i] = coutput
|
||||
elif not output:
|
||||
coutput = changeextension(file, "o")
|
||||
else:
|
||||
coutput = output
|
||||
args = ['-x', language, '-o', coutput, file] + compile_opts
|
||||
compile(args)
|
||||
language = ''
|
||||
|
||||
if action == 'link':
|
||||
for i, file in enumerate(files):
|
||||
if '.c' in file:
|
||||
out = file.replace('.c', '.o')
|
||||
args = ['-o', out] + compile_opts + [file]
|
||||
if extension(file) != "o":
|
||||
out = changeextension(file, "o")
|
||||
args = ['-o', out, file] + compile_opts
|
||||
compile(args)
|
||||
files[i] = out
|
||||
if not output:
|
||||
|
|
Загрузка…
Ссылка в новой задаче