blob: 1ff6af92b10cf823d772f2c0abf9dd4877bc525f [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
Daniel Dunbardff9f502009-01-12 18:51:02 +0000180 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-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 Dunbardff9f502009-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.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000207# 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())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000211
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 Dunbarb37c9652009-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 Dunbar6325fcf2009-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 Dunbarb37c9652009-01-12 21:44:10 +0000291 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-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 Dunbarb37c9652009-01-12 21:44:10 +0000297 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000298 if arglist.getLastArg(arglist.parser.MMDOption):
299 cmd_args.append('-MMD')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000300 # FIXME: Think about this more.
Daniel Dunbar6325fcf2009-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 Dunbarb37c9652009-01-12 21:44:10 +0000306 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
Daniel Dunbar6325fcf2009-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 Dunbardff9f502009-01-12 18:51:02 +0000328 self.addCPPArgs(cmd_args, arch, arglist)
Daniel Dunbar6325fcf2009-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 Dunbarb37c9652009-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 Dunbar6325fcf2009-01-12 09:23:15 +0000342
Daniel Dunbarb37c9652009-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 Dunbar6325fcf2009-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 Dunbarb37c9652009-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 Dunbar6325fcf2009-01-12 09:23:15 +0000367
Daniel Dunbar816dd502009-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 Dunbardff9f502009-01-12 18:51:02 +0000378 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-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 Dunbarb37c9652009-01-12 21:44:10 +0000384 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000385
386 # FIXME: d*
Daniel Dunbar11505a92009-01-13 04:51:51 +0000387
388 # FIXME: Figure out where these are coming from and
389 # dehardcode.
390 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
391 if arg:
392 cmd_args.extend(arglist.render(arg))
393 else:
394 cmd_args.append('-mmacosx-version-min=' +
395 self.toolChain.getMacosxVersionMin())
396 if arglist.getValue(arch) == 'x86_64':
397 cmd_args.append('-m64')
398 else:
399 cmd_args.append('-m32')
400 cmd_args.append('-mtune=core2')
401
Daniel Dunbar816dd502009-01-12 17:53:19 +0000402 # FIXME: m*
403 # FIXME: a*
404
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000405 # FIXME: The goal is to use the user provided -o if that is
406 # our final output, otherwise to drive from the original input
407 # name.
408 #
409 # This implementation is close, but gcc also does this for -S
410 # which is broken, and it would be nice to find a cleaner way
411 # which doesn't introduce a dependency on the output argument
412 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000413 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbar1e0ead42009-01-12 22:19:59 +0000414 if outputOpt and outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000415 cmd_args.append('-auxbase-strip')
416 cmd_args.append(arglist.getValue(outputOpt))
417 else:
418 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000419 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000420
421 # FIXME: g*
422
423 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
424 # FIXME: -Wall is getting some special treatment. Investigate.
425 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
426 arglist.addLastArg(cmd_args, arglist.parser.wOption)
427 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
428 if arglist.getLastArg(arglist.parser.vOption):
429 cmd_args.append('-version')
430 if arglist.getLastArg(arglist.parser.pgOption):
431 cmd_args.append('-p')
432 arglist.addLastArg(cmd_args, arglist.parser.pOption)
433
434 # FIXME: f*
435
436 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
437 if arglist.getLastArg(arglist.parser.QnOption):
438 cmd_args.append('-fno-ident')
439
440 # FIXME: This isn't correct.
441 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
442 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
443
444 if isinstance(output, Jobs.PipedJob):
445 cmd_args.extend(['-o', '-'])
446 elif output is None:
447 cmd_args.extend(['-o', '/dev/null'])
448 else:
449 cmd_args.extend(arglist.render(output))
450
451 # FIXME: Still don't get what is happening here. Investigate.
452 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
453
454 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
455 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
456 cmd_args.append('-fno-builtin')
457 cmd_args.append('-fno-merge-constants')
458
459 if arglist.getLastArg(arglist.parser.coverageOption):
460 cmd_args.append('-fprofile-arcs')
461 cmd_args.append('-ftest-coverage')
462
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000463 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
464 cmd_args))
465
466
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000467class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000468 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000469 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000470 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000471
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000472 def getMacosxVersionTuple(self, arglist):
473 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
474 if arg:
475 version = arglist.getValue(arg)
476 components = version.split('.')
477 try:
478 return tuple(map(int, components))
479 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000480 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000481 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000482 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000483 return (10, major-4, minor)
484
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000485 def addDarwinArch(self, cmd_args, arch, arglist):
486 # Derived from darwin_arch spec.
487 cmd_args.append('-arch')
488 # FIXME: The actual spec uses -m64 for this, but we want to
489 # respect arch. Figure out what exactly gcc is doing.
490 #if arglist.getLastArg(arglist.parser.m_64Option):
491 if arglist.getValue(arch) == 'x86_64':
492 cmd_args.append('x86_64')
493 else:
494 cmd_args.append('i386')
495
496 def addDarwinSubArch(self, cmd_args, arch, arglist):
497 # Derived from darwin_subarch spec, not sure what the
498 # distinction exists for but at least for this chain it is the same.
499 return self.addDarwinArch(cmd_args, arch, arglist)
500
501 def addLinkArgs(self, cmd_args, arch, arglist):
502 # Derived from link spec.
503 if arglist.getLastArg(arglist.parser.staticOption):
504 cmd_args.append('-static')
505 else:
506 cmd_args.append('-dynamic')
507 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
508 # FIXME: Replace -lobjc in forward args with
509 # -lobjc-gnu. How do we wish to handle such things?
510 pass
511
512 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
513 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
514 self.addDarwinArch(cmd_args, arch, arglist)
515 cmd_args.append('-force_cpusubtype_all')
516 else:
517 self.addDarwinSubArch(cmd_args, arch, arglist)
518
519 if arglist.getLastArg(arglist.parser.ZbundleOption):
520 cmd_args.append('-bundle')
521 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
522 '-bundle_loader')
523 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
524 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
525 # FIXME: Where should diagnostics go?
526 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
527 sys.exit(1)
528 if arglist.getLastArg(arglist.parser.current_versionOption):
529 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
530 sys.exit(1)
531 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
532 cmd_args.append('-force_flat_namespace')
533 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
534 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
535 sys.exit(1)
536 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
537 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
538 else:
539 cmd_args.append('-dylib')
540 if arglist.getLastArg(arglist.parser.ZbundleOption):
541 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
542 sys.exit(1)
543 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
544 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
545 sys.exit(1)
546 if arglist.getLastArg(arglist.parser.client_nameOption):
547 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
548 sys.exit(1)
549 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
550 '-dylib_compatibility_version')
551 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
552 '-dylib_current_version')
553
554 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
555 self.addDarwinArch(cmd_args, arch, arglist)
556 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
557 else:
558 self.addDarwinSubArch(cmd_args, arch, arglist)
559
560 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
561 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
562 sys.exit(1)
563
564 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
565 '-dylib_install_name')
566
567 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
568 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
569 sys.exit(1)
570 if arglist.getLastArg(arglist.parser.private_bundleOption):
571 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
572 sys.exit(1)
573
574 if arglist.getLastArg(arglist.parser.Zall_loadOption):
575 cmd_args.append('-all_load')
576
577 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
578 '-allowable_client')
579
580 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
581 cmd_args.append('-bind_at_load')
582
583 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
584 cmd_args.append('-dead_strip')
585
586 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
587 cmd_args.append('-no_dead_strip_inits_and_terms')
588
589 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
590 '-dylib_file')
591
592 if arglist.getLastArg(arglist.parser.ZdynamicOption):
593 cmd_args.append('-dynamic')
594
595 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
596 '-exported_symbols_list')
597
598 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
599 cmd_args.append('-flat_namespace')
600
601 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
602 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
603 '-image_base')
604 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
605 '-init')
606
607 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
608 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
609 # FIXME: I don't understand what is going on
610 # here. This is supposed to come from
611 # darwin_ld_minversion, but gcc doesn't seem to be
612 # following that; it must be getting over-ridden
613 # somewhere.
614 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000615 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000616 else:
617 # addAll doesn't make sense here but this is what gcc
618 # does.
619 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
620 '-macosx_version_min')
621
622 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
623 '-iphoneos_version_min')
624 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
625
626 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
627 cmd_args.append('-multi_module')
628
629 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
630 cmd_args.append('-single_module')
631
632 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
633 '-multiply_defined')
634
635 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
636 '-multiply_defined_unused')
637
638 if arglist.getLastArg(arglist.parser.f_pieOption):
639 cmd_args.append('-pie')
640
641 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
642 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
643 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
644 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
645 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
646 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
647 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
648 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
649 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
650 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
651 '-segaddr')
652 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
653 '-segs_read_only_addr')
654 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
655 '-segs_read_write_addr')
656 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
657 '-seg_addr_table')
658 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
659 '-fn_seg_addr_table_filename')
660 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
661 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
662 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
663 '-syslibroot')
664 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
665 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
666 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
667 '-umbrella')
668 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
669 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
670 '-unexported_symbols_list')
671 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
672 '-weak_reference_mismatches')
673
674 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
675 cmd_args.append('-weak_reference_mismatches')
676 cmd_args.append('non-weak')
677
678 arglist.addLastArg(cmd_args, arglist.parser.XOption)
679 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
680 arglist.addLastArg(cmd_args, arglist.parser.wOption)
681 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
682 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
683 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
684 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
685 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
686 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
687 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
688 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
689 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
690 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
691 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
692 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000693
694 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000695 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000696 assert outputType is Types.ImageType
697
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000698 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000699 # comes from specs (starting with link_command). Consult gcc
700 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000701
702 # FIXME: gcc's spec controls when this is done; certain things
703 # like -filelist or -Wl, still trigger a link stage. I don't
704 # quite understand how gcc decides to execute the linker,
705 # investigate. Also, the spec references -fdump= which seems
706 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000707 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000708
709 # Not sure why this particular decomposition exists in gcc.
710 self.addLinkArgs(cmd_args, arch, arglist)
711
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000712 # This toolchain never accumlates options in specs, the only
713 # place this gets used is to add -ObjC.
714 if (arglist.getLastArg(arglist.parser.ObjCOption) or
715 arglist.getLastArg(arglist.parser.f_objcOption)):
716 cmd_args.append('-ObjC')
717 if arglist.getLastArg(arglist.parser.ObjCXXOption):
718 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000719
720 # FIXME: gcc has %{x} in here. How could this ever happen?
721 # Cruft?
722 arglist.addLastArg(cmd_args, arglist.parser.dOption)
723 arglist.addLastArg(cmd_args, arglist.parser.tOption)
724 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
725 arglist.addLastArg(cmd_args, arglist.parser.uOption)
726 arglist.addLastArg(cmd_args, arglist.parser.AOption)
727 arglist.addLastArg(cmd_args, arglist.parser.eOption)
728 arglist.addLastArg(cmd_args, arglist.parser.mOption)
729 arglist.addLastArg(cmd_args, arglist.parser.rOption)
730
731 cmd_args.extend(arglist.render(output))
732
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000733 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000734 if (not arglist.getLastArg(arglist.parser.AOption) and
735 not arglist.getLastArg(arglist.parser.nostdlibOption) and
736 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
737 # Derived from startfile spec.
738 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
739 # Derived from darwin_dylib1 spec.
740 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
741 cmd_args.append('-ldylib1.o')
742 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000743 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000744 cmd_args.append('-ldylib1.o')
745 else:
746 cmd_args.append('-ldylib1.10.5.o')
747 else:
748 if arglist.getLastArg(arglist.parser.ZbundleOption):
749 if not arglist.getLastArg(arglist.parser.staticOption):
750 cmd_args.append('-lbundle1.o')
751 else:
752 if arglist.getLastArg(arglist.parser.pgOption):
753 if arglist.getLastArg(arglist.parser.staticOption):
754 cmd_args.append('-lgcrt0.o')
755 else:
756 if arglist.getLastArg(arglist.parser.objectOption):
757 cmd_args.append('-lgcrt0.o')
758 else:
759 if arglist.getLastArg(arglist.parser.preloadOption):
760 cmd_args.append('-lgcrt0.o')
761 else:
762 cmd_args.append('-lgcrt1.o')
763
764 # darwin_crt2 spec is empty.
765 pass
766 else:
767 if arglist.getLastArg(arglist.parser.staticOption):
768 cmd_args.append('-lcrt0.o')
769 else:
770 if arglist.getLastArg(arglist.parser.objectOption):
771 cmd_args.append('-lcrt0.o')
772 else:
773 if arglist.getLastArg(arglist.parser.preloadOption):
774 cmd_args.append('-lcrt0.o')
775 else:
776 # Derived from darwin_crt1 spec.
777 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
778 cmd_args.append('-lcrt1.o')
779 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000780 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000781 cmd_args.append('-lcrt1.o')
782 else:
783 cmd_args.append('-lcrt1.10.5.o')
784
785 # darwin_crt2 spec is empty.
786 pass
787
788 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
789 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000790 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000791 # FIXME: gcc does a library search for this
792 # file, this will be be broken currently.
793 cmd_args.append('crt3.o')
794
795 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
796
797 if arglist.getLastArg(arglist.parser.f_openmpOption):
798 # This is more complicated in gcc...
799 cmd_args.append('-lgomp')
800
801 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000802 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000803 if arglist.getValue(arch) == 'x86_64':
804 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
805 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
806 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
807 "-L/usr/lib/gcc/%s" % tcDir,
808 "-L/usr/lib/gcc/%s" % tcDir,
809 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
810 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000811
Daniel Dunbara5677512009-01-05 19:53:30 +0000812 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000813 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000814
815 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
816 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
817 arglist.getLastArg(arglist.parser.f_createProfileOption) or
818 arglist.getLastArg(arglist.parser.coverageOption)):
819 cmd_args.append('-lgcov')
820
821 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
822 cmd_args.append('-allow_stack_execute')
823
824 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
825 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
826 # link_ssp spec is empty.
827
828 # Derived from libgcc spec.
829 if arglist.getLastArg(arglist.parser.staticOption):
830 cmd_args.append('-lgcc_static')
831 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
832 cmd_args.append('-lgcc_eh')
833 cmd_args.append('-lgcc')
834 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
835 # Derived from darwin_iphoneos_libgcc spec.
836 cmd_args.append('-lgcc_s.10.5')
837 cmd_args.append('-lgcc')
838 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
839 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
840 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000841 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000842 cmd_args.append('-lgcc_s.10.4')
843 else:
844 cmd_args.append('-lgcc_s.10.5')
845 cmd_args.append('-lgcc')
846 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000847 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000848 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000849 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000850 cmd_args.append('-lgcc_s.10.5')
851 cmd_args.append('-lgcc')
852
853 # Derived from lib spec.
854 if not arglist.getLastArg(arglist.parser.staticOption):
855 cmd_args.append('-lSystem')
856
857 if (not arglist.getLastArg(arglist.parser.AOption) and
858 not arglist.getLastArg(arglist.parser.nostdlibOption) and
859 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
860 # endfile_spec is empty.
861 pass
862
863 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
864 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
865
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000866 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
867 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000868
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000869 # FIXME: We need to add a dsymutil job here in some particular
870 # cases (basically whenever we have a c-family input we are
871 # compiling, I think). Find out why this is the condition, and
872 # implement. See link_command spec for more details.
873
Daniel Dunbara5677512009-01-05 19:53:30 +0000874class LipoTool(Tool):
875 def __init__(self):
876 super(LipoTool, self).__init__('lipo')
877
878 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000879 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000880 assert outputType is Types.ImageType
881
Daniel Dunbardb439902009-01-07 18:40:45 +0000882 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000883 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000884 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000885 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000886 jobs.addJob(Jobs.Command('lipo', cmd_args))