blob: c2b61dec29937e5f2150474521613db0ea8f2ad5 [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 Dunbarcad3df82009-03-09 17:43:51 +0000539 self.addOption(SeparateOption('-specs', unsupported=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000540
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000541 # Pipeline control
542 self.hashHashHashOption = self.addOption(FlagOption('-###'))
543 self.EOption = self.addOption(FlagOption('-E'))
544 self.SOption = self.addOption(FlagOption('-S'))
545 self.cOption = self.addOption(FlagOption('-c'))
Daniel Dunbare4c0da82009-01-30 00:12:29 +0000546 self.combineOption = self.addOption(FlagOption('-combine', unsupported=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000547 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
548 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000549 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000550
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000551 # FIXME: Error out if this is used.
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000552 self.specsOption = self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000553 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000554 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000555 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000556 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000557
558 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000559 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000560 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
561
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000562 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
563 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000564
565 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
566 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000567
568 # FIXME: This is broken in Darwin cc1, it wants std* and this
569 # is std=. May need an option group for this as well.
570 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000571
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 Dunbarcad3df82009-03-09 17:43:51 +0000628 self.iwithsysrootOption = self.addOption(JoinedOrSeparateOption('-iwithsysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000629 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000630
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000631 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
632 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
633 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
634 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
635 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
636 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000637 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
638 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000639 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
640 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
641 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
642 self.prebindOption = self.addOption(FlagOption('-prebind'))
643 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
644 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
645 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000646 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000647 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000648 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
649 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
650 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
651 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000652 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000653 self.objectOption = self.addOption(FlagOption('-object'))
654 self.preloadOption = self.addOption(FlagOption('-preload'))
655 self.staticOption = self.addOption(FlagOption('-static'))
656 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000657 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000658 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
659 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000660 self.COption = self.addOption(FlagOption('-C'))
661 self.CCOption = self.addOption(FlagOption('-CC'))
662 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000663 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000664 self.POption = self.addOption(FlagOption('-P'))
665 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000666 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000667 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000668 self.traditionalOption = self.addOption(FlagOption('-traditional'))
669 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000670 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000671 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
672 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
673 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000674 self.whyloadOption = self.addOption(FlagOption('-whyload'))
675 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
676 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
677 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
678 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000679 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
680 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
681 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
682 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000683
684 self.all_loadOption = self.addOption(FlagOption('-all_load'))
685 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
686 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
687 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
688 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
689 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
690 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
691 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
692 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
693 self.image_baseOption = self.addOption(FlagOption('-image_base'))
694 self.initOption = self.addOption(SeparateOption('-init'))
695 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
696 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
697 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
698 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
699 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
700 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
701 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
702 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
703 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
704 # FIXME: This probably isn't necessary.
705 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
706 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000707 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000708 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000709
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000710 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
711 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000712
713 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000714
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000715 self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000716 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
717 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000718
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000719 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000720 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000721
722 doNotReallySupport = 1
723 if doNotReallySupport:
724 # Archaic gcc option.
725 self.addOption(FlagOption('-cpp-precomp'))
726 self.addOption(FlagOption('-no-cpp-precomp'))
727
728 # C options for testing
729
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000730 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
731
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000732 # FIXME: This is broken, we need -A as a single option to send
733 # stuff to cc1, but the way the ld spec is constructed it
734 # wants to see -A options but only as a separate arg.
735 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
736 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000737 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000738
739 self.IGroup = OptionGroup('-I')
740 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000741 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000742
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000743 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
Daniel Dunbarcad3df82009-03-09 17:43:51 +0000744
745 self.TGroup = OptionGroup('-T')
746 self.addOption(JoinedOrSeparateOption('-Tbss', self.TGroup))
747 self.addOption(JoinedOrSeparateOption('-Tdata', self.TGroup))
748 self.addOption(JoinedOrSeparateOption('-Ttext', self.TGroup))
749 self.addOption(JoinedOrSeparateOption('-T', self.TGroup))
750
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000751 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000752 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
753
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000754 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000755 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000756 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
757 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000758
759 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000760 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000761 # Not exactly sure how to decompose this. I split out -Xarch_
762 # because we need to recognize that in the driver driver part.
763 # FIXME: Man, this is lame it needs its own option.
764 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
765 self.addOption(JoinedOption('-X'))
766
767 # The driver needs to know about this flag.
768 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
769
770 # FIXME: Wrong?
771 # FIXME: What to do about the ambiguity of options like
772 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000773 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000774 self.dGroup = OptionGroup('-d')
775 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000776 self.dMOption = self.addOption(FlagOption('-dM', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000777 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000778 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000779
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000780 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000781 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
782 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000783 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
784 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000785 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000786 # FIXME: Naming.
787 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
788 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000789
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000790 # FIXME: How should we handle clang specific options? Do we
791 # want to avoid passing them to gcc/cc1 (which will generally
792 # not eat them), or should we let the user sort it out.
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 Dunbard639b422009-03-12 03:28:55 +0000801 self.f_blocksOption = self.addOption(FlagOption('-fblocks', self.Clang_fGroup))
802 self.f_noBlocksOption = self.addOption(FlagOption('-fno-blocks', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000803 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000804 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000805 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000806 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000807 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000808 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
809 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000810 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000811 self.addOption(FlagOption('-femit-all-decls', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000812 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000813 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000814 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Douglas Gregor3573c0c2009-02-14 20:49:29 +0000815 self.f_freestandingOption = self.addOption(FlagOption('-ffreestanding', self.Clang_fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000816 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.Clang_fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000817 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000818 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000819 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000820 self.f_mathErrnoOption = self.addOption(FlagOption('-fmath-errno', self.fGroup))
821 self.f_noMathErrnoOption = self.addOption(FlagOption('-fno-math-errno', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000822 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000823 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
824 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
825 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000826 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.Clang_fGroup))
827 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000828 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
829 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
830 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000831 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.Clang_fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000832 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000833 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.Clang_fGroup))
834 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.Clang_fGroup))
835 self.f_objcNonfragileAbiOption = self.addOption(FlagOption('-fobjc-nonfragile-abi', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000836 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000837 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000838 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000839 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000840 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000841 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000842 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
843 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
844 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000845 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
846 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000847 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar9db8f5d2009-03-10 00:35:30 +0000848 self.f_templateDepthOption = self.addOption(JoinedOption('-ftemplate-depth-', self.fGroup))
Daniel Dunbar00dbfde2009-02-18 05:01:43 +0000849 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000850 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000851 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar4311e452009-02-20 07:35:04 +0000852 self.f_noUnwindTablesOption = self.addOption(FlagOption('-fno-unwind-tables', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000853 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000854 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar3639b4d2009-03-04 19:17:10 +0000855 self.f_noZeroInitializedInBssOption = self.addOption(FlagOption('-fno-zero-initialized-in-bss', self.fGroup))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000856 self.fOption = self.addOption(JoinedOption('-f', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000857
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000858 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000859
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000860 self.mGroup = OptionGroup('-m')
861 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
862 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
863 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
864 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
865 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
866 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000867 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
868 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
869 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
870 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
871 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
872 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000873 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000874
Daniel Dunbar4311e452009-02-20 07:35:04 +0000875 self.m_mmxOption = self.addOption(FlagOption('-mmmx', self.mGroup))
876 self.m_noMmxOption = self.addOption(FlagOption('-mno-mmx', self.mGroup))
877 self.m_sseOption = self.addOption(FlagOption('-msse', self.mGroup))
878 self.m_noSseOption = self.addOption(FlagOption('-mno-sse', self.mGroup))
879 self.m_sse2Option = self.addOption(FlagOption('-msse2', self.mGroup))
880 self.m_noSse2Option = self.addOption(FlagOption('-mno-sse2', self.mGroup))
881 self.m_sse3Option = self.addOption(FlagOption('-msse3', self.mGroup))
882 self.m_noSse3Option = self.addOption(FlagOption('-mno-sse3', self.mGroup))
883 self.m_ssse3Option = self.addOption(FlagOption('-mssse3', self.mGroup))
884 self.m_noSsse3Option = self.addOption(FlagOption('-mno-ssse3', self.mGroup))
885 self.m_sse41Option = self.addOption(FlagOption('-msse41', self.mGroup))
886 self.m_noSse41Option = self.addOption(FlagOption('-mno-sse41', self.mGroup))
887 self.m_sse42Option = self.addOption(FlagOption('-msse42', self.mGroup))
888 self.m_noSse42Option = self.addOption(FlagOption('-mno-sse42', self.mGroup))
889 self.m_sse4aOption = self.addOption(FlagOption('-msse4a', self.mGroup))
890 self.m_noSse4aOption = self.addOption(FlagOption('-mno-sse4a', self.mGroup))
891 self.m_3dnowOption = self.addOption(FlagOption('-m3dnow', self.mGroup))
892 self.m_no3dnowOption = self.addOption(FlagOption('-mno-3dnow', self.mGroup))
893 self.m_3dnowaOption = self.addOption(FlagOption('-m3dnowa', self.mGroup))
894 self.m_no3dnowaOption = self.addOption(FlagOption('-mno-3dnowa', self.mGroup))
895 self.m_redZoneOption = self.addOption(FlagOption('-mred-zone', self.mGroup))
896 self.m_noRedZoneOption = self.addOption(FlagOption('-mno-red-zone', self.mGroup))
897 self.m_softFloatOption = self.addOption(FlagOption('-msoft-float', self.mGroup))
898 self.m_noSoftFloatOption = self.addOption(FlagOption('-mno-soft-float', self.mGroup))
899
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000900 # Ugh. Need to disambiguate our naming convetion. -m x goes to
901 # the linker sometimes, wheres -mxxxx is used for a variety of
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000902 # other things.
903 self.mSeparate = self.addOption(SeparateOption('-m', self.mGroup))
904 self.mJoined = self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000905
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000906 # FIXME: Why does Darwin send -a* to cc1?
907 self.aGroup = OptionGroup('-a')
908 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000909
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000910 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
911
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000912 self.pedanticGroup = OptionGroup('-pedantic')
913 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
914 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000915 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000916
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000917 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000918 self.ClangWGroup = OptionGroup('-W', self.WGroup)
919
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000920 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000921 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
922 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
923 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
924 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
925 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
926 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
927 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000928
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000929 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
930 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
931 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000932
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000933 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000934 # works. There is something else going on which interprets the
935 # '='.
936 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000937
Daniel Dunbardff9f502009-01-12 18:51:02 +0000938 # FIXME: What is this? I think only one is valid, but have a
939 # log that uses both.
940 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000941 self.addOption(FlagOption('-pthreads'))
942
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000943 # Version control.
944 # FIXME: Figure out what to do about these.
Daniel Dunbar76715912009-01-28 19:26:20 +0000945 self.BOption = self.addOption(JoinedOrSeparateOption('-B', unsupported=True))
946 self.addOption(JoinedOrSeparateOption('-V', unsupported=True))
947 self.addOption(JoinedOrSeparateOption('-b', unsupported=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000948
Daniel Dunbarde388a52009-01-21 01:07:49 +0000949 # Clang static analyzer options (also see -WA,).
950 self.analyzeOption = self.addOption(FlagOption('--analyze'))
951
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000952 # Long option handling (aliases).
953 self.addOption(FlagOption('--help'))
954 self.addOption(FlagOption('--target-help'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000955 # FIXME: Who handles this?
956 self.addOption(FlagOption('--version'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000957
958 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
959 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
960 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000961 self.addOption(FlagOption('--combine', alias=self.combineOption))
962 self.addOption(FlagOption('--comments', alias=self.COption))
963 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
964 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000965 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000966 self.addOption(FlagOption('--dependencies', alias=self.MOption))
967 self.addOption(FlagOption('--entry', alias=self.eOption))
968 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000969 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
970 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
971 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
972# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
973 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
974 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
975 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
976 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
977 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
978 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
979# self.addOption(FlagOption('--pie', alias=self.pieOption))
980 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
981 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000982 self.addOption(JoinedOption('--param=', alias=self._paramOption,
983 forceSeparateRender=True))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000984 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
985 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000986 self.addOption(FlagOption('--print-libgcc-file-name',
987 alias=self.printLibgccFileNameOption))
988 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
989 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
990 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
991 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000992 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
993 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000994 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
995 self.addOption(FlagOption('--profile', alias=self.pOption))
996 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
997# self.addOption(FlagOption('--quiet', alias=self.qOption))
998# self.addOption(FlagOption('--shared', alias=self.sharedOption))
999# self.addOption(FlagOption('--silent', alias=self.qOption))
1000 self.addOption(FlagOption('--static', alias=self.staticOption))
1001# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
1002# self.addOption(FlagOption('--time', alias=self.timeOption))
1003 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
1004 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
1005 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
1006 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
1007 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
1008 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001009 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +00001010 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
1011 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001012
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001013 # Long options with joined & separate forms (coercing to
1014 # joined form).
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001015
1016 self.addOption(SeparateOption('--assert', alias=self.AOption))
1017 self.addOption(JoinedOption('--assert=', alias=self.AOption,
1018 forceSeparateRender=True))
1019 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
1020 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
1021 forceJoinedRender=True))
1022 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
1023 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
1024 forceJoinedRender=True))
1025 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
1026 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
1027 forceJoinedRender=True))
1028 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
1029 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
1030 forceJoinedRender=True))
1031 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
1032 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
1033 forceJoinedRender=True))
1034 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
1035 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
1036 forceJoinedRender=True))
1037 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
1038 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
1039 forceJoinedRender=True))
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001040 self.addOption(JoinedOption('--machine=', alias=self.mJoined))
1041 self.addOption(SeparateOption('--machine', alias=self.mJoined,
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001042 forceJoinedRender=True))
1043 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
1044 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
1045 forceJoinedRender=True))
1046 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
1047 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
1048 forceJoinedRender=True))
Daniel Dunbarcad3df82009-03-09 17:43:51 +00001049 self.addOption(JoinedOption('--specs=', alias=self.specsOption,
1050 unsupported=True))
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001051 self.addOption(SeparateOption('--specs', alias=self.specsOption,
Daniel Dunbarcad3df82009-03-09 17:43:51 +00001052 forceJoinedRender=True, unsupported=True))
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001053 self.addOption(JoinedOption('--std=', alias=self.stdOption))
1054 self.addOption(SeparateOption('--std', alias=self.stdOption,
1055 forceJoinedRender=True))
1056 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
1057 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
1058 forceJoinedRender=True))
1059 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
1060 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
1061 forceJoinedRender=True))
1062
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001063 # Long options with joined & separate forms (coercing to
1064 # separate form).
1065
1066# self.addOption(JoinedOption('--dump=', alias=self.dOption,
1067# forceSeparateRender=True))
1068# self.addOption(SeparateOption('--dump', alias=self.dOption))
1069# self.addOption(JoinedOption('--dumpbase=', alias=self.dumpbaseOption,
1070# forceSeparateRender=True))
1071# self.addOption(SeparateOption('--dumpbase', alias=self.dumpbaseOption))
1072# self.addOption(JoinedOption('--for-assembler=', alias=self.WaOption,
1073# forceSeparateRender=True))
1074# self.addOption(SeparateOption('--for-assembler', alias=self.WaOption))
1075 self.addOption(JoinedOption('--for-linker=', alias=self.XlinkerOption,
1076 forceSeparateRender=True,
1077 isLinkerInput=True,
1078 noOptAsInput=True))
1079 self.addOption(SeparateOption('--for-linker', alias=self.XlinkerOption,
1080 isLinkerInput=True,
1081 noOptAsInput=True))
1082 self.addOption(JoinedOption('--force-link=', alias=self.uOption,
1083 forceSeparateRender=True))
1084 self.addOption(SeparateOption('--force-link', alias=self.uOption))
1085 self.addOption(JoinedOption('--imacros=', alias=self.imacrosOption,
1086 forceSeparateRender=True))
1087 self.addOption(SeparateOption('--imacros', alias=self.imacrosOption))
1088 self.addOption(JoinedOption('--include=', alias=self.includeOption,
1089 forceSeparateRender=True))
1090 self.addOption(SeparateOption('--include', alias=self.includeOption))
1091 self.addOption(JoinedOption('--include-directory-after=', alias=self.idirafterOption,
1092 forceSeparateRender=True))
1093 self.addOption(SeparateOption('--include-directory-after', alias=self.idirafterOption))
1094 self.addOption(JoinedOption('--include-prefix=', alias=self.iprefixOption,
1095 forceSeparateRender=True))
1096 self.addOption(SeparateOption('--include-prefix', alias=self.iprefixOption))
1097 self.addOption(JoinedOption('--include-with-prefix=', alias=self.iwithprefixOption,
1098 forceSeparateRender=True))
1099 self.addOption(SeparateOption('--include-with-prefix', alias=self.iwithprefixOption))
1100 self.addOption(JoinedOption('--include-with-prefix-before=', alias=self.iwithprefixbeforeOption,
1101 forceSeparateRender=True))
1102 self.addOption(SeparateOption('--include-with-prefix-before', alias=self.iwithprefixbeforeOption))
1103 self.addOption(JoinedOption('--include-with-prefix-after=', alias=self.iwithprefixOption,
1104 forceSeparateRender=True))
1105 self.addOption(SeparateOption('--include-with-prefix-after', alias=self.iwithprefixOption))
1106 self.addOption(JoinedOption('--language=', alias=self.xOption,
1107 forceSeparateRender=True))
1108 self.addOption(SeparateOption('--language', alias=self.xOption))
1109 self.addOption(JoinedOption('--library-directory=', alias=self.LOption,
1110 forceSeparateRender=True))
1111 self.addOption(SeparateOption('--library-directory', alias=self.LOption))
1112 self.addOption(JoinedOption('--output=', alias=self.oOption,
1113 forceSeparateRender=True))
1114 self.addOption(SeparateOption('--output', alias=self.oOption))
1115 self.addOption(JoinedOption('--prefix=', alias=self.BOption,
1116 forceSeparateRender=True))
1117 self.addOption(SeparateOption('--prefix', alias=self.BOption))
1118
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001119 # Long options with joined forms. gcc's handling of '=' for
1120 # long forms makes these a bit odd.
1121 #
1122 # FIXME: We do not currently support these options. The
1123 # problem is that they need to be reparsed in their translated
1124 # form; they need to map to the correct option and we have to
1125 # find a way to do so without replicating all the declared
1126 # names.
1127 self.addOption(JoinedOption('--debug=', alias=self.gOption,
1128 unsupported=True))
1129 self.addOption(FlagOption('--debug', alias=self.gOption,
1130 unsupported=True))
1131 self.addOption(JoinedOption('--machine-=', alias=self.mJoined,
1132 unsupported=True))
1133 self.addOption(JoinedOption('--machine-', alias=self.mJoined,
1134 unsupported=True))
1135 self.addOption(JoinedOption('--optimize=', alias=self.OOption,
1136 unsupported=True))
1137 self.addOption(FlagOption('--optimize', alias=self.OOption,
1138 unsupported=True))
1139 self.addOption(JoinedOption('--warn-=', alias=self.WOption,
1140 unsupported=True))
1141 self.addOption(JoinedOption('--warn-', alias=self.WOption,
1142 unsupported=True))
1143
1144 # Ugh.
1145 self.addOption(JoinedOption('--', alias=self.fOption,
1146 unsupported=True))
1147
Daniel Dunbara5677512009-01-05 19:53:30 +00001148 def addOption(self, opt):
1149 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +00001150 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +00001151
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001152 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +00001153 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001154 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +00001155
1156 Parse command line into individual option instances.
1157 """
1158
1159 iargs = enumerate(argv)
1160 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001161 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +00001162 for pos,a in it:
1163 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +00001164 if not a:
1165 # gcc's handling of empty arguments doesn't make
1166 # sense, but this is not a common use case. :)
1167 #
1168 # We just ignore them here (note that other things may
1169 # still take them as arguments).
1170 pass
Daniel Dunbar5e83baa2009-02-06 01:28:59 +00001171 elif a[0] == '@':
Daniel Dunbar83d67902009-02-16 18:18:43 +00001172 # @<filename> is only an argument list if it actually
1173 # exists, otherwise it is treated like an input.
1174 if os.path.exists(a[1:]):
1175 # FIXME: Handle '@'
1176 raise InvalidArgumentsError('@ style argument lists are unsupported')
1177 else:
1178 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001179 elif a[0] == '-' and a != '-':
1180 args.append(self.lookupOptForArg(i, a, it))
1181 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +00001182 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001183 return args
1184
Daniel Dunbar5039f212009-01-06 02:30:10 +00001185 def lookupOptForArg(self, i, string, it):
1186 for o in self.options:
1187 arg = o.accept(i, string, it)
1188 if arg is not None:
1189 return arg
1190 return PositionalArg(i, self.unknownOption)