blob: 87487e0144b915951657754cfd776c6f0c23651e [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 Dunbar990bd1e2009-01-23 00:14:46 +000017 def __init__(self, name, group=None, alias=None,
18 isLinkerInput=False, noOptAsInput=False):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000019 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000020 # Multi-level aliases are not supported, and alias options
21 # cannot have groups. This just simplifies option tracking, it
22 # is not an inherent limitation.
23 assert alias is None or (alias.alias is None and
24 group is None)
25
Daniel Dunbara5677512009-01-05 19:53:30 +000026 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000027 self.group = group
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000028 self.alias = alias
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000029 self.isLinkerInput = isLinkerInput
30 self.noOptAsInput = noOptAsInput
Daniel Dunbara5677512009-01-05 19:53:30 +000031
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000032 def getUnaliasedOption(self):
33 if self.alias:
34 return self.alias.getUnaliasedOption()
35 return self
36
37 def getRenderName(self):
38 return self.getUnaliasedOption().name
39
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000040 def matches(self, opt):
41 """matches(opt) -> bool
42
43 Predicate for whether this option is part of the given option
44 (which may be a group)."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000045
46 if self.alias:
47 return self.alias.matches(opt)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000048 if self is opt:
49 return True
50 elif self.group:
51 return self.group.matches(opt)
52 else:
53 return False
54
Daniel Dunbara5677512009-01-05 19:53:30 +000055 def accept(self, index, arg, it):
56 """accept(index, arg, iterator) -> Arg or None
57
58 Accept the argument at the given index, returning an Arg, or
59 return None if the option does not accept this argument.
60
61 May raise MissingArgumentError.
62 """
63 abstract
64
65 def __repr__(self):
66 return '<%s name=%r>' % (self.__class__.__name__,
67 self.name)
68
Daniel Dunbar11672ec2009-01-13 18:51:26 +000069 def forwardToGCC(self):
70 # FIXME: Get rid of this hack.
71 if self.name == '<input>':
72 return False
73
74 if self.isLinkerInput:
75 return False
76
77 return self.name not in ('-E', '-S', '-c',
78 '-arch', '-fsyntax-only', '-combine', '-x',
79 '-###')
80
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000081class OptionGroup(Option):
82 """OptionGroup - A fake option class used to group options so that
83 the driver can efficiently refer to an entire set of options."""
84
Daniel Dunbar3cde3252009-01-14 19:42:31 +000085 def __init__(self, name, group=None):
86 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000087
88 def accept(self, index, arg, it):
89 raise RuntimeError,"accept() should never be called on an OptionGroup"
90
Daniel Dunbar5039f212009-01-06 02:30:10 +000091# Dummy options
92
93class InputOption(Option):
94 def __init__(self):
95 super(InputOption, self).__init__('<input>')
96
97 def accept(self):
98 raise RuntimeError,"accept() should never be used on InputOption instance."
99
100class UnknownOption(Option):
101 def __init__(self):
102 super(UnknownOption, self).__init__('<unknown>')
103
104 def accept(self):
105 raise RuntimeError,"accept() should never be used on UnknownOption instance."
106
107# Normal options
108
Daniel Dunbara5677512009-01-05 19:53:30 +0000109class FlagOption(Option):
110 """An option which takes no arguments."""
111
112 def accept(self, index, arg, it):
113 if arg == self.name:
114 return Arg(index, self)
115
116class JoinedOption(Option):
117 """An option which literally prefixes its argument."""
118
119 def accept(self, index, arg, it):
120 if arg.startswith(self.name):
121 return JoinedValueArg(index, self)
122
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000123class CommaJoinedOption(Option):
124 """An option which literally prefixs its argument, but which
125 conceptually may have an arbitrary number of arguments which are
126 separated by commas."""
127
128 def accept(self, index, arg, it):
129 if arg.startswith(self.name):
130 return CommaJoinedValuesArg(index, self)
131
Daniel Dunbara5677512009-01-05 19:53:30 +0000132class SeparateOption(Option):
133 """An option which is followed by its value."""
134
135 def accept(self, index, arg, it):
136 if arg == self.name:
137 try:
138 _,value = it.next()
139 except StopIteration:
140 raise MissingArgumentError,self
141 return SeparateValueArg(index, self)
142
143class MultiArgOption(Option):
144 """An option which takes multiple arguments."""
145
146 def __init__(self, name, numArgs):
147 assert numArgs > 1
148 super(MultiArgOption, self).__init__(name)
149 self.numArgs = numArgs
150
151 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000152 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000153 try:
154 values = [it.next()[1] for i in range(self.numArgs)]
155 except StopIteration:
156 raise MissingArgumentError,self
157 return MultipleValuesArg(index, self)
158
159class JoinedOrSeparateOption(Option):
160 """An option which either literally prefixes its value or is
161 followed by an value."""
162
163 def accept(self, index, arg, it):
164 if arg.startswith(self.name):
165 if len(arg) != len(self.name): # Joined case
166 return JoinedValueArg(index, self)
167 else:
168 try:
169 _,value = it.next()
170 except StopIteration:
171 raise MissingArgumentError,self
172 return SeparateValueArg(index, self)
173
174class JoinedAndSeparateOption(Option):
175 """An option which literally prefixes its value and is followed by
176 an value."""
177
178 def accept(self, index, arg, it):
179 if arg.startswith(self.name):
180 try:
181 _,value = it.next()
182 except StopIteration:
183 raise MissingArgumentError,self
184 return JoinedAndSeparateValuesArg(index, self)
185
186###
187
188class Arg(object):
189 """Arg - Base class for actual driver arguments."""
190 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000191 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000192 self.index = index
193 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000194
Daniel Dunbara5677512009-01-05 19:53:30 +0000195 def __repr__(self):
196 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
197 self.index,
198 self.opt)
199
200 def render(self, args):
201 """render(args) -> [str]
202
203 Map the argument into a list of actual program arguments,
204 given the source argument array."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000205 return [self.opt.getRenderName()]
Daniel Dunbara5677512009-01-05 19:53:30 +0000206
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000207 def renderAsInput(self, args):
208 return self.render(args)
209
Daniel Dunbara5677512009-01-05 19:53:30 +0000210class ValueArg(Arg):
211 """ValueArg - An instance of an option which has an argument."""
212
213 def getValue(self, args):
214 abstract
215
Daniel Dunbar996ce962009-01-12 07:40:25 +0000216 def getValues(self, args):
217 return [self.getValue(args)]
218
Daniel Dunbar5039f212009-01-06 02:30:10 +0000219class PositionalArg(ValueArg):
220 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000221
222 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000223 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000224
225 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000226 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000227
228class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000229 """JoinedValueArg - A single value argument where the value is
230 joined (suffixed) to the option."""
231
Daniel Dunbara5677512009-01-05 19:53:30 +0000232 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000233 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000234
Daniel Dunbara5677512009-01-05 19:53:30 +0000235 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000236 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000237
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000238 def renderAsInput(self, args):
239 if self.opt.noOptAsInput:
240 return [self.getValue(args)]
241 return self.render(args)
242
Daniel Dunbara5677512009-01-05 19:53:30 +0000243class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000244 """SeparateValueArg - A single value argument where the value
245 follows the option in the argument vector."""
246
Daniel Dunbara5677512009-01-05 19:53:30 +0000247 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000248 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000249
Daniel Dunbara5677512009-01-05 19:53:30 +0000250 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000251 return [self.opt.getRenderName(), self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000252
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000253 def renderAsInput(self, args):
254 if self.opt.noOptAsInput:
255 return [self.getValue(args)]
256 return self.render(args)
257
Daniel Dunbara5677512009-01-05 19:53:30 +0000258class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000259 """MultipleValuesArg - An argument with multiple values which
260 follow the option in the argument vector."""
261
262 # FIXME: Should we unify this with SeparateValueArg?
263
Daniel Dunbara5677512009-01-05 19:53:30 +0000264 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000265 return [args.getInputString(self.index, offset=1+i)
266 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000267
Daniel Dunbara5677512009-01-05 19:53:30 +0000268 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000269 return [self.opt.getRenderName()] + self.getValues(args)
Daniel Dunbara5677512009-01-05 19:53:30 +0000270
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000271class CommaJoinedValuesArg(Arg):
272 """CommaJoinedValuesArg - An argument with multiple values joined
273 by commas and joined (suffixed) to the option.
274
275 The key point of this arg is that it renders its values into
276 separate arguments, which allows it to be used as a generic
277 mechanism for passing arguments through to tools."""
278
279 def getValues(self, args):
280 return args.getInputString(self.index)[len(self.opt.name):].split(',')
281
282 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000283 return [self.opt.getRenderName() + ','.join(self.getValues(args))]
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000284
285 def renderAsInput(self, args):
286 return self.getValues(args)
287
Daniel Dunbara5677512009-01-05 19:53:30 +0000288# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
289# just special case?
290class JoinedAndSeparateValuesArg(Arg):
291 """JoinedAndSeparateValuesArg - An argument with both joined and
292 separate values."""
293
294 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000295 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000296
297 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000298 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000299
300 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000301 return ([self.opt.getRenderName() + self.getJoinedValue(args)] +
Daniel Dunbara5677512009-01-05 19:53:30 +0000302 [self.getSeparateValue(args)])
303
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000304###
305
306class InputIndex:
307 def __init__(self, sourceId, pos):
308 self.sourceId = sourceId
309 self.pos = pos
310
311 def __repr__(self):
312 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
313
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000314class ArgList(object):
315 """ArgList - Collect an input argument vector along with a set of
316 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000317
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000318 def __init__(self, parser, argv):
319 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000320 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000321 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000322 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000323 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000324
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000325 def getArgs(self, option):
326 # FIXME: How efficient do we want to make this. One reasonable
327 # solution would be to embed a linked list inside each arg and
328 # automatically chain them (with pointers to head and
329 # tail). This gives us efficient access to the (first, last,
330 # all) arg(s) with little overhead.
331 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000332 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000333 yield arg
334
Daniel Dunbar996ce962009-01-12 07:40:25 +0000335 def getArgs2(self, optionA, optionB):
336 """getArgs2 - Iterate over all arguments for two options, in
337 the order they were specified."""
338 # As long as getArgs is efficient, we can easily make this
339 # efficient by iterating both at once and always taking the
340 # earlier arg.
341 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000342 if (arg.opt.matches(optionA) or
343 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000344 yield arg
345
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000346 def getArgs3(self, optionA, optionB, optionC):
347 """getArgs3 - Iterate over all arguments for three options, in
348 the order they were specified."""
349 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000350 if (arg.opt.matches(optionA) or
351 arg.opt.matches(optionB) or
352 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000353 yield arg
354
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000355 def getLastArg(self, option):
356 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000357
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000358 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000359 # Source 0 is argv.
360 if index.sourceId == 0:
361 return self.argv[index.pos + offset]
362
363 # Source 1 is synthetic argv.
364 if index.sourceId == 1:
365 return self.syntheticArgv[index.pos + offset]
366
367 raise RuntimeError,'Unknown source ID for index.'
368
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000369 def addLastArg(self, output, option):
370 """addLastArgs - Extend the given output vector with the last
371 instance of a given option."""
372 arg = self.getLastArg(option)
373 if arg:
374 output.extend(self.render(arg))
375
376 def addAllArgs(self, output, option):
377 """addAllArgs - Extend the given output vector with all
378 instances of a given option."""
379 for arg in self.getArgs(option):
380 output.extend(self.render(arg))
381
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000382 def addAllArgs2(self, output, optionA, optionB):
383 """addAllArgs2 - Extend the given output vector with all
384 instances of two given option, with relative order preserved."""
385 for arg in self.getArgs2(optionA, optionB):
386 output.extend(self.render(arg))
387
388 def addAllArgs3(self, output, optionA, optionB, optionC):
389 """addAllArgs3 - Extend the given output vector with all
390 instances of three given option, with relative order preserved."""
391 for arg in self.getArgs3(optionA, optionB, optionC):
392 output.extend(self.render(arg))
393
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000394 def addAllArgsTranslated(self, output, option, translation):
395 """addAllArgsTranslated - Extend the given output vector with
396 all instances of a given option, rendered as separate
397 arguments with the actual option name translated to a user
398 specified string. For example, '-foox' will be render as
399 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
400 translation.
401
402 This routine expects that the option can only yield ValueArg
403 instances."""
404 for arg in self.getArgs(option):
405 assert isinstance(arg, ValueArg)
406 output.append(translation)
407 output.append(self.getValue(arg))
408
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000409 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000410 pos = len(self.syntheticArgv)
411 self.syntheticArgv.extend(strings)
412 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000413
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000414 def makeFlagArg(self, option):
415 return Arg(self.makeIndex(option.name),
416 option)
417
418 def makeInputArg(self, string):
419 return PositionalArg(self.makeIndex(string),
420 self.parser.inputOption)
421
422 def makeUnknownArg(self, string):
423 return PositionalArg(self.makeIndex(string),
424 self.parser.unknownOption)
425
426 def makeSeparateArg(self, string, option):
427 return SeparateValueArg(self.makeIndex(option.name, string),
428 option)
429
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000430 def makeJoinedArg(self, string, option):
431 return JoinedValueArg(self.makeIndex(option.name + string),
432 option)
433
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000434 # Support use as a simple arg list.
435
436 def __iter__(self):
437 return iter(self.args)
438
439 def append(self, arg):
440 self.args.append(arg)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000441
442 opt = arg.opt
443 if opt.alias:
444 opt = opt.alias
445 self.lastArgs[opt] = arg
446 if opt.group is not None:
447 self.lastArgs[opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000448
449 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000450 #
451 # FIXME: Clean this up once restructuring is done.
452
453 def render(self, arg):
454 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000455
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000456 def renderAsInput(self, arg):
457 return arg.renderAsInput(self)
458
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000459 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000460 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000461
462 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000463 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000464
465 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000466 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000467
468 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000469 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000470
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000471class DerivedArgList(ArgList):
472 def __init__(self, args):
473 super(DerivedArgList, self).__init__(args.parser, args.argv)
474 self.parser = args.parser
475 self.argv = args.argv
476 self.syntheticArgv = args.syntheticArgv
477 self.lastArgs = {}
478 self.args = []
479
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000480###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000481
Daniel Dunbara5677512009-01-05 19:53:30 +0000482class OptionParser:
483 def __init__(self):
484 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000485 self.inputOption = InputOption()
486 self.unknownOption = UnknownOption()
487
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000488 # Driver driver options
489 self.archOption = self.addOption(SeparateOption('-arch'))
490
491 # Misc driver options
492 self.addOption(FlagOption('-pass-exit-codes'))
493 self.addOption(FlagOption('--help'))
494 self.addOption(FlagOption('--target-help'))
495
496 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
497 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
498 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
499 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000500
501 self.printLibgccFileNameOption = OptionGroup('-print-libgcc-file-name')
502 self.addOption(FlagOption('-print-libgcc-file-name', self.printLibgccFileNameOption))
503 self.addOption(FlagOption('--print-libgcc-file-name', self.printLibgccFileNameOption))
504
505 self.printFileNameOption = OptionGroup('-print-file-name=')
506 self.addOption(JoinedOption('-print-file-name=', self.printFileNameOption))
507 self.addOption(JoinedOption('--print-file-name=', self.printFileNameOption))
508
509 self.printProgNameOption = OptionGroup('-print-prog-name=')
510 self.addOption(JoinedOption('-print-prog-name=', self.printProgNameOption))
511 self.addOption(JoinedOption('--print-prog-name=', self.printProgNameOption))
512
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000513 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
514 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
515 self.addOption(FlagOption('-print-multi-os-directory'))
516
517 # Hmmm, who really takes this?
518 self.addOption(FlagOption('--version'))
519
520 # Pipeline control
521 self.hashHashHashOption = self.addOption(FlagOption('-###'))
522 self.EOption = self.addOption(FlagOption('-E'))
523 self.SOption = self.addOption(FlagOption('-S'))
524 self.cOption = self.addOption(FlagOption('-c'))
525 self.combineOption = self.addOption(FlagOption('-combine'))
526 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
527 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000528
529 self.saveTempsOption = OptionGroup('-save-temps')
530 self.addOption(FlagOption('-save-temps', self.saveTempsOption))
531 self.addOption(FlagOption('--save-temps', self.saveTempsOption))
532
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000533 # FIXME: Error out if this is used.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000534 self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000535 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000536 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000537 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000538 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000539
540 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000541 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000542 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
543
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000544 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
545 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000546
547 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
548 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000549
550 # FIXME: This is broken in Darwin cc1, it wants std* and this
551 # is std=. May need an option group for this as well.
552 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000553 self.addOption(JoinedOrSeparateOption('--sysroot'))
554
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000555 # Blanket pass-through options.
556
Daniel Dunbarde388a52009-01-21 01:07:49 +0000557 self.WAOption = self.addOption(CommaJoinedOption('-WA,'))
558
Daniel Dunbar996ce962009-01-12 07:40:25 +0000559 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
560 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000561
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000562 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
563 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000564
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000565 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
566 self.addOption(SeparateOption('-Xlinker', isLinkerInput=True, noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000567
568 ####
569 # Bring on the random garbage.
570
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000571 self.MGroup = OptionGroup('-M')
572 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
573 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
574 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
575 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
576 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
577 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
578 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
579 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
580 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000581 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000582 self.uGroup = OptionGroup('-u')
583 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000584
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000585 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000586 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
587 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000588 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
589 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
590 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000591 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000592 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
593 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000594 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000595 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000596
597 self.iGroup = OptionGroup('-i')
598 self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
599 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
600 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000601 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000602
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000603 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
604 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
605 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
606 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
607 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
608 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000609 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
610 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000611 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
612 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
613 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
614 self.prebindOption = self.addOption(FlagOption('-prebind'))
615 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
616 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
617 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000618 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000619 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000620 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
621 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
622 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
623 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000624 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000625 self.objectOption = self.addOption(FlagOption('-object'))
626 self.preloadOption = self.addOption(FlagOption('-preload'))
627 self.staticOption = self.addOption(FlagOption('-static'))
628 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000629 self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000630 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
631 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000632 self.COption = self.addOption(FlagOption('-C'))
633 self.CCOption = self.addOption(FlagOption('-CC'))
634 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000635 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000636 self.POption = self.addOption(FlagOption('-P'))
637 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000638 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000639 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000640 self.traditionalOption = self.addOption(FlagOption('-traditional'))
641 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
642 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000643 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000644 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000645 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
646 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
647 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000648 self.whyloadOption = self.addOption(FlagOption('-whyload'))
649 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
650 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
651 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
652 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000653 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
654 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
655 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
656 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000657
658 self.all_loadOption = self.addOption(FlagOption('-all_load'))
659 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
660 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
661 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
662 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
663 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
664 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
665 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
666 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
667 self.image_baseOption = self.addOption(FlagOption('-image_base'))
668 self.initOption = self.addOption(SeparateOption('-init'))
669 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
670 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
671 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
672 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
673 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
674 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
675 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
676 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
677 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
678 # FIXME: This probably isn't necessary.
679 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
680 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000681 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000682 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000683
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000684 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
685 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000686
687 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000688
689 # Where are these coming from? I can't find them...
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000690 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
691 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000692
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000693 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000694 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000695
696 doNotReallySupport = 1
697 if doNotReallySupport:
698 # Archaic gcc option.
699 self.addOption(FlagOption('-cpp-precomp'))
700 self.addOption(FlagOption('-no-cpp-precomp'))
701
702 # C options for testing
703
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000704 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
705
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000706 # FIXME: This is broken, we need -A as a single option to send
707 # stuff to cc1, but the way the ld spec is constructed it
708 # wants to see -A options but only as a separate arg.
709 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
710 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000711 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000712 self.IOption = self.addOption(JoinedOrSeparateOption('-I'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000713 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
714 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000715 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000716 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
717
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000718 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000719 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000720 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
721 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000722
723 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000724 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000725 # Not exactly sure how to decompose this. I split out -Xarch_
726 # because we need to recognize that in the driver driver part.
727 # FIXME: Man, this is lame it needs its own option.
728 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
729 self.addOption(JoinedOption('-X'))
730
731 # The driver needs to know about this flag.
732 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
733
734 # FIXME: Wrong?
735 # FIXME: What to do about the ambiguity of options like
736 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000737 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000738 self.dGroup = OptionGroup('-d')
739 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
740 self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000741
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000742 # Use a group for this in anticipation of adding more -d
743 # options explicitly. Note that we don't put many -d things in
744 # the -d group (like -dylinker, or '-d' by itself) because it
745 # is really a gcc bug that it ships these to cc1.
746 self.dGroup = OptionGroup('-d')
747 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000748
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000749 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000750 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
751 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000752 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
753 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000754 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000755 # FIXME: Naming.
756 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
757 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000758
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000759 # FIXME: How should we handle clang specific options? Do we
760 # want to avoid passing them to gcc/cc1 (which will generally
761 # not eat them), or should we let the user sort it out.
762
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000763 self.fGroup = OptionGroup('-f')
764 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
765 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
766 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
767
768 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000769 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000770 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000771 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
772 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000773 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000774 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000775 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000776 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000777 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000778 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000779 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000780 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000781 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
782 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
783 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000784 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
785 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
786 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
787 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
788 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
789 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000790 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000791 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
792 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
793 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000794 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000795 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
796 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000797 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000798 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
799 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
800 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000801 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
802 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000803 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000804 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000805 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000806 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000807 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000808 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000809 self.addOption(JoinedOption('-f', self.fGroup))
810
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000811 self.coverageOption = self.addOption(FlagOption('-coverage'))
812 self.coverageOption2 = self.addOption(FlagOption('--coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000813
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000814 self.mGroup = OptionGroup('-m')
815 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
816 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
817 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
818 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
819 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
820 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000821 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
822 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
823 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
824 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
825 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
826 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000827 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000828
829 # Ugh. Need to disambiguate our naming convetion. -m x goes to
830 # the linker sometimes, wheres -mxxxx is used for a variety of
831 # other things.
832 self.mOption = self.addOption(SeparateOption('-m'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000833 self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000834
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000835 # FIXME: Why does Darwin send -a* to cc1?
836 self.aGroup = OptionGroup('-a')
837 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
838 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
839
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000840 self.pedanticGroup = OptionGroup('-pedantic')
841 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
842 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000843 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000844
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000845 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000846 self.ClangWGroup = OptionGroup('-W', self.WGroup)
847
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000848 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
849 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
850
Daniel Dunbarab95c392009-01-21 18:49:34 +0000851 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
852 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
853 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
854 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
855 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
856 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
857 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000858
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000859 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
860 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
861 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000862
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000863 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000864 # works. There is something else going on which interprets the
865 # '='.
866 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000867
Daniel Dunbardff9f502009-01-12 18:51:02 +0000868 # FIXME: What is this? I think only one is valid, but have a
869 # log that uses both.
870 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000871 self.addOption(FlagOption('-pthreads'))
872
Daniel Dunbar470104e2009-01-17 00:53:19 +0000873 # Version control
874 self.addOption(JoinedOrSeparateOption('-B'))
875 self.addOption(JoinedOrSeparateOption('-V'))
876 self.addOption(JoinedOrSeparateOption('-b'))
877
Daniel Dunbarde388a52009-01-21 01:07:49 +0000878 # Clang static analyzer options (also see -WA,).
879 self.analyzeOption = self.addOption(FlagOption('--analyze'))
880
Daniel Dunbara5677512009-01-05 19:53:30 +0000881 def addOption(self, opt):
882 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000883 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +0000884
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000885 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +0000886 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000887 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +0000888
889 Parse command line into individual option instances.
890 """
891
892 iargs = enumerate(argv)
893 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000894 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000895 for pos,a in it:
896 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +0000897 # FIXME: Handle '@'
898 if not a:
899 # gcc's handling of empty arguments doesn't make
900 # sense, but this is not a common use case. :)
901 #
902 # We just ignore them here (note that other things may
903 # still take them as arguments).
904 pass
905 elif a[0] == '-' and a != '-':
906 args.append(self.lookupOptForArg(i, a, it))
907 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +0000908 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +0000909 return args
910
Daniel Dunbar5039f212009-01-06 02:30:10 +0000911 def lookupOptForArg(self, i, string, it):
912 for o in self.options:
913 arg = o.accept(i, string, it)
914 if arg is not None:
915 return arg
916 return PositionalArg(i, self.unknownOption)