blob: 2ed0597f896aeb26dc5660a1f74116de76342898 [file] [log] [blame]
Daniel Dunbar94713452009-01-16 23:12:12 +00001
2###
3
4class InvalidArgumentsError(ValueError):
5 """InvalidArgumentsError - The driver arguments are invalid or
6 inconsistent."""
7
8class MissingArgumentError(ValueError):
9 """MissingArgumentError - An option required an argument but none
10 was given."""
11
12###
13
Daniel Dunbara5677512009-01-05 19:53:30 +000014class Option(object):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000015 """Option - Root option class."""
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000016
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000017 def __init__(self, name, group=None, isLinkerInput=False, noOptAsInput=False):
18 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbara5677512009-01-05 19:53:30 +000019 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000020 self.group = group
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000021 self.isLinkerInput = isLinkerInput
22 self.noOptAsInput = noOptAsInput
Daniel Dunbara5677512009-01-05 19:53:30 +000023
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000024 def matches(self, opt):
25 """matches(opt) -> bool
26
27 Predicate for whether this option is part of the given option
28 (which may be a group)."""
29 if self is opt:
30 return True
31 elif self.group:
32 return self.group.matches(opt)
33 else:
34 return False
35
Daniel Dunbara5677512009-01-05 19:53:30 +000036 def accept(self, index, arg, it):
37 """accept(index, arg, iterator) -> Arg or None
38
39 Accept the argument at the given index, returning an Arg, or
40 return None if the option does not accept this argument.
41
42 May raise MissingArgumentError.
43 """
44 abstract
45
46 def __repr__(self):
47 return '<%s name=%r>' % (self.__class__.__name__,
48 self.name)
49
Daniel Dunbar11672ec2009-01-13 18:51:26 +000050 def forwardToGCC(self):
51 # FIXME: Get rid of this hack.
52 if self.name == '<input>':
53 return False
54
55 if self.isLinkerInput:
56 return False
57
58 return self.name not in ('-E', '-S', '-c',
59 '-arch', '-fsyntax-only', '-combine', '-x',
60 '-###')
61
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000062class OptionGroup(Option):
63 """OptionGroup - A fake option class used to group options so that
64 the driver can efficiently refer to an entire set of options."""
65
Daniel Dunbar3cde3252009-01-14 19:42:31 +000066 def __init__(self, name, group=None):
67 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000068
69 def accept(self, index, arg, it):
70 raise RuntimeError,"accept() should never be called on an OptionGroup"
71
Daniel Dunbar5039f212009-01-06 02:30:10 +000072# Dummy options
73
74class InputOption(Option):
75 def __init__(self):
76 super(InputOption, self).__init__('<input>')
77
78 def accept(self):
79 raise RuntimeError,"accept() should never be used on InputOption instance."
80
81class UnknownOption(Option):
82 def __init__(self):
83 super(UnknownOption, self).__init__('<unknown>')
84
85 def accept(self):
86 raise RuntimeError,"accept() should never be used on UnknownOption instance."
87
88# Normal options
89
Daniel Dunbara5677512009-01-05 19:53:30 +000090class FlagOption(Option):
91 """An option which takes no arguments."""
92
93 def accept(self, index, arg, it):
94 if arg == self.name:
95 return Arg(index, self)
96
97class JoinedOption(Option):
98 """An option which literally prefixes its argument."""
99
100 def accept(self, index, arg, it):
101 if arg.startswith(self.name):
102 return JoinedValueArg(index, self)
103
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000104class CommaJoinedOption(Option):
105 """An option which literally prefixs its argument, but which
106 conceptually may have an arbitrary number of arguments which are
107 separated by commas."""
108
109 def accept(self, index, arg, it):
110 if arg.startswith(self.name):
111 return CommaJoinedValuesArg(index, self)
112
Daniel Dunbara5677512009-01-05 19:53:30 +0000113class SeparateOption(Option):
114 """An option which is followed by its value."""
115
116 def accept(self, index, arg, it):
117 if arg == self.name:
118 try:
119 _,value = it.next()
120 except StopIteration:
121 raise MissingArgumentError,self
122 return SeparateValueArg(index, self)
123
124class MultiArgOption(Option):
125 """An option which takes multiple arguments."""
126
127 def __init__(self, name, numArgs):
128 assert numArgs > 1
129 super(MultiArgOption, self).__init__(name)
130 self.numArgs = numArgs
131
132 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000133 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000134 try:
135 values = [it.next()[1] for i in range(self.numArgs)]
136 except StopIteration:
137 raise MissingArgumentError,self
138 return MultipleValuesArg(index, self)
139
140class JoinedOrSeparateOption(Option):
141 """An option which either literally prefixes its value or is
142 followed by an value."""
143
144 def accept(self, index, arg, it):
145 if arg.startswith(self.name):
146 if len(arg) != len(self.name): # Joined case
147 return JoinedValueArg(index, self)
148 else:
149 try:
150 _,value = it.next()
151 except StopIteration:
152 raise MissingArgumentError,self
153 return SeparateValueArg(index, self)
154
155class JoinedAndSeparateOption(Option):
156 """An option which literally prefixes its value and is followed by
157 an value."""
158
159 def accept(self, index, arg, it):
160 if arg.startswith(self.name):
161 try:
162 _,value = it.next()
163 except StopIteration:
164 raise MissingArgumentError,self
165 return JoinedAndSeparateValuesArg(index, self)
166
167###
168
169class Arg(object):
170 """Arg - Base class for actual driver arguments."""
171 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000172 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000173 self.index = index
174 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000175
Daniel Dunbara5677512009-01-05 19:53:30 +0000176 def __repr__(self):
177 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
178 self.index,
179 self.opt)
180
181 def render(self, args):
182 """render(args) -> [str]
183
184 Map the argument into a list of actual program arguments,
185 given the source argument array."""
186 assert self.opt
187 return [self.opt.name]
188
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000189 def renderAsInput(self, args):
190 return self.render(args)
191
Daniel Dunbara5677512009-01-05 19:53:30 +0000192class ValueArg(Arg):
193 """ValueArg - An instance of an option which has an argument."""
194
195 def getValue(self, args):
196 abstract
197
Daniel Dunbar996ce962009-01-12 07:40:25 +0000198 def getValues(self, args):
199 return [self.getValue(args)]
200
Daniel Dunbar5039f212009-01-06 02:30:10 +0000201class PositionalArg(ValueArg):
202 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000203
204 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000205 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000206
207 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000208 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000209
210class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000211 """JoinedValueArg - A single value argument where the value is
212 joined (suffixed) to the option."""
213
Daniel Dunbara5677512009-01-05 19:53:30 +0000214 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000215 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000216
Daniel Dunbara5677512009-01-05 19:53:30 +0000217 def render(self, args):
218 return [self.opt.name + self.getValue(args)]
219
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000220 def renderAsInput(self, args):
221 if self.opt.noOptAsInput:
222 return [self.getValue(args)]
223 return self.render(args)
224
Daniel Dunbara5677512009-01-05 19:53:30 +0000225class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000226 """SeparateValueArg - A single value argument where the value
227 follows the option in the argument vector."""
228
Daniel Dunbara5677512009-01-05 19:53:30 +0000229 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000230 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000231
Daniel Dunbara5677512009-01-05 19:53:30 +0000232 def render(self, args):
233 return [self.opt.name, self.getValue(args)]
234
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000235 def renderAsInput(self, args):
236 if self.opt.noOptAsInput:
237 return [self.getValue(args)]
238 return self.render(args)
239
Daniel Dunbara5677512009-01-05 19:53:30 +0000240class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000241 """MultipleValuesArg - An argument with multiple values which
242 follow the option in the argument vector."""
243
244 # FIXME: Should we unify this with SeparateValueArg?
245
Daniel Dunbara5677512009-01-05 19:53:30 +0000246 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000247 return [args.getInputString(self.index, offset=1+i)
248 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000249
Daniel Dunbara5677512009-01-05 19:53:30 +0000250 def render(self, args):
251 return [self.opt.name] + self.getValues(args)
252
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000253class CommaJoinedValuesArg(Arg):
254 """CommaJoinedValuesArg - An argument with multiple values joined
255 by commas and joined (suffixed) to the option.
256
257 The key point of this arg is that it renders its values into
258 separate arguments, which allows it to be used as a generic
259 mechanism for passing arguments through to tools."""
260
261 def getValues(self, args):
262 return args.getInputString(self.index)[len(self.opt.name):].split(',')
263
264 def render(self, args):
265 return [self.opt.name + ','.join(self.getValues(args))]
266
267 def renderAsInput(self, args):
268 return self.getValues(args)
269
Daniel Dunbara5677512009-01-05 19:53:30 +0000270# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
271# just special case?
272class JoinedAndSeparateValuesArg(Arg):
273 """JoinedAndSeparateValuesArg - An argument with both joined and
274 separate values."""
275
276 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000277 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000278
279 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000280 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000281
282 def render(self, args):
283 return ([self.opt.name + self.getJoinedValue(args)] +
284 [self.getSeparateValue(args)])
285
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000286###
287
288class InputIndex:
289 def __init__(self, sourceId, pos):
290 self.sourceId = sourceId
291 self.pos = pos
292
293 def __repr__(self):
294 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
295
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000296class ArgList(object):
297 """ArgList - Collect an input argument vector along with a set of
298 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000299
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000300 def __init__(self, parser, argv):
301 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000302 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000303 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000304 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000305 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000306
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000307 def getArgs(self, option):
308 # FIXME: How efficient do we want to make this. One reasonable
309 # solution would be to embed a linked list inside each arg and
310 # automatically chain them (with pointers to head and
311 # tail). This gives us efficient access to the (first, last,
312 # all) arg(s) with little overhead.
313 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000314 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000315 yield arg
316
Daniel Dunbar996ce962009-01-12 07:40:25 +0000317 def getArgs2(self, optionA, optionB):
318 """getArgs2 - Iterate over all arguments for two options, in
319 the order they were specified."""
320 # As long as getArgs is efficient, we can easily make this
321 # efficient by iterating both at once and always taking the
322 # earlier arg.
323 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000324 if (arg.opt.matches(optionA) or
325 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000326 yield arg
327
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000328 def getArgs3(self, optionA, optionB, optionC):
329 """getArgs3 - Iterate over all arguments for three options, in
330 the order they were specified."""
331 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000332 if (arg.opt.matches(optionA) or
333 arg.opt.matches(optionB) or
334 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000335 yield arg
336
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000337 def getLastArg(self, option):
338 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000339
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000340 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000341 # Source 0 is argv.
342 if index.sourceId == 0:
343 return self.argv[index.pos + offset]
344
345 # Source 1 is synthetic argv.
346 if index.sourceId == 1:
347 return self.syntheticArgv[index.pos + offset]
348
349 raise RuntimeError,'Unknown source ID for index.'
350
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000351 def addLastArg(self, output, option):
352 """addLastArgs - Extend the given output vector with the last
353 instance of a given option."""
354 arg = self.getLastArg(option)
355 if arg:
356 output.extend(self.render(arg))
357
358 def addAllArgs(self, output, option):
359 """addAllArgs - Extend the given output vector with all
360 instances of a given option."""
361 for arg in self.getArgs(option):
362 output.extend(self.render(arg))
363
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000364 def addAllArgs2(self, output, optionA, optionB):
365 """addAllArgs2 - Extend the given output vector with all
366 instances of two given option, with relative order preserved."""
367 for arg in self.getArgs2(optionA, optionB):
368 output.extend(self.render(arg))
369
370 def addAllArgs3(self, output, optionA, optionB, optionC):
371 """addAllArgs3 - Extend the given output vector with all
372 instances of three given option, with relative order preserved."""
373 for arg in self.getArgs3(optionA, optionB, optionC):
374 output.extend(self.render(arg))
375
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000376 def addAllArgsTranslated(self, output, option, translation):
377 """addAllArgsTranslated - Extend the given output vector with
378 all instances of a given option, rendered as separate
379 arguments with the actual option name translated to a user
380 specified string. For example, '-foox' will be render as
381 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
382 translation.
383
384 This routine expects that the option can only yield ValueArg
385 instances."""
386 for arg in self.getArgs(option):
387 assert isinstance(arg, ValueArg)
388 output.append(translation)
389 output.append(self.getValue(arg))
390
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000391 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000392 pos = len(self.syntheticArgv)
393 self.syntheticArgv.extend(strings)
394 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000395
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000396 def makeFlagArg(self, option):
397 return Arg(self.makeIndex(option.name),
398 option)
399
400 def makeInputArg(self, string):
401 return PositionalArg(self.makeIndex(string),
402 self.parser.inputOption)
403
404 def makeUnknownArg(self, string):
405 return PositionalArg(self.makeIndex(string),
406 self.parser.unknownOption)
407
408 def makeSeparateArg(self, string, option):
409 return SeparateValueArg(self.makeIndex(option.name, string),
410 option)
411
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000412 def makeJoinedArg(self, string, option):
413 return JoinedValueArg(self.makeIndex(option.name + string),
414 option)
415
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000416 # Support use as a simple arg list.
417
418 def __iter__(self):
419 return iter(self.args)
420
421 def append(self, arg):
422 self.args.append(arg)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000423 self.lastArgs[arg.opt] = arg
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000424 if arg.opt.group is not None:
425 self.lastArgs[arg.opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000426
427 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000428 #
429 # FIXME: Clean this up once restructuring is done.
430
431 def render(self, arg):
432 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000433
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000434 def renderAsInput(self, arg):
435 return arg.renderAsInput(self)
436
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000437 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000438 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000439
440 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000441 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000442
443 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000444 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000445
446 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000447 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000448
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000449class DerivedArgList(ArgList):
450 def __init__(self, args):
451 super(DerivedArgList, self).__init__(args.parser, args.argv)
452 self.parser = args.parser
453 self.argv = args.argv
454 self.syntheticArgv = args.syntheticArgv
455 self.lastArgs = {}
456 self.args = []
457
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000458###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000459
Daniel Dunbara5677512009-01-05 19:53:30 +0000460class OptionParser:
461 def __init__(self):
462 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000463 self.inputOption = InputOption()
464 self.unknownOption = UnknownOption()
465
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000466 # Driver driver options
467 self.archOption = self.addOption(SeparateOption('-arch'))
468
469 # Misc driver options
470 self.addOption(FlagOption('-pass-exit-codes'))
471 self.addOption(FlagOption('--help'))
472 self.addOption(FlagOption('--target-help'))
473
474 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
475 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
476 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
477 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000478
479 self.printLibgccFileNameOption = OptionGroup('-print-libgcc-file-name')
480 self.addOption(FlagOption('-print-libgcc-file-name', self.printLibgccFileNameOption))
481 self.addOption(FlagOption('--print-libgcc-file-name', self.printLibgccFileNameOption))
482
483 self.printFileNameOption = OptionGroup('-print-file-name=')
484 self.addOption(JoinedOption('-print-file-name=', self.printFileNameOption))
485 self.addOption(JoinedOption('--print-file-name=', self.printFileNameOption))
486
487 self.printProgNameOption = OptionGroup('-print-prog-name=')
488 self.addOption(JoinedOption('-print-prog-name=', self.printProgNameOption))
489 self.addOption(JoinedOption('--print-prog-name=', self.printProgNameOption))
490
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000491 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
492 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
493 self.addOption(FlagOption('-print-multi-os-directory'))
494
495 # Hmmm, who really takes this?
496 self.addOption(FlagOption('--version'))
497
498 # Pipeline control
499 self.hashHashHashOption = self.addOption(FlagOption('-###'))
500 self.EOption = self.addOption(FlagOption('-E'))
501 self.SOption = self.addOption(FlagOption('-S'))
502 self.cOption = self.addOption(FlagOption('-c'))
503 self.combineOption = self.addOption(FlagOption('-combine'))
504 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
505 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000506
507 self.saveTempsOption = OptionGroup('-save-temps')
508 self.addOption(FlagOption('-save-temps', self.saveTempsOption))
509 self.addOption(FlagOption('--save-temps', self.saveTempsOption))
510
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000511 # FIXME: Error out if this is used.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000512 self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000513 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000514 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000515 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000516 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000517
518 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000519 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000520 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
521
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000522 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
523 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000524
525 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
526 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000527
528 # FIXME: This is broken in Darwin cc1, it wants std* and this
529 # is std=. May need an option group for this as well.
530 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000531 self.addOption(JoinedOrSeparateOption('--sysroot'))
532
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000533 # Blanket pass-through options.
534
Daniel Dunbarde388a52009-01-21 01:07:49 +0000535 self.WAOption = self.addOption(CommaJoinedOption('-WA,'))
536
Daniel Dunbar996ce962009-01-12 07:40:25 +0000537 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
538 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000539
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000540 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
541 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000542
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000543 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
544 self.addOption(SeparateOption('-Xlinker', isLinkerInput=True, noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000545
546 ####
547 # Bring on the random garbage.
548
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000549 self.MGroup = OptionGroup('-M')
550 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
551 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
552 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
553 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
554 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
555 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
556 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
557 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
558 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000559 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000560 self.uGroup = OptionGroup('-u')
561 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000562
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000563 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000564 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
565 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000566 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
567 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
568 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000569 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000570 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
571 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000572 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000573 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000574
575 self.iGroup = OptionGroup('-i')
576 self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
577 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
578 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000579 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000580
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000581 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
582 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
583 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
584 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
585 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
586 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000587 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
588 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000589 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
590 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
591 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
592 self.prebindOption = self.addOption(FlagOption('-prebind'))
593 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
594 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
595 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000596 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000597 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000598 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
599 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
600 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
601 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000602 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000603 self.objectOption = self.addOption(FlagOption('-object'))
604 self.preloadOption = self.addOption(FlagOption('-preload'))
605 self.staticOption = self.addOption(FlagOption('-static'))
606 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000607 self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000608 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
609 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000610 self.COption = self.addOption(FlagOption('-C'))
611 self.CCOption = self.addOption(FlagOption('-CC'))
612 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000613 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000614 self.POption = self.addOption(FlagOption('-P'))
615 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000616 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000617 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000618 self.traditionalOption = self.addOption(FlagOption('-traditional'))
619 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
620 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000621 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000622 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000623 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
624 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
625 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000626 self.whyloadOption = self.addOption(FlagOption('-whyload'))
627 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
628 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
629 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
630 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000631 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
632 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
633 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
634 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000635
636 self.all_loadOption = self.addOption(FlagOption('-all_load'))
637 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
638 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
639 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
640 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
641 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
642 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
643 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
644 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
645 self.image_baseOption = self.addOption(FlagOption('-image_base'))
646 self.initOption = self.addOption(SeparateOption('-init'))
647 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
648 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
649 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
650 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
651 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
652 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
653 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
654 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
655 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
656 # FIXME: This probably isn't necessary.
657 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
658 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000659 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000660 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000661
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000662 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
663 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000664
665 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000666
667 # Where are these coming from? I can't find them...
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000668 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
669 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000670
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000671 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000672 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000673
674 doNotReallySupport = 1
675 if doNotReallySupport:
676 # Archaic gcc option.
677 self.addOption(FlagOption('-cpp-precomp'))
678 self.addOption(FlagOption('-no-cpp-precomp'))
679
680 # C options for testing
681
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000682 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
683
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000684 # FIXME: This is broken, we need -A as a single option to send
685 # stuff to cc1, but the way the ld spec is constructed it
686 # wants to see -A options but only as a separate arg.
687 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
688 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000689 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000690 self.IOption = self.addOption(JoinedOrSeparateOption('-I'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000691 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
692 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000693 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000694 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
695
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000696 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000697 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000698 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
699 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000700
701 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000702 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000703 # Not exactly sure how to decompose this. I split out -Xarch_
704 # because we need to recognize that in the driver driver part.
705 # FIXME: Man, this is lame it needs its own option.
706 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
707 self.addOption(JoinedOption('-X'))
708
709 # The driver needs to know about this flag.
710 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
711
712 # FIXME: Wrong?
713 # FIXME: What to do about the ambiguity of options like
714 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000715 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000716 self.dGroup = OptionGroup('-d')
717 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
718 self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000719
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000720 # Use a group for this in anticipation of adding more -d
721 # options explicitly. Note that we don't put many -d things in
722 # the -d group (like -dylinker, or '-d' by itself) because it
723 # is really a gcc bug that it ships these to cc1.
724 self.dGroup = OptionGroup('-d')
725 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000726
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000727 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000728 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
729 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000730 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
731 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000732 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000733 # FIXME: Naming.
734 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
735 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000736
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000737 # FIXME: How should we handle clang specific options? Do we
738 # want to avoid passing them to gcc/cc1 (which will generally
739 # not eat them), or should we let the user sort it out.
740
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000741 self.fGroup = OptionGroup('-f')
742 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
743 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
744 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
745
746 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000747 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000748 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000749 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
750 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000751 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000752 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000753 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000754 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000755 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000756 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000757 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000758 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000759 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
760 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
761 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000762 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
763 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
764 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
765 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
766 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
767 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000768 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000769 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
770 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
771 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000772 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000773 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
774 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000775 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000776 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
777 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
778 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000779 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
780 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000781 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000782 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000783 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000784 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000785 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000786 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000787 self.addOption(JoinedOption('-f', self.fGroup))
788
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000789 self.coverageOption = self.addOption(FlagOption('-coverage'))
790 self.coverageOption2 = self.addOption(FlagOption('--coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000791
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000792 self.mGroup = OptionGroup('-m')
793 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
794 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
795 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
796 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
797 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
798 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000799 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
800 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
801 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
802 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
803 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
804 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000805 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000806
807 # Ugh. Need to disambiguate our naming convetion. -m x goes to
808 # the linker sometimes, wheres -mxxxx is used for a variety of
809 # other things.
810 self.mOption = self.addOption(SeparateOption('-m'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000811 self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000812
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000813 # FIXME: Why does Darwin send -a* to cc1?
814 self.aGroup = OptionGroup('-a')
815 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
816 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
817
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000818 self.pedanticGroup = OptionGroup('-pedantic')
819 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
820 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000821 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000822
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000823 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000824 self.ClangWGroup = OptionGroup('-W', self.WGroup)
825
Daniel Dunbarab95c392009-01-21 18:49:34 +0000826 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
827 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
828 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
829 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
830 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
831 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
832 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000833
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000834 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
835 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
836 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000837
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000838 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000839 # works. There is something else going on which interprets the
840 # '='.
841 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000842
Daniel Dunbardff9f502009-01-12 18:51:02 +0000843 # FIXME: What is this? I think only one is valid, but have a
844 # log that uses both.
845 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000846 self.addOption(FlagOption('-pthreads'))
847
Daniel Dunbar470104e2009-01-17 00:53:19 +0000848 # Version control
849 self.addOption(JoinedOrSeparateOption('-B'))
850 self.addOption(JoinedOrSeparateOption('-V'))
851 self.addOption(JoinedOrSeparateOption('-b'))
852
Daniel Dunbarde388a52009-01-21 01:07:49 +0000853 # Clang static analyzer options (also see -WA,).
854 self.analyzeOption = self.addOption(FlagOption('--analyze'))
855
Daniel Dunbara5677512009-01-05 19:53:30 +0000856 def addOption(self, opt):
857 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000858 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +0000859
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000860 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +0000861 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000862 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +0000863
864 Parse command line into individual option instances.
865 """
866
867 iargs = enumerate(argv)
868 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000869 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000870 for pos,a in it:
871 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +0000872 # FIXME: Handle '@'
873 if not a:
874 # gcc's handling of empty arguments doesn't make
875 # sense, but this is not a common use case. :)
876 #
877 # We just ignore them here (note that other things may
878 # still take them as arguments).
879 pass
880 elif a[0] == '-' and a != '-':
881 args.append(self.lookupOptForArg(i, a, it))
882 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +0000883 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +0000884 return args
885
Daniel Dunbar5039f212009-01-06 02:30:10 +0000886 def lookupOptForArg(self, i, string, it):
887 for o in self.options:
888 arg = o.accept(i, string, it)
889 if arg is not None:
890 return arg
891 return PositionalArg(i, self.unknownOption)