blob: c1b4e41b6a7c392257353a762b66027faa180098 [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
Daniel Dunbarde388a52009-01-21 01:07:49 +00006import Phases
Daniel Dunbara5677512009-01-05 19:53:30 +00007import Types
8
9class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +000010 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000011
12 eFlagsPipedInput = 1 << 0
13 eFlagsPipedOutput = 1 << 1
14 eFlagsIntegratedCPP = 1 << 2
15
16 def __init__(self, name, flags = 0):
17 self.name = name
18 self.flags = flags
19
20 def acceptsPipedInput(self):
21 return not not (self.flags & Tool.eFlagsPipedInput)
22 def canPipeOutput(self):
23 return not not (self.flags & Tool.eFlagsPipedOutput)
24 def hasIntegratedCPP(self):
25 return not not (self.flags & Tool.eFlagsIntegratedCPP)
26
27class GCC_Common_Tool(Tool):
Daniel Dunbar7c584962009-01-20 21:29:14 +000028 def getGCCExtraArgs(self):
29 return []
30
Daniel Dunbara5677512009-01-05 19:53:30 +000031 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +000032 output, outputType, arglist, linkingOutput):
Daniel Dunbar11672ec2009-01-13 18:51:26 +000033 cmd_args = []
34 for arg in arglist.args:
35 if arg.opt.forwardToGCC():
36 cmd_args.extend(arglist.render(arg))
37
Daniel Dunbar7c584962009-01-20 21:29:14 +000038 cmd_args.extend(self.getGCCExtraArgs())
Daniel Dunbara5677512009-01-05 19:53:30 +000039 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000040 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000041 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000042 cmd_args.extend(['-o', '-'])
Daniel Dunbarde388a52009-01-21 01:07:49 +000043 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbardb439902009-01-07 18:40:45 +000044 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000045 else:
Daniel Dunbarde388a52009-01-21 01:07:49 +000046 assert output
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000047 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000048
Daniel Dunbar7c584962009-01-20 21:29:14 +000049 if (isinstance(self, GCC_LinkTool) and
50 linkingOutput):
51 cmd_args.append('-Wl,-arch_multiple')
52 cmd_args.append('-Wl,-final_output,' +
53 arglist.getValue(linkingOutput))
54
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000055 # Only pass -x if gcc will understand it; otherwise hope gcc
56 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000057 # would go wrong in is for linker inputs if they happened to
58 # have an odd suffix; really the only way to get this to
59 # happen is a command like '-x foobar a.c' which will treat
60 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000061 #
62 # FIXME: For the linker case specifically, can we safely
63 # convert inputs into '-Wl,' options?
64 for input in inputs:
65 if input.type.canBeUserSpecified:
66 cmd_args.extend(['-x', input.type.name])
67
68 if isinstance(input.source, Jobs.PipedJob):
69 cmd_args.append('-')
70 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000071 assert isinstance(input.source, Arguments.Arg)
72 # If this is a linker input then assume we can forward
73 # just by rendering.
74 if input.source.opt.isLinkerInput:
75 cmd_args.extend(arglist.render(input.source))
76 else:
77 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000078
79 jobs.addJob(Jobs.Command('gcc', cmd_args))
80
81class GCC_PreprocessTool(GCC_Common_Tool):
82 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000083 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000084 (Tool.eFlagsPipedInput |
85 Tool.eFlagsPipedOutput))
86
Daniel Dunbar7c584962009-01-20 21:29:14 +000087 def getGCCExtraArgs(self):
88 return ['-E']
Daniel Dunbara5677512009-01-05 19:53:30 +000089
90class GCC_CompileTool(GCC_Common_Tool):
91 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000092 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000093 (Tool.eFlagsPipedInput |
94 Tool.eFlagsPipedOutput |
95 Tool.eFlagsIntegratedCPP))
96
Daniel Dunbar7c584962009-01-20 21:29:14 +000097 def getGCCExtraArgs(self):
98 return ['-S']
Daniel Dunbara5677512009-01-05 19:53:30 +000099
100class GCC_PrecompileTool(GCC_Common_Tool):
101 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000102 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +0000103 (Tool.eFlagsPipedInput |
104 Tool.eFlagsIntegratedCPP))
105
Daniel Dunbar7c584962009-01-20 21:29:14 +0000106 def getGCCExtraArgs(self):
107 return []
108
109class GCC_AssembleTool(GCC_Common_Tool):
110 def __init__(self):
111 # We can't generally assume the assembler can take or output
112 # on pipes.
113 super(GCC_AssembleTool, self).__init__('gcc (as)')
114
115 def getGCCExtraArgs(self):
116 return ['-c']
117
118class GCC_LinkTool(GCC_Common_Tool):
119 def __init__(self):
120 super(GCC_LinkTool, self).__init__('gcc (ld)')
Daniel Dunbara5677512009-01-05 19:53:30 +0000121
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000122class Darwin_AssembleTool(Tool):
123 def __init__(self, toolChain):
124 super(Darwin_AssembleTool, self).__init__('as',
125 Tool.eFlagsPipedInput)
126 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000127
128 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000129 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000130 assert len(inputs) == 1
131 assert outputType is Types.ObjectType
132
133 input = inputs[0]
134
135 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000136
Daniel Dunbar76290532009-01-13 06:25:31 +0000137 # Bit of a hack, this is only used for original inputs.
138 if input.isOriginalInput():
139 if arglist.getLastArg(arglist.parser.gGroup):
140 cmd_args.append('--gstabs')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000141
142 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000143 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000144 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000145 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000146 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
147 arglist.getLastArg(arglist.parser.staticOption) or
148 arglist.getLastArg(arglist.parser.f_appleKextOption)):
Daniel Dunbar470104e2009-01-17 00:53:19 +0000149 if not arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000150 cmd_args.append('-static')
151
152 for arg in arglist.getArgs2(arglist.parser.WaOption,
153 arglist.parser.XassemblerOption):
154 cmd_args.extend(arglist.getValues(arg))
155
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000156 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000157 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbar7d791fd2009-01-17 02:02:35 +0000158 pass
Daniel Dunbara5677512009-01-05 19:53:30 +0000159 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000160 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000161
162 # asm_final spec is empty.
163
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000164 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
165 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000166
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000167class Clang_CompileTool(Tool):
Daniel Dunbarde388a52009-01-21 01:07:49 +0000168 def __init__(self, toolChain):
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000169 super(Clang_CompileTool, self).__init__('clang',
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000170 (Tool.eFlagsPipedInput |
171 Tool.eFlagsPipedOutput |
172 Tool.eFlagsIntegratedCPP))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000173 self.toolChain = toolChain
Daniel Dunbar33a5d612009-01-14 01:03:36 +0000174
175 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000176 output, outputType, arglist, linkingOutput):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000177 cmd_args = []
178
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000179 patchOutputNameForPTH = False
Daniel Dunbarde388a52009-01-21 01:07:49 +0000180
181 if isinstance(phase.phase, Phases.AnalyzePhase):
182 cmd_args.append('-analyze')
183 elif isinstance(phase.phase, Phases.SyntaxOnlyPhase):
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000184 cmd_args.append('-fsyntax-only')
185 elif outputType is Types.AsmTypeNoPP:
186 cmd_args.append('-S')
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000187 elif outputType is Types.PCHType:
188 # No special option needed, driven by -x. However, we
189 # patch the output name to try and not conflict with gcc.
190 patchOutputNameForPTH = True
191
192 # FIXME: This is a total hack. Copy the input header file
193 # to the output, so that it can be -include'd by clang.
194 assert len(inputs) == 1
195 assert not isinstance(output, Jobs.PipedJob)
196 assert not isinstance(inputs[0].source, Jobs.PipedJob)
197 inputPath = arglist.getValue(inputs[0].source)
198 outputPath = os.path.join(os.path.dirname(arglist.getValue(output)),
199 os.path.basename(inputPath))
200 # Only do copy when the output doesn't exist.
201 if not os.path.exists(outputPath):
202 import shutil
203 shutil.copyfile(inputPath, outputPath)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000204 else:
205 raise ValueError,"Unexpected output type for clang tool."
206
Daniel Dunbarde388a52009-01-21 01:07:49 +0000207 if isinstance(phase.phase, Phases.AnalyzePhase):
208 # Add default argument set.
209 #
210 # FIXME: Move into clang?
211 cmd_args.extend(['-warn-dead-stores',
212 '-checker-cfref',
213 '-warn-objc-methodsigs',
214 '-warn-objc-missing-dealloc',
215 '-warn-objc-unused-ivars'])
216
217 cmd_args.append('-analyzer-output-plist')
218
219 # Add -WA, arguments when running as analyzer.
220 for arg in arglist.getArgs(arglist.parser.WAOption):
221 cmd_args.extend(arglist.renderAsInput(arg))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000222 else:
223 # Perform argument translation for LLVM backend. This
224 # performs some care in reconciling with llvm-gcc. The
225 # issue is that llvm-gcc translates these options based on
226 # the values in cc1, whereas we are processing based on
227 # the driver arguments.
228 #
229 # FIXME: This is currently broken for -f flags when -fno
230 # variants are present.
231
232 # This comes from the default translation the driver + cc1
233 # would do to enable flag_pic.
234 #
235 # FIXME: Centralize this code.
236 picEnabled = (arglist.getLastArg(arglist.parser.f_PICOption) or
237 arglist.getLastArg(arglist.parser.f_picOption) or
238 arglist.getLastArg(arglist.parser.f_PIEOption) or
239 arglist.getLastArg(arglist.parser.f_pieOption) or
240 (not arglist.getLastArg(arglist.parser.m_kernelOption) and
241 not arglist.getLastArg(arglist.parser.staticOption) and
242 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)))
243
244 archName = arglist.getValue(arch)
245 if (archName == 'x86_64' or
246 picEnabled):
247 cmd_args.append('--relocation-model=pic')
248 else:
249 cmd_args.append('--relocation-model=static')
250
251 if arglist.getLastArg(arglist.parser.f_timeReportOption):
252 cmd_args.append('--time-passes')
253 # FIXME: Set --enable-unsafe-fp-math.
254 if not arglist.getLastArg(arglist.parser.f_omitFramePointerOption):
255 cmd_args.append('--disable-fp-elim')
256 if not arglist.getLastArg(arglist.parser.f_zeroInitializedInBssOption):
257 cmd_args.append('--nozero-initialized-in-bss')
258 if arglist.getLastArg(arglist.parser.dAOption):
259 cmd_args.append('--asm-verbose')
260 if arglist.getLastArg(arglist.parser.f_debugPassStructureOption):
261 cmd_args.append('--debug-pass=Structure')
262 if arglist.getLastArg(arglist.parser.f_debugPassArgumentsOption):
263 cmd_args.append('--debug-pass=Arguments')
264 # FIXME: set --inline-threshhold=50 if (optimize_size || optimize < 3)
265 if arglist.getLastArg(arglist.parser.f_unwindTablesOption):
266 cmd_args.append('--unwind-tables')
267
268 arg = arglist.getLastArg(arglist.parser.f_limitedPrecisionOption)
269 if arg:
270 cmd_args.append('--limit-float-precision')
271 cmd_args.append(arglist.getValue(arg))
272
273 # FIXME: Add --stack-protector-buffer-size=<xxx> on -fstack-protect.
Daniel Dunbarde388a52009-01-21 01:07:49 +0000274
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000275 arglist.addAllArgs(cmd_args, arglist.parser.vOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000276 arglist.addAllArgs2(cmd_args, arglist.parser.DOption, arglist.parser.UOption)
277 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000278 arglist.addAllArgs(cmd_args, arglist.parser.m_macosxVersionMinOption)
279
280 # Special case debug options to only pass -g to clang. This is
281 # wrong.
282 if arglist.getLastArg(arglist.parser.gGroup):
283 cmd_args.append('-g')
284
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000285 arglist.addLastArg(cmd_args, arglist.parser.nostdincOption)
286
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000287 # FIXME: Clang isn't going to accept just anything here.
288 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
289
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000290 # Automatically load .pth files which match -include options.
291 for arg in arglist.getArgs(arglist.parser.includeOption):
292 pthPath = arglist.getValue(arg) + '.pth'
293 if os.path.exists(pthPath):
294 cmd_args.append('-token-cache')
295 cmd_args.append(pthPath)
296
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000297 # FIXME: Dehardcode this.
298 cmd_args.append('-fblocks')
299
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000300 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
301 arglist.addAllArgs2(cmd_args, arglist.parser.ClangWGroup, arglist.parser.pedanticGroup)
302 arglist.addLastArg(cmd_args, arglist.parser.wOption)
303 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
304
305 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOption)
306 arglist.addAllArgs(cmd_args, arglist.parser.f_objcGcOnlyOption)
307 arglist.addAllArgs(cmd_args, arglist.parser.f_nextRuntimeOption)
308 arglist.addAllArgs(cmd_args, arglist.parser.f_gnuRuntimeOption)
309 arglist.addLastArg(cmd_args, arglist.parser.f_exceptionsOption)
310 arglist.addLastArg(cmd_args, arglist.parser.f_laxVectorConversionsOption)
311 arglist.addLastArg(cmd_args, arglist.parser.f_msExtensionsOption)
312 arglist.addLastArg(cmd_args, arglist.parser.f_noCaretDiagnosticsOption)
313 arglist.addLastArg(cmd_args, arglist.parser.f_noShowColumnOption)
314 arglist.addLastArg(cmd_args, arglist.parser.f_pascalStringsOption)
315 arglist.addLastArg(cmd_args, arglist.parser.f_writableStringsOption)
316
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000317 if arch is not None:
318 cmd_args.extend(arglist.render(arch))
319
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000320 if isinstance(output, Jobs.PipedJob):
321 cmd_args.extend(['-o', '-'])
322 else:
323 if patchOutputNameForPTH:
324 base,suffix = os.path.splitext(arglist.getValue(output))
325 if suffix == '.gch':
326 suffix = '.pth'
327 cmd_args.append('-o')
328 cmd_args.append(base + suffix)
Daniel Dunbarde388a52009-01-21 01:07:49 +0000329 elif output:
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000330 cmd_args.extend(arglist.render(output))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000331
332 for input in inputs:
333 cmd_args.append('-x')
334 cmd_args.append(input.type.name)
335 if isinstance(input.source, Jobs.PipedJob):
336 cmd_args.append('-')
337 else:
338 cmd_args.extend(arglist.renderAsInput(input.source))
339
Daniel Dunbar768be1c2009-01-21 02:03:52 +0000340 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('clang'),
341 cmd_args))
Daniel Dunbarbfcbc902009-01-14 01:50:15 +0000342
Daniel Dunbar06172d62009-01-20 00:47:24 +0000343class Darwin_X86_CC1Tool(Tool):
344 def getCC1Name(self, type):
345 """getCC1Name(type) -> name, use-cpp, is-cxx"""
Daniel Dunbardff9f502009-01-12 18:51:02 +0000346
Daniel Dunbar06172d62009-01-20 00:47:24 +0000347 # FIXME: Get bool results from elsewhere.
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000348 if type is Types.CType or type is Types.CHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000349 return 'cc1',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000350 elif type is Types.CTypeNoPP or type is Types.CHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000351 return 'cc1',False,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000352 elif type is Types.ObjCType or type is Types.ObjCHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000353 return 'cc1obj',True,False
Daniel Dunbar2910dfa2009-01-23 00:04:43 +0000354 elif type is Types.ObjCTypeNoPP or type is Types.ObjCHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000355 return 'cc1obj',True,False
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000356 elif type is Types.CXXType or type is Types.CXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000357 return 'cc1plus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000358 elif type is Types.CXXTypeNoPP or type is Types.CXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000359 return 'cc1plus',False,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000360 elif type is Types.ObjCXXType or type is Types.ObjCXXHeaderType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000361 return 'cc1objplus',True,True
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000362 elif type is Types.ObjCXXTypeNoPP or type is Types.ObjCXXHeaderNoPPType:
Daniel Dunbar06172d62009-01-20 00:47:24 +0000363 return 'cc1objplus',False,True
364 else:
365 raise ValueError,"Unexpected type for Darwin compile tool."
Daniel Dunbardff9f502009-01-12 18:51:02 +0000366
367 def addCC1Args(self, cmd_args, arch, arglist):
368 # Derived from cc1 spec.
369
370 # FIXME: -fapple-kext seems to disable this too. Investigate.
371 if (not arglist.getLastArg(arglist.parser.m_kernelOption) and
372 not arglist.getLastArg(arglist.parser.staticOption) and
373 not arglist.getLastArg(arglist.parser.m_dynamicNoPicOption)):
374 cmd_args.append('-fPIC')
375
376 # FIXME: Remove mthumb
377 # FIXME: Remove mno-thumb
378
379 # FIXME: As with ld, something else is going on. My best guess
380 # is gcc is faking an -mmacosx-version-min
381 # somewhere. Investigate.
Daniel Dunbar11505a92009-01-13 04:51:51 +0000382# if (not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption) and
383# not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption)):
384# cmd_args.append('-mmacosx-version-min=' +
385# self.toolChain.getMacosxVersionMin())
Daniel Dunbardff9f502009-01-12 18:51:02 +0000386
387 # FIXME: Remove faltivec
388 # FIXME: Remove mno-fused-madd
389 # FIXME: Remove mlong-branch
390 # FIXME: Remove mlongcall
391 # FIXME: Remove mcpu=G4
392 # FIXME: Remove mcpu=G5
393
Daniel Dunbar105132e2009-01-16 21:07:21 +0000394 if (arglist.getLastArg(arglist.parser.gOption) and
Daniel Dunbardff9f502009-01-12 18:51:02 +0000395 not arglist.getLastArg(arglist.parser.f_noEliminateUnusedDebugSymbolsOption)):
396 cmd_args.append('-feliminate-unused-debug-symbols')
397
Daniel Dunbar06172d62009-01-20 00:47:24 +0000398 def addCC1OptionsArgs(self, cmd_args, arch, arglist, inputs, output_args, isCXX):
Daniel Dunbar816dd502009-01-12 17:53:19 +0000399 # Derived from cc1_options spec.
400 if (arglist.getLastArg(arglist.parser.fastOption) or
401 arglist.getLastArg(arglist.parser.fastfOption) or
402 arglist.getLastArg(arglist.parser.fastcpOption)):
403 cmd_args.append('-O3')
404
405 if (arglist.getLastArg(arglist.parser.pgOption) and
406 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
Daniel Dunbar94713452009-01-16 23:12:12 +0000407 raise Arguments.InvalidArgumentsError("-pg and -fomit-frame-pointer are incompatible")
Daniel Dunbar816dd502009-01-12 17:53:19 +0000408
Daniel Dunbardff9f502009-01-12 18:51:02 +0000409 self.addCC1Args(cmd_args, arch, arglist)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000410
411 if not arglist.getLastArg(arglist.parser.QOption):
412 cmd_args.append('-quiet')
413
414 cmd_args.append('-dumpbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000415 cmd_args.append(self.getBaseInputName(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000416
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000417 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
Daniel Dunbar11505a92009-01-13 04:51:51 +0000418
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000419 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
420 arglist.addAllArgs(cmd_args, arglist.parser.aGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000421
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000422 # FIXME: The goal is to use the user provided -o if that is
423 # our final output, otherwise to drive from the original input
Daniel Dunbar82fbac52009-01-14 03:31:16 +0000424 # name. Find a clean way to go about this.
425 if (arglist.getLastArg(arglist.parser.cOption) or
426 arglist.getLastArg(arglist.parser.SOption)):
427 outputOpt = arglist.getLastArg(arglist.parser.oOption)
428 if outputOpt:
429 cmd_args.append('-auxbase-strip')
430 cmd_args.append(arglist.getValue(outputOpt))
431 else:
432 cmd_args.append('-auxbase')
433 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000434 else:
435 cmd_args.append('-auxbase')
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000436 cmd_args.append(self.getBaseInputStem(inputs, arglist))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000437
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000438 arglist.addAllArgs(cmd_args, arglist.parser.gGroup)
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000439
Daniel Dunbar816dd502009-01-12 17:53:19 +0000440 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
441 # FIXME: -Wall is getting some special treatment. Investigate.
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000442 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup, arglist.parser.pedanticGroup)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000443 arglist.addLastArg(cmd_args, arglist.parser.wOption)
444 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
445 if arglist.getLastArg(arglist.parser.vOption):
446 cmd_args.append('-version')
447 if arglist.getLastArg(arglist.parser.pgOption):
448 cmd_args.append('-p')
449 arglist.addLastArg(cmd_args, arglist.parser.pOption)
450
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000451 # ccc treats -fsyntax-only specially.
452 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
453 arglist.parser.syntaxOnlyOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000454
Daniel Dunbar06172d62009-01-20 00:47:24 +0000455 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
Daniel Dunbar816dd502009-01-12 17:53:19 +0000456 if arglist.getLastArg(arglist.parser.QnOption):
457 cmd_args.append('-fno-ident')
458
459 # FIXME: This isn't correct.
460 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
461 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
462
Daniel Dunbar06172d62009-01-20 00:47:24 +0000463 if output_args:
Daniel Dunbar76290532009-01-13 06:25:31 +0000464 cmd_args.extend(output_args)
465
Daniel Dunbar816dd502009-01-12 17:53:19 +0000466 # FIXME: Still don't get what is happening here. Investigate.
467 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
468
469 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
470 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
471 cmd_args.append('-fno-builtin')
472 cmd_args.append('-fno-merge-constants')
473
474 if arglist.getLastArg(arglist.parser.coverageOption):
475 cmd_args.append('-fprofile-arcs')
476 cmd_args.append('-ftest-coverage')
477
Daniel Dunbaredd1e2a2009-01-14 00:06:14 +0000478 if isCXX:
479 cmd_args.append('-D__private_extern__=extern')
480
Daniel Dunbar06172d62009-01-20 00:47:24 +0000481 def getBaseInputName(self, inputs, arglist):
482 # FIXME: gcc uses a temporary name here when the base
483 # input is stdin, but only in auxbase. Investigate.
484 baseInputValue = arglist.getValue(inputs[0].baseInput)
485 return os.path.basename(baseInputValue)
486
487 def getBaseInputStem(self, inputs, arglist):
488 return os.path.splitext(self.getBaseInputName(inputs, arglist))[0]
489
490 def getOutputArgs(self, arglist, output, isCPP=False):
491 if isinstance(output, Jobs.PipedJob):
492 if isCPP:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000493 return []
Daniel Dunbar06172d62009-01-20 00:47:24 +0000494 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000495 return ['-o', '-']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000496 elif output is None:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000497 return ['-o', '/dev/null']
Daniel Dunbar06172d62009-01-20 00:47:24 +0000498 else:
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000499 return arglist.render(output)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000500
501 def addCPPOptionsArgs(self, cmd_args, arch, arglist, inputs,
502 output_args, isCXX):
503 # Derived from cpp_options.
504 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
505
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000506 cmd_args.extend(output_args)
507
Daniel Dunbar06172d62009-01-20 00:47:24 +0000508 self.addCC1Args(cmd_args, arch, arglist)
509
510 # NOTE: The code below has some commonality with cpp_options,
511 # but in classic gcc style ends up sending things in different
512 # orders. This may be a good merge candidate once we drop
513 # pedantic compatibility.
514
515 arglist.addAllArgs(cmd_args, arglist.parser.mGroup)
516 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption,
517 arglist.parser.ansiOption,
518 arglist.parser.trigraphsOption)
519 arglist.addAllArgs2(cmd_args, arglist.parser.WGroup,
520 arglist.parser.pedanticGroup)
521 arglist.addLastArg(cmd_args, arglist.parser.wOption)
522
523 # ccc treats -fsyntax-only specially.
524 arglist.addAllArgs2(cmd_args, arglist.parser.fGroup,
525 arglist.parser.syntaxOnlyOption)
526
527 if (arglist.getLastArg(arglist.parser.gGroup) and
528 not arglist.getLastArg(arglist.parser.g0Option) and
529 not arglist.getLastArg(arglist.parser.f_noWorkingDirectoryOption)):
530 cmd_args.append('-fworking-directory')
531
532 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
533 arglist.addAllArgs(cmd_args, arglist.parser.undefOption)
534 if arglist.getLastArg(arglist.parser.saveTempsOption):
535 cmd_args.append('-fpch-preprocess')
536
537 def addCPPUniqueOptionsArgs(self, cmd_args, arch, arglist, inputs):
538 # Derived from cpp_unique_options.
539
540 if (arglist.getLastArg(arglist.parser.COption) or
541 arglist.getLastArg(arglist.parser.CCOption)):
542 if not arglist.getLastArg(arglist.parser.EOption):
543 raise Arguments.InvalidArgumentsError("-C or -CC is not supported without -E")
544 if not arglist.getLastArg(arglist.parser.QOption):
545 cmd_args.append('-quiet')
546 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
547 arglist.addLastArg(cmd_args, arglist.parser.vOption)
548 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
549 arglist.addLastArg(cmd_args, arglist.parser.POption)
550
551 # FIXME: Handle %I properly.
552 if arglist.getValue(arch) == 'x86_64':
553 cmd_args.append('-imultilib')
554 cmd_args.append('x86_64')
555
556 if arglist.getLastArg(arglist.parser.MDOption):
557 cmd_args.append('-MD')
558 # FIXME: Think about this more.
559 outputOpt = arglist.getLastArg(arglist.parser.oOption)
560 if outputOpt:
561 base,ext = os.path.splitext(arglist.getValue(outputOpt))
562 cmd_args.append(base+'.d')
563 else:
564 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
565 if arglist.getLastArg(arglist.parser.MMDOption):
566 cmd_args.append('-MMD')
567 # FIXME: Think about this more.
568 outputOpt = arglist.getLastArg(arglist.parser.oOption)
569 if outputOpt:
570 base,ext = os.path.splitext(arglist.getValue(outputOpt))
571 cmd_args.append(base+'.d')
572 else:
573 cmd_args.append(self.getBaseInputStem(inputs, arglist)+'.d')
574 arglist.addLastArg(cmd_args, arglist.parser.MOption)
575 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
576 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
577 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
578 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
579 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
580 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
581 if (not arglist.getLastArg(arglist.parser.MOption) and
582 not arglist.getLastArg(arglist.parser.MMOption) and
583 (arglist.getLastArg(arglist.parser.MDOption) or
584 arglist.getLastArg(arglist.parser.MMDOption))):
585 outputOpt = arglist.getLastArg(arglist.parser.oOption)
586 if outputOpt:
587 cmd_args.append('-MQ')
588 cmd_args.append(arglist.getValue(outputOpt))
589
590 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
591 if arglist.getLastArg(arglist.parser.g3Option):
592 cmd_args.append('-dD')
593 arglist.addLastArg(cmd_args, arglist.parser.HOption)
594
595 self.addCPPArgs(cmd_args, arch, arglist)
596
597 arglist.addAllArgs3(cmd_args,
598 arglist.parser.DOption,
599 arglist.parser.UOption,
600 arglist.parser.AOption)
601
602 arglist.addAllArgs(cmd_args, arglist.parser.iGroup)
603
604 for input in inputs:
605 if isinstance(input.source, Jobs.PipedJob):
606 cmd_args.append('-')
607 else:
608 cmd_args.extend(arglist.renderAsInput(input.source))
609
610 for arg in arglist.getArgs2(arglist.parser.WpOption,
611 arglist.parser.XpreprocessorOption):
612 cmd_args.extend(arglist.getValues(arg))
613
614 if arglist.getLastArg(arglist.parser.f_mudflapOption):
615 cmd_args.append('-D_MUDFLAP')
616 cmd_args.append('-include')
617 cmd_args.append('mf-runtime.h')
618
619 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
620 cmd_args.append('-D_MUDFLAP')
621 cmd_args.append('-D_MUDFLAPTH')
622 cmd_args.append('-include')
623 cmd_args.append('mf-runtime.h')
624
625 def addCPPArgs(self, cmd_args, arch, arglist):
626 # Derived from cpp spec.
627
628 if arglist.getLastArg(arglist.parser.staticOption):
629 # The gcc spec is broken here, it refers to dynamic but
630 # that has been translated. Start by being bug compatible.
631
632 # if not arglist.getLastArg(arglist.parser.dynamicOption):
633 cmd_args.append('-D__STATIC__')
634 else:
635 cmd_args.append('-D__DYNAMIC__')
636
637 if arglist.getLastArg(arglist.parser.pthreadOption):
638 cmd_args.append('-D_REENTRANT')
639
640class Darwin_X86_PreprocessTool(Darwin_X86_CC1Tool):
641 def __init__(self, toolChain):
642 super(Darwin_X86_PreprocessTool, self).__init__('cpp',
643 (Tool.eFlagsPipedInput |
644 Tool.eFlagsPipedOutput))
645 self.toolChain = toolChain
646
647 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000648 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000649 inputType = inputs[0].type
650 assert not [i for i in inputs if i.type != inputType]
651
652 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
653
654 cmd_args = ['-E']
655 if (arglist.getLastArg(arglist.parser.traditionalOption) or
656 arglist.getLastArg(arglist.parser.f_traditionalOption) or
657 arglist.getLastArg(arglist.parser.traditionalCPPOption)):
658 cmd_args.append('-traditional-cpp')
659
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000660 output_args = self.getOutputArgs(arglist, output,
661 isCPP=True)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000662 self.addCPPOptionsArgs(cmd_args, arch, arglist, inputs,
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000663 output_args, isCXX)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000664
665 arglist.addAllArgs(cmd_args, arglist.parser.dGroup)
666
667 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
668 cmd_args))
669
670class Darwin_X86_CompileTool(Darwin_X86_CC1Tool):
671 def __init__(self, toolChain):
672 super(Darwin_X86_CompileTool, self).__init__('cc1',
673 (Tool.eFlagsPipedInput |
674 Tool.eFlagsPipedOutput |
675 Tool.eFlagsIntegratedCPP))
676 self.toolChain = toolChain
677
678 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000679 output, outputType, arglist, linkingOutput):
Daniel Dunbar06172d62009-01-20 00:47:24 +0000680 inputType = inputs[0].type
681 assert not [i for i in inputs if i.type != inputType]
682
683 cc1Name,usePP,isCXX = self.getCC1Name(inputType)
684
685 cmd_args = []
686 if (arglist.getLastArg(arglist.parser.traditionalOption) or
687 arglist.getLastArg(arglist.parser.f_traditionalOption)):
688 raise Arguments.InvalidArgumentsError("-traditional is not supported without -E")
689
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000690 if outputType is Types.PCHType:
691 output_args = []
692 else:
693 output_args = self.getOutputArgs(arglist, output)
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000694
695 # There is no need for this level of compatibility, but it
696 # makes diffing easier.
697 if (not arglist.getLastArg(arglist.parser.syntaxOnlyOption) and
698 not arglist.getLastArg(arglist.parser.SOption)):
699 early_output_args, end_output_args = [], output_args
700 else:
701 early_output_args, end_output_args = output_args, []
702
Daniel Dunbar06172d62009-01-20 00:47:24 +0000703 if usePP:
704 self.addCPPUniqueOptionsArgs(cmd_args, arch, arglist, inputs)
705 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
706 early_output_args, isCXX)
707 cmd_args.extend(end_output_args)
708 else:
709 cmd_args.append('-fpreprocessed')
710
711 # FIXME: There is a spec command to remove
712 # -fpredictive-compilation args here. Investigate.
713
714 for input in inputs:
715 if isinstance(input.source, Jobs.PipedJob):
716 cmd_args.append('-')
717 else:
718 cmd_args.extend(arglist.renderAsInput(input.source))
719
720 self.addCC1OptionsArgs(cmd_args, arch, arglist, inputs,
721 early_output_args, isCXX)
722 cmd_args.extend(end_output_args)
Daniel Dunbar76290532009-01-13 06:25:31 +0000723
Daniel Dunbar4e3d7622009-01-20 05:51:52 +0000724 if outputType is Types.PCHType:
725 assert output is not None and not isinstance(output, Jobs.PipedJob)
726
727 cmd_args.append('-o')
728 # NOTE: gcc uses a temp .s file for this, but there
729 # doesn't seem to be a good reason.
730 cmd_args.append('/dev/null')
731
732 cmd_args.append('--output-pch=')
733 cmd_args.append(arglist.getValue(output))
734
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000735 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
736 cmd_args))
737
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000738class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000739 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000740 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000741 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000742
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000743 def getMacosxVersionTuple(self, arglist):
744 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
745 if arg:
746 version = arglist.getValue(arg)
747 components = version.split('.')
748 try:
749 return tuple(map(int, components))
750 except:
Daniel Dunbar94713452009-01-16 23:12:12 +0000751 raise Arguments.InvalidArgumentsError("invalid version number %r" % version)
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000752 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000753 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000754 return (10, major-4, minor)
755
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000756 def addDarwinArch(self, cmd_args, arch, arglist):
757 # Derived from darwin_arch spec.
758 cmd_args.append('-arch')
759 # FIXME: The actual spec uses -m64 for this, but we want to
760 # respect arch. Figure out what exactly gcc is doing.
761 #if arglist.getLastArg(arglist.parser.m_64Option):
762 if arglist.getValue(arch) == 'x86_64':
763 cmd_args.append('x86_64')
764 else:
765 cmd_args.append('i386')
766
767 def addDarwinSubArch(self, cmd_args, arch, arglist):
768 # Derived from darwin_subarch spec, not sure what the
769 # distinction exists for but at least for this chain it is the same.
770 return self.addDarwinArch(cmd_args, arch, arglist)
771
772 def addLinkArgs(self, cmd_args, arch, arglist):
773 # Derived from link spec.
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000774 arglist.addAllArgs(cmd_args, arglist.parser.staticOption)
775 if not arglist.getLastArg(arglist.parser.staticOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000776 cmd_args.append('-dynamic')
777 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
778 # FIXME: Replace -lobjc in forward args with
779 # -lobjc-gnu. How do we wish to handle such things?
780 pass
781
Daniel Dunbar470104e2009-01-17 00:53:19 +0000782 if not arglist.getLastArg(arglist.parser.dynamiclibOption):
783 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000784 self.addDarwinArch(cmd_args, arch, arglist)
Anders Carlsson6f26dc92009-01-18 02:54:30 +0000785 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000786 else:
787 self.addDarwinSubArch(cmd_args, arch, arglist)
788
Daniel Dunbar470104e2009-01-17 00:53:19 +0000789 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000790 cmd_args.append('-bundle')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000791 arglist.addAllArgsTranslated(cmd_args, arglist.parser.bundle_loaderOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000792 '-bundle_loader')
793 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
794 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
795 # FIXME: Where should diagnostics go?
796 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
797 sys.exit(1)
798 if arglist.getLastArg(arglist.parser.current_versionOption):
799 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
800 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000801 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000802 cmd_args.append('-force_flat_namespace')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000803 if arglist.getLastArg(arglist.parser.install_nameOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000804 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
805 sys.exit(1)
806 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
807 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
808 else:
809 cmd_args.append('-dylib')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000810 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000811 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
812 sys.exit(1)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000813 if arglist.getLastArg(arglist.parser.bundle_loaderOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000814 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
815 sys.exit(1)
816 if arglist.getLastArg(arglist.parser.client_nameOption):
817 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
818 sys.exit(1)
819 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
820 '-dylib_compatibility_version')
821 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
822 '-dylib_current_version')
823
Daniel Dunbar470104e2009-01-17 00:53:19 +0000824 if arglist.getLastArg(arglist.parser.force_cpusubtype_ALLOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000825 self.addDarwinArch(cmd_args, arch, arglist)
826 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
827 else:
828 self.addDarwinSubArch(cmd_args, arch, arglist)
829
Daniel Dunbar470104e2009-01-17 00:53:19 +0000830 if arglist.getLastArg(arglist.parser.force_flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000831 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
832 sys.exit(1)
833
Daniel Dunbar470104e2009-01-17 00:53:19 +0000834 arglist.addAllArgsTranslated(cmd_args, arglist.parser.install_nameOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000835 '-dylib_install_name')
836
837 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
838 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
839 sys.exit(1)
840 if arglist.getLastArg(arglist.parser.private_bundleOption):
841 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
842 sys.exit(1)
843
Daniel Dunbar470104e2009-01-17 00:53:19 +0000844 if arglist.getLastArg(arglist.parser.all_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000845 cmd_args.append('-all_load')
846
Daniel Dunbar470104e2009-01-17 00:53:19 +0000847 arglist.addAllArgsTranslated(cmd_args, arglist.parser.allowable_clientOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000848 '-allowable_client')
849
Daniel Dunbar470104e2009-01-17 00:53:19 +0000850 if arglist.getLastArg(arglist.parser.bind_at_loadOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000851 cmd_args.append('-bind_at_load')
852
Daniel Dunbar470104e2009-01-17 00:53:19 +0000853 if arglist.getLastArg(arglist.parser.dead_stripOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000854 cmd_args.append('-dead_strip')
855
Daniel Dunbar470104e2009-01-17 00:53:19 +0000856 if arglist.getLastArg(arglist.parser.no_dead_strip_inits_and_termsOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000857 cmd_args.append('-no_dead_strip_inits_and_terms')
858
Daniel Dunbar470104e2009-01-17 00:53:19 +0000859 arglist.addAllArgsTranslated(cmd_args, arglist.parser.dylib_fileOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000860 '-dylib_file')
861
Daniel Dunbar470104e2009-01-17 00:53:19 +0000862 if arglist.getLastArg(arglist.parser.dynamicOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000863 cmd_args.append('-dynamic')
864
Daniel Dunbar470104e2009-01-17 00:53:19 +0000865 arglist.addAllArgsTranslated(cmd_args, arglist.parser.exported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000866 '-exported_symbols_list')
867
Daniel Dunbar470104e2009-01-17 00:53:19 +0000868 if arglist.getLastArg(arglist.parser.flat_namespaceOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000869 cmd_args.append('-flat_namespace')
870
871 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000872 arglist.addAllArgsTranslated(cmd_args, arglist.parser.image_baseOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000873 '-image_base')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000874 arglist.addAllArgsTranslated(cmd_args, arglist.parser.initOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000875 '-init')
876
877 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
878 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
879 # FIXME: I don't understand what is going on
880 # here. This is supposed to come from
881 # darwin_ld_minversion, but gcc doesn't seem to be
882 # following that; it must be getting over-ridden
883 # somewhere.
884 cmd_args.append('-macosx_version_min')
Daniel Dunbardff9f502009-01-12 18:51:02 +0000885 cmd_args.append(self.toolChain.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000886 else:
887 # addAll doesn't make sense here but this is what gcc
888 # does.
889 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
890 '-macosx_version_min')
891
892 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
893 '-iphoneos_version_min')
894 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
895
Daniel Dunbar470104e2009-01-17 00:53:19 +0000896 if arglist.getLastArg(arglist.parser.multi_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000897 cmd_args.append('-multi_module')
898
Daniel Dunbar470104e2009-01-17 00:53:19 +0000899 if arglist.getLastArg(arglist.parser.single_moduleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000900 cmd_args.append('-single_module')
901
Daniel Dunbar470104e2009-01-17 00:53:19 +0000902 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_definedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000903 '-multiply_defined')
904
Daniel Dunbar470104e2009-01-17 00:53:19 +0000905 arglist.addAllArgsTranslated(cmd_args, arglist.parser.multiply_defined_unusedOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000906 '-multiply_defined_unused')
907
908 if arglist.getLastArg(arglist.parser.f_pieOption):
909 cmd_args.append('-pie')
910
911 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
912 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
913 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
914 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
915 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
916 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
917 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
918 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
919 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000920 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segaddrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000921 '-segaddr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000922 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_only_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000923 '-segs_read_only_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000924 arglist.addAllArgsTranslated(cmd_args, arglist.parser.segs_read_write_addrOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000925 '-segs_read_write_addr')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000926 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_tableOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000927 '-seg_addr_table')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000928 arglist.addAllArgsTranslated(cmd_args, arglist.parser.seg_addr_table_filenameOption,
929 '-seg_addr_table_filename')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000930 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
931 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
932 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
933 '-syslibroot')
934 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
935 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000936 arglist.addAllArgsTranslated(cmd_args, arglist.parser.umbrellaOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000937 '-umbrella')
938 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
Daniel Dunbar470104e2009-01-17 00:53:19 +0000939 arglist.addAllArgsTranslated(cmd_args, arglist.parser.unexported_symbols_listOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000940 '-unexported_symbols_list')
Daniel Dunbar470104e2009-01-17 00:53:19 +0000941 arglist.addAllArgsTranslated(cmd_args, arglist.parser.weak_reference_mismatchesOption,
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000942 '-weak_reference_mismatches')
943
Daniel Dunbar470104e2009-01-17 00:53:19 +0000944 if not arglist.getLastArg(arglist.parser.weak_reference_mismatchesOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000945 cmd_args.append('-weak_reference_mismatches')
946 cmd_args.append('non-weak')
947
948 arglist.addLastArg(cmd_args, arglist.parser.XOption)
949 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
950 arglist.addLastArg(cmd_args, arglist.parser.wOption)
951 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
952 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
953 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
954 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
955 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
956 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
957 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
958 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
959 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
960 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
961 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
962 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000963
964 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +0000965 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +0000966 assert outputType is Types.ImageType
967
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000968 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000969 # comes from specs (starting with link_command). Consult gcc
970 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000971
972 # FIXME: gcc's spec controls when this is done; certain things
973 # like -filelist or -Wl, still trigger a link stage. I don't
974 # quite understand how gcc decides to execute the linker,
975 # investigate. Also, the spec references -fdump= which seems
976 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000977 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000978
979 # Not sure why this particular decomposition exists in gcc.
980 self.addLinkArgs(cmd_args, arch, arglist)
981
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000982 # This toolchain never accumlates options in specs, the only
983 # place this gets used is to add -ObjC.
984 if (arglist.getLastArg(arglist.parser.ObjCOption) or
985 arglist.getLastArg(arglist.parser.f_objcOption)):
986 cmd_args.append('-ObjC')
987 if arglist.getLastArg(arglist.parser.ObjCXXOption):
988 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000989
990 # FIXME: gcc has %{x} in here. How could this ever happen?
991 # Cruft?
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000992 arglist.addLastArg(cmd_args, arglist.parser.dGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000993 arglist.addLastArg(cmd_args, arglist.parser.tOption)
994 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
Daniel Dunbar06172d62009-01-20 00:47:24 +0000995 arglist.addAllArgs(cmd_args, arglist.parser.uGroup)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000996 arglist.addLastArg(cmd_args, arglist.parser.AOption)
997 arglist.addLastArg(cmd_args, arglist.parser.eOption)
998 arglist.addLastArg(cmd_args, arglist.parser.mOption)
999 arglist.addLastArg(cmd_args, arglist.parser.rOption)
1000
1001 cmd_args.extend(arglist.render(output))
1002
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001003 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001004 if (not arglist.getLastArg(arglist.parser.AOption) and
1005 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1006 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1007 # Derived from startfile spec.
Daniel Dunbar470104e2009-01-17 00:53:19 +00001008 if arglist.getLastArg(arglist.parser.dynamiclibOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001009 # Derived from darwin_dylib1 spec.
1010 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1011 cmd_args.append('-ldylib1.o')
1012 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001013 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001014 cmd_args.append('-ldylib1.o')
1015 else:
1016 cmd_args.append('-ldylib1.10.5.o')
1017 else:
Daniel Dunbar470104e2009-01-17 00:53:19 +00001018 if arglist.getLastArg(arglist.parser.bundleOption):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001019 if not arglist.getLastArg(arglist.parser.staticOption):
1020 cmd_args.append('-lbundle1.o')
1021 else:
1022 if arglist.getLastArg(arglist.parser.pgOption):
1023 if arglist.getLastArg(arglist.parser.staticOption):
1024 cmd_args.append('-lgcrt0.o')
1025 else:
1026 if arglist.getLastArg(arglist.parser.objectOption):
1027 cmd_args.append('-lgcrt0.o')
1028 else:
1029 if arglist.getLastArg(arglist.parser.preloadOption):
1030 cmd_args.append('-lgcrt0.o')
1031 else:
1032 cmd_args.append('-lgcrt1.o')
1033
1034 # darwin_crt2 spec is empty.
1035 pass
1036 else:
1037 if arglist.getLastArg(arglist.parser.staticOption):
1038 cmd_args.append('-lcrt0.o')
1039 else:
1040 if arglist.getLastArg(arglist.parser.objectOption):
1041 cmd_args.append('-lcrt0.o')
1042 else:
1043 if arglist.getLastArg(arglist.parser.preloadOption):
1044 cmd_args.append('-lcrt0.o')
1045 else:
1046 # Derived from darwin_crt1 spec.
1047 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1048 cmd_args.append('-lcrt1.o')
1049 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001050 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001051 cmd_args.append('-lcrt1.o')
1052 else:
1053 cmd_args.append('-lcrt1.10.5.o')
1054
1055 # darwin_crt2 spec is empty.
1056 pass
1057
1058 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
1059 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001060 if macosxVersion < (10,5):
Daniel Dunbar70230822009-01-21 17:18:19 +00001061 cmd_args.append(self.toolChain.getFilePath('crt3.o'))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001062
1063 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
1064
1065 if arglist.getLastArg(arglist.parser.f_openmpOption):
1066 # This is more complicated in gcc...
1067 cmd_args.append('-lgomp')
1068
1069 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001070 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +00001071 if arglist.getValue(arch) == 'x86_64':
1072 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
1073 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
1074 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
1075 "-L/usr/lib/gcc/%s" % tcDir,
1076 "-L/usr/lib/gcc/%s" % tcDir,
1077 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
1078 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001079
Daniel Dunbara5677512009-01-05 19:53:30 +00001080 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001081 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001082
Daniel Dunbar7c584962009-01-20 21:29:14 +00001083 if linkingOutput:
1084 cmd_args.append('-arch_multiple')
1085 cmd_args.append('-final_output')
1086 cmd_args.append(arglist.getValue(linkingOutput))
1087
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001088 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
1089 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
1090 arglist.getLastArg(arglist.parser.f_createProfileOption) or
1091 arglist.getLastArg(arglist.parser.coverageOption)):
1092 cmd_args.append('-lgcov')
1093
1094 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
1095 cmd_args.append('-allow_stack_execute')
1096
1097 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
1098 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
1099 # link_ssp spec is empty.
1100
1101 # Derived from libgcc spec.
1102 if arglist.getLastArg(arglist.parser.staticOption):
1103 cmd_args.append('-lgcc_static')
1104 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
1105 cmd_args.append('-lgcc_eh')
1106 cmd_args.append('-lgcc')
1107 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
1108 # Derived from darwin_iphoneos_libgcc spec.
1109 cmd_args.append('-lgcc_s.10.5')
1110 cmd_args.append('-lgcc')
1111 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
1112 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
1113 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001114 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001115 cmd_args.append('-lgcc_s.10.4')
1116 else:
1117 cmd_args.append('-lgcc_s.10.5')
1118 cmd_args.append('-lgcc')
1119 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001120 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001121 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +00001122 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001123 cmd_args.append('-lgcc_s.10.5')
1124 cmd_args.append('-lgcc')
1125
1126 # Derived from lib spec.
1127 if not arglist.getLastArg(arglist.parser.staticOption):
1128 cmd_args.append('-lSystem')
1129
1130 if (not arglist.getLastArg(arglist.parser.AOption) and
1131 not arglist.getLastArg(arglist.parser.nostdlibOption) and
1132 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
1133 # endfile_spec is empty.
1134 pass
1135
1136 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
1137 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
1138
Daniel Dunbar9cb22532009-01-12 07:45:49 +00001139 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
1140 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +00001141
Daniel Dunbar841ceea2009-01-13 06:44:28 +00001142 if (arglist.getLastArg(arglist.parser.gGroup) and
1143 not arglist.getLastArg(arglist.parser.gstabsOption) and
1144 not arglist.getLastArg(arglist.parser.g0Option)):
1145 # FIXME: This is gross, but matches gcc. The test only
1146 # considers the suffix (not the -x type), and then only of the
1147 # first input.
1148 inputSuffix = os.path.splitext(arglist.getValue(inputs[0].baseInput))[1]
1149 if inputSuffix in ('.c','.cc','.C','.cpp','.cp',
1150 '.c++','.cxx','.CPP','.m','.mm'):
1151 jobs.addJob(Jobs.Command('dsymutil',
1152 arglist.renderAsInput(output)))
Daniel Dunbar9c199a02009-01-11 23:13:15 +00001153
Daniel Dunbara5677512009-01-05 19:53:30 +00001154class LipoTool(Tool):
1155 def __init__(self):
1156 super(LipoTool, self).__init__('lipo')
1157
1158 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbar7c584962009-01-20 21:29:14 +00001159 output, outputType, arglist, linkingOutput):
Daniel Dunbara5677512009-01-05 19:53:30 +00001160 assert outputType is Types.ImageType
1161
Daniel Dunbardb439902009-01-07 18:40:45 +00001162 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001163 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +00001164 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00001165 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +00001166 jobs.addJob(Jobs.Command('lipo', cmd_args))