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