blob: b58bf616c24cc7c46e7f8df218fc4cac5eae2bb5 [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
137 if arg[:2] in ['-l', '-L', '-O', '-F']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000138 if arg == '-O': arg = '-O1'
139 if arg == '-Os': arg = '-O2'
140 link_opts.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000141
Anders Carlssond125bb12008-01-29 07:21:34 +0000142 # Input files
143 if arg == '-filelist':
144 f = open(args[i+1])
145 for line in f:
146 files.append(line.strip())
147 f.close()
148 i += 1
149 if arg == '-x':
150 language = args[i+1]
151 i += 1
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000152 if arg[0] != '-':
153 files.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000154
155 # Output file
156 if arg == '-o':
157 output = args[i+1]
158 i += 1
159
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000160 i += 1
161
Seo Sanghyeon96b99f72008-01-25 14:57:54 +0000162 if action == 'print-prog-name':
163 # assume we can handle everything
164 print sys.argv[0]
165 return
166
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000167 if not files:
168 error('no input files')
169
Anders Carlssond125bb12008-01-29 07:21:34 +0000170 if action == 'preprocess' or save_temps:
171 for i, file in enumerate(files):
172 if not language:
173 language = inferlanguage(extension(file))
174 if save_temps and action != 'preprocess':
175 # Need a temporary output file
176 if language == 'c':
177 poutput = changeextension(file, "i");
178 elif language == 'objective-c':
179 poutput = changeextension(file, "mi");
180 else:
181 poutput = changeextension(file, "tmp." + extension(file))
182 files[i] = poutput
183 else:
184 poutput = output
185 if poutput:
186 args = ['-x', language, '-o', poutput, file] + compile_opts
187 else:
188 args = ['-x', language, file] + compile_opts
189 preprocess(args)
190 # Discard the explicit language after used once
191 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000192
Anders Carlssond125bb12008-01-29 07:21:34 +0000193 if action == 'compile' or save_temps:
194 for i, file in enumerate(files):
195 if not language:
196 language = inferlanguage(extension(file))
197 if save_temps and action != "compile":
198 # Need a temporary output file
199 coutput = changeextension(file, "o");
200 files[i] = coutput
201 elif not output:
202 coutput = changeextension(file, "o")
203 else:
204 coutput = output
205 args = ['-x', language, '-o', coutput, file] + compile_opts
206 compile(args)
207 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000208
209 if action == 'link':
210 for i, file in enumerate(files):
Anders Carlssonc720d9b2008-01-31 23:48:19 +0000211 ext = extension(file)
212 if ext != "o" and ext != "a":
Anders Carlssond125bb12008-01-29 07:21:34 +0000213 out = changeextension(file, "o")
214 args = ['-o', out, file] + compile_opts
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000215 compile(args)
216 files[i] = out
217 if not output:
218 output = 'a.out'
219 args = ['-o', output] + link_opts + files
220 link(args)
221
222if __name__ == '__main__':
223 main(sys.argv[1:])