blob: 50415bf706e7823039c5de326d519d773eeab000 [file] [log] [blame]
Daniel Dunbara0026f22009-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 Dunbar378530c2009-01-05 19:53:30 +000014class Option(object):
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +000015 """Option - Root option class."""
Daniel Dunbarfc2ad022009-01-12 03:33:58 +000016
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +000017 def __init__(self, name, group=None, alias=None,
Daniel Dunbarde087382009-01-23 00:54:03 +000018 isLinkerInput=False, noOptAsInput=False,
19 forceSeparateRender=False,
20 forceJoinedRender=False):
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +000021 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbarfc1e8ef2009-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 Dunbar378530c2009-01-05 19:53:30 +000028 self.name = name
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +000029 self.group = group
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +000030 self.alias = alias
Daniel Dunbarfc2ad022009-01-12 03:33:58 +000031 self.isLinkerInput = isLinkerInput
32 self.noOptAsInput = noOptAsInput
Daniel Dunbarde087382009-01-23 00:54:03 +000033 self.forceSeparateRender = forceSeparateRender
34 self.forceJoinedRender = forceJoinedRender
Daniel Dunbar378530c2009-01-05 19:53:30 +000035
Daniel Dunbarfc1e8ef2009-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 Dunbarb39fcdb2009-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 Dunbarfc1e8ef2009-01-23 00:14:46 +000049
50 if self.alias:
51 return self.alias.matches(opt)
Daniel Dunbarb39fcdb2009-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 Dunbar378530c2009-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 Dunbarb3492762009-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 Dunbarb39fcdb2009-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 Dunbar60b874a2009-01-14 19:42:31 +000089 def __init__(self, name, group=None):
90 super(OptionGroup, self).__init__(name, group)
Daniel Dunbarb39fcdb2009-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 Dunbar927a5092009-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 Dunbar378530c2009-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 Dunbarfc2ad022009-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 Dunbar378530c2009-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 Dunbarf9c191a2009-01-11 22:12:37 +0000156 if arg == self.name:
Daniel Dunbar378530c2009-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 Dunbar927a5092009-01-06 02:30:10 +0000195 assert opt is not None
Daniel Dunbar378530c2009-01-05 19:53:30 +0000196 self.index = index
197 self.opt = opt
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000198
Daniel Dunbar378530c2009-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 Dunbarfc1e8ef2009-01-23 00:14:46 +0000209 return [self.opt.getRenderName()]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000210
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000211 def renderAsInput(self, args):
212 return self.render(args)
213
Daniel Dunbar378530c2009-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 Dunbar3b246392009-01-12 07:40:25 +0000220 def getValues(self, args):
221 return [self.getValue(args)]
222
Daniel Dunbar927a5092009-01-06 02:30:10 +0000223class PositionalArg(ValueArg):
224 """PositionalArg - A simple positional argument."""
Daniel Dunbar378530c2009-01-05 19:53:30 +0000225
226 def getValue(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000227 return args.getInputString(self.index)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000228
229 def render(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000230 return [args.getInputString(self.index)]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000231
232class JoinedValueArg(ValueArg):
Daniel Dunbar927a5092009-01-06 02:30:10 +0000233 """JoinedValueArg - A single value argument where the value is
234 joined (suffixed) to the option."""
235
Daniel Dunbar378530c2009-01-05 19:53:30 +0000236 def getValue(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000237 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000238
Daniel Dunbar378530c2009-01-05 19:53:30 +0000239 def render(self, args):
Daniel Dunbarde087382009-01-23 00:54:03 +0000240 if self.opt.forceSeparateRender:
241 return [self.opt.getRenderName(),
242 self.getValue(args)]
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +0000243 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000244
Daniel Dunbarfc2ad022009-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 Dunbar378530c2009-01-05 19:53:30 +0000250class SeparateValueArg(ValueArg):
Daniel Dunbar927a5092009-01-06 02:30:10 +0000251 """SeparateValueArg - A single value argument where the value
252 follows the option in the argument vector."""
253
Daniel Dunbar378530c2009-01-05 19:53:30 +0000254 def getValue(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000255 return args.getInputString(self.index, offset=1)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000256
Daniel Dunbar378530c2009-01-05 19:53:30 +0000257 def render(self, args):
Daniel Dunbarde087382009-01-23 00:54:03 +0000258 if self.opt.forceJoinedRender:
259 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +0000260 return [self.opt.getRenderName(), self.getValue(args)]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000261
Daniel Dunbarfc2ad022009-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 Dunbar378530c2009-01-05 19:53:30 +0000267class MultipleValuesArg(Arg):
Daniel Dunbar927a5092009-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 Dunbar378530c2009-01-05 19:53:30 +0000273 def getValues(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000274 return [args.getInputString(self.index, offset=1+i)
275 for i in range(self.opt.numArgs)]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000276
Daniel Dunbar378530c2009-01-05 19:53:30 +0000277 def render(self, args):
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +0000278 return [self.opt.getRenderName()] + self.getValues(args)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000279
Daniel Dunbarfc2ad022009-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 Dunbarfc1e8ef2009-01-23 00:14:46 +0000292 return [self.opt.getRenderName() + ','.join(self.getValues(args))]
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000293
294 def renderAsInput(self, args):
295 return self.getValues(args)
296
Daniel Dunbar378530c2009-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 Dunbar9d32bcd2009-01-07 01:29:28 +0000304 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbar378530c2009-01-05 19:53:30 +0000305
306 def getSeparateValue(self, args):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000307 return args.getInputString(self.index, offset=1)
Daniel Dunbar378530c2009-01-05 19:53:30 +0000308
309 def render(self, args):
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +0000310 return ([self.opt.getRenderName() + self.getJoinedValue(args)] +
Daniel Dunbar378530c2009-01-05 19:53:30 +0000311 [self.getSeparateValue(args)])
312
Daniel Dunbar64271452009-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 Dunbarb3492762009-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 Dunbar74727872009-01-06 01:35:44 +0000326
Daniel Dunbar1ba90982009-01-07 18:54:26 +0000327 def __init__(self, parser, argv):
328 self.parser = parser
Daniel Dunbar74727872009-01-06 01:35:44 +0000329 self.argv = list(argv)
Daniel Dunbar64271452009-01-07 01:57:39 +0000330 self.syntheticArgv = []
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000331 self.lastArgs = {}
Daniel Dunbar64271452009-01-07 01:57:39 +0000332 self.args = []
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000333
Daniel Dunbarf9c191a2009-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 Dunbarb39fcdb2009-01-13 05:54:38 +0000341 if arg.opt.matches(option):
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000342 yield arg
343
Daniel Dunbar3b246392009-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 Dunbarb39fcdb2009-01-13 05:54:38 +0000351 if (arg.opt.matches(optionA) or
352 arg.opt.matches(optionB)):
Daniel Dunbar3b246392009-01-12 07:40:25 +0000353 yield arg
354
Daniel Dunbarf86e98a2009-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 Dunbarb39fcdb2009-01-13 05:54:38 +0000359 if (arg.opt.matches(optionA) or
360 arg.opt.matches(optionB) or
361 arg.opt.matches(optionC)):
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000362 yield arg
363
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000364 def getLastArg(self, option):
365 return self.lastArgs.get(option)
Daniel Dunbar74727872009-01-06 01:35:44 +0000366
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000367 def getInputString(self, index, offset=0):
Daniel Dunbar64271452009-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 Dunbar021df612009-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 Dunbarf86e98a2009-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 Dunbar021df612009-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 Dunbar1ba90982009-01-07 18:54:26 +0000418 def makeIndex(self, *strings):
Daniel Dunbar64271452009-01-07 01:57:39 +0000419 pos = len(self.syntheticArgv)
420 self.syntheticArgv.extend(strings)
421 return InputIndex(1, pos)
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000422
Daniel Dunbar1ba90982009-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 Dunbar6cb42052009-01-13 21:07:43 +0000439 def makeJoinedArg(self, string, option):
440 return JoinedValueArg(self.makeIndex(option.name + string),
441 option)
442
Daniel Dunbar74727872009-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 Dunbarfc1e8ef2009-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 Dunbar74727872009-01-06 01:35:44 +0000457
458 # Forwarding methods.
Daniel Dunbar9d32bcd2009-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 Dunbar74727872009-01-06 01:35:44 +0000464
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000465 def renderAsInput(self, arg):
466 return arg.renderAsInput(self)
467
Daniel Dunbar74727872009-01-06 01:35:44 +0000468 def getValue(self, arg):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000469 return arg.getValue(self)
Daniel Dunbar74727872009-01-06 01:35:44 +0000470
471 def getValues(self, arg):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000472 return arg.getValues(self)
Daniel Dunbar74727872009-01-06 01:35:44 +0000473
474 def getSeparateValue(self, arg):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000475 return arg.getSeparateValue(self)
Daniel Dunbar74727872009-01-06 01:35:44 +0000476
477 def getJoinedValue(self, arg):
Daniel Dunbar9d32bcd2009-01-07 01:29:28 +0000478 return arg.getJoinedValue(self)
Daniel Dunbar52d04592009-01-06 06:32:49 +0000479
Daniel Dunbarb3492762009-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 Dunbar52d04592009-01-06 06:32:49 +0000489###
Daniel Dunbar74727872009-01-06 01:35:44 +0000490
Daniel Dunbar378530c2009-01-05 19:53:30 +0000491class OptionParser:
492 def __init__(self):
493 self.options = []
Daniel Dunbar927a5092009-01-06 02:30:10 +0000494 self.inputOption = InputOption()
495 self.unknownOption = UnknownOption()
496
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000497 # Driver driver options
498 self.archOption = self.addOption(SeparateOption('-arch'))
499
500 # Misc driver options
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000501 self.passExitCodesOption = self.addOption(FlagOption('-pass-exit-codes'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000502 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
503 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
504 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
505 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000506 self.printLibgccFileNameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
507 self.printFileNameOption = self.addOption(JoinedOption('-print-file-name='))
508 self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name='))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000509 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000510 self.printMultiOsDirectoryOption = self.addOption(FlagOption('-print-multi-os-directory'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000511 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000512
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000513 # Pipeline control
514 self.hashHashHashOption = self.addOption(FlagOption('-###'))
515 self.EOption = self.addOption(FlagOption('-E'))
516 self.SOption = self.addOption(FlagOption('-S'))
517 self.cOption = self.addOption(FlagOption('-c'))
518 self.combineOption = self.addOption(FlagOption('-combine'))
519 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
520 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000521 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
Daniel Dunbara33176f2009-01-21 18:49:34 +0000522
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000523 # FIXME: Error out if this is used.
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000524 self.specsOption = self.addOption(JoinedOption('-specs='))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000525 # FIXME: Implement.
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000526 self.addOption(FlagOption('-time'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000527 # FIXME: Implement.
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000528 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000529
530 # Input/output stuff
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000531 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000532 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
533
Daniel Dunbar08292932009-01-12 02:24:21 +0000534 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
535 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000536
537 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
538 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000539
540 # FIXME: This is broken in Darwin cc1, it wants std* and this
541 # is std=. May need an option group for this as well.
542 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000543 self.addOption(JoinedOrSeparateOption('--sysroot'))
544
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000545 # Blanket pass-through options.
546
Daniel Dunbar90c72cd2009-01-21 01:07:49 +0000547 self.WAOption = self.addOption(CommaJoinedOption('-WA,'))
548
Daniel Dunbar3b246392009-01-12 07:40:25 +0000549 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
550 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000551
Daniel Dunbarfdf1e812009-01-12 21:44:10 +0000552 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
553 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000554
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000555 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
556 self.addOption(SeparateOption('-Xlinker', isLinkerInput=True, noOptAsInput=True))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000557
558 ####
559 # Bring on the random garbage.
560
Daniel Dunbarde087382009-01-23 00:54:03 +0000561 self.sOption = self.addOption(FlagOption('-s'))
562
Daniel Dunbar445c46d2009-01-20 01:53:54 +0000563 self.MGroup = OptionGroup('-M')
564 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
565 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
566 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
567 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
568 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
569 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
570 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
571 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
572 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000573 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar7d494092009-01-20 00:47:24 +0000574 self.uGroup = OptionGroup('-u')
575 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000576
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000577 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000578 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
579 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000580 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
581 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
582 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar7e184602009-01-16 20:25:36 +0000583 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000584 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
585 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000586 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000587 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000588
589 self.iGroup = OptionGroup('-i')
590 self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
591 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
592 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar386a51c2009-01-14 23:26:40 +0000593 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000594
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000595 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
596 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
597 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
598 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
599 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
600 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar7d494092009-01-20 00:47:24 +0000601 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
602 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000603 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
604 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
605 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
606 self.prebindOption = self.addOption(FlagOption('-prebind'))
607 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
608 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
609 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000610 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000611 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000612 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
613 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
614 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
615 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000616 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000617 self.objectOption = self.addOption(FlagOption('-object'))
618 self.preloadOption = self.addOption(FlagOption('-preload'))
619 self.staticOption = self.addOption(FlagOption('-static'))
620 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000621 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000622 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
623 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000624 self.COption = self.addOption(FlagOption('-C'))
625 self.CCOption = self.addOption(FlagOption('-CC'))
626 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000627 self.addOption(FlagOption('-R'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000628 self.POption = self.addOption(FlagOption('-P'))
629 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000630 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000631 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000632 self.traditionalOption = self.addOption(FlagOption('-traditional'))
633 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
634 # FIXME: Alias.
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000635 self.addOption(FlagOption('--traditional'))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000636 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000637 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
638 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
639 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000640 self.whyloadOption = self.addOption(FlagOption('-whyload'))
641 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
642 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
643 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
644 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000645 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
646 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
647 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
648 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000649
650 self.all_loadOption = self.addOption(FlagOption('-all_load'))
651 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
652 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
653 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
654 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
655 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
656 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
657 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
658 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
659 self.image_baseOption = self.addOption(FlagOption('-image_base'))
660 self.initOption = self.addOption(SeparateOption('-init'))
661 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
662 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
663 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
664 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
665 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
666 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
667 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
668 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
669 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
670 # FIXME: This probably isn't necessary.
671 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
672 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar7d494092009-01-20 00:47:24 +0000673 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000674 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000675
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000676 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
677 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar80e48b72009-01-17 00:53:19 +0000678
679 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000680
681 # Where are these coming from? I can't find them...
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000682 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
683 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000684
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000685 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000686 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000687
688 doNotReallySupport = 1
689 if doNotReallySupport:
690 # Archaic gcc option.
691 self.addOption(FlagOption('-cpp-precomp'))
692 self.addOption(FlagOption('-no-cpp-precomp'))
693
694 # C options for testing
695
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000696 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
697
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000698 # FIXME: This is broken, we need -A as a single option to send
699 # stuff to cc1, but the way the ld spec is constructed it
700 # wants to see -A options but only as a separate arg.
701 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
702 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000703 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000704
705 self.IGroup = OptionGroup('-I')
706 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000707 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000708
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000709 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
710 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbarf86e98a2009-01-12 09:23:15 +0000711 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000712 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
713
Daniel Dunbarfc2ad022009-01-12 03:33:58 +0000714 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar7d494092009-01-20 00:47:24 +0000715 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000716 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
717 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000718
719 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000720 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000721 # Not exactly sure how to decompose this. I split out -Xarch_
722 # because we need to recognize that in the driver driver part.
723 # FIXME: Man, this is lame it needs its own option.
724 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
725 self.addOption(JoinedOption('-X'))
726
727 # The driver needs to know about this flag.
728 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
729
730 # FIXME: Wrong?
731 # FIXME: What to do about the ambiguity of options like
732 # -dumpspecs? How is this handled in gcc?
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000733 # FIXME: Naming convention.
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000734 self.dGroup = OptionGroup('-d')
735 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbarde087382009-01-23 00:54:03 +0000736 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000737
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000738 # Use a group for this in anticipation of adding more -d
739 # options explicitly. Note that we don't put many -d things in
740 # the -d group (like -dylinker, or '-d' by itself) because it
741 # is really a gcc bug that it ships these to cc1.
742 self.dGroup = OptionGroup('-d')
743 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar3b246392009-01-12 07:40:25 +0000744
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000745 self.gGroup = OptionGroup('-g')
Daniel Dunbar7e184602009-01-16 20:25:36 +0000746 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
747 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar0d51cf72009-01-13 06:44:28 +0000748 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
749 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000750 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar6e524b62009-01-16 21:07:21 +0000751 # FIXME: Naming.
752 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
753 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000754
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000755 # FIXME: How should we handle clang specific options? Do we
756 # want to avoid passing them to gcc/cc1 (which will generally
757 # not eat them), or should we let the user sort it out.
758
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000759 self.fGroup = OptionGroup('-f')
760 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
761 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
762 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
763
764 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000765 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000766 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000767 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar6cb42052009-01-13 21:07:43 +0000768 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000769 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000770 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
771 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar7e184602009-01-16 20:25:36 +0000772 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000773 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000774 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000775 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000776 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000777 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar7e184602009-01-16 20:25:36 +0000778 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000779 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000780 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000781 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000782 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
783 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
784 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000785 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
786 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
787 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
788 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
789 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
790 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
Daniel Dunbar7d494092009-01-20 00:47:24 +0000791 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000792 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
793 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
794 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000795 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000796 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000797 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000798 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000799 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000800 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
801 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
802 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000803 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
804 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar7e184602009-01-16 20:25:36 +0000805 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000806 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000807 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000808 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000809 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar6d91bdf2009-01-22 01:55:46 +0000810 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar23daad12009-01-13 07:39:45 +0000811 self.addOption(JoinedOption('-f', self.fGroup))
812
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000813 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000814
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000815 self.mGroup = OptionGroup('-m')
816 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
817 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
818 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
819 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
820 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
821 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar6cb42052009-01-13 21:07:43 +0000822 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
823 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
824 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
825 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
826 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
827 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000828 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000829
830 # Ugh. Need to disambiguate our naming convetion. -m x goes to
831 # the linker sometimes, wheres -mxxxx is used for a variety of
832 # other things.
833 self.mOption = self.addOption(SeparateOption('-m'))
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000834 self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbarf9c191a2009-01-11 22:12:37 +0000835
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000836 # FIXME: Why does Darwin send -a* to cc1?
837 self.aGroup = OptionGroup('-a')
838 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbarde087382009-01-23 00:54:03 +0000839
Daniel Dunbarb39fcdb2009-01-13 05:54:38 +0000840 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
841
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000842 self.pedanticGroup = OptionGroup('-pedantic')
843 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
844 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbare9b50a02009-01-12 17:53:19 +0000845 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000846
Daniel Dunbar6cb42052009-01-13 21:07:43 +0000847 self.WGroup = OptionGroup('-W')
Daniel Dunbar60b874a2009-01-14 19:42:31 +0000848 self.ClangWGroup = OptionGroup('-W', self.WGroup)
849
Daniel Dunbarfc1e8ef2009-01-23 00:14:46 +0000850 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbara33176f2009-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 Dunbar60b874a2009-01-14 19:42:31 +0000858
Daniel Dunbar6cb42052009-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 Dunbar60b874a2009-01-14 19:42:31 +0000862
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000863 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbare9b50a02009-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 Dunbare9f1a692009-01-06 06:12:13 +0000867
Daniel Dunbarbafb8f42009-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 Dunbare9f1a692009-01-06 06:12:13 +0000871 self.addOption(FlagOption('-pthreads'))
872
Daniel Dunbar80e48b72009-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 Dunbar90c72cd2009-01-21 01:07:49 +0000878 # Clang static analyzer options (also see -WA,).
879 self.analyzeOption = self.addOption(FlagOption('--analyze'))
880
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000881 # Long option handling (aliases).
882 self.addOption(FlagOption('--help'))
883 self.addOption(FlagOption('--target-help'))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000884 # FIXME: Who handles this?
885 self.addOption(FlagOption('--version'))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000886
887 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
888 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
889 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000890 self.addOption(FlagOption('--combine', alias=self.combineOption))
891 self.addOption(FlagOption('--comments', alias=self.COption))
892 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
893 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000894 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000895 self.addOption(FlagOption('--dependencies', alias=self.MOption))
896 self.addOption(FlagOption('--entry', alias=self.eOption))
897 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
898 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
899 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
900 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
901 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
902# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
903 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
904 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
905 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
906 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
907 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
908 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
909# self.addOption(FlagOption('--pie', alias=self.pieOption))
910 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
911 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000912 self.addOption(JoinedOption('--param=', alias=self._paramOption,
913 forceSeparateRender=True))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000914 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
915 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000916 self.addOption(FlagOption('--print-libgcc-file-name',
917 alias=self.printLibgccFileNameOption))
918 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
919 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
920 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
921 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000922 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
923 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000924 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
925 self.addOption(FlagOption('--profile', alias=self.pOption))
926 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
927# self.addOption(FlagOption('--quiet', alias=self.qOption))
928# self.addOption(FlagOption('--shared', alias=self.sharedOption))
929# self.addOption(FlagOption('--silent', alias=self.qOption))
930 self.addOption(FlagOption('--static', alias=self.staticOption))
931# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
932# self.addOption(FlagOption('--time', alias=self.timeOption))
933 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
934 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
935 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
936 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
937 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
938 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000939 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbar73fb9072009-01-23 02:00:46 +0000940 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
941 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar1fd21e32009-01-23 01:31:44 +0000942
Daniel Dunbar9f16bf92009-01-23 08:16:41 +0000943 # Long options with joined & separate forms.
944
945 self.addOption(SeparateOption('--assert', alias=self.AOption))
946 self.addOption(JoinedOption('--assert=', alias=self.AOption,
947 forceSeparateRender=True))
948 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
949 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
950 forceJoinedRender=True))
951 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
952 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
953 forceJoinedRender=True))
954 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
955 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
956 forceJoinedRender=True))
957 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
958 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
959 forceJoinedRender=True))
960 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
961 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
962 forceJoinedRender=True))
963 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
964 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
965 forceJoinedRender=True))
966 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
967 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
968 forceJoinedRender=True))
969 self.addOption(JoinedOption('--machine=', alias=self.mOption))
970 self.addOption(SeparateOption('--machine', alias=self.mOption,
971 forceJoinedRender=True))
972 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
973 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
974 forceJoinedRender=True))
975 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
976 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
977 forceJoinedRender=True))
978 self.addOption(JoinedOption('--specs=', alias=self.specsOption))
979 self.addOption(SeparateOption('--specs', alias=self.specsOption,
980 forceJoinedRender=True))
981 self.addOption(JoinedOption('--std=', alias=self.stdOption))
982 self.addOption(SeparateOption('--std', alias=self.stdOption,
983 forceJoinedRender=True))
984 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
985 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
986 forceJoinedRender=True))
987 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
988 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
989 forceJoinedRender=True))
990
Daniel Dunbar378530c2009-01-05 19:53:30 +0000991 def addOption(self, opt):
992 self.options.append(opt)
Daniel Dunbare9f1a692009-01-06 06:12:13 +0000993 return opt
Daniel Dunbar378530c2009-01-05 19:53:30 +0000994
Daniel Dunbar74727872009-01-06 01:35:44 +0000995 def parseArgs(self, argv):
Daniel Dunbar378530c2009-01-05 19:53:30 +0000996 """
Daniel Dunbar74727872009-01-06 01:35:44 +0000997 parseArgs([str]) -> ArgList
Daniel Dunbar378530c2009-01-05 19:53:30 +0000998
999 Parse command line into individual option instances.
1000 """
1001
1002 iargs = enumerate(argv)
1003 it = iter(iargs)
Daniel Dunbar1ba90982009-01-07 18:54:26 +00001004 args = ArgList(self, argv)
Daniel Dunbar64271452009-01-07 01:57:39 +00001005 for pos,a in it:
1006 i = InputIndex(0, pos)
Daniel Dunbar378530c2009-01-05 19:53:30 +00001007 # FIXME: Handle '@'
1008 if not a:
1009 # gcc's handling of empty arguments doesn't make
1010 # sense, but this is not a common use case. :)
1011 #
1012 # We just ignore them here (note that other things may
1013 # still take them as arguments).
1014 pass
1015 elif a[0] == '-' and a != '-':
1016 args.append(self.lookupOptForArg(i, a, it))
1017 else:
Daniel Dunbar927a5092009-01-06 02:30:10 +00001018 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbar378530c2009-01-05 19:53:30 +00001019 return args
1020
Daniel Dunbar927a5092009-01-06 02:30:10 +00001021 def lookupOptForArg(self, i, string, it):
1022 for o in self.options:
1023 arg = o.accept(i, string, it)
1024 if arg is not None:
1025 return arg
1026 return PositionalArg(i, self.unknownOption)