blob: 8b926225d8439ed0a7981f646b62ffaf1712b47e [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,
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000018 isLinkerInput=False, noOptAsInput=False,
19 forceSeparateRender=False,
20 forceJoinedRender=False):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000021 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000022 # Multi-level aliases are not supported, and alias options
23 # cannot have groups. This just simplifies option tracking, it
24 # is not an inherent limitation.
25 assert alias is None or (alias.alias is None and
26 group is None)
27
Daniel Dunbara5677512009-01-05 19:53:30 +000028 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000029 self.group = group
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000030 self.alias = alias
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000031 self.isLinkerInput = isLinkerInput
32 self.noOptAsInput = noOptAsInput
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000033 self.forceSeparateRender = forceSeparateRender
34 self.forceJoinedRender = forceJoinedRender
Daniel Dunbara5677512009-01-05 19:53:30 +000035
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000036 def getUnaliasedOption(self):
37 if self.alias:
38 return self.alias.getUnaliasedOption()
39 return self
40
41 def getRenderName(self):
42 return self.getUnaliasedOption().name
43
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000044 def matches(self, opt):
45 """matches(opt) -> bool
46
47 Predicate for whether this option is part of the given option
48 (which may be a group)."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000049
50 if self.alias:
51 return self.alias.matches(opt)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000052 if self is opt:
53 return True
54 elif self.group:
55 return self.group.matches(opt)
56 else:
57 return False
58
Daniel Dunbara5677512009-01-05 19:53:30 +000059 def accept(self, index, arg, it):
60 """accept(index, arg, iterator) -> Arg or None
61
62 Accept the argument at the given index, returning an Arg, or
63 return None if the option does not accept this argument.
64
65 May raise MissingArgumentError.
66 """
67 abstract
68
69 def __repr__(self):
70 return '<%s name=%r>' % (self.__class__.__name__,
71 self.name)
72
Daniel Dunbar11672ec2009-01-13 18:51:26 +000073 def forwardToGCC(self):
74 # FIXME: Get rid of this hack.
75 if self.name == '<input>':
76 return False
77
78 if self.isLinkerInput:
79 return False
80
81 return self.name not in ('-E', '-S', '-c',
82 '-arch', '-fsyntax-only', '-combine', '-x',
83 '-###')
84
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000085class OptionGroup(Option):
86 """OptionGroup - A fake option class used to group options so that
87 the driver can efficiently refer to an entire set of options."""
88
Daniel Dunbar3cde3252009-01-14 19:42:31 +000089 def __init__(self, name, group=None):
90 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000091
92 def accept(self, index, arg, it):
93 raise RuntimeError,"accept() should never be called on an OptionGroup"
94
Daniel Dunbar5039f212009-01-06 02:30:10 +000095# Dummy options
96
97class InputOption(Option):
98 def __init__(self):
99 super(InputOption, self).__init__('<input>')
100
101 def accept(self):
102 raise RuntimeError,"accept() should never be used on InputOption instance."
103
104class UnknownOption(Option):
105 def __init__(self):
106 super(UnknownOption, self).__init__('<unknown>')
107
108 def accept(self):
109 raise RuntimeError,"accept() should never be used on UnknownOption instance."
110
111# Normal options
112
Daniel Dunbara5677512009-01-05 19:53:30 +0000113class FlagOption(Option):
114 """An option which takes no arguments."""
115
116 def accept(self, index, arg, it):
117 if arg == self.name:
118 return Arg(index, self)
119
120class JoinedOption(Option):
121 """An option which literally prefixes its argument."""
122
123 def accept(self, index, arg, it):
124 if arg.startswith(self.name):
125 return JoinedValueArg(index, self)
126
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000127class CommaJoinedOption(Option):
128 """An option which literally prefixs its argument, but which
129 conceptually may have an arbitrary number of arguments which are
130 separated by commas."""
131
132 def accept(self, index, arg, it):
133 if arg.startswith(self.name):
134 return CommaJoinedValuesArg(index, self)
135
Daniel Dunbara5677512009-01-05 19:53:30 +0000136class SeparateOption(Option):
137 """An option which is followed by its value."""
138
139 def accept(self, index, arg, it):
140 if arg == self.name:
141 try:
142 _,value = it.next()
143 except StopIteration:
144 raise MissingArgumentError,self
145 return SeparateValueArg(index, self)
146
147class MultiArgOption(Option):
148 """An option which takes multiple arguments."""
149
150 def __init__(self, name, numArgs):
151 assert numArgs > 1
152 super(MultiArgOption, self).__init__(name)
153 self.numArgs = numArgs
154
155 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000156 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000157 try:
158 values = [it.next()[1] for i in range(self.numArgs)]
159 except StopIteration:
160 raise MissingArgumentError,self
161 return MultipleValuesArg(index, self)
162
163class JoinedOrSeparateOption(Option):
164 """An option which either literally prefixes its value or is
165 followed by an value."""
166
167 def accept(self, index, arg, it):
168 if arg.startswith(self.name):
169 if len(arg) != len(self.name): # Joined case
170 return JoinedValueArg(index, self)
171 else:
172 try:
173 _,value = it.next()
174 except StopIteration:
175 raise MissingArgumentError,self
176 return SeparateValueArg(index, self)
177
178class JoinedAndSeparateOption(Option):
179 """An option which literally prefixes its value and is followed by
180 an value."""
181
182 def accept(self, index, arg, it):
183 if arg.startswith(self.name):
184 try:
185 _,value = it.next()
186 except StopIteration:
187 raise MissingArgumentError,self
188 return JoinedAndSeparateValuesArg(index, self)
189
190###
191
192class Arg(object):
193 """Arg - Base class for actual driver arguments."""
194 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000195 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000196 self.index = index
197 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000198
Daniel Dunbara5677512009-01-05 19:53:30 +0000199 def __repr__(self):
200 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
201 self.index,
202 self.opt)
203
204 def render(self, args):
205 """render(args) -> [str]
206
207 Map the argument into a list of actual program arguments,
208 given the source argument array."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000209 return [self.opt.getRenderName()]
Daniel Dunbara5677512009-01-05 19:53:30 +0000210
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000211 def renderAsInput(self, args):
212 return self.render(args)
213
Daniel Dunbara5677512009-01-05 19:53:30 +0000214class ValueArg(Arg):
215 """ValueArg - An instance of an option which has an argument."""
216
217 def getValue(self, args):
218 abstract
219
Daniel Dunbar996ce962009-01-12 07:40:25 +0000220 def getValues(self, args):
221 return [self.getValue(args)]
222
Daniel Dunbar5039f212009-01-06 02:30:10 +0000223class PositionalArg(ValueArg):
224 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000225
226 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000227 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000228
229 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000230 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000231
232class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000233 """JoinedValueArg - A single value argument where the value is
234 joined (suffixed) to the option."""
235
Daniel Dunbara5677512009-01-05 19:53:30 +0000236 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000237 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000238
Daniel Dunbara5677512009-01-05 19:53:30 +0000239 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000240 if self.opt.forceSeparateRender:
241 return [self.opt.getRenderName(),
242 self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000243 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000244
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000245 def renderAsInput(self, args):
246 if self.opt.noOptAsInput:
247 return [self.getValue(args)]
248 return self.render(args)
249
Daniel Dunbara5677512009-01-05 19:53:30 +0000250class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000251 """SeparateValueArg - A single value argument where the value
252 follows the option in the argument vector."""
253
Daniel Dunbara5677512009-01-05 19:53:30 +0000254 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000255 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000256
Daniel Dunbara5677512009-01-05 19:53:30 +0000257 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000258 if self.opt.forceJoinedRender:
259 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000260 return [self.opt.getRenderName(), self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000261
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000262 def renderAsInput(self, args):
263 if self.opt.noOptAsInput:
264 return [self.getValue(args)]
265 return self.render(args)
266
Daniel Dunbara5677512009-01-05 19:53:30 +0000267class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000268 """MultipleValuesArg - An argument with multiple values which
269 follow the option in the argument vector."""
270
271 # FIXME: Should we unify this with SeparateValueArg?
272
Daniel Dunbara5677512009-01-05 19:53:30 +0000273 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000274 return [args.getInputString(self.index, offset=1+i)
275 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000276
Daniel Dunbara5677512009-01-05 19:53:30 +0000277 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000278 return [self.opt.getRenderName()] + self.getValues(args)
Daniel Dunbara5677512009-01-05 19:53:30 +0000279
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000280class CommaJoinedValuesArg(Arg):
281 """CommaJoinedValuesArg - An argument with multiple values joined
282 by commas and joined (suffixed) to the option.
283
284 The key point of this arg is that it renders its values into
285 separate arguments, which allows it to be used as a generic
286 mechanism for passing arguments through to tools."""
287
288 def getValues(self, args):
289 return args.getInputString(self.index)[len(self.opt.name):].split(',')
290
291 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000292 return [self.opt.getRenderName() + ','.join(self.getValues(args))]
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000293
294 def renderAsInput(self, args):
295 return self.getValues(args)
296
Daniel Dunbara5677512009-01-05 19:53:30 +0000297# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
298# just special case?
299class JoinedAndSeparateValuesArg(Arg):
300 """JoinedAndSeparateValuesArg - An argument with both joined and
301 separate values."""
302
303 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000304 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000305
306 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000307 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000308
309 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000310 return ([self.opt.getRenderName() + self.getJoinedValue(args)] +
Daniel Dunbara5677512009-01-05 19:53:30 +0000311 [self.getSeparateValue(args)])
312
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000313###
314
315class InputIndex:
316 def __init__(self, sourceId, pos):
317 self.sourceId = sourceId
318 self.pos = pos
319
320 def __repr__(self):
321 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
322
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000323class ArgList(object):
324 """ArgList - Collect an input argument vector along with a set of
325 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000326
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000327 def __init__(self, parser, argv):
328 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000329 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000330 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000331 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000332 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000333
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000334 def getArgs(self, option):
335 # FIXME: How efficient do we want to make this. One reasonable
336 # solution would be to embed a linked list inside each arg and
337 # automatically chain them (with pointers to head and
338 # tail). This gives us efficient access to the (first, last,
339 # all) arg(s) with little overhead.
340 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000341 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000342 yield arg
343
Daniel Dunbar996ce962009-01-12 07:40:25 +0000344 def getArgs2(self, optionA, optionB):
345 """getArgs2 - Iterate over all arguments for two options, in
346 the order they were specified."""
347 # As long as getArgs is efficient, we can easily make this
348 # efficient by iterating both at once and always taking the
349 # earlier arg.
350 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000351 if (arg.opt.matches(optionA) or
352 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000353 yield arg
354
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000355 def getArgs3(self, optionA, optionB, optionC):
356 """getArgs3 - Iterate over all arguments for three options, in
357 the order they were specified."""
358 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000359 if (arg.opt.matches(optionA) or
360 arg.opt.matches(optionB) or
361 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000362 yield arg
363
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000364 def getLastArg(self, option):
365 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000366
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000367 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000368 # Source 0 is argv.
369 if index.sourceId == 0:
370 return self.argv[index.pos + offset]
371
372 # Source 1 is synthetic argv.
373 if index.sourceId == 1:
374 return self.syntheticArgv[index.pos + offset]
375
376 raise RuntimeError,'Unknown source ID for index.'
377
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000378 def addLastArg(self, output, option):
379 """addLastArgs - Extend the given output vector with the last
380 instance of a given option."""
381 arg = self.getLastArg(option)
382 if arg:
383 output.extend(self.render(arg))
384
385 def addAllArgs(self, output, option):
386 """addAllArgs - Extend the given output vector with all
387 instances of a given option."""
388 for arg in self.getArgs(option):
389 output.extend(self.render(arg))
390
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000391 def addAllArgs2(self, output, optionA, optionB):
392 """addAllArgs2 - Extend the given output vector with all
393 instances of two given option, with relative order preserved."""
394 for arg in self.getArgs2(optionA, optionB):
395 output.extend(self.render(arg))
396
397 def addAllArgs3(self, output, optionA, optionB, optionC):
398 """addAllArgs3 - Extend the given output vector with all
399 instances of three given option, with relative order preserved."""
400 for arg in self.getArgs3(optionA, optionB, optionC):
401 output.extend(self.render(arg))
402
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000403 def addAllArgsTranslated(self, output, option, translation):
404 """addAllArgsTranslated - Extend the given output vector with
405 all instances of a given option, rendered as separate
406 arguments with the actual option name translated to a user
407 specified string. For example, '-foox' will be render as
408 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
409 translation.
410
411 This routine expects that the option can only yield ValueArg
412 instances."""
413 for arg in self.getArgs(option):
414 assert isinstance(arg, ValueArg)
415 output.append(translation)
416 output.append(self.getValue(arg))
417
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000418 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000419 pos = len(self.syntheticArgv)
420 self.syntheticArgv.extend(strings)
421 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000422
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000423 def makeFlagArg(self, option):
424 return Arg(self.makeIndex(option.name),
425 option)
426
427 def makeInputArg(self, string):
428 return PositionalArg(self.makeIndex(string),
429 self.parser.inputOption)
430
431 def makeUnknownArg(self, string):
432 return PositionalArg(self.makeIndex(string),
433 self.parser.unknownOption)
434
435 def makeSeparateArg(self, string, option):
436 return SeparateValueArg(self.makeIndex(option.name, string),
437 option)
438
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000439 def makeJoinedArg(self, string, option):
440 return JoinedValueArg(self.makeIndex(option.name + string),
441 option)
442
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000443 # Support use as a simple arg list.
444
445 def __iter__(self):
446 return iter(self.args)
447
448 def append(self, arg):
449 self.args.append(arg)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000450
451 opt = arg.opt
452 if opt.alias:
453 opt = opt.alias
454 self.lastArgs[opt] = arg
455 if opt.group is not None:
456 self.lastArgs[opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000457
458 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000459 #
460 # FIXME: Clean this up once restructuring is done.
461
462 def render(self, arg):
463 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000464
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000465 def renderAsInput(self, arg):
466 return arg.renderAsInput(self)
467
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000468 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000469 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000470
471 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000472 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000473
474 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000475 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000476
477 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000478 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000479
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000480class DerivedArgList(ArgList):
481 def __init__(self, args):
482 super(DerivedArgList, self).__init__(args.parser, args.argv)
483 self.parser = args.parser
484 self.argv = args.argv
485 self.syntheticArgv = args.syntheticArgv
486 self.lastArgs = {}
487 self.args = []
488
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000489###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000490
Daniel Dunbara5677512009-01-05 19:53:30 +0000491class OptionParser:
492 def __init__(self):
493 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000494 self.inputOption = InputOption()
495 self.unknownOption = UnknownOption()
496
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000497 # Driver driver options
498 self.archOption = self.addOption(SeparateOption('-arch'))
499
500 # Misc driver options
501 self.addOption(FlagOption('-pass-exit-codes'))
502 self.addOption(FlagOption('--help'))
503 self.addOption(FlagOption('--target-help'))
504
505 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
506 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
507 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
508 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000509
510 self.printLibgccFileNameOption = OptionGroup('-print-libgcc-file-name')
511 self.addOption(FlagOption('-print-libgcc-file-name', self.printLibgccFileNameOption))
512 self.addOption(FlagOption('--print-libgcc-file-name', self.printLibgccFileNameOption))
513
514 self.printFileNameOption = OptionGroup('-print-file-name=')
515 self.addOption(JoinedOption('-print-file-name=', self.printFileNameOption))
516 self.addOption(JoinedOption('--print-file-name=', self.printFileNameOption))
517
518 self.printProgNameOption = OptionGroup('-print-prog-name=')
519 self.addOption(JoinedOption('-print-prog-name=', self.printProgNameOption))
520 self.addOption(JoinedOption('--print-prog-name=', self.printProgNameOption))
521
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000522 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
523 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
524 self.addOption(FlagOption('-print-multi-os-directory'))
525
526 # Hmmm, who really takes this?
527 self.addOption(FlagOption('--version'))
528
529 # Pipeline control
530 self.hashHashHashOption = self.addOption(FlagOption('-###'))
531 self.EOption = self.addOption(FlagOption('-E'))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000532
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000533 self.SOption = self.addOption(FlagOption('-S'))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000534 self.addOption(FlagOption('--assemble', alias=self.SOption))
535
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000536 self.cOption = self.addOption(FlagOption('-c'))
537 self.combineOption = self.addOption(FlagOption('-combine'))
538 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
539 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000540
541 self.saveTempsOption = OptionGroup('-save-temps')
542 self.addOption(FlagOption('-save-temps', self.saveTempsOption))
543 self.addOption(FlagOption('--save-temps', self.saveTempsOption))
544
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000545 # FIXME: Error out if this is used.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000546 self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000547 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000548 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000549 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000550 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000551
552 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000553 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000554 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
555
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000556 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
557 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000558
559 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
560 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000561
562 # FIXME: This is broken in Darwin cc1, it wants std* and this
563 # is std=. May need an option group for this as well.
564 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000565 self.addOption(JoinedOrSeparateOption('--sysroot'))
566
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000567 # Blanket pass-through options.
568
Daniel Dunbarde388a52009-01-21 01:07:49 +0000569 self.WAOption = self.addOption(CommaJoinedOption('-WA,'))
570
Daniel Dunbar996ce962009-01-12 07:40:25 +0000571 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
572 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000573
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000574 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
575 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000576
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000577 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
578 self.addOption(SeparateOption('-Xlinker', isLinkerInput=True, noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000579
580 ####
581 # Bring on the random garbage.
582
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000583 self.sOption = self.addOption(FlagOption('-s'))
584
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000585 self.MGroup = OptionGroup('-M')
586 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
587 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
588 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
589 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
590 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
591 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
592 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
593 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
594 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000595 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000596 self.uGroup = OptionGroup('-u')
597 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000598
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000599 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000600 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
601 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000602 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
603 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
604 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000605 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000606 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
607 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000608 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000609 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000610
611 self.iGroup = OptionGroup('-i')
612 self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
613 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
614 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000615 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000616
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000617 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
618 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
619 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
620 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
621 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
622 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000623 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
624 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000625 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
626 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
627 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
628 self.prebindOption = self.addOption(FlagOption('-prebind'))
629 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
630 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
631 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000632 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000633 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000634 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
635 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
636 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
637 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000638 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000639 self.objectOption = self.addOption(FlagOption('-object'))
640 self.preloadOption = self.addOption(FlagOption('-preload'))
641 self.staticOption = self.addOption(FlagOption('-static'))
642 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000643 self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000644 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
645 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000646 self.COption = self.addOption(FlagOption('-C'))
647 self.CCOption = self.addOption(FlagOption('-CC'))
648 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000649 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000650 self.POption = self.addOption(FlagOption('-P'))
651 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000652 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000653 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000654 self.traditionalOption = self.addOption(FlagOption('-traditional'))
655 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
656 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000657 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000658 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000659 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
660 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
661 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000662 self.whyloadOption = self.addOption(FlagOption('-whyload'))
663 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
664 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
665 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
666 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000667 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
668 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
669 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
670 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000671
672 self.all_loadOption = self.addOption(FlagOption('-all_load'))
673 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
674 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
675 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
676 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
677 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
678 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
679 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
680 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
681 self.image_baseOption = self.addOption(FlagOption('-image_base'))
682 self.initOption = self.addOption(SeparateOption('-init'))
683 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
684 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
685 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
686 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
687 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
688 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
689 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
690 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
691 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
692 # FIXME: This probably isn't necessary.
693 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
694 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000695 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000696 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000697
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000698 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
699 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000700
701 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000702
703 # Where are these coming from? I can't find them...
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000704 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
705 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000706
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000707 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000708 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000709
710 doNotReallySupport = 1
711 if doNotReallySupport:
712 # Archaic gcc option.
713 self.addOption(FlagOption('-cpp-precomp'))
714 self.addOption(FlagOption('-no-cpp-precomp'))
715
716 # C options for testing
717
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000718 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
719
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000720 # FIXME: This is broken, we need -A as a single option to send
721 # stuff to cc1, but the way the ld spec is constructed it
722 # wants to see -A options but only as a separate arg.
723 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000724 self.addOption(JoinedOption('--assert=', alias=self.AOption,
725 forceSeparateRender=True))
726 self.addOption(SeparateOption('--assert', alias=self.AOption))
727
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000728 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000729 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000730 self.IOption = self.addOption(JoinedOrSeparateOption('-I'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000731 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
732 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000733 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000734 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
735
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000736 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000737 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000738 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
739 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000740
741 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000742 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000743 # Not exactly sure how to decompose this. I split out -Xarch_
744 # because we need to recognize that in the driver driver part.
745 # FIXME: Man, this is lame it needs its own option.
746 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
747 self.addOption(JoinedOption('-X'))
748
749 # The driver needs to know about this flag.
750 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
751
752 # FIXME: Wrong?
753 # FIXME: What to do about the ambiguity of options like
754 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000755 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000756 self.dGroup = OptionGroup('-d')
757 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000758 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000759
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000760 # Use a group for this in anticipation of adding more -d
761 # options explicitly. Note that we don't put many -d things in
762 # the -d group (like -dylinker, or '-d' by itself) because it
763 # is really a gcc bug that it ships these to cc1.
764 self.dGroup = OptionGroup('-d')
765 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000766
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000767 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000768 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
769 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000770 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
771 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000772 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000773 # FIXME: Naming.
774 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
775 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000776
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000777 # FIXME: How should we handle clang specific options? Do we
778 # want to avoid passing them to gcc/cc1 (which will generally
779 # not eat them), or should we let the user sort it out.
780
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000781 self.fGroup = OptionGroup('-f')
782 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
783 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
784 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
785
786 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000787
788 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
789 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
790 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
791 forceJoinedRender=True))
792
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000793 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000794 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000795 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
796 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000797 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000798 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000799 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000800 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000801 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000802 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000803 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000804 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000805 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
806 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
807 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000808 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
809 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
810 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
811 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
812 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
813 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000814 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000815 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
816 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
817 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000818 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000819 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
820 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000821 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000822 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
823 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
824 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000825 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
826 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000827 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000828 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000829 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000830 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000831 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000832 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000833 self.addOption(JoinedOption('-f', self.fGroup))
834
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000835 self.coverageOption = self.addOption(FlagOption('-coverage'))
836 self.coverageOption2 = self.addOption(FlagOption('--coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000837
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000838 self.mGroup = OptionGroup('-m')
839 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
840 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
841 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
842 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
843 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
844 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000845 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
846 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
847 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
848 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
849 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
850 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000851 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000852
853 # Ugh. Need to disambiguate our naming convetion. -m x goes to
854 # the linker sometimes, wheres -mxxxx is used for a variety of
855 # other things.
856 self.mOption = self.addOption(SeparateOption('-m'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000857 self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000858
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000859 # FIXME: Why does Darwin send -a* to cc1?
860 self.aGroup = OptionGroup('-a')
861 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000862 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
863
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000864 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
865
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000866 self.pedanticGroup = OptionGroup('-pedantic')
867 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
868 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000869 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000870
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000871 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000872 self.ClangWGroup = OptionGroup('-W', self.WGroup)
873
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000874 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
875 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
876
Daniel Dunbarab95c392009-01-21 18:49:34 +0000877 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
878 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
879 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
880 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
881 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
882 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
883 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000884
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000885 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
886 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
887 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000888
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000889 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000890 # works. There is something else going on which interprets the
891 # '='.
892 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000893
Daniel Dunbardff9f502009-01-12 18:51:02 +0000894 # FIXME: What is this? I think only one is valid, but have a
895 # log that uses both.
896 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000897 self.addOption(FlagOption('-pthreads'))
898
Daniel Dunbar470104e2009-01-17 00:53:19 +0000899 # Version control
900 self.addOption(JoinedOrSeparateOption('-B'))
901 self.addOption(JoinedOrSeparateOption('-V'))
902 self.addOption(JoinedOrSeparateOption('-b'))
903
Daniel Dunbarde388a52009-01-21 01:07:49 +0000904 # Clang static analyzer options (also see -WA,).
905 self.analyzeOption = self.addOption(FlagOption('--analyze'))
906
Daniel Dunbara5677512009-01-05 19:53:30 +0000907 def addOption(self, opt):
908 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000909 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +0000910
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000911 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +0000912 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000913 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +0000914
915 Parse command line into individual option instances.
916 """
917
918 iargs = enumerate(argv)
919 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000920 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000921 for pos,a in it:
922 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +0000923 # FIXME: Handle '@'
924 if not a:
925 # gcc's handling of empty arguments doesn't make
926 # sense, but this is not a common use case. :)
927 #
928 # We just ignore them here (note that other things may
929 # still take them as arguments).
930 pass
931 elif a[0] == '-' and a != '-':
932 args.append(self.lookupOptForArg(i, a, it))
933 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +0000934 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +0000935 return args
936
Daniel Dunbar5039f212009-01-06 02:30:10 +0000937 def lookupOptForArg(self, i, string, it):
938 for o in self.options:
939 arg = o.accept(i, string, it)
940 if arg is not None:
941 return arg
942 return PositionalArg(i, self.unknownOption)