blob: d29443c832f322e09d326ccc58a1ac5ce1535769 [file] [log] [blame]
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +00001#!/usr/bin/env python
2#
3# The LLVM Compiler Infrastructure
4#
5# This file is distributed under the University of Illinois Open Source
6# License. See LICENSE.TXT for details.
7#
8##===----------------------------------------------------------------------===##
9#
10# This script attempts to be a drop-in replacement for gcc.
11#
12##===----------------------------------------------------------------------===##
13
14import sys
Anders Carlssondac2b542008-02-06 19:03:27 +000015import subprocess
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000016
17def error(message):
Anders Carlssond125bb12008-01-29 07:21:34 +000018 print >> sys.stderr, 'ccc: ' + message
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000019 sys.exit(1)
20
Seo Sanghyeond3894652008-04-04 11:02:21 +000021def quote(arg):
22 if '"' in arg:
23 return repr(arg)
24 return arg
25
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000026def run(args):
Seo Sanghyeond3894652008-04-04 11:02:21 +000027 print ' '.join(map(quote, args))
Anders Carlssondac2b542008-02-06 19:03:27 +000028 code = subprocess.call(args)
Bill Wendling550ce0f2008-02-03 21:27:46 +000029 if code > 255:
30 code = 1
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000031 if code:
32 sys.exit(code)
33
34def preprocess(args):
Anders Carlssondac2b542008-02-06 19:03:27 +000035 command = 'clang -E'.split()
36 run(command + args)
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000037
38def compile(args):
Anders Carlssondac2b542008-02-06 19:03:27 +000039 command = 'clang -emit-llvm-bc'.split()
40 run(command + args)
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000041
42def link(args):
Lauro Ramos Venanciode808ca2008-02-27 18:46:32 +000043 command = 'llvm-ld -native -disable-internalize'.split()
Anders Carlssondac2b542008-02-06 19:03:27 +000044 run(command + args)
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000045
Anders Carlssond125bb12008-01-29 07:21:34 +000046def extension(path):
Seo Sanghyeon795aaed2008-02-03 03:40:41 +000047 return path.split(".")[-1]
Anders Carlssond125bb12008-01-29 07:21:34 +000048
49def changeextension(path, newext):
Seo Sanghyeon795aaed2008-02-03 03:40:41 +000050 i = path.rfind('.')
51 if i < 0:
52 return path
Bill Wendling550ce0f2008-02-03 21:27:46 +000053 j = path.rfind('/', 0, i)
54 print path
55 if j < 0:
56 return path[:i] + "." + newext
57 return path[j+1:i] + "." + newext
Anders Carlssond125bb12008-01-29 07:21:34 +000058
59def inferlanguage(extension):
60 if extension == "c":
61 return "c"
Lauro Ramos Venancio279876b2008-02-15 22:35:25 +000062 elif extension in ["cpp", "cc"]:
63 return "c++"
Anders Carlssond125bb12008-01-29 07:21:34 +000064 elif extension == "i":
65 return "c-cpp-output"
66 elif extension == "m":
67 return "objective-c"
68 elif extension == "mi":
69 return "objective-c-cpp-output"
70 else:
71 return "unknown"
72
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000073def main(args):
74 action = 'link'
75 output = ''
Seo Sanghyeon96b99f72008-01-25 14:57:54 +000076 compile_opts = []
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000077 link_opts = []
78 files = []
Anders Carlssond125bb12008-01-29 07:21:34 +000079 save_temps = 0
80 language = ''
81
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000082 i = 0
83 while i < len(args):
84 arg = args[i]
Anders Carlssond125bb12008-01-29 07:21:34 +000085
86 # Modes ccc supports
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +000087 if arg == '-E':
88 action = 'preprocess'
89 if arg == '-c':
90 action = 'compile'
Seo Sanghyeon96b99f72008-01-25 14:57:54 +000091 if arg.startswith('-print-prog-name'):
92 action = 'print-prog-name'
Anders Carlssond125bb12008-01-29 07:21:34 +000093 if arg == '-save-temps':
94 save_temps = 1
95
96 # Options with no arguments that should pass through
97 if arg in ['-v']:
98 compile_opts.append(arg)
99 link_opts.append(arg)
100
101 # Options with one argument that should be ignored
Ted Kremenekd0eef022008-04-21 20:28:01 +0000102 if arg in ['--param', '-u']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000103 i += 1
Anders Carlssond125bb12008-01-29 07:21:34 +0000104
105 # Prefix matches for the compile mode
106 if arg[:2] in ['-D', '-I', '-U', '-F']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000107 if not arg[2:]:
108 arg += args[i+1]
109 i += 1
110 compile_opts.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000111 if arg[:5] in ['-std=']:
112 compile_opts.append(arg)
113
Nuno Lopese5d12e82008-06-17 17:23:14 +0000114 # Options with one argument that should pass through to compiler
115 if arg in [ '-include', '-idirafter', '-iprefix',
116 '-iquote', '-isystem', '-iwithprefix',
117 '-iwithprefixbefore']:
Anders Carlssond125bb12008-01-29 07:21:34 +0000118 compile_opts.append(arg)
119 compile_opts.append(args[i+1])
120 i += 1
121
Nuno Lopese5d12e82008-06-17 17:23:14 +0000122 # Options with one argument that should pass through
123 if arg in ['-framework']:
124 link_opts.append(arg)
125 link_opts.append(args[i+1])
126 i += 1
127
128 # Options with one argument that should pass through to both
129 if arg in ['-isysroot', '-arch']:
130 compile_opts.append(arg)
131 compile_opts.append(args[i+1])
132 link_opts.append(arg)
133 link_opts.append(args[i+1])
134 i += 1
135
Anders Carlssond125bb12008-01-29 07:21:34 +0000136 # Prefix matches for the link mode
Nuno Lopes05f971a2008-07-05 17:31:10 +0000137 if arg[:2] in ['-l', '-L', '-F']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000138 link_opts.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000139
Chris Lattnercf719b72008-06-21 17:46:11 +0000140 # Enable threads
141 if arg == '-pthread':
142 link_opts.append('-lpthread')
143
Anders Carlssond125bb12008-01-29 07:21:34 +0000144 # Input files
145 if arg == '-filelist':
146 f = open(args[i+1])
147 for line in f:
148 files.append(line.strip())
149 f.close()
150 i += 1
151 if arg == '-x':
152 language = args[i+1]
Chris Lattnercf719b72008-06-21 17:46:11 +0000153 compile_opts.append(arg)
154 compile_opts.append(args[i+1])
Anders Carlssond125bb12008-01-29 07:21:34 +0000155 i += 1
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000156 if arg[0] != '-':
157 files.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000158
159 # Output file
160 if arg == '-o':
161 output = args[i+1]
162 i += 1
163
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000164 i += 1
165
Seo Sanghyeon96b99f72008-01-25 14:57:54 +0000166 if action == 'print-prog-name':
167 # assume we can handle everything
168 print sys.argv[0]
169 return
170
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000171 if not files:
172 error('no input files')
173
Anders Carlssond125bb12008-01-29 07:21:34 +0000174 if action == 'preprocess' or save_temps:
175 for i, file in enumerate(files):
176 if not language:
177 language = inferlanguage(extension(file))
178 if save_temps and action != 'preprocess':
179 # Need a temporary output file
180 if language == 'c':
181 poutput = changeextension(file, "i");
182 elif language == 'objective-c':
183 poutput = changeextension(file, "mi");
184 else:
185 poutput = changeextension(file, "tmp." + extension(file))
186 files[i] = poutput
187 else:
188 poutput = output
189 if poutput:
190 args = ['-x', language, '-o', poutput, file] + compile_opts
191 else:
192 args = ['-x', language, file] + compile_opts
193 preprocess(args)
194 # Discard the explicit language after used once
195 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000196
Anders Carlssond125bb12008-01-29 07:21:34 +0000197 if action == 'compile' or save_temps:
198 for i, file in enumerate(files):
199 if not language:
200 language = inferlanguage(extension(file))
201 if save_temps and action != "compile":
202 # Need a temporary output file
203 coutput = changeextension(file, "o");
204 files[i] = coutput
205 elif not output:
206 coutput = changeextension(file, "o")
207 else:
208 coutput = output
209 args = ['-x', language, '-o', coutput, file] + compile_opts
210 compile(args)
211 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000212
213 if action == 'link':
214 for i, file in enumerate(files):
Anders Carlssonc720d9b2008-01-31 23:48:19 +0000215 ext = extension(file)
216 if ext != "o" and ext != "a":
Anders Carlssond125bb12008-01-29 07:21:34 +0000217 out = changeextension(file, "o")
218 args = ['-o', out, file] + compile_opts
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000219 compile(args)
220 files[i] = out
221 if not output:
222 output = 'a.out'
223 args = ['-o', output] + link_opts + files
224 link(args)
225
226if __name__ == '__main__':
227 main(sys.argv[1:])