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