blob: d999d2bfc79b1b92ed8bd89ec7dc4eabcd6085f1 [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
Ted Kremenek16833602008-07-24 03:49:15 +0000105 # Preprocessor options with one argument that should be ignored
106 if arg in ['-MT', '-MF']:
107 i += 1
108
Anders Carlssond125bb12008-01-29 07:21:34 +0000109 # Prefix matches for the compile mode
110 if arg[:2] in ['-D', '-I', '-U', '-F']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000111 if not arg[2:]:
112 arg += args[i+1]
113 i += 1
114 compile_opts.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000115 if arg[:5] in ['-std=']:
116 compile_opts.append(arg)
117
Nuno Lopese5d12e82008-06-17 17:23:14 +0000118 # Options with one argument that should pass through to compiler
119 if arg in [ '-include', '-idirafter', '-iprefix',
120 '-iquote', '-isystem', '-iwithprefix',
121 '-iwithprefixbefore']:
Anders Carlssond125bb12008-01-29 07:21:34 +0000122 compile_opts.append(arg)
123 compile_opts.append(args[i+1])
124 i += 1
125
Nuno Lopese5d12e82008-06-17 17:23:14 +0000126 # Options with one argument that should pass through
127 if arg in ['-framework']:
128 link_opts.append(arg)
129 link_opts.append(args[i+1])
130 i += 1
131
132 # Options with one argument that should pass through to both
133 if arg in ['-isysroot', '-arch']:
134 compile_opts.append(arg)
135 compile_opts.append(args[i+1])
136 link_opts.append(arg)
137 link_opts.append(args[i+1])
138 i += 1
139
Anders Carlssond125bb12008-01-29 07:21:34 +0000140 # Prefix matches for the link mode
Nuno Lopes9a184482008-08-10 21:58:01 +0000141 if arg[:2] in ['-l', '-L', '-F', '-R']:
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000142 link_opts.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000143
Chris Lattnercf719b72008-06-21 17:46:11 +0000144 # Enable threads
145 if arg == '-pthread':
146 link_opts.append('-lpthread')
147
Anders Carlssond125bb12008-01-29 07:21:34 +0000148 # Input files
149 if arg == '-filelist':
150 f = open(args[i+1])
151 for line in f:
152 files.append(line.strip())
153 f.close()
154 i += 1
155 if arg == '-x':
156 language = args[i+1]
Chris Lattnercf719b72008-06-21 17:46:11 +0000157 compile_opts.append(arg)
158 compile_opts.append(args[i+1])
Anders Carlssond125bb12008-01-29 07:21:34 +0000159 i += 1
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000160 if arg[0] != '-':
161 files.append(arg)
Anders Carlssond125bb12008-01-29 07:21:34 +0000162
163 # Output file
164 if arg == '-o':
165 output = args[i+1]
166 i += 1
167
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000168 i += 1
169
Seo Sanghyeon96b99f72008-01-25 14:57:54 +0000170 if action == 'print-prog-name':
171 # assume we can handle everything
172 print sys.argv[0]
173 return
174
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000175 if not files:
176 error('no input files')
177
Anders Carlssond125bb12008-01-29 07:21:34 +0000178 if action == 'preprocess' or save_temps:
179 for i, file in enumerate(files):
180 if not language:
181 language = inferlanguage(extension(file))
182 if save_temps and action != 'preprocess':
183 # Need a temporary output file
184 if language == 'c':
185 poutput = changeextension(file, "i");
186 elif language == 'objective-c':
187 poutput = changeextension(file, "mi");
188 else:
189 poutput = changeextension(file, "tmp." + extension(file))
190 files[i] = poutput
191 else:
192 poutput = output
193 if poutput:
194 args = ['-x', language, '-o', poutput, file] + compile_opts
195 else:
196 args = ['-x', language, file] + compile_opts
197 preprocess(args)
198 # Discard the explicit language after used once
199 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000200
Anders Carlssond125bb12008-01-29 07:21:34 +0000201 if action == 'compile' or save_temps:
202 for i, file in enumerate(files):
203 if not language:
204 language = inferlanguage(extension(file))
205 if save_temps and action != "compile":
206 # Need a temporary output file
207 coutput = changeextension(file, "o");
208 files[i] = coutput
209 elif not output:
210 coutput = changeextension(file, "o")
211 else:
212 coutput = output
213 args = ['-x', language, '-o', coutput, file] + compile_opts
214 compile(args)
215 language = ''
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000216
217 if action == 'link':
218 for i, file in enumerate(files):
Anders Carlssonc720d9b2008-01-31 23:48:19 +0000219 ext = extension(file)
Nuno Lopesc46cf492008-08-10 22:17:57 +0000220 if ext != "o" and ext != "a" and ext != "so":
Anders Carlssond125bb12008-01-29 07:21:34 +0000221 out = changeextension(file, "o")
222 args = ['-o', out, file] + compile_opts
Seo Sanghyeon2bfa5332008-01-10 01:43:47 +0000223 compile(args)
224 files[i] = out
225 if not output:
226 output = 'a.out'
227 args = ['-o', output] + link_opts + files
228 link(args)
229
230if __name__ == '__main__':
231 main(sys.argv[1:])