2008-01-10 04:43:47 +03:00
|
|
|
#!/usr/bin/env python
|
|
|
|
#
|
|
|
|
# The LLVM Compiler Infrastructure
|
|
|
|
#
|
|
|
|
# This file is distributed under the University of Illinois Open Source
|
|
|
|
# License. See LICENSE.TXT for details.
|
|
|
|
#
|
|
|
|
##===----------------------------------------------------------------------===##
|
|
|
|
#
|
|
|
|
# This script attempts to be a drop-in replacement for gcc.
|
|
|
|
#
|
|
|
|
##===----------------------------------------------------------------------===##
|
|
|
|
|
|
|
|
import sys
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
def error(message):
|
|
|
|
print 'ccc: ' + message
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
def run(args):
|
|
|
|
print ' '.join(args)
|
|
|
|
code = subprocess.call(args)
|
|
|
|
if code:
|
|
|
|
sys.exit(code)
|
|
|
|
|
|
|
|
def preprocess(args):
|
|
|
|
command = 'clang -E'.split()
|
|
|
|
run(command + args)
|
|
|
|
|
|
|
|
def compile(args):
|
|
|
|
command = 'clang -emit-llvm-bc'.split()
|
|
|
|
run(command + args)
|
|
|
|
|
|
|
|
def link(args):
|
|
|
|
command = 'llvm-ld -native'.split()
|
|
|
|
run(command + args)
|
|
|
|
|
|
|
|
def main(args):
|
|
|
|
action = 'link'
|
|
|
|
output = ''
|
|
|
|
compile_opts = ['-U__GNUC__']
|
|
|
|
link_opts = []
|
|
|
|
files = []
|
|
|
|
|
|
|
|
i = 0
|
|
|
|
while i < len(args):
|
|
|
|
arg = args[i]
|
|
|
|
if arg == '-E':
|
|
|
|
action = 'preprocess'
|
|
|
|
if arg == '-c':
|
|
|
|
action = 'compile'
|
|
|
|
if arg == '-o':
|
|
|
|
output = args[i+1]
|
|
|
|
i += 1
|
2008-01-17 04:08:43 +03:00
|
|
|
if arg == '--param':
|
|
|
|
i += 1
|
2008-01-10 04:43:47 +03:00
|
|
|
if arg[:2] in ['-D', '-I', '-U']:
|
|
|
|
if not arg[2:]:
|
|
|
|
arg += args[i+1]
|
|
|
|
i += 1
|
|
|
|
compile_opts.append(arg)
|
|
|
|
if arg[:2] in ['-l', '-L', '-O']:
|
|
|
|
if arg == '-O': arg = '-O1'
|
|
|
|
if arg == '-Os': arg = '-O2'
|
|
|
|
link_opts.append(arg)
|
|
|
|
if arg[0] != '-':
|
|
|
|
files.append(arg)
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
if not files:
|
|
|
|
error('no input files')
|
|
|
|
|
|
|
|
if action == 'preprocess':
|
|
|
|
args = compile_opts + files
|
|
|
|
preprocess(args)
|
|
|
|
|
|
|
|
if action == 'compile':
|
|
|
|
if not output:
|
|
|
|
output = files[0].replace('.c', '.o')
|
|
|
|
args = ['-o', output] + compile_opts + files
|
|
|
|
compile(args)
|
|
|
|
|
|
|
|
if action == 'link':
|
|
|
|
for i, file in enumerate(files):
|
|
|
|
if '.c' in file:
|
|
|
|
out = file.replace('.c', '.o')
|
|
|
|
args = ['-o', out] + compile_opts + [file]
|
|
|
|
compile(args)
|
|
|
|
files[i] = out
|
|
|
|
if not output:
|
|
|
|
output = 'a.out'
|
|
|
|
args = ['-o', output] + link_opts + files
|
|
|
|
link(args)
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
main(sys.argv[1:])
|