blob: c850ef1a03603e11e32e4d27fb03f0205090108d [file] [log] [blame]
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +00001import sys # FIXME: Shouldn't be needed.
2
Daniel Dunbar378530c2009-01-05 19:53:30 +00003import Arguments
4import Jobs
5import Types
6
7class Tool(object):
Daniel Dunbare9f1a692009-01-06 06:12:13 +00008 """Tool - A concrete implementation of an action."""
Daniel Dunbar378530c2009-01-05 19:53:30 +00009
10 eFlagsPipedInput = 1 << 0
11 eFlagsPipedOutput = 1 << 1
12 eFlagsIntegratedCPP = 1 << 2
13
14 def __init__(self, name, flags = 0):
15 self.name = name
16 self.flags = flags
17
18 def acceptsPipedInput(self):
19 return not not (self.flags & Tool.eFlagsPipedInput)
20 def canPipeOutput(self):
21 return not not (self.flags & Tool.eFlagsPipedOutput)
22 def hasIntegratedCPP(self):
23 return not not (self.flags & Tool.eFlagsIntegratedCPP)
24
25class GCC_Common_Tool(Tool):
26 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000027 output, outputType, args, arglist,
Daniel Dunbar378530c2009-01-05 19:53:30 +000028 extraArgs):
Daniel Dunbarb421dba2009-01-07 18:40:45 +000029 cmd_args = sum(map(arglist.render, args),[]) + extraArgs
Daniel Dunbar378530c2009-01-05 19:53:30 +000030 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +000031 cmd_args.extend(arglist.render(arch))
Daniel Dunbar378530c2009-01-05 19:53:30 +000032 if isinstance(output, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +000033 cmd_args.extend(['-o', '-'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000034 elif output is None:
Daniel Dunbarb421dba2009-01-07 18:40:45 +000035 cmd_args.append('-fsyntax-only')
Daniel Dunbar378530c2009-01-05 19:53:30 +000036 else:
Daniel Dunbar1ba90982009-01-07 18:54:26 +000037 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +000038
Daniel Dunbar306ca042009-01-10 02:00:04 +000039 # Only pass -x if gcc will understand it; otherwise hope gcc
40 # understands the suffix correctly. The main use case this
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +000041 # would go wrong in is for linker inputs if they happened to
42 # have an odd suffix; really the only way to get this to
43 # happen is a command like '-x foobar a.c' which will treat
44 # a.c like a linker input.
Daniel Dunbar306ca042009-01-10 02:00:04 +000045 #
46 # FIXME: For the linker case specifically, can we safely
47 # convert inputs into '-Wl,' options?
48 for input in inputs:
49 if input.type.canBeUserSpecified:
50 cmd_args.extend(['-x', input.type.name])
51
52 if isinstance(input.source, Jobs.PipedJob):
53 cmd_args.append('-')
54 else:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +000055 assert isinstance(input.source, Arguments.Arg)
56 # If this is a linker input then assume we can forward
57 # just by rendering.
58 if input.source.opt.isLinkerInput:
59 cmd_args.extend(arglist.render(input.source))
60 else:
61 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +000062
63 jobs.addJob(Jobs.Command('gcc', cmd_args))
64
65class GCC_PreprocessTool(GCC_Common_Tool):
66 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000067 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000068 (Tool.eFlagsPipedInput |
69 Tool.eFlagsPipedOutput))
70
71 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000072 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000073 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000074 output, outputType, args, arglist,
75 ['-E'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000076
77class GCC_CompileTool(GCC_Common_Tool):
78 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000079 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000080 (Tool.eFlagsPipedInput |
81 Tool.eFlagsPipedOutput |
82 Tool.eFlagsIntegratedCPP))
83
84 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000085 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000086 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000087 output, outputType, args, arglist,
88 ['-S'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000089
90class GCC_PrecompileTool(GCC_Common_Tool):
91 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000092 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000093 (Tool.eFlagsPipedInput |
94 Tool.eFlagsIntegratedCPP))
95
96 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000097 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000098 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000099 output, outputType, args, arglist,
Daniel Dunbar378530c2009-01-05 19:53:30 +0000100 [])
101
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000102class Darwin_AssembleTool(Tool):
103 def __init__(self, toolChain):
104 super(Darwin_AssembleTool, self).__init__('as',
105 Tool.eFlagsPipedInput)
106 self.toolChain = toolChain
Daniel Dunbar378530c2009-01-05 19:53:30 +0000107
108 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000109 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000110 assert len(inputs) == 1
111 assert outputType is Types.ObjectType
112
113 input = inputs[0]
114
115 cmd_args = []
Daniel Dunbar3b246392009-01-12 07:40:25 +0000116
117 if arglist.getLastArg(arglist.parser.gOption):
118 cmd_args.append('--gstabs')
119
120 # Derived from asm spec.
Daniel Dunbar378530c2009-01-05 19:53:30 +0000121 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000122 cmd_args.extend(arglist.render(arch))
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000123 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar3b246392009-01-12 07:40:25 +0000124 if (arglist.getLastArg(arglist.parser.m_kernelOption) or
125 arglist.getLastArg(arglist.parser.staticOption) or
126 arglist.getLastArg(arglist.parser.f_appleKextOption)):
127 if not arglist.getLastArg(arglist.parser.ZdynamicOption):
128 cmd_args.append('-static')
129
130 for arg in arglist.getArgs2(arglist.parser.WaOption,
131 arglist.parser.XassemblerOption):
132 cmd_args.extend(arglist.getValues(arg))
133
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000134 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000135 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000136 cmd_args.append('-')
Daniel Dunbar378530c2009-01-05 19:53:30 +0000137 else:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000138 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar3b246392009-01-12 07:40:25 +0000139
140 # asm_final spec is empty.
141
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000142 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('as'),
143 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000144
Daniel Dunbar306ca042009-01-10 02:00:04 +0000145class GCC_AssembleTool(GCC_Common_Tool):
146 def __init__(self):
147 # We can't generally assume the assembler can take or output
148 # on pipes.
149 super(GCC_AssembleTool, self).__init__('gcc (as)')
150
151 def constructJob(self, phase, arch, jobs, inputs,
152 output, outputType, args, arglist):
153 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
154 output, outputType, args, arglist,
155 ['-c'])
156
157class GCC_LinkTool(GCC_Common_Tool):
158 def __init__(self):
159 super(GCC_LinkTool, self).__init__('gcc (ld)')
160
161 def constructJob(self, phase, arch, jobs, inputs,
162 output, outputType, args, arglist):
163 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
164 output, outputType, args, arglist,
165 [])
166
Daniel Dunbarc2148562009-01-12 04:21:12 +0000167class Darwin_X86_LinkTool(Tool):
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000168 def __init__(self, toolChain):
Daniel Dunbarc2148562009-01-12 04:21:12 +0000169 super(Darwin_X86_LinkTool, self).__init__('collect2')
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000170 self.toolChain = toolChain
Daniel Dunbarc2148562009-01-12 04:21:12 +0000171
172 def getMacosxVersionMin(self):
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000173 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbarc2148562009-01-12 04:21:12 +0000174 return '%d.%d.%d' % (10, major-4, minor)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000175
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000176 def getMacosxVersionTuple(self, arglist):
177 arg = arglist.getLastArg(arglist.parser.m_macosxVersionMinOption)
178 if arg:
179 version = arglist.getValue(arg)
180 components = version.split('.')
181 try:
182 return tuple(map(int, components))
183 except:
184 raise ArgumentError,"invalid version number %r" % version
185 else:
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000186 major,minor,minorminor = self.toolChain.darwinVersion
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000187 return (10, major-4, minor)
188
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000189 def addDarwinArch(self, cmd_args, arch, arglist):
190 # Derived from darwin_arch spec.
191 cmd_args.append('-arch')
192 # FIXME: The actual spec uses -m64 for this, but we want to
193 # respect arch. Figure out what exactly gcc is doing.
194 #if arglist.getLastArg(arglist.parser.m_64Option):
195 if arglist.getValue(arch) == 'x86_64':
196 cmd_args.append('x86_64')
197 else:
198 cmd_args.append('i386')
199
200 def addDarwinSubArch(self, cmd_args, arch, arglist):
201 # Derived from darwin_subarch spec, not sure what the
202 # distinction exists for but at least for this chain it is the same.
203 return self.addDarwinArch(cmd_args, arch, arglist)
204
205 def addLinkArgs(self, cmd_args, arch, arglist):
206 # Derived from link spec.
207 if arglist.getLastArg(arglist.parser.staticOption):
208 cmd_args.append('-static')
209 else:
210 cmd_args.append('-dynamic')
211 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
212 # FIXME: Replace -lobjc in forward args with
213 # -lobjc-gnu. How do we wish to handle such things?
214 pass
215
216 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
217 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
218 self.addDarwinArch(cmd_args, arch, arglist)
219 cmd_args.append('-force_cpusubtype_all')
220 else:
221 self.addDarwinSubArch(cmd_args, arch, arglist)
222
223 if arglist.getLastArg(arglist.parser.ZbundleOption):
224 cmd_args.append('-bundle')
225 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
226 '-bundle_loader')
227 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
228 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
229 # FIXME: Where should diagnostics go?
230 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
231 sys.exit(1)
232 if arglist.getLastArg(arglist.parser.current_versionOption):
233 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
234 sys.exit(1)
235 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
236 cmd_args.append('-force_flat_namespace')
237 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
238 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
239 sys.exit(1)
240 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
241 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
242 else:
243 cmd_args.append('-dylib')
244 if arglist.getLastArg(arglist.parser.ZbundleOption):
245 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
246 sys.exit(1)
247 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
248 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
249 sys.exit(1)
250 if arglist.getLastArg(arglist.parser.client_nameOption):
251 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
252 sys.exit(1)
253 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
254 '-dylib_compatibility_version')
255 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
256 '-dylib_current_version')
257
258 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
259 self.addDarwinArch(cmd_args, arch, arglist)
260 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
261 else:
262 self.addDarwinSubArch(cmd_args, arch, arglist)
263
264 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
265 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
266 sys.exit(1)
267
268 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
269 '-dylib_install_name')
270
271 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
272 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
273 sys.exit(1)
274 if arglist.getLastArg(arglist.parser.private_bundleOption):
275 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
276 sys.exit(1)
277
278 if arglist.getLastArg(arglist.parser.Zall_loadOption):
279 cmd_args.append('-all_load')
280
281 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
282 '-allowable_client')
283
284 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
285 cmd_args.append('-bind_at_load')
286
287 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
288 cmd_args.append('-dead_strip')
289
290 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
291 cmd_args.append('-no_dead_strip_inits_and_terms')
292
293 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
294 '-dylib_file')
295
296 if arglist.getLastArg(arglist.parser.ZdynamicOption):
297 cmd_args.append('-dynamic')
298
299 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
300 '-exported_symbols_list')
301
302 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
303 cmd_args.append('-flat_namespace')
304
305 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
306 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
307 '-image_base')
308 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
309 '-init')
310
311 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
312 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
313 # FIXME: I don't understand what is going on
314 # here. This is supposed to come from
315 # darwin_ld_minversion, but gcc doesn't seem to be
316 # following that; it must be getting over-ridden
317 # somewhere.
318 cmd_args.append('-macosx_version_min')
Daniel Dunbarc2148562009-01-12 04:21:12 +0000319 cmd_args.append(self.getMacosxVersionMin())
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000320 else:
321 # addAll doesn't make sense here but this is what gcc
322 # does.
323 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
324 '-macosx_version_min')
325
326 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
327 '-iphoneos_version_min')
328 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
329
330 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
331 cmd_args.append('-multi_module')
332
333 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
334 cmd_args.append('-single_module')
335
336 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
337 '-multiply_defined')
338
339 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
340 '-multiply_defined_unused')
341
342 if arglist.getLastArg(arglist.parser.f_pieOption):
343 cmd_args.append('-pie')
344
345 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
346 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
347 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
348 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
349 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
350 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
351 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
352 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
353 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
354 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
355 '-segaddr')
356 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
357 '-segs_read_only_addr')
358 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
359 '-segs_read_write_addr')
360 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
361 '-seg_addr_table')
362 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
363 '-fn_seg_addr_table_filename')
364 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
365 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
366 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
367 '-syslibroot')
368 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
369 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
370 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
371 '-umbrella')
372 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
373 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
374 '-unexported_symbols_list')
375 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
376 '-weak_reference_mismatches')
377
378 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
379 cmd_args.append('-weak_reference_mismatches')
380 cmd_args.append('non-weak')
381
382 arglist.addLastArg(cmd_args, arglist.parser.XOption)
383 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
384 arglist.addLastArg(cmd_args, arglist.parser.wOption)
385 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
386 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
387 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
388 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
389 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
390 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
391 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
392 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
393 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
394 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
395 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
396 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000397
398 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000399 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000400 assert outputType is Types.ImageType
401
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000402 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbar08292932009-01-12 02:24:21 +0000403 # comes from specs (starting with link_command). Consult gcc
404 # for more information.
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000405
406 # FIXME: gcc's spec controls when this is done; certain things
407 # like -filelist or -Wl, still trigger a link stage. I don't
408 # quite understand how gcc decides to execute the linker,
409 # investigate. Also, the spec references -fdump= which seems
410 # to have disappeared?
Daniel Dunbar378530c2009-01-05 19:53:30 +0000411 cmd_args = []
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000412
413 # Not sure why this particular decomposition exists in gcc.
414 self.addLinkArgs(cmd_args, arch, arglist)
415
Daniel Dunbar08292932009-01-12 02:24:21 +0000416 # This toolchain never accumlates options in specs, the only
417 # place this gets used is to add -ObjC.
418 if (arglist.getLastArg(arglist.parser.ObjCOption) or
419 arglist.getLastArg(arglist.parser.f_objcOption)):
420 cmd_args.append('-ObjC')
421 if arglist.getLastArg(arglist.parser.ObjCXXOption):
422 cmd_args.append('-ObjC')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000423
424 # FIXME: gcc has %{x} in here. How could this ever happen?
425 # Cruft?
426 arglist.addLastArg(cmd_args, arglist.parser.dOption)
427 arglist.addLastArg(cmd_args, arglist.parser.tOption)
428 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
429 arglist.addLastArg(cmd_args, arglist.parser.uOption)
430 arglist.addLastArg(cmd_args, arglist.parser.AOption)
431 arglist.addLastArg(cmd_args, arglist.parser.eOption)
432 arglist.addLastArg(cmd_args, arglist.parser.mOption)
433 arglist.addLastArg(cmd_args, arglist.parser.rOption)
434
435 cmd_args.extend(arglist.render(output))
436
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000437 macosxVersion = self.getMacosxVersionTuple(arglist)
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000438 if (not arglist.getLastArg(arglist.parser.AOption) and
439 not arglist.getLastArg(arglist.parser.nostdlibOption) and
440 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
441 # Derived from startfile spec.
442 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
443 # Derived from darwin_dylib1 spec.
444 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
445 cmd_args.append('-ldylib1.o')
446 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000447 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000448 cmd_args.append('-ldylib1.o')
449 else:
450 cmd_args.append('-ldylib1.10.5.o')
451 else:
452 if arglist.getLastArg(arglist.parser.ZbundleOption):
453 if not arglist.getLastArg(arglist.parser.staticOption):
454 cmd_args.append('-lbundle1.o')
455 else:
456 if arglist.getLastArg(arglist.parser.pgOption):
457 if arglist.getLastArg(arglist.parser.staticOption):
458 cmd_args.append('-lgcrt0.o')
459 else:
460 if arglist.getLastArg(arglist.parser.objectOption):
461 cmd_args.append('-lgcrt0.o')
462 else:
463 if arglist.getLastArg(arglist.parser.preloadOption):
464 cmd_args.append('-lgcrt0.o')
465 else:
466 cmd_args.append('-lgcrt1.o')
467
468 # darwin_crt2 spec is empty.
469 pass
470 else:
471 if arglist.getLastArg(arglist.parser.staticOption):
472 cmd_args.append('-lcrt0.o')
473 else:
474 if arglist.getLastArg(arglist.parser.objectOption):
475 cmd_args.append('-lcrt0.o')
476 else:
477 if arglist.getLastArg(arglist.parser.preloadOption):
478 cmd_args.append('-lcrt0.o')
479 else:
480 # Derived from darwin_crt1 spec.
481 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
482 cmd_args.append('-lcrt1.o')
483 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000484 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000485 cmd_args.append('-lcrt1.o')
486 else:
487 cmd_args.append('-lcrt1.10.5.o')
488
489 # darwin_crt2 spec is empty.
490 pass
491
492 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
493 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000494 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000495 # FIXME: gcc does a library search for this
496 # file, this will be be broken currently.
497 cmd_args.append('crt3.o')
498
499 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
500
501 if arglist.getLastArg(arglist.parser.f_openmpOption):
502 # This is more complicated in gcc...
503 cmd_args.append('-lgomp')
504
505 # FIXME: Derive these correctly.
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000506 tcDir = self.toolChain.getToolChainDir()
Daniel Dunbarc2148562009-01-12 04:21:12 +0000507 if arglist.getValue(arch) == 'x86_64':
508 cmd_args.extend(["-L/usr/lib/gcc/%s/x86_64" % tcDir,
509 "-L/usr/lib/gcc/%s/x86_64" % tcDir])
510 cmd_args.extend(["-L/usr/lib/%s" % tcDir,
511 "-L/usr/lib/gcc/%s" % tcDir,
512 "-L/usr/lib/gcc/%s" % tcDir,
513 "-L/usr/lib/gcc/%s/../../../%s" % (tcDir,tcDir),
514 "-L/usr/lib/gcc/%s/../../.." % tcDir])
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000515
Daniel Dunbar378530c2009-01-05 19:53:30 +0000516 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000517 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000518
519 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
520 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
521 arglist.getLastArg(arglist.parser.f_createProfileOption) or
522 arglist.getLastArg(arglist.parser.coverageOption)):
523 cmd_args.append('-lgcov')
524
525 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
526 cmd_args.append('-allow_stack_execute')
527
528 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
529 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
530 # link_ssp spec is empty.
531
532 # Derived from libgcc spec.
533 if arglist.getLastArg(arglist.parser.staticOption):
534 cmd_args.append('-lgcc_static')
535 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
536 cmd_args.append('-lgcc_eh')
537 cmd_args.append('-lgcc')
538 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
539 # Derived from darwin_iphoneos_libgcc spec.
540 cmd_args.append('-lgcc_s.10.5')
541 cmd_args.append('-lgcc')
542 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
543 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
544 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000545 if macosxVersion < (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000546 cmd_args.append('-lgcc_s.10.4')
547 else:
548 cmd_args.append('-lgcc_s.10.5')
549 cmd_args.append('-lgcc')
550 else:
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000551 if macosxVersion < (10,5) and macosxVersion >= (10,3,9):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000552 cmd_args.append('-lgcc_s.10.4')
Daniel Dunbar37d54e92009-01-12 05:02:38 +0000553 if macosxVersion >= (10,5):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000554 cmd_args.append('-lgcc_s.10.5')
555 cmd_args.append('-lgcc')
556
557 # Derived from lib spec.
558 if not arglist.getLastArg(arglist.parser.staticOption):
559 cmd_args.append('-lSystem')
560
561 if (not arglist.getLastArg(arglist.parser.AOption) and
562 not arglist.getLastArg(arglist.parser.nostdlibOption) and
563 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
564 # endfile_spec is empty.
565 pass
566
567 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
568 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
569
Daniel Dunbar2dda5412009-01-12 07:45:49 +0000570 jobs.addJob(Jobs.Command(self.toolChain.getProgramPath('collect2'),
571 cmd_args))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000572
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000573 # FIXME: We need to add a dsymutil job here in some particular
574 # cases (basically whenever we have a c-family input we are
575 # compiling, I think). Find out why this is the condition, and
576 # implement. See link_command spec for more details.
577
Daniel Dunbar378530c2009-01-05 19:53:30 +0000578class LipoTool(Tool):
579 def __init__(self):
580 super(LipoTool, self).__init__('lipo')
581
582 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000583 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000584 assert outputType is Types.ImageType
585
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000586 cmd_args = ['-create']
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000587 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000588 for input in inputs:
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000589 cmd_args.extend(arglist.renderAsInput(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000590 jobs.addJob(Jobs.Command('lipo', cmd_args))