blob: 4156efa03b4d790d9f765278a713880392347b66 [file] [log] [blame]
Daniel Dunbar6325fcf2009-01-12 09:23:15 +00001import os
Daniel Dunbar9c199a02009-01-11 23:13:15 +00002import sys # FIXME: Shouldn't be needed.
3
Daniel Dunbara5677512009-01-05 19:53:30 +00004import Arguments
5import Jobs
6import Types
7
8class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +00009 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000010
11 eFlagsPipedInput = 1 << 0
12 eFlagsPipedOutput = 1 << 1
13 eFlagsIntegratedCPP = 1 << 2
14
15 def __init__(self, name, flags = 0):
16 self.name = name
17 self.flags = flags
18
19 def acceptsPipedInput(self):
20 return not not (self.flags & Tool.eFlagsPipedInput)
21 def canPipeOutput(self):
22 return not not (self.flags & Tool.eFlagsPipedOutput)
23 def hasIntegratedCPP(self):
24 return not not (self.flags & Tool.eFlagsIntegratedCPP)
25
26class GCC_Common_Tool(Tool):
27 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000028 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +000029 extraArgs):
Daniel Dunbardb439902009-01-07 18:40:45 +000030 cmd_args = sum(map(arglist.render, args),[]) + extraArgs
Daniel Dunbara5677512009-01-05 19:53:30 +000031 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000032 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000033 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000034 cmd_args.extend(['-o', '-'])
Daniel Dunbara5677512009-01-05 19:53:30 +000035 elif output is None:
Daniel Dunbardb439902009-01-07 18:40:45 +000036 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000037 else:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000038 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000039
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000040 # Only pass -x if gcc will understand it; otherwise hope gcc
41 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000042 # would go wrong in is for linker inputs if they happened to
43 # have an odd suffix; really the only way to get this to
44 # happen is a command like '-x foobar a.c' which will treat
45 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000046 #
47 # FIXME: For the linker case specifically, can we safely
48 # convert inputs into '-Wl,' options?
49 for input in inputs:
50 if input.type.canBeUserSpecified:
51 cmd_args.extend(['-x', input.type.name])
52
53 if isinstance(input.source, Jobs.PipedJob):
54 cmd_args.append('-')
55 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000056 assert isinstance(input.source, Arguments.Arg)
57 # If this is a linker input then assume we can forward
58 # just by rendering.
59 if input.source.opt.isLinkerInput:
60 cmd_args.extend(arglist.render(input.source))
61 else:
62 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000063
64 jobs.addJob(Jobs.Command('gcc', cmd_args))
65
66class GCC_PreprocessTool(GCC_Common_Tool):
67 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000068 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000069 (Tool.eFlagsPipedInput |
70 Tool.eFlagsPipedOutput))
71
72 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000073 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000074 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000075 output, outputType, args, arglist,
76 ['-E'])
Daniel Dunbara5677512009-01-05 19:53:30 +000077
78class GCC_CompileTool(GCC_Common_Tool):
79 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000080 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000081 (Tool.eFlagsPipedInput |
82 Tool.eFlagsPipedOutput |
83 Tool.eFlagsIntegratedCPP))
84
85 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000086 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000087 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000088 output, outputType, args, arglist,
89 ['-S'])
Daniel Dunbara5677512009-01-05 19:53:30 +000090
91class GCC_PrecompileTool(GCC_Common_Tool):
92 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000093 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +000094 (Tool.eFlagsPipedInput |
95 Tool.eFlagsIntegratedCPP))
96
97 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000098 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000099 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000100 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +0000101 [])
102
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000103class Darwin_AssembleTool(Tool):
104 def __init__(self, toolChain):
105 super(Darwin_AssembleTool, self).__init__('as',
106 Tool.eFlagsPipedInput)
107 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000108
109 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000110 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000111 assert len(inputs) == 1
112 assert outputType is Types.ObjectType
113
114 input = inputs[0]
115
116 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000117
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000118 if (arglist.getLastArg(arglist.parser.gOption) or
119 arglist.getLastArg(arglist.parser.g3Option)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000120 cmd_args.append('--gstabs')
121
122 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000123 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000124 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000125 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000126 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
127 arglist.getLastArg(arglist.parser.staticOption) or
128 arglist.getLastArg(arglist.parser.f_appleKextOption)):
129 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
130 cmd_args.append('-static')
131
132 for arg in arglist.getArgs2(arglist.parser.WaOption,
133 arglist.parser.XassemblerOption):
134 cmd_args.extend(arglist.getValues(arg))
135
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000136 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000137 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000138 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000139 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000140 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000141
142 # asm_final spec is empty.
143
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000144 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
145 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000146
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000147class GCC_AssembleTool(GCC_Common_Tool):
148 def __init__(self):
149 # We can't generally assume the assembler can take or output
150 # on pipes.
151 super(GCC_AssembleTool, self).__init__('gcc (as)')
152
153 def constructJob(self, phase, arch, jobs, inputs,
154 output, outputType, args, arglist):
155 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
156 output, outputType, args, arglist,
157 ['-c'])
158
159class GCC_LinkTool(GCC_Common_Tool):
160 def __init__(self):
161 super(GCC_LinkTool, self).__init__('gcc (ld)')
162
163 def constructJob(self, phase, arch, jobs, inputs,
164 output, outputType, args, arglist):
165 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
166 output, outputType, args, arglist,
167 [])
168
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000169class Darwin_X86_CompileTool(Tool):
170 def __init__(self, toolChain):
171 super(Darwin_X86_CompileTool, self).__init__('cc1',
172 (Tool.eFlagsPipedInput |
173 Tool.eFlagsPipedOutput |
174 Tool.eFlagsIntegratedCPP))
175 self.toolChain = toolChain
176
Daniel Dunbardff9f502009-01-12 18:51:02 +0000177 def addCPPArgs(self, cmd_args, arch, arglist):
178 # Derived from cpp spec.
179
180 # FIXME: The gcc spec is broken here, it refers to dynamic but
181 # that has been translated.
182 if arglist.getLastArg(arglist.parser.staticOption):
183 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
184 cmd_args.append('-D__STATIC__')
185 else:
186 cmd_args.append('-D__DYNAMIC__')
187
188 if arglist.getLastArg(arglist.parser.pthreadOption):
189 cmd_args.append('-D_REENTRANT')
190
191 def addCC1Args(self, cmd_args, arch, arglist):
192 # Derived from cc1 spec.
193
194 # FIXME: -fapple-kext seems to disable this too. Investigate.
195 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
196 not arglist.getLastArg(arglist.parser.staticOption) and
197 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
198 cmd_args.append('-fPIC')
199
200 # FIXME: Remove mthumb
201 # FIXME: Remove mno-thumb
202
203 # FIXME: As with ld, something else is going on. My best guess
204 # is gcc is faking an -mmacosx-version-min
205 # somewhere. Investigate.
206 if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
207 not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
208 cmd_args.append('-mmacosx-version-min=' +
209 self.toolChain.getMacosxVersionMin())
210
211 # FIXME: Remove faltivec
212 # FIXME: Remove mno-fused-madd
213 # FIXME: Remove mlong-branch
214 # FIXME: Remove mlongcall
215 # FIXME: Remove mcpu=G4
216 # FIXME: Remove mcpu=G5
217
218 if (arglist.getLastArg(arglist.parser.gOption) and
219 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
220 cmd_args.append('-feliminate-unused-debug-symbols')
221
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000222 def getBaseInputName(self, inputs, arglist):
223 # FIXME: gcc uses a temporary name here when the base
224 # input is stdin, but only in auxbase. Investigate.
225 baseInputValue = arglist.getValue(inputs[0].baseInput)
226 return os.path.basename(baseInputValue)
227
228 def getBaseInputStem(self, inputs, arglist):
229 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
230
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000231 def constructJob(self, phase, arch, jobs, inputs,
232 output, outputType, args, arglist):
233 inputType = inputs[0].type
234 assert not [i for i in inputs if i.type != inputType]
235
236 usePP = False
237 if inputType is Types.CType:
238 cc1Name = 'cc1'
239 usePP = True
240 elif inputType is Types.CTypeNoPP:
241 cc1Name = 'cc1'
242 usePP = False
243 elif inputType is Types.ObjCType:
244 cc1Name = 'cc1obj'
245 usePP = True
246 elif inputType is Types.ObjCTypeNoPP:
247 cc1Name = 'cc1obj'
248 usePP = False
249 elif inputType is Types.CXXType:
250 cc1Name = 'cc1plus'
251 usePP = True
252 elif inputType is Types.CXXTypeNoPP:
253 cc1Name = 'cc1plus'
254 usePP = False
255 elif inputType is Types.ObjCXXType:
256 cc1Name = 'cc1objplus'
257 usePP = True
258 elif inputType is Types.ObjCXXTypeNoPP:
259 cc1Name = 'cc1objplus'
260 usePP = False
261 else:
262 raise RuntimeError,"Unexpected input type for Darwin compile tool."
263
264 cmd_args = []
265 if (arglist.getLastArg(arglist.parser.traditionalOption) or
266 arglist.getLastArg(arglist.parser.f_traditionalOption)):
267 raise ValueError,"-traditional is not supported without -E"
268
269 if usePP:
270 # Derived from cpp_unique_options.
271
272 if (arglist.getLastArg(arglist.parser.COption) or
273 arglist.getLastArg(arglist.parser.CCOption)):
274 if not arglist.getLastArg(arglist.parser.EOption):
275 raise ValueError,"-C or -CC is not supported without -E"
276 if not arglist.getLastArg(arglist.parser.QOption):
277 cmd_args.append('-quiet')
278 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
279 arglist.addLastArg(cmd_args, arglist.parser.vOption)
280 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
281 arglist.addLastArg(cmd_args, arglist.parser.POption)
282
283 # FIXME: Handle %I properly.
284 if arglist.getValue(arch) == 'x86_64':
285 cmd_args.append('-imultilib')
286 cmd_args.append('x86_64')
287
288 if arglist.getLastArg(arglist.parser.MDOption):
289 cmd_args.append('-MD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000290 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000291 outputOpt = arglist.getLastArg(arglist.parser.oOption)
292 if outputOpt:
293 base,ext = os.path.splitext(arglist.getValue(outputOpt))
294 cmd_args.append(base+'.d')
295 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000296 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000297 if arglist.getLastArg(arglist.parser.MMDOption):
298 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000299 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000300 outputOpt = arglist.getLastArg(arglist.parser.oOption)
301 if outputOpt:
302 base,ext = os.path.splitext(arglist.getValue(outputOpt))
303 cmd_args.append(base+'.d')
304 else:
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000305 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000306 arglist.addLastArg(cmd_args, arglist.parser.MOption)
307 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
308 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
309 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
310 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
311 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
312 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
313 if (not arglist.getLastArg(arglist.parser.MOption) and
314 not arglist.getLastArg(arglist.parser.MMOption) and
315 (arglist.getLastArg(arglist.parser.MDOption) or
316 arglist.getLastArg(arglist.parser.MMDOption))):
317 outputOpt = arglist.getLastArg(arglist.parser.oOption)
318 if outputOpt:
319 cmd_args.append('-MQ')
320 cmd_args.append(arglist.getValue(outputOpt))
321
322 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
323 if arglist.getLastArg(arglist.parser.g3Option):
324 cmd_args.append('-dD')
325 arglist.addLastArg(cmd_args, arglist.parser.HOption)
326
Daniel Dunbardff9f502009-01-12 18:51:02 +0000327 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000328
329 arglist.addAllArgs3(cmd_args,
330 arglist.parser.DOption,
331 arglist.parser.UOption,
332 arglist.parser.AOption)
333
334 # FIXME: Add i*
335
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000336 for input in inputs:
337 if isinstance(input.source, Jobs.PipedJob):
338 cmd_args.append('-')
339 else:
340 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000341
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000342 for arg in arglist.getArgs2(arglist.parser.WpOption,
343 arglist.parser.XpreprocessorOption):
344 cmd_args.extend(arglist.getValues(arg))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000345
346 if arglist.getLastArg(arglist.parser.f_mudflapOption):
347 cmd_args.append('-D_MUDFLAP')
348 cmd_args.append('-include')
349 cmd_args.append('mf-runtime.h')
350
351 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
352 cmd_args.append('-D_MUDFLAP')
353 cmd_args.append('-D_MUDFLAPTH')
354 cmd_args.append('-include')
355 cmd_args.append('mf-runtime.h')
356 else:
357 cmd_args.append('-fpreprocessed')
358 # FIXME: There is a spec command to remove
359 # -fpredictive-compilation args here. Investigate.
360
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000361 for input in inputs:
362 if isinstance(input.source, Jobs.PipedJob):
363 cmd_args.append('-')
364 else:
365 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000366
Daniel Dunbar816dd502009-01-12 17:53:19 +0000367 # Derived from cc1_options spec.
368 if (arglist.getLastArg(arglist.parser.fastOption) or
369 arglist.getLastArg(arglist.parser.fastfOption) or
370 arglist.getLastArg(arglist.parser.fastcpOption)):
371 cmd_args.append('-O3')
372
373 if (arglist.getLastArg(arglist.parser.pgOption) and
374 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
375 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
376
Daniel Dunbardff9f502009-01-12 18:51:02 +0000377 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000378
379 if not arglist.getLastArg(arglist.parser.QOption):
380 cmd_args.append('-quiet')
381
382 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000383 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000384
385 # FIXME: d*
386 # FIXME: m*
387 # FIXME: a*
388
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000389 # FIXME: The goal is to use the user provided -o if that is
390 # our final output, otherwise to drive from the original input
391 # name.
392 #
393 # This implementation is close, but gcc also does this for -S
394 # which is broken, and it would be nice to find a cleaner way
395 # which doesn't introduce a dependency on the output argument
396 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000397 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000398 if outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000399 cmd_args.append('-auxbase-strip')
400 cmd_args.append(arglist.getValue(outputOpt))
401 else:
402 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000403 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000404
405 # FIXME: g*
406
407 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
408 # FIXME: -Wall is getting some special treatment. Investigate.
409 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
410 arglist.addLastArg(cmd_args, arglist.parser.wOption)
411 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
412 if arglist.getLastArg(arglist.parser.vOption):
413 cmd_args.append('-version')
414 if arglist.getLastArg(arglist.parser.pgOption):
415 cmd_args.append('-p')
416 arglist.addLastArg(cmd_args, arglist.parser.pOption)
417
418 # FIXME: f*
419
420 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
421 if arglist.getLastArg(arglist.parser.QnOption):
422 cmd_args.append('-fno-ident')
423
424 # FIXME: This isn't correct.
425 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
426 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
427
428 if isinstance(output, Jobs.PipedJob):
429 cmd_args.extend(['-o', '-'])
430 elif output is None:
431 cmd_args.extend(['-o', '/dev/null'])
432 else:
433 cmd_args.extend(arglist.render(output))
434
435 # FIXME: Still don't get what is happening here. Investigate.
436 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
437
438 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
439 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
440 cmd_args.append('-fno-builtin')
441 cmd_args.append('-fno-merge-constants')
442
443 if arglist.getLastArg(arglist.parser.coverageOption):
444 cmd_args.append('-fprofile-arcs')
445 cmd_args.append('-ftest-coverage')
446
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000447 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
448 cmd_args))
449
450
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000451class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000452 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000453 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000454 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000455
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000456 def getMacosxVersionTuple(self, arglist):
457 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
458 if arg:
459 version = arglist.getValue(arg)
460 components = version.split('.')
461 try:
462 return tuple(map(int, components))
463 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000464 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000465 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000466 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000467 return (10, major-4, minor)
468
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000469 def addDarwinArch(self, cmd_args, arch, arglist):
470 # Derived from darwin_arch spec.
471 cmd_args.append('-arch')
472 # FIXME: The actual spec uses -m64 for this, but we want to
473 # respect arch. Figure out what exactly gcc is doing.
474 #if arglist.getLastArg(arglist.parser.m_64Option):
475 if arglist.getValue(arch) == 'x86_64':
476 cmd_args.append('x86_64')
477 else:
478 cmd_args.append('i386')
479
480 def addDarwinSubArch(self, cmd_args, arch, arglist):
481 # Derived from darwin_subarch spec, not sure what the
482 # distinction exists for but at least for this chain it is the same.
483 return self.addDarwinArch(cmd_args, arch, arglist)
484
485 def addLinkArgs(self, cmd_args, arch, arglist):
486 # Derived from link spec.
487 if arglist.getLastArg(arglist.parser.staticOption):
488 cmd_args.append('-static')
489 else:
490 cmd_args.append('-dynamic')
491 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
492 # FIXME: Replace -lobjc in forward args with
493 # -lobjc-gnu. How do we wish to handle such things?
494 pass
495
496 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
497 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
498 self.addDarwinArch(cmd_args, arch, arglist)
499 cmd_args.append('-force_cpusubtype_all')
500 else:
501 self.addDarwinSubArch(cmd_args, arch, arglist)
502
503 if arglist.getLastArg(arglist.parser.ZbundleOption):
504 cmd_args.append('-bundle')
505 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
506 '-bundle_loader')
507 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
508 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
509 # FIXME: Where should diagnostics go?
510 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
511 sys.exit(1)
512 if arglist.getLastArg(arglist.parser.current_versionOption):
513 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
514 sys.exit(1)
515 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
516 cmd_args.append('-force_flat_namespace')
517 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
518 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
519 sys.exit(1)
520 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
521 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
522 else:
523 cmd_args.append('-dylib')
524 if arglist.getLastArg(arglist.parser.ZbundleOption):
525 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
526 sys.exit(1)
527 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
528 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
529 sys.exit(1)
530 if arglist.getLastArg(arglist.parser.client_nameOption):
531 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
532 sys.exit(1)
533 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
534 '-dylib_compatibility_version')
535 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
536 '-dylib_current_version')
537
538 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
539 self.addDarwinArch(cmd_args, arch, arglist)
540 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
541 else:
542 self.addDarwinSubArch(cmd_args, arch, arglist)
543
544 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
545 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
546 sys.exit(1)
547
548 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
549 '-dylib_install_name')
550
551 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
552 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
553 sys.exit(1)
554 if arglist.getLastArg(arglist.parser.private_bundleOption):
555 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
556 sys.exit(1)
557
558 if arglist.getLastArg(arglist.parser.Zall_loadOption):
559 cmd_args.append('-all_load')
560
561 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
562 '-allowable_client')
563
564 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
565 cmd_args.append('-bind_at_load')
566
567 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
568 cmd_args.append('-dead_strip')
569
570 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
571 cmd_args.append('-no_dead_strip_inits_and_terms')
572
573 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
574 '-dylib_file')
575
576 if arglist.getLastArg(arglist.parser.ZdynamicOption):
577 cmd_args.append('-dynamic')
578
579 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
580 '-exported_symbols_list')
581
582 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
583 cmd_args.append('-flat_namespace')
584
585 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
586 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
587 '-image_base')
588 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
589 '-init')
590
591 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
592 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
593 # FIXME: I don't understand what is going on
594 # here. This is supposed to come from
595 # darwin_ld_minversion, but gcc doesn't seem to be
596 # following that; it must be getting over-ridden
597 # somewhere.
598 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000599 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000600 else:
601 # addAll doesn't make sense here but this is what gcc
602 # does.
603 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
604 '-macosx_version_min')
605
606 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
607 '-iphoneos_version_min')
608 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
609
610 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
611 cmd_args.append('-multi_module')
612
613 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
614 cmd_args.append('-single_module')
615
616 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
617 '-multiply_defined')
618
619 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
620 '-multiply_defined_unused')
621
622 if arglist.getLastArg(arglist.parser.f_pieOption):
623 cmd_args.append('-pie')
624
625 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
626 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
627 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
628 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
629 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
630 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
631 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
632 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
633 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
634 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
635 '-segaddr')
636 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
637 '-segs_read_only_addr')
638 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
639 '-segs_read_write_addr')
640 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
641 '-seg_addr_table')
642 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
643 '-fn_seg_addr_table_filename')
644 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
645 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
646 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
647 '-syslibroot')
648 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
649 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
650 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
651 '-umbrella')
652 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
653 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
654 '-unexported_symbols_list')
655 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
656 '-weak_reference_mismatches')
657
658 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
659 cmd_args.append('-weak_reference_mismatches')
660 cmd_args.append('non-weak')
661
662 arglist.addLastArg(cmd_args, arglist.parser.XOption)
663 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
664 arglist.addLastArg(cmd_args, arglist.parser.wOption)
665 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
666 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
667 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
668 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
669 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
670 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
671 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
672 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
673 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
674 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
675 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
676 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000677
678 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000679 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000680 assert outputType is Types.ImageType
681
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000682 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000683 # comes from specs (starting with link_command). Consult gcc
684 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000685
686 # FIXME: gcc's spec controls when this is done; certain things
687 # like -filelist or -Wl, still trigger a link stage. I don't
688 # quite understand how gcc decides to execute the linker,
689 # investigate. Also, the spec references -fdump= which seems
690 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000691 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000692
693 # Not sure why this particular decomposition exists in gcc.
694 self.addLinkArgs(cmd_args, arch, arglist)
695
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000696 # This toolchain never accumlates options in specs, the only
697 # place this gets used is to add -ObjC.
698 if (arglist.getLastArg(arglist.parser.ObjCOption) or
699 arglist.getLastArg(arglist.parser.f_objcOption)):
700 cmd_args.append('-ObjC')
701 if arglist.getLastArg(arglist.parser.ObjCXXOption):
702 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000703
704 # FIXME: gcc has %{x} in here. How could this ever happen?
705 # Cruft?
706 arglist.addLastArg(cmd_args, arglist.parser.dOption)
707 arglist.addLastArg(cmd_args, arglist.parser.tOption)
708 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
709 arglist.addLastArg(cmd_args, arglist.parser.uOption)
710 arglist.addLastArg(cmd_args, arglist.parser.AOption)
711 arglist.addLastArg(cmd_args, arglist.parser.eOption)
712 arglist.addLastArg(cmd_args, arglist.parser.mOption)
713 arglist.addLastArg(cmd_args, arglist.parser.rOption)
714
715 cmd_args.extend(arglist.render(output))
716
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000717 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000718 if (not arglist.getLastArg(arglist.parser.AOption) and
719 not arglist.getLastArg(arglist.parser.nostdlibOption) and
720 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
721 # Derived from startfile spec.
722 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
723 # Derived from darwin_dylib1 spec.
724 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
725 cmd_args.append('-ldylib1.o')
726 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000727 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000728 cmd_args.append('-ldylib1.o')
729 else:
730 cmd_args.append('-ldylib1.10.5.o')
731 else:
732 if arglist.getLastArg(arglist.parser.ZbundleOption):
733 if not arglist.getLastArg(arglist.parser.staticOption):
734 cmd_args.append('-lbundle1.o')
735 else:
736 if arglist.getLastArg(arglist.parser.pgOption):
737 if arglist.getLastArg(arglist.parser.staticOption):
738 cmd_args.append('-lgcrt0.o')
739 else:
740 if arglist.getLastArg(arglist.parser.objectOption):
741 cmd_args.append('-lgcrt0.o')
742 else:
743 if arglist.getLastArg(arglist.parser.preloadOption):
744 cmd_args.append('-lgcrt0.o')
745 else:
746 cmd_args.append('-lgcrt1.o')
747
748 # darwin_crt2 spec is empty.
749 pass
750 else:
751 if arglist.getLastArg(arglist.parser.staticOption):
752 cmd_args.append('-lcrt0.o')
753 else:
754 if arglist.getLastArg(arglist.parser.objectOption):
755 cmd_args.append('-lcrt0.o')
756 else:
757 if arglist.getLastArg(arglist.parser.preloadOption):
758 cmd_args.append('-lcrt0.o')
759 else:
760 # Derived from darwin_crt1 spec.
761 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
762 cmd_args.append('-lcrt1.o')
763 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000764 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000765 cmd_args.append('-lcrt1.o')
766 else:
767 cmd_args.append('-lcrt1.10.5.o')
768
769 # darwin_crt2 spec is empty.
770 pass
771
772 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
773 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000774 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000775 # FIXME: gcc does a library search for this
776 # file, this will be be broken currently.
777 cmd_args.append('crt3.o')
778
779 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
780
781 if arglist.getLastArg(arglist.parser.f_openmpOption):
782 # This is more complicated in gcc...
783 cmd_args.append('-lgomp')
784
785 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000786 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000787 if arglist.getValue(arch) == 'x86_64':
788 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
789 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
790 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
791 "-L/usr/lib/gcc/%s" % tcDir,
792 "-L/usr/lib/gcc/%s" % tcDir,
793 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
794 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000795
Daniel Dunbara5677512009-01-05 19:53:30 +0000796 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000797 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000798
799 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
800 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
801 arglist.getLastArg(arglist.parser.f_createProfileOption) or
802 arglist.getLastArg(arglist.parser.coverageOption)):
803 cmd_args.append('-lgcov')
804
805 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
806 cmd_args.append('-allow_stack_execute')
807
808 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
809 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
810 # link_ssp spec is empty.
811
812 # Derived from libgcc spec.
813 if arglist.getLastArg(arglist.parser.staticOption):
814 cmd_args.append('-lgcc_static')
815 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
816 cmd_args.append('-lgcc_eh')
817 cmd_args.append('-lgcc')
818 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
819 # Derived from darwin_iphoneos_libgcc spec.
820 cmd_args.append('-lgcc_s.10.5')
821 cmd_args.append('-lgcc')
822 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
823 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
824 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000825 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000826 cmd_args.append('-lgcc_s.10.4')
827 else:
828 cmd_args.append('-lgcc_s.10.5')
829 cmd_args.append('-lgcc')
830 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000831 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000832 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000833 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000834 cmd_args.append('-lgcc_s.10.5')
835 cmd_args.append('-lgcc')
836
837 # Derived from lib spec.
838 if not arglist.getLastArg(arglist.parser.staticOption):
839 cmd_args.append('-lSystem')
840
841 if (not arglist.getLastArg(arglist.parser.AOption) and
842 not arglist.getLastArg(arglist.parser.nostdlibOption) and
843 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
844 # endfile_spec is empty.
845 pass
846
847 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
848 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
849
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000850 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
851 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000852
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000853 # FIXME: We need to add a dsymutil job here in some particular
854 # cases (basically whenever we have a c-family input we are
855 # compiling, I think). Find out why this is the condition, and
856 # implement. See link_command spec for more details.
857
Daniel Dunbara5677512009-01-05 19:53:30 +0000858class LipoTool(Tool):
859 def __init__(self):
860 super(LipoTool, self).__init__('lipo')
861
862 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000863 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000864 assert outputType is Types.ImageType
865
Daniel Dunbardb439902009-01-07 18:40:45 +0000866 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000867 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000868 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000869 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000870 jobs.addJob(Jobs.Command('lipo', cmd_args))