blob: dfba53f68747c13cc811bd6c8b39408e6fbaee8f [file] [log] [blame]
Daniel Dunbar83d67902009-02-16 18:18:43 +00001import os
Daniel Dunbar94713452009-01-16 23:12:12 +00002
3###
4
5class InvalidArgumentsError(ValueError):
6 """InvalidArgumentsError - The driver arguments are invalid or
7 inconsistent."""
8
9class MissingArgumentError(ValueError):
10 """MissingArgumentError - An option required an argument but none
11 was given."""
12
13###
14
Daniel Dunbara5677512009-01-05 19:53:30 +000015class Option(object):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000016 """Option - Root option class."""
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000017
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000018 def __init__(self, name, group=None, alias=None,
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000019 isLinkerInput=False, noOptAsInput=False,
20 forceSeparateRender=False,
Daniel Dunbard9fb9722009-01-23 20:08:16 +000021 forceJoinedRender=False,
22 unsupported=False):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000023 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000024 # Multi-level aliases are not supported, and alias options
25 # cannot have groups. This just simplifies option tracking, it
26 # is not an inherent limitation.
27 assert alias is None or (alias.alias is None and
28 group is None)
29
Daniel Dunbara5677512009-01-05 19:53:30 +000030 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000031 self.group = group
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000032 self.alias = alias
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000033 self.isLinkerInput = isLinkerInput
34 self.noOptAsInput = noOptAsInput
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000035 self.forceSeparateRender = forceSeparateRender
36 self.forceJoinedRender = forceJoinedRender
Daniel Dunbard9fb9722009-01-23 20:08:16 +000037 self.unsupported = unsupported
Daniel Dunbara5677512009-01-05 19:53:30 +000038
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000039 def getUnaliasedOption(self):
40 if self.alias:
41 return self.alias.getUnaliasedOption()
42 return self
43
44 def getRenderName(self):
45 return self.getUnaliasedOption().name
46
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000047 def matches(self, opt):
48 """matches(opt) -> bool
49
50 Predicate for whether this option is part of the given option
51 (which may be a group)."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000052
53 if self.alias:
54 return self.alias.matches(opt)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000055 if self is opt:
56 return True
57 elif self.group:
58 return self.group.matches(opt)
59 else:
60 return False
61
Daniel Dunbara5677512009-01-05 19:53:30 +000062 def accept(self, index, arg, it):
63 """accept(index, arg, iterator) -> Arg or None
64
65 Accept the argument at the given index, returning an Arg, or
66 return None if the option does not accept this argument.
67
68 May raise MissingArgumentError.
69 """
70 abstract
71
72 def __repr__(self):
73 return '<%s name=%r>' % (self.__class__.__name__,
74 self.name)
75
Daniel Dunbar11672ec2009-01-13 18:51:26 +000076 def forwardToGCC(self):
77 # FIXME: Get rid of this hack.
78 if self.name == '<input>':
79 return False
80
81 if self.isLinkerInput:
82 return False
83
84 return self.name not in ('-E', '-S', '-c',
85 '-arch', '-fsyntax-only', '-combine', '-x',
Daniel Dunbarfd8d98f2009-01-26 18:00:14 +000086 '-###', '-o')
Daniel Dunbar11672ec2009-01-13 18:51:26 +000087
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000088class OptionGroup(Option):
89 """OptionGroup - A fake option class used to group options so that
90 the driver can efficiently refer to an entire set of options."""
91
Daniel Dunbar3cde3252009-01-14 19:42:31 +000092 def __init__(self, name, group=None):
93 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000094
95 def accept(self, index, arg, it):
96 raise RuntimeError,"accept() should never be called on an OptionGroup"
97
Daniel Dunbar5039f212009-01-06 02:30:10 +000098# Dummy options
99
100class InputOption(Option):
101 def __init__(self):
102 super(InputOption, self).__init__('<input>')
103
104 def accept(self):
105 raise RuntimeError,"accept() should never be used on InputOption instance."
106
107class UnknownOption(Option):
108 def __init__(self):
109 super(UnknownOption, self).__init__('<unknown>')
110
111 def accept(self):
112 raise RuntimeError,"accept() should never be used on UnknownOption instance."
113
114# Normal options
115
Daniel Dunbara5677512009-01-05 19:53:30 +0000116class FlagOption(Option):
117 """An option which takes no arguments."""
118
119 def accept(self, index, arg, it):
120 if arg == self.name:
121 return Arg(index, self)
122
123class JoinedOption(Option):
124 """An option which literally prefixes its argument."""
125
126 def accept(self, index, arg, it):
127 if arg.startswith(self.name):
128 return JoinedValueArg(index, self)
129
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000130class CommaJoinedOption(Option):
131 """An option which literally prefixs its argument, but which
132 conceptually may have an arbitrary number of arguments which are
133 separated by commas."""
134
135 def accept(self, index, arg, it):
136 if arg.startswith(self.name):
137 return CommaJoinedValuesArg(index, self)
138
Daniel Dunbara5677512009-01-05 19:53:30 +0000139class SeparateOption(Option):
140 """An option which is followed by its value."""
141
142 def accept(self, index, arg, it):
143 if arg == self.name:
144 try:
145 _,value = it.next()
146 except StopIteration:
147 raise MissingArgumentError,self
148 return SeparateValueArg(index, self)
149
150class MultiArgOption(Option):
151 """An option which takes multiple arguments."""
152
153 def __init__(self, name, numArgs):
154 assert numArgs > 1
155 super(MultiArgOption, self).__init__(name)
156 self.numArgs = numArgs
157
158 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000159 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000160 try:
161 values = [it.next()[1] for i in range(self.numArgs)]
162 except StopIteration:
163 raise MissingArgumentError,self
164 return MultipleValuesArg(index, self)
165
166class JoinedOrSeparateOption(Option):
167 """An option which either literally prefixes its value or is
168 followed by an value."""
169
170 def accept(self, index, arg, it):
171 if arg.startswith(self.name):
172 if len(arg) != len(self.name): # Joined case
173 return JoinedValueArg(index, self)
174 else:
175 try:
176 _,value = it.next()
177 except StopIteration:
178 raise MissingArgumentError,self
179 return SeparateValueArg(index, self)
180
181class JoinedAndSeparateOption(Option):
182 """An option which literally prefixes its value and is followed by
183 an value."""
184
185 def accept(self, index, arg, it):
186 if arg.startswith(self.name):
187 try:
188 _,value = it.next()
189 except StopIteration:
190 raise MissingArgumentError,self
191 return JoinedAndSeparateValuesArg(index, self)
192
193###
194
195class Arg(object):
196 """Arg - Base class for actual driver arguments."""
197 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000198 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000199 self.index = index
200 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000201
Daniel Dunbara5677512009-01-05 19:53:30 +0000202 def __repr__(self):
203 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
204 self.index,
205 self.opt)
206
207 def render(self, args):
208 """render(args) -> [str]
209
210 Map the argument into a list of actual program arguments,
211 given the source argument array."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000212 return [self.opt.getRenderName()]
Daniel Dunbara5677512009-01-05 19:53:30 +0000213
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000214 def renderAsInput(self, args):
215 return self.render(args)
216
Daniel Dunbara5677512009-01-05 19:53:30 +0000217class ValueArg(Arg):
218 """ValueArg - An instance of an option which has an argument."""
219
220 def getValue(self, args):
221 abstract
222
Daniel Dunbar996ce962009-01-12 07:40:25 +0000223 def getValues(self, args):
224 return [self.getValue(args)]
225
Daniel Dunbar5039f212009-01-06 02:30:10 +0000226class PositionalArg(ValueArg):
227 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000228
229 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000230 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000231
232 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000233 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000234
235class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000236 """JoinedValueArg - A single value argument where the value is
237 joined (suffixed) to the option."""
238
Daniel Dunbara5677512009-01-05 19:53:30 +0000239 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000240 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000241
Daniel Dunbara5677512009-01-05 19:53:30 +0000242 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000243 if self.opt.forceSeparateRender:
244 return [self.opt.getRenderName(),
245 self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000246 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000247
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000248 def renderAsInput(self, args):
249 if self.opt.noOptAsInput:
250 return [self.getValue(args)]
251 return self.render(args)
252
Daniel Dunbara5677512009-01-05 19:53:30 +0000253class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000254 """SeparateValueArg - A single value argument where the value
255 follows the option in the argument vector."""
256
Daniel Dunbara5677512009-01-05 19:53:30 +0000257 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000258 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000259
Daniel Dunbara5677512009-01-05 19:53:30 +0000260 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000261 if self.opt.forceJoinedRender:
262 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000263 return [self.opt.getRenderName(), self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000264
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000265 def renderAsInput(self, args):
266 if self.opt.noOptAsInput:
267 return [self.getValue(args)]
268 return self.render(args)
269
Daniel Dunbara5677512009-01-05 19:53:30 +0000270class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000271 """MultipleValuesArg - An argument with multiple values which
272 follow the option in the argument vector."""
273
274 # FIXME: Should we unify this with SeparateValueArg?
275
Daniel Dunbara5677512009-01-05 19:53:30 +0000276 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000277 return [args.getInputString(self.index, offset=1+i)
278 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000279
Daniel Dunbara5677512009-01-05 19:53:30 +0000280 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000281 return [self.opt.getRenderName()] + self.getValues(args)
Daniel Dunbara5677512009-01-05 19:53:30 +0000282
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000283class CommaJoinedValuesArg(Arg):
284 """CommaJoinedValuesArg - An argument with multiple values joined
285 by commas and joined (suffixed) to the option.
286
287 The key point of this arg is that it renders its values into
288 separate arguments, which allows it to be used as a generic
289 mechanism for passing arguments through to tools."""
290
291 def getValues(self, args):
292 return args.getInputString(self.index)[len(self.opt.name):].split(',')
293
294 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000295 return [self.opt.getRenderName() + ','.join(self.getValues(args))]
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000296
297 def renderAsInput(self, args):
298 return self.getValues(args)
299
Daniel Dunbara5677512009-01-05 19:53:30 +0000300# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
301# just special case?
302class JoinedAndSeparateValuesArg(Arg):
303 """JoinedAndSeparateValuesArg - An argument with both joined and
304 separate values."""
305
306 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000307 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000308
309 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000310 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000311
312 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000313 return ([self.opt.getRenderName() + self.getJoinedValue(args)] +
Daniel Dunbara5677512009-01-05 19:53:30 +0000314 [self.getSeparateValue(args)])
315
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000316###
317
318class InputIndex:
319 def __init__(self, sourceId, pos):
320 self.sourceId = sourceId
321 self.pos = pos
322
323 def __repr__(self):
324 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
325
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000326class ArgList(object):
327 """ArgList - Collect an input argument vector along with a set of
328 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000329
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000330 def __init__(self, parser, argv):
331 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000332 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000333 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000334 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000335 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000336
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000337 def getArgs(self, option):
338 # FIXME: How efficient do we want to make this. One reasonable
339 # solution would be to embed a linked list inside each arg and
340 # automatically chain them (with pointers to head and
341 # tail). This gives us efficient access to the (first, last,
342 # all) arg(s) with little overhead.
343 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000344 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000345 yield arg
346
Daniel Dunbar996ce962009-01-12 07:40:25 +0000347 def getArgs2(self, optionA, optionB):
348 """getArgs2 - Iterate over all arguments for two options, in
349 the order they were specified."""
350 # As long as getArgs is efficient, we can easily make this
351 # efficient by iterating both at once and always taking the
352 # earlier arg.
353 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000354 if (arg.opt.matches(optionA) or
355 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000356 yield arg
357
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000358 def getArgs3(self, optionA, optionB, optionC):
359 """getArgs3 - Iterate over all arguments for three options, in
360 the order they were specified."""
361 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000362 if (arg.opt.matches(optionA) or
363 arg.opt.matches(optionB) or
364 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000365 yield arg
366
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000367 def getLastArgAndPosition(self, option):
368 return self.lastArgs.get(option, (None,-1))
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000369
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000370 def getLastArg(self, option):
371 return self.getLastArgAndPosition(option)[0]
372
373 def hasFFlag(self, option, negativeOption, default):
374 """hasFFlag - Given an option and its corresponding negative
375 option, return True if the option is present, False if the
376 negation is present, and default if neither option is
377 given. If both the option and its negation are present, the
378 last one wins.
379 """
380 arg,argPos = self.getLastArgAndPosition(option)
381 neg,negPos = self.getLastArgAndPosition(negativeOption)
382 if arg and neg:
383 return negPos < argPos
384 elif arg:
385 return True
386 elif neg:
387 return False
388 else:
389 return default
390
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000391 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000392 # Source 0 is argv.
393 if index.sourceId == 0:
394 return self.argv[index.pos + offset]
395
396 # Source 1 is synthetic argv.
397 if index.sourceId == 1:
398 return self.syntheticArgv[index.pos + offset]
399
400 raise RuntimeError,'Unknown source ID for index.'
401
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000402 def addLastArg(self, output, option):
403 """addLastArgs - Extend the given output vector with the last
404 instance of a given option."""
405 arg = self.getLastArg(option)
406 if arg:
407 output.extend(self.render(arg))
408
409 def addAllArgs(self, output, option):
410 """addAllArgs - Extend the given output vector with all
411 instances of a given option."""
412 for arg in self.getArgs(option):
413 output.extend(self.render(arg))
414
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000415 def addAllArgs2(self, output, optionA, optionB):
416 """addAllArgs2 - Extend the given output vector with all
417 instances of two given option, with relative order preserved."""
418 for arg in self.getArgs2(optionA, optionB):
419 output.extend(self.render(arg))
420
421 def addAllArgs3(self, output, optionA, optionB, optionC):
422 """addAllArgs3 - Extend the given output vector with all
423 instances of three given option, with relative order preserved."""
424 for arg in self.getArgs3(optionA, optionB, optionC):
425 output.extend(self.render(arg))
426
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000427 def addAllArgsTranslated(self, output, option, translation):
428 """addAllArgsTranslated - Extend the given output vector with
429 all instances of a given option, rendered as separate
430 arguments with the actual option name translated to a user
431 specified string. For example, '-foox' will be render as
432 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
433 translation.
434
435 This routine expects that the option can only yield ValueArg
436 instances."""
437 for arg in self.getArgs(option):
438 assert isinstance(arg, ValueArg)
439 output.append(translation)
440 output.append(self.getValue(arg))
441
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000442 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000443 pos = len(self.syntheticArgv)
444 self.syntheticArgv.extend(strings)
445 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000446
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000447 def makeFlagArg(self, option):
448 return Arg(self.makeIndex(option.name),
449 option)
450
451 def makeInputArg(self, string):
452 return PositionalArg(self.makeIndex(string),
453 self.parser.inputOption)
454
455 def makeUnknownArg(self, string):
456 return PositionalArg(self.makeIndex(string),
457 self.parser.unknownOption)
458
459 def makeSeparateArg(self, string, option):
460 return SeparateValueArg(self.makeIndex(option.name, string),
461 option)
462
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000463 def makeJoinedArg(self, string, option):
464 return JoinedValueArg(self.makeIndex(option.name + string),
465 option)
466
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000467 # Support use as a simple arg list.
468
469 def __iter__(self):
470 return iter(self.args)
471
472 def append(self, arg):
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000473 if arg.opt.unsupported:
474 raise InvalidArgumentsError('option %r is unsupported' % arg.opt.name)
475
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000476 self.args.append(arg)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000477
478 opt = arg.opt
479 if opt.alias:
480 opt = opt.alias
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000481 self.lastArgs[opt] = (arg, len(self.args) - 1)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000482 if opt.group is not None:
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000483 self.lastArgs[opt.group] = (arg, len(self.args) - 1)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000484
485 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000486 #
487 # FIXME: Clean this up once restructuring is done.
488
489 def render(self, arg):
490 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000491
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000492 def renderAsInput(self, arg):
493 return arg.renderAsInput(self)
494
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000495 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000496 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000497
498 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000499 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000500
501 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000502 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000503
504 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000505 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000506
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000507class DerivedArgList(ArgList):
508 def __init__(self, args):
509 super(DerivedArgList, self).__init__(args.parser, args.argv)
510 self.parser = args.parser
511 self.argv = args.argv
512 self.syntheticArgv = args.syntheticArgv
513 self.lastArgs = {}
514 self.args = []
515
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000516###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000517
Daniel Dunbara5677512009-01-05 19:53:30 +0000518class OptionParser:
519 def __init__(self):
520 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000521 self.inputOption = InputOption()
522 self.unknownOption = UnknownOption()
523
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000524 # Driver driver options
525 self.archOption = self.addOption(SeparateOption('-arch'))
526
527 # Misc driver options
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000528 self.passExitCodesOption = self.addOption(FlagOption('-pass-exit-codes'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000529 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
530 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
531 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
532 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000533 self.printLibgccFileNameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
534 self.printFileNameOption = self.addOption(JoinedOption('-print-file-name='))
535 self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000536 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000537 self.printMultiOsDirectoryOption = self.addOption(FlagOption('-print-multi-os-directory'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000538 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000539
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000540 # Pipeline control
541 self.hashHashHashOption = self.addOption(FlagOption('-###'))
542 self.EOption = self.addOption(FlagOption('-E'))
543 self.SOption = self.addOption(FlagOption('-S'))
544 self.cOption = self.addOption(FlagOption('-c'))
Daniel Dunbare4c0da82009-01-30 00:12:29 +0000545 self.combineOption = self.addOption(FlagOption('-combine', unsupported=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000546 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
547 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000548 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000549
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000550 # FIXME: Error out if this is used.
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000551 self.specsOption = self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000552 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000553 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000554 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000555 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000556
557 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000558 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000559 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
560
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000561 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
562 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000563
564 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
565 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000566
567 # FIXME: This is broken in Darwin cc1, it wants std* and this
568 # is std=. May need an option group for this as well.
569 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000570 self.addOption(JoinedOrSeparateOption('--sysroot'))
571
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000572 # Blanket pass-through options.
573
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000574 self.XanalyzerOption = self.addOption(SeparateOption('-Xanalyzer'))
575 self.XclangOption = self.addOption(SeparateOption('-Xclang'))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000576
Daniel Dunbar996ce962009-01-12 07:40:25 +0000577 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
578 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000579
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000580 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
581 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000582
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000583 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000584 self.XlinkerOption = self.addOption(SeparateOption('-Xlinker',
585 isLinkerInput=True,
586 noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000587
588 ####
589 # Bring on the random garbage.
590
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000591 self.sOption = self.addOption(FlagOption('-s'))
592
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000593 self.MGroup = OptionGroup('-M')
594 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
595 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
596 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
597 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
598 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
599 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
600 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
601 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
602 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000603 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000604 self.uGroup = OptionGroup('-u')
605 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000606
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000607 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000608 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
609 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000610 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
611 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
612 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000613 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000614 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
615 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000616 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000617 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000618
619 self.iGroup = OptionGroup('-i')
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000620 self.idirafterOption = self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
621 self.imacrosOption = self.addOption(JoinedOrSeparateOption('-imacros', self.iGroup))
622 self.iprefixOption = self.addOption(JoinedOrSeparateOption('-iprefix', self.iGroup))
Daniel Dunbar360c6ce2009-02-17 18:10:48 +0000623 self.isystem = self.addOption(JoinedOrSeparateOption('-isystem', self.iGroup))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000624 self.iwithprefixOption = self.addOption(JoinedOrSeparateOption('-iwithprefix', self.iGroup))
625 self.iwithprefixbeforeOption = self.addOption(JoinedOrSeparateOption('-iwithprefixbefore', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000626 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
627 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000628 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000629
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000630 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
631 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
632 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
633 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
634 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
635 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000636 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
637 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000638 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
639 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
640 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
641 self.prebindOption = self.addOption(FlagOption('-prebind'))
642 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
643 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
644 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000645 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000646 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000647 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
648 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
649 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
650 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000651 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000652 self.objectOption = self.addOption(FlagOption('-object'))
653 self.preloadOption = self.addOption(FlagOption('-preload'))
654 self.staticOption = self.addOption(FlagOption('-static'))
655 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000656 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000657 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
658 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000659 self.COption = self.addOption(FlagOption('-C'))
660 self.CCOption = self.addOption(FlagOption('-CC'))
661 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000662 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000663 self.POption = self.addOption(FlagOption('-P'))
664 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000665 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000666 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000667 self.traditionalOption = self.addOption(FlagOption('-traditional'))
668 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
669 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000670 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000671 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000672 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
673 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
674 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000675 self.whyloadOption = self.addOption(FlagOption('-whyload'))
676 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
677 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
678 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
679 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000680 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
681 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
682 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
683 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000684
685 self.all_loadOption = self.addOption(FlagOption('-all_load'))
686 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
687 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
688 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
689 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
690 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
691 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
692 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
693 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
694 self.image_baseOption = self.addOption(FlagOption('-image_base'))
695 self.initOption = self.addOption(SeparateOption('-init'))
696 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
697 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
698 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
699 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
700 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
701 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
702 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
703 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
704 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
705 # FIXME: This probably isn't necessary.
706 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
707 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000708 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000709 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000710
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000711 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
712 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000713
714 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000715
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000716 self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000717 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
718 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000719
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000720 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000721 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000722
723 doNotReallySupport = 1
724 if doNotReallySupport:
725 # Archaic gcc option.
726 self.addOption(FlagOption('-cpp-precomp'))
727 self.addOption(FlagOption('-no-cpp-precomp'))
728
729 # C options for testing
730
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000731 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
732
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000733 # FIXME: This is broken, we need -A as a single option to send
734 # stuff to cc1, but the way the ld spec is constructed it
735 # wants to see -A options but only as a separate arg.
736 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
737 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000738 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000739
740 self.IGroup = OptionGroup('-I')
741 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000742 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000743
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000744 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
745 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000746 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000747 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
748
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000749 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000750 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000751 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
752 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000753
754 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000755 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000756 # Not exactly sure how to decompose this. I split out -Xarch_
757 # because we need to recognize that in the driver driver part.
758 # FIXME: Man, this is lame it needs its own option.
759 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
760 self.addOption(JoinedOption('-X'))
761
762 # The driver needs to know about this flag.
763 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
764
765 # FIXME: Wrong?
766 # FIXME: What to do about the ambiguity of options like
767 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000768 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000769 self.dGroup = OptionGroup('-d')
770 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000771 self.dMOption = self.addOption(FlagOption('-dM', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000772 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000773 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000774
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000775 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000776 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
777 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000778 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
779 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000780 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000781 # FIXME: Naming.
782 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
783 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000784
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000785 # FIXME: How should we handle clang specific options? Do we
786 # want to avoid passing them to gcc/cc1 (which will generally
787 # not eat them), or should we let the user sort it out.
788
Mike Stumpb55cc632009-01-30 08:22:07 +0000789 self.fblocksGroup = OptionGroup('-fblocks')
790 self.f_blocks = self.addOption(FlagOption('-fblocks', self.fblocksGroup))
791 self.f_noblocks = self.addOption(FlagOption('-fno-blocks', self.fblocksGroup))
792 # self.fblocksOption = self.addOption(JoinedOption('-fblocks', self.fblocksGroup))
793
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000794 self.fGroup = OptionGroup('-f')
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000795 self.Clang_fGroup = OptionGroup('-f', self.fGroup)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000796 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
797 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
798 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
799
800 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000801 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000802 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000803 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000804 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000805 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000806 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
807 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000808 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000809 self.addOption(FlagOption('-femit-all-decls', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000810 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000811 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000812 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Douglas Gregor3573c0c2009-02-14 20:49:29 +0000813 self.f_freestandingOption = self.addOption(FlagOption('-ffreestanding', self.Clang_fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000814 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.Clang_fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000815 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000816 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000817 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000818 self.f_mathErrnoOption = self.addOption(FlagOption('-fmath-errno', self.fGroup))
819 self.f_noMathErrnoOption = self.addOption(FlagOption('-fno-math-errno', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000820 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000821 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
822 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
823 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000824 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.Clang_fGroup))
825 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000826 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
827 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
828 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000829 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.Clang_fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000830 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000831 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.Clang_fGroup))
832 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.Clang_fGroup))
833 self.f_objcNonfragileAbiOption = self.addOption(FlagOption('-fobjc-nonfragile-abi', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000834 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000835 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000836 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000837 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000838 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000839 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000840 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
841 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
842 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000843 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
844 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000845 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar00dbfde2009-02-18 05:01:43 +0000846 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000847 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000848 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar4311e452009-02-20 07:35:04 +0000849 self.f_noUnwindTablesOption = self.addOption(FlagOption('-fno-unwind-tables', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000850 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000851 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar3639b4d2009-03-04 19:17:10 +0000852 self.f_noZeroInitializedInBssOption = self.addOption(FlagOption('-fno-zero-initialized-in-bss', self.fGroup))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000853 self.fOption = self.addOption(JoinedOption('-f', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000854
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000855 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000856
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000857 self.mGroup = OptionGroup('-m')
858 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
859 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
860 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
861 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
862 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
863 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000864 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
865 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
866 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
867 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
868 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
869 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000870 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000871
Daniel Dunbar4311e452009-02-20 07:35:04 +0000872 self.m_mmxOption = self.addOption(FlagOption('-mmmx', self.mGroup))
873 self.m_noMmxOption = self.addOption(FlagOption('-mno-mmx', self.mGroup))
874 self.m_sseOption = self.addOption(FlagOption('-msse', self.mGroup))
875 self.m_noSseOption = self.addOption(FlagOption('-mno-sse', self.mGroup))
876 self.m_sse2Option = self.addOption(FlagOption('-msse2', self.mGroup))
877 self.m_noSse2Option = self.addOption(FlagOption('-mno-sse2', self.mGroup))
878 self.m_sse3Option = self.addOption(FlagOption('-msse3', self.mGroup))
879 self.m_noSse3Option = self.addOption(FlagOption('-mno-sse3', self.mGroup))
880 self.m_ssse3Option = self.addOption(FlagOption('-mssse3', self.mGroup))
881 self.m_noSsse3Option = self.addOption(FlagOption('-mno-ssse3', self.mGroup))
882 self.m_sse41Option = self.addOption(FlagOption('-msse41', self.mGroup))
883 self.m_noSse41Option = self.addOption(FlagOption('-mno-sse41', self.mGroup))
884 self.m_sse42Option = self.addOption(FlagOption('-msse42', self.mGroup))
885 self.m_noSse42Option = self.addOption(FlagOption('-mno-sse42', self.mGroup))
886 self.m_sse4aOption = self.addOption(FlagOption('-msse4a', self.mGroup))
887 self.m_noSse4aOption = self.addOption(FlagOption('-mno-sse4a', self.mGroup))
888 self.m_3dnowOption = self.addOption(FlagOption('-m3dnow', self.mGroup))
889 self.m_no3dnowOption = self.addOption(FlagOption('-mno-3dnow', self.mGroup))
890 self.m_3dnowaOption = self.addOption(FlagOption('-m3dnowa', self.mGroup))
891 self.m_no3dnowaOption = self.addOption(FlagOption('-mno-3dnowa', self.mGroup))
892 self.m_redZoneOption = self.addOption(FlagOption('-mred-zone', self.mGroup))
893 self.m_noRedZoneOption = self.addOption(FlagOption('-mno-red-zone', self.mGroup))
894 self.m_softFloatOption = self.addOption(FlagOption('-msoft-float', self.mGroup))
895 self.m_noSoftFloatOption = self.addOption(FlagOption('-mno-soft-float', self.mGroup))
896
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000897 # Ugh. Need to disambiguate our naming convetion. -m x goes to
898 # the linker sometimes, wheres -mxxxx is used for a variety of
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000899 # other things.
900 self.mSeparate = self.addOption(SeparateOption('-m', self.mGroup))
901 self.mJoined = self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000902
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000903 # FIXME: Why does Darwin send -a* to cc1?
904 self.aGroup = OptionGroup('-a')
905 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000906
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000907 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
908
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000909 self.pedanticGroup = OptionGroup('-pedantic')
910 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
911 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000912 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000913
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000914 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000915 self.ClangWGroup = OptionGroup('-W', self.WGroup)
916
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000917 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000918 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
919 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
920 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
921 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
922 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
923 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
924 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000925
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000926 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
927 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
928 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000929
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000930 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000931 # works. There is something else going on which interprets the
932 # '='.
933 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000934
Daniel Dunbardff9f502009-01-12 18:51:02 +0000935 # FIXME: What is this? I think only one is valid, but have a
936 # log that uses both.
937 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000938 self.addOption(FlagOption('-pthreads'))
939
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000940 # Version control.
941 # FIXME: Figure out what to do about these.
Daniel Dunbar76715912009-01-28 19:26:20 +0000942 self.BOption = self.addOption(JoinedOrSeparateOption('-B', unsupported=True))
943 self.addOption(JoinedOrSeparateOption('-V', unsupported=True))
944 self.addOption(JoinedOrSeparateOption('-b', unsupported=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000945
Daniel Dunbarde388a52009-01-21 01:07:49 +0000946 # Clang static analyzer options (also see -WA,).
947 self.analyzeOption = self.addOption(FlagOption('--analyze'))
948
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000949 # Long option handling (aliases).
950 self.addOption(FlagOption('--help'))
951 self.addOption(FlagOption('--target-help'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000952 # FIXME: Who handles this?
953 self.addOption(FlagOption('--version'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000954
955 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
956 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
957 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000958 self.addOption(FlagOption('--combine', alias=self.combineOption))
959 self.addOption(FlagOption('--comments', alias=self.COption))
960 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
961 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000962 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000963 self.addOption(FlagOption('--dependencies', alias=self.MOption))
964 self.addOption(FlagOption('--entry', alias=self.eOption))
965 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
966 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
967 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
968 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
969 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
970# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
971 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
972 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
973 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
974 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
975 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
976 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
977# self.addOption(FlagOption('--pie', alias=self.pieOption))
978 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
979 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000980 self.addOption(JoinedOption('--param=', alias=self._paramOption,
981 forceSeparateRender=True))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000982 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
983 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000984 self.addOption(FlagOption('--print-libgcc-file-name',
985 alias=self.printLibgccFileNameOption))
986 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
987 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
988 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
989 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000990 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
991 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000992 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
993 self.addOption(FlagOption('--profile', alias=self.pOption))
994 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
995# self.addOption(FlagOption('--quiet', alias=self.qOption))
996# self.addOption(FlagOption('--shared', alias=self.sharedOption))
997# self.addOption(FlagOption('--silent', alias=self.qOption))
998 self.addOption(FlagOption('--static', alias=self.staticOption))
999# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
1000# self.addOption(FlagOption('--time', alias=self.timeOption))
1001 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
1002 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
1003 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
1004 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
1005 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
1006 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001007 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +00001008 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
1009 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001010
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001011 # Long options with joined & separate forms (coercing to
1012 # joined form).
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001013
1014 self.addOption(SeparateOption('--assert', alias=self.AOption))
1015 self.addOption(JoinedOption('--assert=', alias=self.AOption,
1016 forceSeparateRender=True))
1017 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
1018 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
1019 forceJoinedRender=True))
1020 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
1021 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
1022 forceJoinedRender=True))
1023 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
1024 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
1025 forceJoinedRender=True))
1026 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
1027 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
1028 forceJoinedRender=True))
1029 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
1030 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
1031 forceJoinedRender=True))
1032 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
1033 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
1034 forceJoinedRender=True))
1035 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
1036 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
1037 forceJoinedRender=True))
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001038 self.addOption(JoinedOption('--machine=', alias=self.mJoined))
1039 self.addOption(SeparateOption('--machine', alias=self.mJoined,
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001040 forceJoinedRender=True))
1041 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
1042 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
1043 forceJoinedRender=True))
1044 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
1045 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
1046 forceJoinedRender=True))
1047 self.addOption(JoinedOption('--specs=', alias=self.specsOption))
1048 self.addOption(SeparateOption('--specs', alias=self.specsOption,
1049 forceJoinedRender=True))
1050 self.addOption(JoinedOption('--std=', alias=self.stdOption))
1051 self.addOption(SeparateOption('--std', alias=self.stdOption,
1052 forceJoinedRender=True))
1053 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
1054 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
1055 forceJoinedRender=True))
1056 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
1057 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
1058 forceJoinedRender=True))
1059
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001060 # Long options with joined & separate forms (coercing to
1061 # separate form).
1062
1063# self.addOption(JoinedOption('--dump=', alias=self.dOption,
1064# forceSeparateRender=True))
1065# self.addOption(SeparateOption('--dump', alias=self.dOption))
1066# self.addOption(JoinedOption('--dumpbase=', alias=self.dumpbaseOption,
1067# forceSeparateRender=True))
1068# self.addOption(SeparateOption('--dumpbase', alias=self.dumpbaseOption))
1069# self.addOption(JoinedOption('--for-assembler=', alias=self.WaOption,
1070# forceSeparateRender=True))
1071# self.addOption(SeparateOption('--for-assembler', alias=self.WaOption))
1072 self.addOption(JoinedOption('--for-linker=', alias=self.XlinkerOption,
1073 forceSeparateRender=True,
1074 isLinkerInput=True,
1075 noOptAsInput=True))
1076 self.addOption(SeparateOption('--for-linker', alias=self.XlinkerOption,
1077 isLinkerInput=True,
1078 noOptAsInput=True))
1079 self.addOption(JoinedOption('--force-link=', alias=self.uOption,
1080 forceSeparateRender=True))
1081 self.addOption(SeparateOption('--force-link', alias=self.uOption))
1082 self.addOption(JoinedOption('--imacros=', alias=self.imacrosOption,
1083 forceSeparateRender=True))
1084 self.addOption(SeparateOption('--imacros', alias=self.imacrosOption))
1085 self.addOption(JoinedOption('--include=', alias=self.includeOption,
1086 forceSeparateRender=True))
1087 self.addOption(SeparateOption('--include', alias=self.includeOption))
1088 self.addOption(JoinedOption('--include-directory-after=', alias=self.idirafterOption,
1089 forceSeparateRender=True))
1090 self.addOption(SeparateOption('--include-directory-after', alias=self.idirafterOption))
1091 self.addOption(JoinedOption('--include-prefix=', alias=self.iprefixOption,
1092 forceSeparateRender=True))
1093 self.addOption(SeparateOption('--include-prefix', alias=self.iprefixOption))
1094 self.addOption(JoinedOption('--include-with-prefix=', alias=self.iwithprefixOption,
1095 forceSeparateRender=True))
1096 self.addOption(SeparateOption('--include-with-prefix', alias=self.iwithprefixOption))
1097 self.addOption(JoinedOption('--include-with-prefix-before=', alias=self.iwithprefixbeforeOption,
1098 forceSeparateRender=True))
1099 self.addOption(SeparateOption('--include-with-prefix-before', alias=self.iwithprefixbeforeOption))
1100 self.addOption(JoinedOption('--include-with-prefix-after=', alias=self.iwithprefixOption,
1101 forceSeparateRender=True))
1102 self.addOption(SeparateOption('--include-with-prefix-after', alias=self.iwithprefixOption))
1103 self.addOption(JoinedOption('--language=', alias=self.xOption,
1104 forceSeparateRender=True))
1105 self.addOption(SeparateOption('--language', alias=self.xOption))
1106 self.addOption(JoinedOption('--library-directory=', alias=self.LOption,
1107 forceSeparateRender=True))
1108 self.addOption(SeparateOption('--library-directory', alias=self.LOption))
1109 self.addOption(JoinedOption('--output=', alias=self.oOption,
1110 forceSeparateRender=True))
1111 self.addOption(SeparateOption('--output', alias=self.oOption))
1112 self.addOption(JoinedOption('--prefix=', alias=self.BOption,
1113 forceSeparateRender=True))
1114 self.addOption(SeparateOption('--prefix', alias=self.BOption))
1115
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001116 # Long options with joined forms. gcc's handling of '=' for
1117 # long forms makes these a bit odd.
1118 #
1119 # FIXME: We do not currently support these options. The
1120 # problem is that they need to be reparsed in their translated
1121 # form; they need to map to the correct option and we have to
1122 # find a way to do so without replicating all the declared
1123 # names.
1124 self.addOption(JoinedOption('--debug=', alias=self.gOption,
1125 unsupported=True))
1126 self.addOption(FlagOption('--debug', alias=self.gOption,
1127 unsupported=True))
1128 self.addOption(JoinedOption('--machine-=', alias=self.mJoined,
1129 unsupported=True))
1130 self.addOption(JoinedOption('--machine-', alias=self.mJoined,
1131 unsupported=True))
1132 self.addOption(JoinedOption('--optimize=', alias=self.OOption,
1133 unsupported=True))
1134 self.addOption(FlagOption('--optimize', alias=self.OOption,
1135 unsupported=True))
1136 self.addOption(JoinedOption('--warn-=', alias=self.WOption,
1137 unsupported=True))
1138 self.addOption(JoinedOption('--warn-', alias=self.WOption,
1139 unsupported=True))
1140
1141 # Ugh.
1142 self.addOption(JoinedOption('--', alias=self.fOption,
1143 unsupported=True))
1144
Daniel Dunbara5677512009-01-05 19:53:30 +00001145 def addOption(self, opt):
1146 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +00001147 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +00001148
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001149 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +00001150 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001151 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +00001152
1153 Parse command line into individual option instances.
1154 """
1155
1156 iargs = enumerate(argv)
1157 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001158 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +00001159 for pos,a in it:
1160 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +00001161 if not a:
1162 # gcc's handling of empty arguments doesn't make
1163 # sense, but this is not a common use case. :)
1164 #
1165 # We just ignore them here (note that other things may
1166 # still take them as arguments).
1167 pass
Daniel Dunbar5e83baa2009-02-06 01:28:59 +00001168 elif a[0] == '@':
Daniel Dunbar83d67902009-02-16 18:18:43 +00001169 # @<filename> is only an argument list if it actually
1170 # exists, otherwise it is treated like an input.
1171 if os.path.exists(a[1:]):
1172 # FIXME: Handle '@'
1173 raise InvalidArgumentsError('@ style argument lists are unsupported')
1174 else:
1175 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001176 elif a[0] == '-' and a != '-':
1177 args.append(self.lookupOptForArg(i, a, it))
1178 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +00001179 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001180 return args
1181
Daniel Dunbar5039f212009-01-06 02:30:10 +00001182 def lookupOptForArg(self, i, string, it):
1183 for o in self.options:
1184 arg = o.accept(i, string, it)
1185 if arg is not None:
1186 return arg
1187 return PositionalArg(i, self.unknownOption)