blob: 57c8afc6bb5591432df98fb00754127b9c2659c5 [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 Dunbar8bf90fd2009-01-13 05:54:38 +0000118 if arglist.getLastArg(arglist.parser.gGroup):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000119 cmd_args.append('--gstabs')
120
121 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000122 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000123 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000124 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000125 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
126 arglist.getLastArg(arglist.parser.staticOption) or
127 arglist.getLastArg(arglist.parser.f_appleKextOption)):
128 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
129 cmd_args.append('-static')
130
131 for arg in arglist.getArgs2(arglist.parser.WaOption,
132 arglist.parser.XassemblerOption):
133 cmd_args.extend(arglist.getValues(arg))
134
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000135 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000136 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000137 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000138 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000139 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000140
141 # asm_final spec is empty.
142
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000143 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
144 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000145
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000146class GCC_AssembleTool(GCC_Common_Tool):
147 def __init__(self):
148 # We can't generally assume the assembler can take or output
149 # on pipes.
150 super(GCC_AssembleTool, self).__init__('gcc (as)')
151
152 def constructJob(self, phase, arch, jobs, inputs,
153 output, outputType, args, arglist):
154 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
155 output, outputType, args, arglist,
156 ['-c'])
157
158class GCC_LinkTool(GCC_Common_Tool):
159 def __init__(self):
160 super(GCC_LinkTool, self).__init__('gcc (ld)')
161
162 def constructJob(self, phase, arch, jobs, inputs,
163 output, outputType, args, arglist):
164 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
165 output, outputType, args, arglist,
166 [])
167
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000168class Darwin_X86_CompileTool(Tool):
169 def __init__(self, toolChain):
170 super(Darwin_X86_CompileTool, self).__init__('cc1',
171 (Tool.eFlagsPipedInput |
172 Tool.eFlagsPipedOutput |
173 Tool.eFlagsIntegratedCPP))
174 self.toolChain = toolChain
175
Daniel Dunbardff9f502009-01-12 18:51:02 +0000176 def addCPPArgs(self, cmd_args, arch, arglist):
177 # Derived from cpp spec.
178
Daniel Dunbardff9f502009-01-12 18:51:02 +0000179 if arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar93a08e62009-01-13 01:04:40 +0000180 # The gcc spec is broken here, it refers to dynamic but
181 # that has been translated. Start by being bug compatible.
182
183 # if not arglist.getLastArg(arglist.parser.ZdynamicOption):
184 cmd_args.append('-D__STATIC__')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000185 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.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000206# 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())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000210
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
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000334 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000335
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
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000385 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000386
387 # FIXME: Figure out where these are coming from and
388 # dehardcode.
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000389 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
Daniel Dunbar11505a92009-01-13 04:51:51 +0000390 cmd_args.append('-mmacosx-version-min=' +
391 self.toolChain.getMacosxVersionMin())
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000392 if (not arglist.getLastArg(arglist.parser.m_32Option) and
393 not arglist.getLastArg(arglist.parser.m_64Option)):
394 if arglist.getValue(arch) == 'x86_64':
395 cmd_args.append('-m64')
396 else:
397 cmd_args.append('-m32')
398 if not arglist.getLastArg(arglist.parser.m_tuneOption):
399 cmd_args.append('-mtune=core2')
Daniel Dunbar11505a92009-01-13 04:51:51 +0000400
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000401 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
402 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000403
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000404 # FIXME: The goal is to use the user provided -o if that is
405 # our final output, otherwise to drive from the original input
406 # name.
407 #
408 # This implementation is close, but gcc also does this for -S
409 # which is broken, and it would be nice to find a cleaner way
410 # which doesn't introduce a dependency on the output argument
411 # we are given.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000412 outputOpt = arglist.getLastArg(arglist.parser.oOption)
Daniel Dunbar1e0ead42009-01-12 22:19:59 +0000413 if outputOpt and outputOpt is output:
Daniel Dunbar816dd502009-01-12 17:53:19 +0000414 cmd_args.append('-auxbase-strip')
415 cmd_args.append(arglist.getValue(outputOpt))
416 else:
417 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000418 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000419
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000420 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000421
422 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
423 # FIXME: -Wall is getting some special treatment. Investigate.
424 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
425 arglist.addLastArg(cmd_args, arglist.parser.wOption)
426 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
427 if arglist.getLastArg(arglist.parser.vOption):
428 cmd_args.append('-version')
429 if arglist.getLastArg(arglist.parser.pgOption):
430 cmd_args.append('-p')
431 arglist.addLastArg(cmd_args, arglist.parser.pOption)
432
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000433 # ccc treats -fsyntax-only specially.
434 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
435 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000436
437 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
438 if arglist.getLastArg(arglist.parser.QnOption):
439 cmd_args.append('-fno-ident')
440
441 # FIXME: This isn't correct.
442 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
443 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
444
445 if isinstance(output, Jobs.PipedJob):
446 cmd_args.extend(['-o', '-'])
447 elif output is None:
448 cmd_args.extend(['-o', '/dev/null'])
449 else:
450 cmd_args.extend(arglist.render(output))
451
452 # FIXME: Still don't get what is happening here. Investigate.
453 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
454
455 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
456 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
457 cmd_args.append('-fno-builtin')
458 cmd_args.append('-fno-merge-constants')
459
460 if arglist.getLastArg(arglist.parser.coverageOption):
461 cmd_args.append('-fprofile-arcs')
462 cmd_args.append('-ftest-coverage')
463
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000464 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
465 cmd_args))
466
467
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000468class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000469 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000470 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000471 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000472
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000473 def getMacosxVersionTuple(self, arglist):
474 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
475 if arg:
476 version = arglist.getValue(arg)
477 components = version.split('.')
478 try:
479 return tuple(map(int, components))
480 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000481 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000482 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000483 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000484 return (10, major-4, minor)
485
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000486 def addDarwinArch(self, cmd_args, arch, arglist):
487 # Derived from darwin_arch spec.
488 cmd_args.append('-arch')
489 # FIXME: The actual spec uses -m64 for this, but we want to
490 # respect arch. Figure out what exactly gcc is doing.
491 #if arglist.getLastArg(arglist.parser.m_64Option):
492 if arglist.getValue(arch) == 'x86_64':
493 cmd_args.append('x86_64')
494 else:
495 cmd_args.append('i386')
496
497 def addDarwinSubArch(self, cmd_args, arch, arglist):
498 # Derived from darwin_subarch spec, not sure what the
499 # distinction exists for but at least for this chain it is the same.
500 return self.addDarwinArch(cmd_args, arch, arglist)
501
502 def addLinkArgs(self, cmd_args, arch, arglist):
503 # Derived from link spec.
504 if arglist.getLastArg(arglist.parser.staticOption):
505 cmd_args.append('-static')
506 else:
507 cmd_args.append('-dynamic')
508 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
509 # FIXME: Replace -lobjc in forward args with
510 # -lobjc-gnu. How do we wish to handle such things?
511 pass
512
513 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
514 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
515 self.addDarwinArch(cmd_args, arch, arglist)
516 cmd_args.append('-force_cpusubtype_all')
517 else:
518 self.addDarwinSubArch(cmd_args, arch, arglist)
519
520 if arglist.getLastArg(arglist.parser.ZbundleOption):
521 cmd_args.append('-bundle')
522 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
523 '-bundle_loader')
524 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
525 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
526 # FIXME: Where should diagnostics go?
527 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
528 sys.exit(1)
529 if arglist.getLastArg(arglist.parser.current_versionOption):
530 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
531 sys.exit(1)
532 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
533 cmd_args.append('-force_flat_namespace')
534 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
535 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
536 sys.exit(1)
537 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
538 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
539 else:
540 cmd_args.append('-dylib')
541 if arglist.getLastArg(arglist.parser.ZbundleOption):
542 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
543 sys.exit(1)
544 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
545 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
546 sys.exit(1)
547 if arglist.getLastArg(arglist.parser.client_nameOption):
548 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
549 sys.exit(1)
550 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
551 '-dylib_compatibility_version')
552 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
553 '-dylib_current_version')
554
555 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
556 self.addDarwinArch(cmd_args, arch, arglist)
557 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
558 else:
559 self.addDarwinSubArch(cmd_args, arch, arglist)
560
561 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
562 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
563 sys.exit(1)
564
565 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
566 '-dylib_install_name')
567
568 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
569 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
570 sys.exit(1)
571 if arglist.getLastArg(arglist.parser.private_bundleOption):
572 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
573 sys.exit(1)
574
575 if arglist.getLastArg(arglist.parser.Zall_loadOption):
576 cmd_args.append('-all_load')
577
578 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
579 '-allowable_client')
580
581 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
582 cmd_args.append('-bind_at_load')
583
584 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
585 cmd_args.append('-dead_strip')
586
587 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
588 cmd_args.append('-no_dead_strip_inits_and_terms')
589
590 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
591 '-dylib_file')
592
593 if arglist.getLastArg(arglist.parser.ZdynamicOption):
594 cmd_args.append('-dynamic')
595
596 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
597 '-exported_symbols_list')
598
599 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
600 cmd_args.append('-flat_namespace')
601
602 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
603 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
604 '-image_base')
605 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
606 '-init')
607
608 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
609 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
610 # FIXME: I don't understand what is going on
611 # here. This is supposed to come from
612 # darwin_ld_minversion, but gcc doesn't seem to be
613 # following that; it must be getting over-ridden
614 # somewhere.
615 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000616 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000617 else:
618 # addAll doesn't make sense here but this is what gcc
619 # does.
620 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
621 '-macosx_version_min')
622
623 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
624 '-iphoneos_version_min')
625 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
626
627 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
628 cmd_args.append('-multi_module')
629
630 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
631 cmd_args.append('-single_module')
632
633 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
634 '-multiply_defined')
635
636 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
637 '-multiply_defined_unused')
638
639 if arglist.getLastArg(arglist.parser.f_pieOption):
640 cmd_args.append('-pie')
641
642 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
643 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
644 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
645 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
646 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
647 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
648 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
649 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
650 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
651 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
652 '-segaddr')
653 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
654 '-segs_read_only_addr')
655 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
656 '-segs_read_write_addr')
657 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
658 '-seg_addr_table')
659 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
660 '-fn_seg_addr_table_filename')
661 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
662 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
663 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
664 '-syslibroot')
665 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
666 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
667 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
668 '-umbrella')
669 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
670 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
671 '-unexported_symbols_list')
672 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
673 '-weak_reference_mismatches')
674
675 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
676 cmd_args.append('-weak_reference_mismatches')
677 cmd_args.append('non-weak')
678
679 arglist.addLastArg(cmd_args, arglist.parser.XOption)
680 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
681 arglist.addLastArg(cmd_args, arglist.parser.wOption)
682 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
683 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
684 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
685 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
686 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
687 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
688 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
689 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
690 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
691 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
692 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
693 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000694
695 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000696 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000697 assert outputType is Types.ImageType
698
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000699 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000700 # comes from specs (starting with link_command). Consult gcc
701 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000702
703 # FIXME: gcc's spec controls when this is done; certain things
704 # like -filelist or -Wl, still trigger a link stage. I don't
705 # quite understand how gcc decides to execute the linker,
706 # investigate. Also, the spec references -fdump= which seems
707 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000708 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000709
710 # Not sure why this particular decomposition exists in gcc.
711 self.addLinkArgs(cmd_args, arch, arglist)
712
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000713 # This toolchain never accumlates options in specs, the only
714 # place this gets used is to add -ObjC.
715 if (arglist.getLastArg(arglist.parser.ObjCOption) or
716 arglist.getLastArg(arglist.parser.f_objcOption)):
717 cmd_args.append('-ObjC')
718 if arglist.getLastArg(arglist.parser.ObjCXXOption):
719 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000720
721 # FIXME: gcc has %{x} in here. How could this ever happen?
722 # Cruft?
723 arglist.addLastArg(cmd_args, arglist.parser.dOption)
724 arglist.addLastArg(cmd_args, arglist.parser.tOption)
725 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
726 arglist.addLastArg(cmd_args, arglist.parser.uOption)
727 arglist.addLastArg(cmd_args, arglist.parser.AOption)
728 arglist.addLastArg(cmd_args, arglist.parser.eOption)
729 arglist.addLastArg(cmd_args, arglist.parser.mOption)
730 arglist.addLastArg(cmd_args, arglist.parser.rOption)
731
732 cmd_args.extend(arglist.render(output))
733
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000734 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000735 if (not arglist.getLastArg(arglist.parser.AOption) and
736 not arglist.getLastArg(arglist.parser.nostdlibOption) and
737 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
738 # Derived from startfile spec.
739 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
740 # Derived from darwin_dylib1 spec.
741 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
742 cmd_args.append('-ldylib1.o')
743 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000744 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000745 cmd_args.append('-ldylib1.o')
746 else:
747 cmd_args.append('-ldylib1.10.5.o')
748 else:
749 if arglist.getLastArg(arglist.parser.ZbundleOption):
750 if not arglist.getLastArg(arglist.parser.staticOption):
751 cmd_args.append('-lbundle1.o')
752 else:
753 if arglist.getLastArg(arglist.parser.pgOption):
754 if arglist.getLastArg(arglist.parser.staticOption):
755 cmd_args.append('-lgcrt0.o')
756 else:
757 if arglist.getLastArg(arglist.parser.objectOption):
758 cmd_args.append('-lgcrt0.o')
759 else:
760 if arglist.getLastArg(arglist.parser.preloadOption):
761 cmd_args.append('-lgcrt0.o')
762 else:
763 cmd_args.append('-lgcrt1.o')
764
765 # darwin_crt2 spec is empty.
766 pass
767 else:
768 if arglist.getLastArg(arglist.parser.staticOption):
769 cmd_args.append('-lcrt0.o')
770 else:
771 if arglist.getLastArg(arglist.parser.objectOption):
772 cmd_args.append('-lcrt0.o')
773 else:
774 if arglist.getLastArg(arglist.parser.preloadOption):
775 cmd_args.append('-lcrt0.o')
776 else:
777 # Derived from darwin_crt1 spec.
778 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
779 cmd_args.append('-lcrt1.o')
780 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000781 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000782 cmd_args.append('-lcrt1.o')
783 else:
784 cmd_args.append('-lcrt1.10.5.o')
785
786 # darwin_crt2 spec is empty.
787 pass
788
789 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
790 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000791 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792 # FIXME: gcc does a library search for this
793 # file, this will be be broken currently.
794 cmd_args.append('crt3.o')
795
796 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
797
798 if arglist.getLastArg(arglist.parser.f_openmpOption):
799 # This is more complicated in gcc...
800 cmd_args.append('-lgomp')
801
802 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000803 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000804 if arglist.getValue(arch) == 'x86_64':
805 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
806 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
807 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
808 "-L/usr/lib/gcc/%s" % tcDir,
809 "-L/usr/lib/gcc/%s" % tcDir,
810 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
811 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000812
Daniel Dunbara5677512009-01-05 19:53:30 +0000813 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000814 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000815
816 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
817 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
818 arglist.getLastArg(arglist.parser.f_createProfileOption) or
819 arglist.getLastArg(arglist.parser.coverageOption)):
820 cmd_args.append('-lgcov')
821
822 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
823 cmd_args.append('-allow_stack_execute')
824
825 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
826 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
827 # link_ssp spec is empty.
828
829 # Derived from libgcc spec.
830 if arglist.getLastArg(arglist.parser.staticOption):
831 cmd_args.append('-lgcc_static')
832 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
833 cmd_args.append('-lgcc_eh')
834 cmd_args.append('-lgcc')
835 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
836 # Derived from darwin_iphoneos_libgcc spec.
837 cmd_args.append('-lgcc_s.10.5')
838 cmd_args.append('-lgcc')
839 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
840 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
841 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000842 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000843 cmd_args.append('-lgcc_s.10.4')
844 else:
845 cmd_args.append('-lgcc_s.10.5')
846 cmd_args.append('-lgcc')
847 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000848 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000849 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000850 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000851 cmd_args.append('-lgcc_s.10.5')
852 cmd_args.append('-lgcc')
853
854 # Derived from lib spec.
855 if not arglist.getLastArg(arglist.parser.staticOption):
856 cmd_args.append('-lSystem')
857
858 if (not arglist.getLastArg(arglist.parser.AOption) and
859 not arglist.getLastArg(arglist.parser.nostdlibOption) and
860 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
861 # endfile_spec is empty.
862 pass
863
864 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
865 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
866
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000867 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
868 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000869
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000870 # FIXME: We need to add a dsymutil job here in some particular
871 # cases (basically whenever we have a c-family input we are
872 # compiling, I think). Find out why this is the condition, and
873 # implement. See link_command spec for more details.
874
Daniel Dunbara5677512009-01-05 19:53:30 +0000875class LipoTool(Tool):
876 def __init__(self):
877 super(LipoTool, self).__init__('lipo')
878
879 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000880 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000881 assert outputType is Types.ImageType
882
Daniel Dunbardb439902009-01-07 18:40:45 +0000883 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000884 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000885 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000886 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000887 jobs.addJob(Jobs.Command('lipo', cmd_args))