blob: e4f71b33ea75c06b6e8e7b5e93fc8c166775b600 [file] [log] [blame]
Daniel Dunbar6325fcf2009-01-12 09:23:15 +00001import os
Daniel Dunbar9c199a02009-01-11 23:13:15 +00002import sys # FIXME: Shouldn't be needed.
3
Daniel Dunbara5677512009-01-05 19:53:30 +00004import Arguments
5import Jobs
6import Types
7
8class Tool(object):
Daniel Dunbarba6e3232009-01-06 06:12:13 +00009 """Tool - A concrete implementation of an action."""
Daniel Dunbara5677512009-01-05 19:53:30 +000010
11 eFlagsPipedInput = 1 << 0
12 eFlagsPipedOutput = 1 << 1
13 eFlagsIntegratedCPP = 1 << 2
14
15 def __init__(self, name, flags = 0):
16 self.name = name
17 self.flags = flags
18
19 def acceptsPipedInput(self):
20 return not not (self.flags & Tool.eFlagsPipedInput)
21 def canPipeOutput(self):
22 return not not (self.flags & Tool.eFlagsPipedOutput)
23 def hasIntegratedCPP(self):
24 return not not (self.flags & Tool.eFlagsIntegratedCPP)
25
26class GCC_Common_Tool(Tool):
27 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000028 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +000029 extraArgs):
Daniel Dunbardb439902009-01-07 18:40:45 +000030 cmd_args = sum(map(arglist.render, args),[]) + extraArgs
Daniel Dunbara5677512009-01-05 19:53:30 +000031 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000032 cmd_args.extend(arglist.render(arch))
Daniel Dunbara5677512009-01-05 19:53:30 +000033 if isinstance(output, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +000034 cmd_args.extend(['-o', '-'])
Daniel Dunbara5677512009-01-05 19:53:30 +000035 elif output is None:
Daniel Dunbardb439902009-01-07 18:40:45 +000036 cmd_args.append('-fsyntax-only')
Daniel Dunbara5677512009-01-05 19:53:30 +000037 else:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +000038 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +000039
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000040 # Only pass -x if gcc will understand it; otherwise hope gcc
41 # understands the suffix correctly. The main use case this
Daniel Dunbar9c199a02009-01-11 23:13:15 +000042 # would go wrong in is for linker inputs if they happened to
43 # have an odd suffix; really the only way to get this to
44 # happen is a command like '-x foobar a.c' which will treat
45 # a.c like a linker input.
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000046 #
47 # FIXME: For the linker case specifically, can we safely
48 # convert inputs into '-Wl,' options?
49 for input in inputs:
50 if input.type.canBeUserSpecified:
51 cmd_args.extend(['-x', input.type.name])
52
53 if isinstance(input.source, Jobs.PipedJob):
54 cmd_args.append('-')
55 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000056 assert isinstance(input.source, Arguments.Arg)
57 # If this is a linker input then assume we can forward
58 # just by rendering.
59 if input.source.opt.isLinkerInput:
60 cmd_args.extend(arglist.render(input.source))
61 else:
62 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +000063
64 jobs.addJob(Jobs.Command('gcc', cmd_args))
65
66class GCC_PreprocessTool(GCC_Common_Tool):
67 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000068 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbara5677512009-01-05 19:53:30 +000069 (Tool.eFlagsPipedInput |
70 Tool.eFlagsPipedOutput))
71
72 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000073 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000074 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000075 output, outputType, args, arglist,
76 ['-E'])
Daniel Dunbara5677512009-01-05 19:53:30 +000077
78class GCC_CompileTool(GCC_Common_Tool):
79 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000080 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbara5677512009-01-05 19:53:30 +000081 (Tool.eFlagsPipedInput |
82 Tool.eFlagsPipedOutput |
83 Tool.eFlagsIntegratedCPP))
84
85 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000086 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000087 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000088 output, outputType, args, arglist,
89 ['-S'])
Daniel Dunbara5677512009-01-05 19:53:30 +000090
91class GCC_PrecompileTool(GCC_Common_Tool):
92 def __init__(self):
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +000093 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbara5677512009-01-05 19:53:30 +000094 (Tool.eFlagsPipedInput |
95 Tool.eFlagsIntegratedCPP))
96
97 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +000098 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +000099 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000100 output, outputType, args, arglist,
Daniel Dunbara5677512009-01-05 19:53:30 +0000101 [])
102
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000103class Darwin_AssembleTool(Tool):
104 def __init__(self, toolChain):
105 super(Darwin_AssembleTool, self).__init__('as',
106 Tool.eFlagsPipedInput)
107 self.toolChain = toolChain
Daniel Dunbara5677512009-01-05 19:53:30 +0000108
109 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000110 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000111 assert len(inputs) == 1
112 assert outputType is Types.ObjectType
113
114 input = inputs[0]
115
116 cmd_args = []
Daniel Dunbar996ce962009-01-12 07:40:25 +0000117
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000118 if (arglist.getLastArg(arglist.parser.gOption) or
119 arglist.getLastArg(arglist.parser.g3Option)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000120 cmd_args.append('--gstabs')
121
122 # Derived from asm spec.
Daniel Dunbara5677512009-01-05 19:53:30 +0000123 if arch:
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000124 cmd_args.extend(arglist.render(arch))
Daniel Dunbardb439902009-01-07 18:40:45 +0000125 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar996ce962009-01-12 07:40:25 +0000126 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
127 arglist.getLastArg(arglist.parser.staticOption) or
128 arglist.getLastArg(arglist.parser.f_appleKextOption)):
129 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
130 cmd_args.append('-static')
131
132 for arg in arglist.getArgs2(arglist.parser.WaOption,
133 arglist.parser.XassemblerOption):
134 cmd_args.extend(arglist.getValues(arg))
135
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000136 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000137 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbardb439902009-01-07 18:40:45 +0000138 cmd_args.append('-')
Daniel Dunbara5677512009-01-05 19:53:30 +0000139 else:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000140 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000141
142 # asm_final spec is empty.
143
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000144 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
145 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000146
Daniel Dunbara9ad2bc2009-01-10 02:00:04 +0000147class GCC_AssembleTool(GCC_Common_Tool):
148 def __init__(self):
149 # We can't generally assume the assembler can take or output
150 # on pipes.
151 super(GCC_AssembleTool, self).__init__('gcc (as)')
152
153 def constructJob(self, phase, arch, jobs, inputs,
154 output, outputType, args, arglist):
155 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
156 output, outputType, args, arglist,
157 ['-c'])
158
159class GCC_LinkTool(GCC_Common_Tool):
160 def __init__(self):
161 super(GCC_LinkTool, self).__init__('gcc (ld)')
162
163 def constructJob(self, phase, arch, jobs, inputs,
164 output, outputType, args, arglist):
165 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
166 output, outputType, args, arglist,
167 [])
168
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000169class Darwin_X86_CompileTool(Tool):
170 def __init__(self, toolChain):
171 super(Darwin_X86_CompileTool, self).__init__('cc1',
172 (Tool.eFlagsPipedInput |
173 Tool.eFlagsPipedOutput |
174 Tool.eFlagsIntegratedCPP))
175 self.toolChain = toolChain
176
177 def constructJob(self, phase, arch, jobs, inputs,
178 output, outputType, args, arglist):
179 inputType = inputs[0].type
180 assert not [i for i in inputs if i.type != inputType]
181
182 usePP = False
183 if inputType is Types.CType:
184 cc1Name = 'cc1'
185 usePP = True
186 elif inputType is Types.CTypeNoPP:
187 cc1Name = 'cc1'
188 usePP = False
189 elif inputType is Types.ObjCType:
190 cc1Name = 'cc1obj'
191 usePP = True
192 elif inputType is Types.ObjCTypeNoPP:
193 cc1Name = 'cc1obj'
194 usePP = False
195 elif inputType is Types.CXXType:
196 cc1Name = 'cc1plus'
197 usePP = True
198 elif inputType is Types.CXXTypeNoPP:
199 cc1Name = 'cc1plus'
200 usePP = False
201 elif inputType is Types.ObjCXXType:
202 cc1Name = 'cc1objplus'
203 usePP = True
204 elif inputType is Types.ObjCXXTypeNoPP:
205 cc1Name = 'cc1objplus'
206 usePP = False
207 else:
208 raise RuntimeError,"Unexpected input type for Darwin compile tool."
209
210 cmd_args = []
211 if (arglist.getLastArg(arglist.parser.traditionalOption) or
212 arglist.getLastArg(arglist.parser.f_traditionalOption)):
213 raise ValueError,"-traditional is not supported without -E"
214
215 if usePP:
216 # Derived from cpp_unique_options.
217
218 if (arglist.getLastArg(arglist.parser.COption) or
219 arglist.getLastArg(arglist.parser.CCOption)):
220 if not arglist.getLastArg(arglist.parser.EOption):
221 raise ValueError,"-C or -CC is not supported without -E"
222 if not arglist.getLastArg(arglist.parser.QOption):
223 cmd_args.append('-quiet')
224 arglist.addAllArgs(cmd_args, arglist.parser.nostdincOption)
225 arglist.addLastArg(cmd_args, arglist.parser.vOption)
226 arglist.addAllArgs2(cmd_args, arglist.parser.IOption, arglist.parser.FOption)
227 arglist.addLastArg(cmd_args, arglist.parser.POption)
228
229 # FIXME: Handle %I properly.
230 if arglist.getValue(arch) == 'x86_64':
231 cmd_args.append('-imultilib')
232 cmd_args.append('x86_64')
233
234 if arglist.getLastArg(arglist.parser.MDOption):
235 cmd_args.append('-MD')
236 outputOpt = arglist.getLastArg(arglist.parser.oOption)
237 if outputOpt:
238 base,ext = os.path.splitext(arglist.getValue(outputOpt))
239 cmd_args.append(base+'.d')
240 else:
241 # FIXME: Get correct basename.
242 cmd_args.append('FIXME.d')
243 if arglist.getLastArg(arglist.parser.MMDOption):
244 cmd_args.append('-MMD')
245 outputOpt = arglist.getLastArg(arglist.parser.oOption)
246 if outputOpt:
247 base,ext = os.path.splitext(arglist.getValue(outputOpt))
248 cmd_args.append(base+'.d')
249 else:
250 # FIXME: Get correct basename.
251 cmd_args.append('FIXME.d')
252 arglist.addLastArg(cmd_args, arglist.parser.MOption)
253 arglist.addLastArg(cmd_args, arglist.parser.MMOption)
254 arglist.addAllArgs(cmd_args, arglist.parser.MFOption)
255 arglist.addLastArg(cmd_args, arglist.parser.MGOption)
256 arglist.addLastArg(cmd_args, arglist.parser.MPOption)
257 arglist.addAllArgs(cmd_args, arglist.parser.MQOption)
258 arglist.addAllArgs(cmd_args, arglist.parser.MTOption)
259 if (not arglist.getLastArg(arglist.parser.MOption) and
260 not arglist.getLastArg(arglist.parser.MMOption) and
261 (arglist.getLastArg(arglist.parser.MDOption) or
262 arglist.getLastArg(arglist.parser.MMDOption))):
263 outputOpt = arglist.getLastArg(arglist.parser.oOption)
264 if outputOpt:
265 cmd_args.append('-MQ')
266 cmd_args.append(arglist.getValue(outputOpt))
267
268 arglist.addLastArg(cmd_args, arglist.parser.remapOption)
269 if arglist.getLastArg(arglist.parser.g3Option):
270 cmd_args.append('-dD')
271 arglist.addLastArg(cmd_args, arglist.parser.HOption)
272
273 # FIXME: %C
274
275 arglist.addAllArgs3(cmd_args,
276 arglist.parser.DOption,
277 arglist.parser.UOption,
278 arglist.parser.AOption)
279
280 # FIXME: Add i*
281
282 # FIXME: %Z
283
284 # FIXME: %i
285
286 if arglist.getLastArg(arglist.parser.f_mudflapOption):
287 cmd_args.append('-D_MUDFLAP')
288 cmd_args.append('-include')
289 cmd_args.append('mf-runtime.h')
290
291 if arglist.getLastArg(arglist.parser.f_mudflapthOption):
292 cmd_args.append('-D_MUDFLAP')
293 cmd_args.append('-D_MUDFLAPTH')
294 cmd_args.append('-include')
295 cmd_args.append('mf-runtime.h')
296 else:
297 cmd_args.append('-fpreprocessed')
298 # FIXME: There is a spec command to remove
299 # -fpredictive-compilation args here. Investigate.
300
Daniel Dunbar816dd502009-01-12 17:53:19 +0000301 # FIXME: This is from previously & not part of the spec,
302 # integrate properly.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000303 for input in inputs:
304 if isinstance(input.source, Jobs.PipedJob):
305 cmd_args.append('-')
306 else:
307 cmd_args.extend(arglist.renderAsInput(input.source))
308
Daniel Dunbar816dd502009-01-12 17:53:19 +0000309 # Derived from cc1_options spec.
310 if (arglist.getLastArg(arglist.parser.fastOption) or
311 arglist.getLastArg(arglist.parser.fastfOption) or
312 arglist.getLastArg(arglist.parser.fastcpOption)):
313 cmd_args.append('-O3')
314
315 if (arglist.getLastArg(arglist.parser.pgOption) and
316 arglist.getLastArg(arglist.parser.f_omitFramePointerOption)):
317 raise ValueError,"-pg and -fomit-frame-pointer are incompatible"
318
319 # FIXME: cc1 spec
320
321 if not arglist.getLastArg(arglist.parser.QOption):
322 cmd_args.append('-quiet')
323
324 cmd_args.append('-dumpbase')
325 # FIXME: Get correct basename.
326 cmd_args.append('FIXME')
327
328 # FIXME: d*
329 # FIXME: m*
330 # FIXME: a*
331
332 # FIXME: This is wrong, what is supposed to happen is we
333 # should be using the immediate output if we have a "named
334 # output" from the user, and otherwise derive one from the
335 # input name.
336 outputOpt = arglist.getLastArg(arglist.parser.oOption)
337 if outputOpt:
338 cmd_args.append('-auxbase-strip')
339 cmd_args.append(arglist.getValue(outputOpt))
340 else:
341 cmd_args.append('-auxbase')
342 # FIXME: Add proper basename.
343 cmd_args.append('FIXME')
344
345 # FIXME: g*
346
347 arglist.addAllArgs(cmd_args, arglist.parser.OOption)
348 # FIXME: -Wall is getting some special treatment. Investigate.
349 arglist.addAllArgs2(cmd_args, arglist.parser.WOption, arglist.parser.pedanticOption)
350 arglist.addLastArg(cmd_args, arglist.parser.wOption)
351 arglist.addAllArgs3(cmd_args, arglist.parser.stdOption, arglist.parser.ansiOption, arglist.parser.trigraphsOption)
352 if arglist.getLastArg(arglist.parser.vOption):
353 cmd_args.append('-version')
354 if arglist.getLastArg(arglist.parser.pgOption):
355 cmd_args.append('-p')
356 arglist.addLastArg(cmd_args, arglist.parser.pOption)
357
358 # FIXME: f*
359
360 arglist.addLastArg(cmd_args, arglist.parser.undefOption)
361 if arglist.getLastArg(arglist.parser.QnOption):
362 cmd_args.append('-fno-ident')
363
364 # FIXME: This isn't correct.
365 #arglist.addLastArg(cmd_args, arglist.parser._helpOption)
366 #arglist.addLastArg(cmd_args, arglist.parser._targetHelpOption)
367
368 if isinstance(output, Jobs.PipedJob):
369 cmd_args.extend(['-o', '-'])
370 elif output is None:
371 cmd_args.extend(['-o', '/dev/null'])
372 else:
373 cmd_args.extend(arglist.render(output))
374
375 # FIXME: Still don't get what is happening here. Investigate.
376 arglist.addAllArgs(cmd_args, arglist.parser._paramOption)
377
378 if (arglist.getLastArg(arglist.parser.f_mudflapOption) or
379 arglist.getLastArg(arglist.parser.f_mudflapthOption)):
380 cmd_args.append('-fno-builtin')
381 cmd_args.append('-fno-merge-constants')
382
383 if arglist.getLastArg(arglist.parser.coverageOption):
384 cmd_args.append('-fprofile-arcs')
385 cmd_args.append('-ftest-coverage')
386
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000387 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath(cc1Name),
388 cmd_args))
389
390
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000391class Darwin_X86_LinkTool(Tool):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000392 def __init__(self, toolChain):
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000393 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000394 self.toolChain = toolChain
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000395
396 def getMacosxVersionMin(self):
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000397 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000398 return '%d.%d.%d' % (10, major-4, minor)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000399
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000400 def getMacosxVersionTuple(self, arglist):
401 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
402 if arg:
403 version = arglist.getValue(arg)
404 components = version.split('.')
405 try:
406 return tuple(map(int, components))
407 except:
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000408 raise ValueError,"invalid version number %r" % version
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000409 else:
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000410 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000411 return (10, major-4, minor)
412
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000413 def addDarwinArch(self, cmd_args, arch, arglist):
414 # Derived from darwin_arch spec.
415 cmd_args.append('-arch')
416 # FIXME: The actual spec uses -m64 for this, but we want to
417 # respect arch. Figure out what exactly gcc is doing.
418 #if arglist.getLastArg(arglist.parser.m_64Option):
419 if arglist.getValue(arch) == 'x86_64':
420 cmd_args.append('x86_64')
421 else:
422 cmd_args.append('i386')
423
424 def addDarwinSubArch(self, cmd_args, arch, arglist):
425 # Derived from darwin_subarch spec, not sure what the
426 # distinction exists for but at least for this chain it is the same.
427 return self.addDarwinArch(cmd_args, arch, arglist)
428
429 def addLinkArgs(self, cmd_args, arch, arglist):
430 # Derived from link spec.
431 if arglist.getLastArg(arglist.parser.staticOption):
432 cmd_args.append('-static')
433 else:
434 cmd_args.append('-dynamic')
435 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
436 # FIXME: Replace -lobjc in forward args with
437 # -lobjc-gnu. How do we wish to handle such things?
438 pass
439
440 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
441 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
442 self.addDarwinArch(cmd_args, arch, arglist)
443 cmd_args.append('-force_cpusubtype_all')
444 else:
445 self.addDarwinSubArch(cmd_args, arch, arglist)
446
447 if arglist.getLastArg(arglist.parser.ZbundleOption):
448 cmd_args.append('-bundle')
449 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
450 '-bundle_loader')
451 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
452 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
453 # FIXME: Where should diagnostics go?
454 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
455 sys.exit(1)
456 if arglist.getLastArg(arglist.parser.current_versionOption):
457 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
458 sys.exit(1)
459 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
460 cmd_args.append('-force_flat_namespace')
461 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
462 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
463 sys.exit(1)
464 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
465 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
466 else:
467 cmd_args.append('-dylib')
468 if arglist.getLastArg(arglist.parser.ZbundleOption):
469 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
470 sys.exit(1)
471 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
472 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
473 sys.exit(1)
474 if arglist.getLastArg(arglist.parser.client_nameOption):
475 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
476 sys.exit(1)
477 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
478 '-dylib_compatibility_version')
479 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
480 '-dylib_current_version')
481
482 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
483 self.addDarwinArch(cmd_args, arch, arglist)
484 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
485 else:
486 self.addDarwinSubArch(cmd_args, arch, arglist)
487
488 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
489 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
490 sys.exit(1)
491
492 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
493 '-dylib_install_name')
494
495 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
496 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
497 sys.exit(1)
498 if arglist.getLastArg(arglist.parser.private_bundleOption):
499 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
500 sys.exit(1)
501
502 if arglist.getLastArg(arglist.parser.Zall_loadOption):
503 cmd_args.append('-all_load')
504
505 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
506 '-allowable_client')
507
508 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
509 cmd_args.append('-bind_at_load')
510
511 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
512 cmd_args.append('-dead_strip')
513
514 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
515 cmd_args.append('-no_dead_strip_inits_and_terms')
516
517 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
518 '-dylib_file')
519
520 if arglist.getLastArg(arglist.parser.ZdynamicOption):
521 cmd_args.append('-dynamic')
522
523 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
524 '-exported_symbols_list')
525
526 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
527 cmd_args.append('-flat_namespace')
528
529 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
530 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
531 '-image_base')
532 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
533 '-init')
534
535 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
536 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
537 # FIXME: I don't understand what is going on
538 # here. This is supposed to come from
539 # darwin_ld_minversion, but gcc doesn't seem to be
540 # following that; it must be getting over-ridden
541 # somewhere.
542 cmd_args.append('-macosx_version_min')
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000543 cmd_args.append(self.getMacosxVersionMin())
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000544 else:
545 # addAll doesn't make sense here but this is what gcc
546 # does.
547 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
548 '-macosx_version_min')
549
550 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
551 '-iphoneos_version_min')
552 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
553
554 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
555 cmd_args.append('-multi_module')
556
557 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
558 cmd_args.append('-single_module')
559
560 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
561 '-multiply_defined')
562
563 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
564 '-multiply_defined_unused')
565
566 if arglist.getLastArg(arglist.parser.f_pieOption):
567 cmd_args.append('-pie')
568
569 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
570 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
571 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
572 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
573 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
574 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
575 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
576 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
577 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
578 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
579 '-segaddr')
580 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
581 '-segs_read_only_addr')
582 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
583 '-segs_read_write_addr')
584 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
585 '-seg_addr_table')
586 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
587 '-fn_seg_addr_table_filename')
588 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
589 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
590 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
591 '-syslibroot')
592 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
593 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
594 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
595 '-umbrella')
596 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
597 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
598 '-unexported_symbols_list')
599 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
600 '-weak_reference_mismatches')
601
602 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
603 cmd_args.append('-weak_reference_mismatches')
604 cmd_args.append('non-weak')
605
606 arglist.addLastArg(cmd_args, arglist.parser.XOption)
607 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
608 arglist.addLastArg(cmd_args, arglist.parser.wOption)
609 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
610 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
611 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
612 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
613 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
614 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
615 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
616 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
617 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
618 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
619 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
620 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbara5677512009-01-05 19:53:30 +0000621
622 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000623 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000624 assert outputType is Types.ImageType
625
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000626 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000627 # comes from specs (starting with link_command). Consult gcc
628 # for more information.
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000629
630 # FIXME: gcc's spec controls when this is done; certain things
631 # like -filelist or -Wl, still trigger a link stage. I don't
632 # quite understand how gcc decides to execute the linker,
633 # investigate. Also, the spec references -fdump= which seems
634 # to have disappeared?
Daniel Dunbara5677512009-01-05 19:53:30 +0000635 cmd_args = []
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000636
637 # Not sure why this particular decomposition exists in gcc.
638 self.addLinkArgs(cmd_args, arch, arglist)
639
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000640 # This toolchain never accumlates options in specs, the only
641 # place this gets used is to add -ObjC.
642 if (arglist.getLastArg(arglist.parser.ObjCOption) or
643 arglist.getLastArg(arglist.parser.f_objcOption)):
644 cmd_args.append('-ObjC')
645 if arglist.getLastArg(arglist.parser.ObjCXXOption):
646 cmd_args.append('-ObjC')
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000647
648 # FIXME: gcc has %{x} in here. How could this ever happen?
649 # Cruft?
650 arglist.addLastArg(cmd_args, arglist.parser.dOption)
651 arglist.addLastArg(cmd_args, arglist.parser.tOption)
652 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
653 arglist.addLastArg(cmd_args, arglist.parser.uOption)
654 arglist.addLastArg(cmd_args, arglist.parser.AOption)
655 arglist.addLastArg(cmd_args, arglist.parser.eOption)
656 arglist.addLastArg(cmd_args, arglist.parser.mOption)
657 arglist.addLastArg(cmd_args, arglist.parser.rOption)
658
659 cmd_args.extend(arglist.render(output))
660
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000661 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000662 if (not arglist.getLastArg(arglist.parser.AOption) and
663 not arglist.getLastArg(arglist.parser.nostdlibOption) and
664 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
665 # Derived from startfile spec.
666 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
667 # Derived from darwin_dylib1 spec.
668 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
669 cmd_args.append('-ldylib1.o')
670 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000671 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000672 cmd_args.append('-ldylib1.o')
673 else:
674 cmd_args.append('-ldylib1.10.5.o')
675 else:
676 if arglist.getLastArg(arglist.parser.ZbundleOption):
677 if not arglist.getLastArg(arglist.parser.staticOption):
678 cmd_args.append('-lbundle1.o')
679 else:
680 if arglist.getLastArg(arglist.parser.pgOption):
681 if arglist.getLastArg(arglist.parser.staticOption):
682 cmd_args.append('-lgcrt0.o')
683 else:
684 if arglist.getLastArg(arglist.parser.objectOption):
685 cmd_args.append('-lgcrt0.o')
686 else:
687 if arglist.getLastArg(arglist.parser.preloadOption):
688 cmd_args.append('-lgcrt0.o')
689 else:
690 cmd_args.append('-lgcrt1.o')
691
692 # darwin_crt2 spec is empty.
693 pass
694 else:
695 if arglist.getLastArg(arglist.parser.staticOption):
696 cmd_args.append('-lcrt0.o')
697 else:
698 if arglist.getLastArg(arglist.parser.objectOption):
699 cmd_args.append('-lcrt0.o')
700 else:
701 if arglist.getLastArg(arglist.parser.preloadOption):
702 cmd_args.append('-lcrt0.o')
703 else:
704 # Derived from darwin_crt1 spec.
705 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
706 cmd_args.append('-lcrt1.o')
707 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000708 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000709 cmd_args.append('-lcrt1.o')
710 else:
711 cmd_args.append('-lcrt1.10.5.o')
712
713 # darwin_crt2 spec is empty.
714 pass
715
716 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
717 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000718 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000719 # FIXME: gcc does a library search for this
720 # file, this will be be broken currently.
721 cmd_args.append('crt3.o')
722
723 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
724
725 if arglist.getLastArg(arglist.parser.f_openmpOption):
726 # This is more complicated in gcc...
727 cmd_args.append('-lgomp')
728
729 # FIXME: Derive these correctly.
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000730 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbar9c257c32009-01-12 04:21:12 +0000731 if arglist.getValue(arch) == 'x86_64':
732 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
733 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
734 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
735 "-L/usr/lib/gcc/%s" % tcDir,
736 "-L/usr/lib/gcc/%s" % tcDir,
737 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
738 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000739
Daniel Dunbara5677512009-01-05 19:53:30 +0000740 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000741 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000742
743 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
744 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
745 arglist.getLastArg(arglist.parser.f_createProfileOption) or
746 arglist.getLastArg(arglist.parser.coverageOption)):
747 cmd_args.append('-lgcov')
748
749 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
750 cmd_args.append('-allow_stack_execute')
751
752 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
753 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
754 # link_ssp spec is empty.
755
756 # Derived from libgcc spec.
757 if arglist.getLastArg(arglist.parser.staticOption):
758 cmd_args.append('-lgcc_static')
759 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
760 cmd_args.append('-lgcc_eh')
761 cmd_args.append('-lgcc')
762 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
763 # Derived from darwin_iphoneos_libgcc spec.
764 cmd_args.append('-lgcc_s.10.5')
765 cmd_args.append('-lgcc')
766 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
767 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
768 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000769 if macosxVersion < (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000770 cmd_args.append('-lgcc_s.10.4')
771 else:
772 cmd_args.append('-lgcc_s.10.5')
773 cmd_args.append('-lgcc')
774 else:
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000775 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000776 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar4a0ba1a2009-01-12 05:02:38 +0000777 if macosxVersion >= (10,5):
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000778 cmd_args.append('-lgcc_s.10.5')
779 cmd_args.append('-lgcc')
780
781 # Derived from lib spec.
782 if not arglist.getLastArg(arglist.parser.staticOption):
783 cmd_args.append('-lSystem')
784
785 if (not arglist.getLastArg(arglist.parser.AOption) and
786 not arglist.getLastArg(arglist.parser.nostdlibOption) and
787 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
788 # endfile_spec is empty.
789 pass
790
791 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
792 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
793
Daniel Dunbar9cb22532009-01-12 07:45:49 +0000794 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
795 cmd_args))
Daniel Dunbara5677512009-01-05 19:53:30 +0000796
Daniel Dunbar9c199a02009-01-11 23:13:15 +0000797 # FIXME: We need to add a dsymutil job here in some particular
798 # cases (basically whenever we have a c-family input we are
799 # compiling, I think). Find out why this is the condition, and
800 # implement. See link_command spec for more details.
801
Daniel Dunbara5677512009-01-05 19:53:30 +0000802class LipoTool(Tool):
803 def __init__(self):
804 super(LipoTool, self).__init__('lipo')
805
806 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbardb439902009-01-07 18:40:45 +0000807 output, outputType, args, arglist):
Daniel Dunbara5677512009-01-05 19:53:30 +0000808 assert outputType is Types.ImageType
809
Daniel Dunbardb439902009-01-07 18:40:45 +0000810 cmd_args = ['-create']
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000811 cmd_args.extend(arglist.render(output))
Daniel Dunbara5677512009-01-05 19:53:30 +0000812 for input in inputs:
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000813 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbara5677512009-01-05 19:53:30 +0000814 jobs.addJob(Jobs.Command('lipo', cmd_args))