blob: 48819b083691fefe0fe0896fadf4b647a1f518cb [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 self.addOption(JoinedOrSeparateOption('--sysroot'))
572
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000573 # Blanket pass-through options.
574
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000575 self.XanalyzerOption = self.addOption(SeparateOption('-Xanalyzer'))
576 self.XclangOption = self.addOption(SeparateOption('-Xclang'))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000577
Daniel Dunbar996ce962009-01-12 07:40:25 +0000578 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
579 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000580
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000581 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
582 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000583
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000584 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000585 self.XlinkerOption = self.addOption(SeparateOption('-Xlinker',
586 isLinkerInput=True,
587 noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000588
589 ####
590 # Bring on the random garbage.
591
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000592 self.sOption = self.addOption(FlagOption('-s'))
593
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000594 self.MGroup = OptionGroup('-M')
595 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
596 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
597 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
598 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
599 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
600 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
601 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
602 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
603 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000604 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000605 self.uGroup = OptionGroup('-u')
606 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000607
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000608 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000609 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
610 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000611 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
612 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
613 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000614 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000615 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
616 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000617 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000618 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000619
620 self.iGroup = OptionGroup('-i')
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000621 self.idirafterOption = self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
622 self.imacrosOption = self.addOption(JoinedOrSeparateOption('-imacros', self.iGroup))
623 self.iprefixOption = self.addOption(JoinedOrSeparateOption('-iprefix', self.iGroup))
Daniel Dunbar360c6ce2009-02-17 18:10:48 +0000624 self.isystem = self.addOption(JoinedOrSeparateOption('-isystem', self.iGroup))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000625 self.iwithprefixOption = self.addOption(JoinedOrSeparateOption('-iwithprefix', self.iGroup))
626 self.iwithprefixbeforeOption = self.addOption(JoinedOrSeparateOption('-iwithprefixbefore', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000627 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
628 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbarcad3df82009-03-09 17:43:51 +0000629 self.iwithsysrootOption = self.addOption(JoinedOrSeparateOption('-iwithsysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000630 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000631
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000632 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
633 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
634 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
635 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
636 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
637 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000638 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
639 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000640 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
641 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
642 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
643 self.prebindOption = self.addOption(FlagOption('-prebind'))
644 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
645 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
646 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000647 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000648 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000649 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
650 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
651 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
652 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000653 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000654 self.objectOption = self.addOption(FlagOption('-object'))
655 self.preloadOption = self.addOption(FlagOption('-preload'))
656 self.staticOption = self.addOption(FlagOption('-static'))
657 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000658 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000659 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
660 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000661 self.COption = self.addOption(FlagOption('-C'))
662 self.CCOption = self.addOption(FlagOption('-CC'))
663 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000664 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000665 self.POption = self.addOption(FlagOption('-P'))
666 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000667 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000668 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000669 self.traditionalOption = self.addOption(FlagOption('-traditional'))
670 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
671 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000672 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000673 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000674 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
675 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
676 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000677 self.whyloadOption = self.addOption(FlagOption('-whyload'))
678 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
679 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
680 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
681 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000682 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
683 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
684 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
685 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000686
687 self.all_loadOption = self.addOption(FlagOption('-all_load'))
688 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
689 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
690 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
691 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
692 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
693 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
694 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
695 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
696 self.image_baseOption = self.addOption(FlagOption('-image_base'))
697 self.initOption = self.addOption(SeparateOption('-init'))
698 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
699 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
700 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
701 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
702 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
703 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
704 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
705 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
706 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
707 # FIXME: This probably isn't necessary.
708 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
709 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000710 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000711 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000712
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000713 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
714 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000715
716 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000717
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000718 self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000719 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
720 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000721
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000722 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000723 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000724
725 doNotReallySupport = 1
726 if doNotReallySupport:
727 # Archaic gcc option.
728 self.addOption(FlagOption('-cpp-precomp'))
729 self.addOption(FlagOption('-no-cpp-precomp'))
730
731 # C options for testing
732
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000733 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
734
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000735 # FIXME: This is broken, we need -A as a single option to send
736 # stuff to cc1, but the way the ld spec is constructed it
737 # wants to see -A options but only as a separate arg.
738 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
739 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000740 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000741
742 self.IGroup = OptionGroup('-I')
743 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000744 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000745
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000746 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
Daniel Dunbarcad3df82009-03-09 17:43:51 +0000747
748 self.TGroup = OptionGroup('-T')
749 self.addOption(JoinedOrSeparateOption('-Tbss', self.TGroup))
750 self.addOption(JoinedOrSeparateOption('-Tdata', self.TGroup))
751 self.addOption(JoinedOrSeparateOption('-Ttext', self.TGroup))
752 self.addOption(JoinedOrSeparateOption('-T', self.TGroup))
753
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000754 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000755 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
756
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000757 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000758 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000759 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
760 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000761
762 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000763 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000764 # Not exactly sure how to decompose this. I split out -Xarch_
765 # because we need to recognize that in the driver driver part.
766 # FIXME: Man, this is lame it needs its own option.
767 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
768 self.addOption(JoinedOption('-X'))
769
770 # The driver needs to know about this flag.
771 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
772
773 # FIXME: Wrong?
774 # FIXME: What to do about the ambiguity of options like
775 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000776 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000777 self.dGroup = OptionGroup('-d')
778 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000779 self.dMOption = self.addOption(FlagOption('-dM', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000780 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000781 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000782
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000783 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000784 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
785 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000786 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
787 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000788 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000789 # FIXME: Naming.
790 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
791 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000792
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000793 # FIXME: How should we handle clang specific options? Do we
794 # want to avoid passing them to gcc/cc1 (which will generally
795 # not eat them), or should we let the user sort it out.
796
Mike Stumpb55cc632009-01-30 08:22:07 +0000797 self.fblocksGroup = OptionGroup('-fblocks')
798 self.f_blocks = self.addOption(FlagOption('-fblocks', self.fblocksGroup))
799 self.f_noblocks = self.addOption(FlagOption('-fno-blocks', self.fblocksGroup))
800 # self.fblocksOption = self.addOption(JoinedOption('-fblocks', self.fblocksGroup))
801
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000802 self.fGroup = OptionGroup('-f')
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000803 self.Clang_fGroup = OptionGroup('-f', self.fGroup)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000804 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
805 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
806 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
807
808 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000809 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000810 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000811 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000812 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000813 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000814 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
815 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000816 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000817 self.addOption(FlagOption('-femit-all-decls', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000818 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000819 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000820 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Douglas Gregor3573c0c2009-02-14 20:49:29 +0000821 self.f_freestandingOption = self.addOption(FlagOption('-ffreestanding', self.Clang_fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000822 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.Clang_fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000823 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000824 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000825 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar27a02ac2009-02-17 00:42:05 +0000826 self.f_mathErrnoOption = self.addOption(FlagOption('-fmath-errno', self.fGroup))
827 self.f_noMathErrnoOption = self.addOption(FlagOption('-fno-math-errno', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000828 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000829 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
830 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
831 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000832 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.Clang_fGroup))
833 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000834 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
835 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
836 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000837 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.Clang_fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000838 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000839 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.Clang_fGroup))
840 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.Clang_fGroup))
841 self.f_objcNonfragileAbiOption = self.addOption(FlagOption('-fobjc-nonfragile-abi', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000842 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000843 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000844 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000845 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000846 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000847 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000848 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
849 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
850 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000851 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
852 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000853 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar00dbfde2009-02-18 05:01:43 +0000854 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000855 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000856 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar4311e452009-02-20 07:35:04 +0000857 self.f_noUnwindTablesOption = self.addOption(FlagOption('-fno-unwind-tables', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000858 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000859 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbar3639b4d2009-03-04 19:17:10 +0000860 self.f_noZeroInitializedInBssOption = self.addOption(FlagOption('-fno-zero-initialized-in-bss', self.fGroup))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000861 self.fOption = self.addOption(JoinedOption('-f', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000862
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000863 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000864
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000865 self.mGroup = OptionGroup('-m')
866 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
867 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
868 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
869 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
870 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
871 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000872 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
873 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
874 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
875 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
876 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
877 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000878 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000879
Daniel Dunbar4311e452009-02-20 07:35:04 +0000880 self.m_mmxOption = self.addOption(FlagOption('-mmmx', self.mGroup))
881 self.m_noMmxOption = self.addOption(FlagOption('-mno-mmx', self.mGroup))
882 self.m_sseOption = self.addOption(FlagOption('-msse', self.mGroup))
883 self.m_noSseOption = self.addOption(FlagOption('-mno-sse', self.mGroup))
884 self.m_sse2Option = self.addOption(FlagOption('-msse2', self.mGroup))
885 self.m_noSse2Option = self.addOption(FlagOption('-mno-sse2', self.mGroup))
886 self.m_sse3Option = self.addOption(FlagOption('-msse3', self.mGroup))
887 self.m_noSse3Option = self.addOption(FlagOption('-mno-sse3', self.mGroup))
888 self.m_ssse3Option = self.addOption(FlagOption('-mssse3', self.mGroup))
889 self.m_noSsse3Option = self.addOption(FlagOption('-mno-ssse3', self.mGroup))
890 self.m_sse41Option = self.addOption(FlagOption('-msse41', self.mGroup))
891 self.m_noSse41Option = self.addOption(FlagOption('-mno-sse41', self.mGroup))
892 self.m_sse42Option = self.addOption(FlagOption('-msse42', self.mGroup))
893 self.m_noSse42Option = self.addOption(FlagOption('-mno-sse42', self.mGroup))
894 self.m_sse4aOption = self.addOption(FlagOption('-msse4a', self.mGroup))
895 self.m_noSse4aOption = self.addOption(FlagOption('-mno-sse4a', self.mGroup))
896 self.m_3dnowOption = self.addOption(FlagOption('-m3dnow', self.mGroup))
897 self.m_no3dnowOption = self.addOption(FlagOption('-mno-3dnow', self.mGroup))
898 self.m_3dnowaOption = self.addOption(FlagOption('-m3dnowa', self.mGroup))
899 self.m_no3dnowaOption = self.addOption(FlagOption('-mno-3dnowa', self.mGroup))
900 self.m_redZoneOption = self.addOption(FlagOption('-mred-zone', self.mGroup))
901 self.m_noRedZoneOption = self.addOption(FlagOption('-mno-red-zone', self.mGroup))
902 self.m_softFloatOption = self.addOption(FlagOption('-msoft-float', self.mGroup))
903 self.m_noSoftFloatOption = self.addOption(FlagOption('-mno-soft-float', self.mGroup))
904
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000905 # Ugh. Need to disambiguate our naming convetion. -m x goes to
906 # the linker sometimes, wheres -mxxxx is used for a variety of
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000907 # other things.
908 self.mSeparate = self.addOption(SeparateOption('-m', self.mGroup))
909 self.mJoined = self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000910
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000911 # FIXME: Why does Darwin send -a* to cc1?
912 self.aGroup = OptionGroup('-a')
913 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000914
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000915 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
916
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000917 self.pedanticGroup = OptionGroup('-pedantic')
918 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
919 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000920 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000921
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000922 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000923 self.ClangWGroup = OptionGroup('-W', self.WGroup)
924
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000925 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000926 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
927 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
928 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
929 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
930 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
931 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
932 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000933
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000934 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
935 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
936 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000937
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000938 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000939 # works. There is something else going on which interprets the
940 # '='.
941 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000942
Daniel Dunbardff9f502009-01-12 18:51:02 +0000943 # FIXME: What is this? I think only one is valid, but have a
944 # log that uses both.
945 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000946 self.addOption(FlagOption('-pthreads'))
947
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000948 # Version control.
949 # FIXME: Figure out what to do about these.
Daniel Dunbar76715912009-01-28 19:26:20 +0000950 self.BOption = self.addOption(JoinedOrSeparateOption('-B', unsupported=True))
951 self.addOption(JoinedOrSeparateOption('-V', unsupported=True))
952 self.addOption(JoinedOrSeparateOption('-b', unsupported=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000953
Daniel Dunbarde388a52009-01-21 01:07:49 +0000954 # Clang static analyzer options (also see -WA,).
955 self.analyzeOption = self.addOption(FlagOption('--analyze'))
956
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000957 # Long option handling (aliases).
958 self.addOption(FlagOption('--help'))
959 self.addOption(FlagOption('--target-help'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000960 # FIXME: Who handles this?
961 self.addOption(FlagOption('--version'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000962
963 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
964 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
965 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000966 self.addOption(FlagOption('--combine', alias=self.combineOption))
967 self.addOption(FlagOption('--comments', alias=self.COption))
968 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
969 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000970 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000971 self.addOption(FlagOption('--dependencies', alias=self.MOption))
972 self.addOption(FlagOption('--entry', alias=self.eOption))
973 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
974 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
975 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
976 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
977 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
978# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
979 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
980 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
981 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
982 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
983 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
984 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
985# self.addOption(FlagOption('--pie', alias=self.pieOption))
986 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
987 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000988 self.addOption(JoinedOption('--param=', alias=self._paramOption,
989 forceSeparateRender=True))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000990 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
991 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000992 self.addOption(FlagOption('--print-libgcc-file-name',
993 alias=self.printLibgccFileNameOption))
994 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
995 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
996 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
997 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000998 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
999 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +00001000 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
1001 self.addOption(FlagOption('--profile', alias=self.pOption))
1002 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
1003# self.addOption(FlagOption('--quiet', alias=self.qOption))
1004# self.addOption(FlagOption('--shared', alias=self.sharedOption))
1005# self.addOption(FlagOption('--silent', alias=self.qOption))
1006 self.addOption(FlagOption('--static', alias=self.staticOption))
1007# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
1008# self.addOption(FlagOption('--time', alias=self.timeOption))
1009 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
1010 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
1011 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
1012 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
1013 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
1014 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001015 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +00001016 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
1017 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +00001018
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001019 # Long options with joined & separate forms (coercing to
1020 # joined form).
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001021
1022 self.addOption(SeparateOption('--assert', alias=self.AOption))
1023 self.addOption(JoinedOption('--assert=', alias=self.AOption,
1024 forceSeparateRender=True))
1025 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
1026 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
1027 forceJoinedRender=True))
1028 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
1029 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
1030 forceJoinedRender=True))
1031 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
1032 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
1033 forceJoinedRender=True))
1034 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
1035 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
1036 forceJoinedRender=True))
1037 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
1038 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
1039 forceJoinedRender=True))
1040 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
1041 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
1042 forceJoinedRender=True))
1043 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
1044 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
1045 forceJoinedRender=True))
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001046 self.addOption(JoinedOption('--machine=', alias=self.mJoined))
1047 self.addOption(SeparateOption('--machine', alias=self.mJoined,
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001048 forceJoinedRender=True))
1049 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
1050 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
1051 forceJoinedRender=True))
1052 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
1053 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
1054 forceJoinedRender=True))
Daniel Dunbarcad3df82009-03-09 17:43:51 +00001055 self.addOption(JoinedOption('--specs=', alias=self.specsOption,
1056 unsupported=True))
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001057 self.addOption(SeparateOption('--specs', alias=self.specsOption,
Daniel Dunbarcad3df82009-03-09 17:43:51 +00001058 forceJoinedRender=True, unsupported=True))
Daniel Dunbar09d5b162009-01-23 08:16:41 +00001059 self.addOption(JoinedOption('--std=', alias=self.stdOption))
1060 self.addOption(SeparateOption('--std', alias=self.stdOption,
1061 forceJoinedRender=True))
1062 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
1063 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
1064 forceJoinedRender=True))
1065 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
1066 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
1067 forceJoinedRender=True))
1068
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001069 # Long options with joined & separate forms (coercing to
1070 # separate form).
1071
1072# self.addOption(JoinedOption('--dump=', alias=self.dOption,
1073# forceSeparateRender=True))
1074# self.addOption(SeparateOption('--dump', alias=self.dOption))
1075# self.addOption(JoinedOption('--dumpbase=', alias=self.dumpbaseOption,
1076# forceSeparateRender=True))
1077# self.addOption(SeparateOption('--dumpbase', alias=self.dumpbaseOption))
1078# self.addOption(JoinedOption('--for-assembler=', alias=self.WaOption,
1079# forceSeparateRender=True))
1080# self.addOption(SeparateOption('--for-assembler', alias=self.WaOption))
1081 self.addOption(JoinedOption('--for-linker=', alias=self.XlinkerOption,
1082 forceSeparateRender=True,
1083 isLinkerInput=True,
1084 noOptAsInput=True))
1085 self.addOption(SeparateOption('--for-linker', alias=self.XlinkerOption,
1086 isLinkerInput=True,
1087 noOptAsInput=True))
1088 self.addOption(JoinedOption('--force-link=', alias=self.uOption,
1089 forceSeparateRender=True))
1090 self.addOption(SeparateOption('--force-link', alias=self.uOption))
1091 self.addOption(JoinedOption('--imacros=', alias=self.imacrosOption,
1092 forceSeparateRender=True))
1093 self.addOption(SeparateOption('--imacros', alias=self.imacrosOption))
1094 self.addOption(JoinedOption('--include=', alias=self.includeOption,
1095 forceSeparateRender=True))
1096 self.addOption(SeparateOption('--include', alias=self.includeOption))
1097 self.addOption(JoinedOption('--include-directory-after=', alias=self.idirafterOption,
1098 forceSeparateRender=True))
1099 self.addOption(SeparateOption('--include-directory-after', alias=self.idirafterOption))
1100 self.addOption(JoinedOption('--include-prefix=', alias=self.iprefixOption,
1101 forceSeparateRender=True))
1102 self.addOption(SeparateOption('--include-prefix', alias=self.iprefixOption))
1103 self.addOption(JoinedOption('--include-with-prefix=', alias=self.iwithprefixOption,
1104 forceSeparateRender=True))
1105 self.addOption(SeparateOption('--include-with-prefix', alias=self.iwithprefixOption))
1106 self.addOption(JoinedOption('--include-with-prefix-before=', alias=self.iwithprefixbeforeOption,
1107 forceSeparateRender=True))
1108 self.addOption(SeparateOption('--include-with-prefix-before', alias=self.iwithprefixbeforeOption))
1109 self.addOption(JoinedOption('--include-with-prefix-after=', alias=self.iwithprefixOption,
1110 forceSeparateRender=True))
1111 self.addOption(SeparateOption('--include-with-prefix-after', alias=self.iwithprefixOption))
1112 self.addOption(JoinedOption('--language=', alias=self.xOption,
1113 forceSeparateRender=True))
1114 self.addOption(SeparateOption('--language', alias=self.xOption))
1115 self.addOption(JoinedOption('--library-directory=', alias=self.LOption,
1116 forceSeparateRender=True))
1117 self.addOption(SeparateOption('--library-directory', alias=self.LOption))
1118 self.addOption(JoinedOption('--output=', alias=self.oOption,
1119 forceSeparateRender=True))
1120 self.addOption(SeparateOption('--output', alias=self.oOption))
1121 self.addOption(JoinedOption('--prefix=', alias=self.BOption,
1122 forceSeparateRender=True))
1123 self.addOption(SeparateOption('--prefix', alias=self.BOption))
1124
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001125 # Long options with joined forms. gcc's handling of '=' for
1126 # long forms makes these a bit odd.
1127 #
1128 # FIXME: We do not currently support these options. The
1129 # problem is that they need to be reparsed in their translated
1130 # form; they need to map to the correct option and we have to
1131 # find a way to do so without replicating all the declared
1132 # names.
1133 self.addOption(JoinedOption('--debug=', alias=self.gOption,
1134 unsupported=True))
1135 self.addOption(FlagOption('--debug', alias=self.gOption,
1136 unsupported=True))
1137 self.addOption(JoinedOption('--machine-=', alias=self.mJoined,
1138 unsupported=True))
1139 self.addOption(JoinedOption('--machine-', alias=self.mJoined,
1140 unsupported=True))
1141 self.addOption(JoinedOption('--optimize=', alias=self.OOption,
1142 unsupported=True))
1143 self.addOption(FlagOption('--optimize', alias=self.OOption,
1144 unsupported=True))
1145 self.addOption(JoinedOption('--warn-=', alias=self.WOption,
1146 unsupported=True))
1147 self.addOption(JoinedOption('--warn-', alias=self.WOption,
1148 unsupported=True))
1149
1150 # Ugh.
1151 self.addOption(JoinedOption('--', alias=self.fOption,
1152 unsupported=True))
1153
Daniel Dunbara5677512009-01-05 19:53:30 +00001154 def addOption(self, opt):
1155 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +00001156 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +00001157
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001158 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +00001159 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001160 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +00001161
1162 Parse command line into individual option instances.
1163 """
1164
1165 iargs = enumerate(argv)
1166 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001167 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +00001168 for pos,a in it:
1169 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +00001170 if not a:
1171 # gcc's handling of empty arguments doesn't make
1172 # sense, but this is not a common use case. :)
1173 #
1174 # We just ignore them here (note that other things may
1175 # still take them as arguments).
1176 pass
Daniel Dunbar5e83baa2009-02-06 01:28:59 +00001177 elif a[0] == '@':
Daniel Dunbar83d67902009-02-16 18:18:43 +00001178 # @<filename> is only an argument list if it actually
1179 # exists, otherwise it is treated like an input.
1180 if os.path.exists(a[1:]):
1181 # FIXME: Handle '@'
1182 raise InvalidArgumentsError('@ style argument lists are unsupported')
1183 else:
1184 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001185 elif a[0] == '-' and a != '-':
1186 args.append(self.lookupOptForArg(i, a, it))
1187 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +00001188 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001189 return args
1190
Daniel Dunbar5039f212009-01-06 02:30:10 +00001191 def lookupOptForArg(self, i, string, it):
1192 for o in self.options:
1193 arg = o.accept(i, string, it)
1194 if arg is not None:
1195 return arg
1196 return PositionalArg(i, self.unknownOption)