blob: 17a9ce822a9030538fc7af19980ca98a41ba655f [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:
55 cmd_args.append(arglist.getValue(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +000056
57 jobs.addJob(Jobs.Command('gcc', cmd_args))
58
59class GCC_PreprocessTool(GCC_Common_Tool):
60 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000061 super(GCC_PreprocessTool, self).__init__('gcc (cpp)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000062 (Tool.eFlagsPipedInput |
63 Tool.eFlagsPipedOutput))
64
65 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000066 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000067 return super(GCC_PreprocessTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000068 output, outputType, args, arglist,
69 ['-E'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000070
71class GCC_CompileTool(GCC_Common_Tool):
72 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000073 super(GCC_CompileTool, self).__init__('gcc (cc1)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000074 (Tool.eFlagsPipedInput |
75 Tool.eFlagsPipedOutput |
76 Tool.eFlagsIntegratedCPP))
77
78 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000079 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000080 return super(GCC_CompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000081 output, outputType, args, arglist,
82 ['-S'])
Daniel Dunbar378530c2009-01-05 19:53:30 +000083
84class GCC_PrecompileTool(GCC_Common_Tool):
85 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000086 super(GCC_PrecompileTool, self).__init__('gcc (pch)',
Daniel Dunbar378530c2009-01-05 19:53:30 +000087 (Tool.eFlagsPipedInput |
88 Tool.eFlagsIntegratedCPP))
89
90 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000091 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +000092 return super(GCC_PrecompileTool, self).constructJob(phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +000093 output, outputType, args, arglist,
Daniel Dunbar378530c2009-01-05 19:53:30 +000094 [])
95
Daniel Dunbar306ca042009-01-10 02:00:04 +000096class DarwinAssembleTool(Tool):
Daniel Dunbar378530c2009-01-05 19:53:30 +000097 def __init__(self):
Daniel Dunbar306ca042009-01-10 02:00:04 +000098 super(DarwinAssembleTool, self).__init__('as',
99 Tool.eFlagsPipedInput)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000100
101 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000102 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000103 assert len(inputs) == 1
104 assert outputType is Types.ObjectType
105
106 input = inputs[0]
107
108 cmd_args = []
109 if arch:
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000110 cmd_args.extend(arglist.render(arch))
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000111 cmd_args.append('-force_cpusubtype_ALL')
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000112 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000113 if isinstance(input.source, Jobs.PipedJob):
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000114 cmd_args.append('-')
Daniel Dunbar378530c2009-01-05 19:53:30 +0000115 else:
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000116 cmd_args.append(arglist.getValue(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000117 jobs.addJob(Jobs.Command('as', cmd_args))
118
Daniel Dunbar306ca042009-01-10 02:00:04 +0000119class GCC_AssembleTool(GCC_Common_Tool):
120 def __init__(self):
121 # We can't generally assume the assembler can take or output
122 # on pipes.
123 super(GCC_AssembleTool, self).__init__('gcc (as)')
124
125 def constructJob(self, phase, arch, jobs, inputs,
126 output, outputType, args, arglist):
127 return super(GCC_AssembleTool, self).constructJob(phase, arch, jobs, inputs,
128 output, outputType, args, arglist,
129 ['-c'])
130
131class GCC_LinkTool(GCC_Common_Tool):
132 def __init__(self):
133 super(GCC_LinkTool, self).__init__('gcc (ld)')
134
135 def constructJob(self, phase, arch, jobs, inputs,
136 output, outputType, args, arglist):
137 return super(GCC_LinkTool, self).constructJob(phase, arch, jobs, inputs,
138 output, outputType, args, arglist,
139 [])
140
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000141class Darwin10_X86_LinkTool(Tool):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000142 kCollect2Path = '/usr/libexec/gcc/i686-apple-darwin10/4.2.1/collect2'
143 def __init__(self):
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000144 super(Darwin10_X86_LinkTool, self).__init__('collect2')
145
146 def addDarwinArch(self, cmd_args, arch, arglist):
147 # Derived from darwin_arch spec.
148 cmd_args.append('-arch')
149 # FIXME: The actual spec uses -m64 for this, but we want to
150 # respect arch. Figure out what exactly gcc is doing.
151 #if arglist.getLastArg(arglist.parser.m_64Option):
152 if arglist.getValue(arch) == 'x86_64':
153 cmd_args.append('x86_64')
154 else:
155 cmd_args.append('i386')
156
157 def addDarwinSubArch(self, cmd_args, arch, arglist):
158 # Derived from darwin_subarch spec, not sure what the
159 # distinction exists for but at least for this chain it is the same.
160 return self.addDarwinArch(cmd_args, arch, arglist)
161
162 def addLinkArgs(self, cmd_args, arch, arglist):
163 # Derived from link spec.
164 if arglist.getLastArg(arglist.parser.staticOption):
165 cmd_args.append('-static')
166 else:
167 cmd_args.append('-dynamic')
168 if arglist.getLastArg(arglist.parser.f_gnuRuntimeOption):
169 # FIXME: Replace -lobjc in forward args with
170 # -lobjc-gnu. How do we wish to handle such things?
171 pass
172
173 if not arglist.getLastArg(arglist.parser.ZdynamiclibOption):
174 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
175 self.addDarwinArch(cmd_args, arch, arglist)
176 cmd_args.append('-force_cpusubtype_all')
177 else:
178 self.addDarwinSubArch(cmd_args, arch, arglist)
179
180 if arglist.getLastArg(arglist.parser.ZbundleOption):
181 cmd_args.append('-bundle')
182 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zbundle_loaderOption,
183 '-bundle_loader')
184 arglist.addAllArgs(cmd_args, arglist.parser.client_nameOption)
185 if arglist.getLastArg(arglist.parser.compatibility_versionOption):
186 # FIXME: Where should diagnostics go?
187 print >>sys.stderr, "-compatibility_version only allowed with -dynamiclib"
188 sys.exit(1)
189 if arglist.getLastArg(arglist.parser.current_versionOption):
190 print >>sys.stderr, "-current_version only allowed with -dynamiclib"
191 sys.exit(1)
192 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
193 cmd_args.append('-force_flat_namespace')
194 if arglist.getLastArg(arglist.parser.Zinstall_nameOption):
195 print >>sys.stderr, "-install_name only allowed with -dynamiclib"
196 sys.exit(1)
197 arglist.addLastArg(cmd_args, arglist.parser.keep_private_externsOption)
198 arglist.addLastArg(cmd_args, arglist.parser.private_bundleOption)
199 else:
200 cmd_args.append('-dylib')
201 if arglist.getLastArg(arglist.parser.ZbundleOption):
202 print >>sys.stderr, "-bundle not allowed with -dynamiclib"
203 sys.exit(1)
204 if arglist.getLastArg(arglist.parser.Zbundle_loaderOption):
205 print >>sys.stderr, "-bundle_loader not allowed with -dynamiclib"
206 sys.exit(1)
207 if arglist.getLastArg(arglist.parser.client_nameOption):
208 print >>sys.stderr, "-client_name not allowed with -dynamiclib"
209 sys.exit(1)
210 arglist.addAllArgsTranslated(cmd_args, arglist.parser.compatibility_versionOption,
211 '-dylib_compatibility_version')
212 arglist.addAllArgsTranslated(cmd_args, arglist.parser.current_versionOption,
213 '-dylib_current_version')
214
215 if arglist.getLastArg(arglist.parser.Zforce_cpusubtype_ALLOption):
216 self.addDarwinArch(cmd_args, arch, arglist)
217 # NOTE: We don't add -force_cpusubtype_ALL on this path. Ok.
218 else:
219 self.addDarwinSubArch(cmd_args, arch, arglist)
220
221 if arglist.getLastArg(arglist.parser.Zforce_flat_namespaceOption):
222 print >>sys.stderr, "-force_flat_namespace not allowed with -dynamiclib"
223 sys.exit(1)
224
225 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zinstall_nameOption,
226 '-dylib_install_name')
227
228 if arglist.getLastArg(arglist.parser.keep_private_externsOption):
229 print >>sys.stderr, "-keep_private_externs not allowed with -dynamiclib"
230 sys.exit(1)
231 if arglist.getLastArg(arglist.parser.private_bundleOption):
232 print >>sys.stderr, "-private_bundle not allowed with -dynamiclib"
233 sys.exit(1)
234
235 if arglist.getLastArg(arglist.parser.Zall_loadOption):
236 cmd_args.append('-all_load')
237
238 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zallowable_clientOption,
239 '-allowable_client')
240
241 if arglist.getLastArg(arglist.parser.Zbind_at_loadOption):
242 cmd_args.append('-bind_at_load')
243
244 if arglist.getLastArg(arglist.parser.Zdead_stripOption):
245 cmd_args.append('-dead_strip')
246
247 if arglist.getLastArg(arglist.parser.Zno_dead_strip_inits_and_termsOption):
248 cmd_args.append('-no_dead_strip_inits_and_terms')
249
250 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zdylib_fileOption,
251 '-dylib_file')
252
253 if arglist.getLastArg(arglist.parser.ZdynamicOption):
254 cmd_args.append('-dynamic')
255
256 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zexported_symbols_listOption,
257 '-exported_symbols_list')
258
259 if arglist.getLastArg(arglist.parser.Zflat_namespaceOption):
260 cmd_args.append('-flat_namespace')
261
262 arglist.addAllArgs(cmd_args, arglist.parser.headerpad_max_install_namesOption)
263 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zimage_baseOption,
264 '-image_base')
265 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZinitOption,
266 '-init')
267
268 if not arglist.getLastArg(arglist.parser.m_macosxVersionMinOption):
269 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
270 # FIXME: I don't understand what is going on
271 # here. This is supposed to come from
272 # darwin_ld_minversion, but gcc doesn't seem to be
273 # following that; it must be getting over-ridden
274 # somewhere.
275 cmd_args.append('-macosx_version_min')
276 # FIXME: De-hardcode.
277 cmd_args.append('10.6.0')
278 pass
279 else:
280 # addAll doesn't make sense here but this is what gcc
281 # does.
282 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_macosxVersionMinOption,
283 '-macosx_version_min')
284
285 arglist.addAllArgsTranslated(cmd_args, arglist.parser.m_iphoneosVersionMinOption,
286 '-iphoneos_version_min')
287 arglist.addLastArg(cmd_args, arglist.parser.nomultidefsOption)
288
289 if arglist.getLastArg(arglist.parser.Zmulti_moduleOption):
290 cmd_args.append('-multi_module')
291
292 if arglist.getLastArg(arglist.parser.Zsingle_moduleOption):
293 cmd_args.append('-single_module')
294
295 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zmultiply_definedOption,
296 '-multiply_defined')
297
298 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZmultiplydefinedunusedOption,
299 '-multiply_defined_unused')
300
301 if arglist.getLastArg(arglist.parser.f_pieOption):
302 cmd_args.append('-pie')
303
304 arglist.addLastArg(cmd_args, arglist.parser.prebindOption)
305 arglist.addLastArg(cmd_args, arglist.parser.noprebindOption)
306 arglist.addLastArg(cmd_args, arglist.parser.nofixprebindingOption)
307 arglist.addLastArg(cmd_args, arglist.parser.prebind_all_twolevel_modulesOption)
308 arglist.addLastArg(cmd_args, arglist.parser.read_only_relocsOption)
309 arglist.addAllArgs(cmd_args, arglist.parser.sectcreateOption)
310 arglist.addAllArgs(cmd_args, arglist.parser.sectorderOption)
311 arglist.addAllArgs(cmd_args, arglist.parser.seg1addrOption)
312 arglist.addAllArgs(cmd_args, arglist.parser.segprotOption)
313 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZsegaddrOption,
314 '-segaddr')
315 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_only_addrOption,
316 '-segs_read_only_addr')
317 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zsegs_read_write_addrOption,
318 '-segs_read_write_addr')
319 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zseg_addr_tableOption,
320 '-seg_addr_table')
321 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zfn_seg_addr_table_filenameOption,
322 '-fn_seg_addr_table_filename')
323 arglist.addAllArgs(cmd_args, arglist.parser.sub_libraryOption)
324 arglist.addAllArgs(cmd_args, arglist.parser.sub_umbrellaOption)
325 arglist.addAllArgsTranslated(cmd_args, arglist.parser.isysrootOption,
326 '-syslibroot')
327 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespaceOption)
328 arglist.addLastArg(cmd_args, arglist.parser.twolevel_namespace_hintsOption)
329 arglist.addAllArgsTranslated(cmd_args, arglist.parser.ZumbrellaOption,
330 '-umbrella')
331 arglist.addAllArgs(cmd_args, arglist.parser.undefinedOption)
332 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zunexported_symbols_listOption,
333 '-unexported_symbols_list')
334 arglist.addAllArgsTranslated(cmd_args, arglist.parser.Zweak_reference_mismatchesOption,
335 '-weak_reference_mismatches')
336
337 if not arglist.getLastArg(arglist.parser.Zweak_reference_mismatchesOption):
338 cmd_args.append('-weak_reference_mismatches')
339 cmd_args.append('non-weak')
340
341 arglist.addLastArg(cmd_args, arglist.parser.XOption)
342 arglist.addAllArgs(cmd_args, arglist.parser.yOption)
343 arglist.addLastArg(cmd_args, arglist.parser.wOption)
344 arglist.addAllArgs(cmd_args, arglist.parser.pagezero_sizeOption)
345 arglist.addAllArgs(cmd_args, arglist.parser.segs_read_Option)
346 arglist.addLastArg(cmd_args, arglist.parser.seglinkeditOption)
347 arglist.addLastArg(cmd_args, arglist.parser.noseglinkeditOption)
348 arglist.addAllArgs(cmd_args, arglist.parser.sectalignOption)
349 arglist.addAllArgs(cmd_args, arglist.parser.sectobjectsymbolsOption)
350 arglist.addAllArgs(cmd_args, arglist.parser.segcreateOption)
351 arglist.addLastArg(cmd_args, arglist.parser.whyloadOption)
352 arglist.addLastArg(cmd_args, arglist.parser.whatsloadedOption)
353 arglist.addAllArgs(cmd_args, arglist.parser.dylinker_install_nameOption)
354 arglist.addLastArg(cmd_args, arglist.parser.dylinkerOption)
355 arglist.addLastArg(cmd_args, arglist.parser.MachOption)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000356
357 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000358 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000359 assert outputType is Types.ImageType
360
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000361 # The logic here is derived from gcc's behavior; most of which
Daniel Dunbar08292932009-01-12 02:24:21 +0000362 # comes from specs (starting with link_command). Consult gcc
363 # for more information.
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000364
365 # FIXME: gcc's spec controls when this is done; certain things
366 # like -filelist or -Wl, still trigger a link stage. I don't
367 # quite understand how gcc decides to execute the linker,
368 # investigate. Also, the spec references -fdump= which seems
369 # to have disappeared?
Daniel Dunbar378530c2009-01-05 19:53:30 +0000370 cmd_args = []
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000371
372 # Not sure why this particular decomposition exists in gcc.
373 self.addLinkArgs(cmd_args, arch, arglist)
374
Daniel Dunbar08292932009-01-12 02:24:21 +0000375 # This toolchain never accumlates options in specs, the only
376 # place this gets used is to add -ObjC.
377 if (arglist.getLastArg(arglist.parser.ObjCOption) or
378 arglist.getLastArg(arglist.parser.f_objcOption)):
379 cmd_args.append('-ObjC')
380 if arglist.getLastArg(arglist.parser.ObjCXXOption):
381 cmd_args.append('-ObjC')
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000382
383 # FIXME: gcc has %{x} in here. How could this ever happen?
384 # Cruft?
385 arglist.addLastArg(cmd_args, arglist.parser.dOption)
386 arglist.addLastArg(cmd_args, arglist.parser.tOption)
387 arglist.addLastArg(cmd_args, arglist.parser.ZOption)
388 arglist.addLastArg(cmd_args, arglist.parser.uOption)
389 arglist.addLastArg(cmd_args, arglist.parser.AOption)
390 arglist.addLastArg(cmd_args, arglist.parser.eOption)
391 arglist.addLastArg(cmd_args, arglist.parser.mOption)
392 arglist.addLastArg(cmd_args, arglist.parser.rOption)
393
394 cmd_args.extend(arglist.render(output))
395
396 if (not arglist.getLastArg(arglist.parser.AOption) and
397 not arglist.getLastArg(arglist.parser.nostdlibOption) and
398 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
399 # Derived from startfile spec.
400 if arglist.getLastArg(arglist.parser.ZdynamiclibOption):
401 # Derived from darwin_dylib1 spec.
402 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
403 cmd_args.append('-ldylib1.o')
404 else:
405 if self.macosxVersionCmp('<', '10.5', arglist):
406 cmd_args.append('-ldylib1.o')
407 else:
408 cmd_args.append('-ldylib1.10.5.o')
409 else:
410 if arglist.getLastArg(arglist.parser.ZbundleOption):
411 if not arglist.getLastArg(arglist.parser.staticOption):
412 cmd_args.append('-lbundle1.o')
413 else:
414 if arglist.getLastArg(arglist.parser.pgOption):
415 if arglist.getLastArg(arglist.parser.staticOption):
416 cmd_args.append('-lgcrt0.o')
417 else:
418 if arglist.getLastArg(arglist.parser.objectOption):
419 cmd_args.append('-lgcrt0.o')
420 else:
421 if arglist.getLastArg(arglist.parser.preloadOption):
422 cmd_args.append('-lgcrt0.o')
423 else:
424 cmd_args.append('-lgcrt1.o')
425
426 # darwin_crt2 spec is empty.
427 pass
428 else:
429 if arglist.getLastArg(arglist.parser.staticOption):
430 cmd_args.append('-lcrt0.o')
431 else:
432 if arglist.getLastArg(arglist.parser.objectOption):
433 cmd_args.append('-lcrt0.o')
434 else:
435 if arglist.getLastArg(arglist.parser.preloadOption):
436 cmd_args.append('-lcrt0.o')
437 else:
438 # Derived from darwin_crt1 spec.
439 if arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
440 cmd_args.append('-lcrt1.o')
441 else:
442 if self.macosxVersionCmp('<', '10.5', arglist):
443 cmd_args.append('-lcrt1.o')
444 else:
445 cmd_args.append('-lcrt1.10.5.o')
446
447 # darwin_crt2 spec is empty.
448 pass
449
450 if arglist.getLastArg(arglist.parser.sharedLibgccOption):
451 if not arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
452 if self.macosxVersionCmp('<', '10.5', arglist):
453 # FIXME: gcc does a library search for this
454 # file, this will be be broken currently.
455 cmd_args.append('crt3.o')
456
457 arglist.addAllArgs(cmd_args, arglist.parser.LOption)
458
459 if arglist.getLastArg(arglist.parser.f_openmpOption):
460 # This is more complicated in gcc...
461 cmd_args.append('-lgomp')
462
463 # FIXME: Derive these correctly.
464 if arglist.getValue(arch) == 'x86_64':
465 cmd_args.extend(["-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64",
466 "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/x86_64"])
467 cmd_args.extend(["-L/usr/lib/i686-apple-darwin10/4.2.1",
468 "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1",
469 "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1",
470 "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../../i686-apple-darwin10/4.2.1",
471 "-L/usr/lib/gcc/i686-apple-darwin10/4.2.1/../../.."])
472
Daniel Dunbar378530c2009-01-05 19:53:30 +0000473 for input in inputs:
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000474 cmd_args.append(arglist.getValue(input.source))
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000475
476 if (arglist.getLastArg(arglist.parser.f_profileArcsOption) or
477 arglist.getLastArg(arglist.parser.f_profileGenerateOption) or
478 arglist.getLastArg(arglist.parser.f_createProfileOption) or
479 arglist.getLastArg(arglist.parser.coverageOption)):
480 cmd_args.append('-lgcov')
481
482 if arglist.getLastArg(arglist.parser.f_nestedFunctionsOption):
483 cmd_args.append('-allow_stack_execute')
484
485 if (not arglist.getLastArg(arglist.parser.nostdlibOption) and
486 not arglist.getLastArg(arglist.parser.nodefaultlibsOption)):
487 # link_ssp spec is empty.
488
489 # Derived from libgcc spec.
490 if arglist.getLastArg(arglist.parser.staticOption):
491 cmd_args.append('-lgcc_static')
492 elif arglist.getLastArg(arglist.parser.staticLibgccOption):
493 cmd_args.append('-lgcc_eh')
494 cmd_args.append('-lgcc')
495 elif arglist.getLastArg(arglist.parser.m_iphoneosVersionMinOption):
496 # Derived from darwin_iphoneos_libgcc spec.
497 cmd_args.append('-lgcc_s.10.5')
498 cmd_args.append('-lgcc')
499 elif (arglist.getLastArg(arglist.parser.sharedLibgccOption) or
500 arglist.getLastArg(arglist.parser.f_exceptionsOption) or
501 arglist.getLastArg(arglist.parser.f_gnuRuntimeOption)):
502 if self.macosxVersionCmp('<', '10.5', arglist):
503 cmd_args.append('-lgcc_s.10.4')
504 else:
505 cmd_args.append('-lgcc_s.10.5')
506 cmd_args.append('-lgcc')
507 else:
508 if (self.macosxVersionCmp('<', '10.5', arglist) and
509 self.macosxVersionCmp('>=', '10.3.9', arglist)):
510 cmd_args.append('-lgcc_s.10.4')
511 else:
512 cmd_args.append('-lgcc_s.10.5')
513 cmd_args.append('-lgcc')
514
515 # Derived from lib spec.
516 if not arglist.getLastArg(arglist.parser.staticOption):
517 cmd_args.append('-lSystem')
518
519 if (not arglist.getLastArg(arglist.parser.AOption) and
520 not arglist.getLastArg(arglist.parser.nostdlibOption) and
521 not arglist.getLastArg(arglist.parser.nostartfilesOption)):
522 # endfile_spec is empty.
523 pass
524
525 arglist.addAllArgs(cmd_args, arglist.parser.TOption)
526 arglist.addAllArgs(cmd_args, arglist.parser.FOption)
527
Daniel Dunbar378530c2009-01-05 19:53:30 +0000528 jobs.addJob(Jobs.Command(self.kCollect2Path, cmd_args))
529
Daniel Dunbar9bbf18d2009-01-11 23:13:15 +0000530 # FIXME: We need to add a dsymutil job here in some particular
531 # cases (basically whenever we have a c-family input we are
532 # compiling, I think). Find out why this is the condition, and
533 # implement. See link_command spec for more details.
534
535 def macosxVersionCmp(self, cmp, version, arglist):
536 import sys
537 print >>sys.stderr, 'FIXME: macosxVersionCmp unimplemented.'
538 return False
539
Daniel Dunbar378530c2009-01-05 19:53:30 +0000540class LipoTool(Tool):
541 def __init__(self):
542 super(LipoTool, self).__init__('lipo')
543
544 def constructJob(self, phase, arch, jobs, inputs,
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000545 output, outputType, args, arglist):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000546 assert outputType is Types.ImageType
547
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000548 cmd_args = ['-create']
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000549 cmd_args.extend(arglist.render(output))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000550 for input in inputs:
Daniel Dunbarb421dba2009-01-07 18:40:45 +0000551 cmd_args.append(arglist.getValue(input.source))
Daniel Dunbar378530c2009-01-05 19:53:30 +0000552 jobs.addJob(Jobs.Command('lipo', cmd_args))