blob: 5d20feaae1c64bc505b864c6b241671e6006a21a [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 Dunbarba6e3232009-01-06 06:12:13 +0000367 def getLastArg(self, option):
368 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000369
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000370 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000371 # Source 0 is argv.
372 if index.sourceId == 0:
373 return self.argv[index.pos + offset]
374
375 # Source 1 is synthetic argv.
376 if index.sourceId == 1:
377 return self.syntheticArgv[index.pos + offset]
378
379 raise RuntimeError,'Unknown source ID for index.'
380
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000381 def addLastArg(self, output, option):
382 """addLastArgs - Extend the given output vector with the last
383 instance of a given option."""
384 arg = self.getLastArg(option)
385 if arg:
386 output.extend(self.render(arg))
387
388 def addAllArgs(self, output, option):
389 """addAllArgs - Extend the given output vector with all
390 instances of a given option."""
391 for arg in self.getArgs(option):
392 output.extend(self.render(arg))
393
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000394 def addAllArgs2(self, output, optionA, optionB):
395 """addAllArgs2 - Extend the given output vector with all
396 instances of two given option, with relative order preserved."""
397 for arg in self.getArgs2(optionA, optionB):
398 output.extend(self.render(arg))
399
400 def addAllArgs3(self, output, optionA, optionB, optionC):
401 """addAllArgs3 - Extend the given output vector with all
402 instances of three given option, with relative order preserved."""
403 for arg in self.getArgs3(optionA, optionB, optionC):
404 output.extend(self.render(arg))
405
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000406 def addAllArgsTranslated(self, output, option, translation):
407 """addAllArgsTranslated - Extend the given output vector with
408 all instances of a given option, rendered as separate
409 arguments with the actual option name translated to a user
410 specified string. For example, '-foox' will be render as
411 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
412 translation.
413
414 This routine expects that the option can only yield ValueArg
415 instances."""
416 for arg in self.getArgs(option):
417 assert isinstance(arg, ValueArg)
418 output.append(translation)
419 output.append(self.getValue(arg))
420
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000421 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000422 pos = len(self.syntheticArgv)
423 self.syntheticArgv.extend(strings)
424 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000425
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000426 def makeFlagArg(self, option):
427 return Arg(self.makeIndex(option.name),
428 option)
429
430 def makeInputArg(self, string):
431 return PositionalArg(self.makeIndex(string),
432 self.parser.inputOption)
433
434 def makeUnknownArg(self, string):
435 return PositionalArg(self.makeIndex(string),
436 self.parser.unknownOption)
437
438 def makeSeparateArg(self, string, option):
439 return SeparateValueArg(self.makeIndex(option.name, string),
440 option)
441
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000442 def makeJoinedArg(self, string, option):
443 return JoinedValueArg(self.makeIndex(option.name + string),
444 option)
445
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000446 # Support use as a simple arg list.
447
448 def __iter__(self):
449 return iter(self.args)
450
451 def append(self, arg):
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000452 if arg.opt.unsupported:
453 raise InvalidArgumentsError('option %r is unsupported' % arg.opt.name)
454
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000455 self.args.append(arg)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000456
457 opt = arg.opt
458 if opt.alias:
459 opt = opt.alias
460 self.lastArgs[opt] = arg
461 if opt.group is not None:
462 self.lastArgs[opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000463
464 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000465 #
466 # FIXME: Clean this up once restructuring is done.
467
468 def render(self, arg):
469 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000470
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000471 def renderAsInput(self, arg):
472 return arg.renderAsInput(self)
473
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000474 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000475 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000476
477 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000478 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000479
480 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000481 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000482
483 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000484 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000485
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000486class DerivedArgList(ArgList):
487 def __init__(self, args):
488 super(DerivedArgList, self).__init__(args.parser, args.argv)
489 self.parser = args.parser
490 self.argv = args.argv
491 self.syntheticArgv = args.syntheticArgv
492 self.lastArgs = {}
493 self.args = []
494
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000495###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000496
Daniel Dunbara5677512009-01-05 19:53:30 +0000497class OptionParser:
498 def __init__(self):
499 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000500 self.inputOption = InputOption()
501 self.unknownOption = UnknownOption()
502
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000503 # Driver driver options
504 self.archOption = self.addOption(SeparateOption('-arch'))
505
506 # Misc driver options
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000507 self.passExitCodesOption = self.addOption(FlagOption('-pass-exit-codes'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000508 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
509 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
510 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
511 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000512 self.printLibgccFileNameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
513 self.printFileNameOption = self.addOption(JoinedOption('-print-file-name='))
514 self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000515 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000516 self.printMultiOsDirectoryOption = self.addOption(FlagOption('-print-multi-os-directory'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000517 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000518
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000519 # Pipeline control
520 self.hashHashHashOption = self.addOption(FlagOption('-###'))
521 self.EOption = self.addOption(FlagOption('-E'))
522 self.SOption = self.addOption(FlagOption('-S'))
523 self.cOption = self.addOption(FlagOption('-c'))
Daniel Dunbare4c0da82009-01-30 00:12:29 +0000524 self.combineOption = self.addOption(FlagOption('-combine', unsupported=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000525 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
526 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000527 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000528
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000529 # FIXME: Error out if this is used.
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000530 self.specsOption = self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000531 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000532 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000533 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000534 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000535
536 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000537 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000538 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
539
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000540 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
541 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000542
543 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
544 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000545
546 # FIXME: This is broken in Darwin cc1, it wants std* and this
547 # is std=. May need an option group for this as well.
548 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000549 self.addOption(JoinedOrSeparateOption('--sysroot'))
550
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000551 # Blanket pass-through options.
552
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000553 self.XanalyzerOption = self.addOption(SeparateOption('-Xanalyzer'))
554 self.XclangOption = self.addOption(SeparateOption('-Xclang'))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000555
Daniel Dunbar996ce962009-01-12 07:40:25 +0000556 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
557 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000558
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000559 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
560 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000561
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000562 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000563 self.XlinkerOption = self.addOption(SeparateOption('-Xlinker',
564 isLinkerInput=True,
565 noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000566
567 ####
568 # Bring on the random garbage.
569
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000570 self.sOption = self.addOption(FlagOption('-s'))
571
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000572 self.MGroup = OptionGroup('-M')
573 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
574 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
575 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
576 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
577 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
578 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
579 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
580 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
581 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000582 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000583 self.uGroup = OptionGroup('-u')
584 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000585
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000586 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000587 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
588 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000589 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
590 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
591 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000592 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000593 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
594 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000595 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000596 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000597
598 self.iGroup = OptionGroup('-i')
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000599 self.idirafterOption = self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
600 self.imacrosOption = self.addOption(JoinedOrSeparateOption('-imacros', self.iGroup))
601 self.iprefixOption = self.addOption(JoinedOrSeparateOption('-iprefix', self.iGroup))
602 self.iwithprefixOption = self.addOption(JoinedOrSeparateOption('-iwithprefix', self.iGroup))
603 self.iwithprefixbeforeOption = self.addOption(JoinedOrSeparateOption('-iwithprefixbefore', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000604 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
605 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000606 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000607
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000608 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
609 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
610 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
611 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
612 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
613 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000614 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
615 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000616 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
617 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
618 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
619 self.prebindOption = self.addOption(FlagOption('-prebind'))
620 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
621 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
622 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000623 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000624 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000625 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
626 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
627 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
628 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000629 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000630 self.objectOption = self.addOption(FlagOption('-object'))
631 self.preloadOption = self.addOption(FlagOption('-preload'))
632 self.staticOption = self.addOption(FlagOption('-static'))
633 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000634 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000635 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
636 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000637 self.COption = self.addOption(FlagOption('-C'))
638 self.CCOption = self.addOption(FlagOption('-CC'))
639 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000640 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000641 self.POption = self.addOption(FlagOption('-P'))
642 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000643 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000644 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000645 self.traditionalOption = self.addOption(FlagOption('-traditional'))
646 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
647 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000648 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000649 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000650 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
651 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
652 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000653 self.whyloadOption = self.addOption(FlagOption('-whyload'))
654 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
655 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
656 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
657 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000658 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
659 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
660 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
661 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000662
663 self.all_loadOption = self.addOption(FlagOption('-all_load'))
664 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
665 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
666 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
667 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
668 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
669 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
670 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
671 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
672 self.image_baseOption = self.addOption(FlagOption('-image_base'))
673 self.initOption = self.addOption(SeparateOption('-init'))
674 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
675 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
676 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
677 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
678 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
679 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
680 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
681 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
682 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
683 # FIXME: This probably isn't necessary.
684 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
685 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000686 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000687 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000688
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000689 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
690 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000691
692 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000693
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000694 self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000695 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
696 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000697
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000698 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000699 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000700
701 doNotReallySupport = 1
702 if doNotReallySupport:
703 # Archaic gcc option.
704 self.addOption(FlagOption('-cpp-precomp'))
705 self.addOption(FlagOption('-no-cpp-precomp'))
706
707 # C options for testing
708
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000709 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
710
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000711 # FIXME: This is broken, we need -A as a single option to send
712 # stuff to cc1, but the way the ld spec is constructed it
713 # wants to see -A options but only as a separate arg.
714 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
715 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000716 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000717
718 self.IGroup = OptionGroup('-I')
719 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000720 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000721
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000722 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
723 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000724 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000725 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
726
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000727 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000728 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000729 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
730 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000731
732 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000733 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000734 # Not exactly sure how to decompose this. I split out -Xarch_
735 # because we need to recognize that in the driver driver part.
736 # FIXME: Man, this is lame it needs its own option.
737 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
738 self.addOption(JoinedOption('-X'))
739
740 # The driver needs to know about this flag.
741 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
742
743 # FIXME: Wrong?
744 # FIXME: What to do about the ambiguity of options like
745 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000746 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000747 self.dGroup = OptionGroup('-d')
748 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar8425a0f2009-02-06 19:26:48 +0000749 self.dMOption = self.addOption(FlagOption('-dM', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000750 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000751 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000752
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000753 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000754 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
755 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000756 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
757 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000758 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000759 # FIXME: Naming.
760 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
761 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000762
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000763 # FIXME: How should we handle clang specific options? Do we
764 # want to avoid passing them to gcc/cc1 (which will generally
765 # not eat them), or should we let the user sort it out.
766
Mike Stumpb55cc632009-01-30 08:22:07 +0000767 self.fblocksGroup = OptionGroup('-fblocks')
768 self.f_blocks = self.addOption(FlagOption('-fblocks', self.fblocksGroup))
769 self.f_noblocks = self.addOption(FlagOption('-fno-blocks', self.fblocksGroup))
770 # self.fblocksOption = self.addOption(JoinedOption('-fblocks', self.fblocksGroup))
771
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000772 self.fGroup = OptionGroup('-f')
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000773 self.Clang_fGroup = OptionGroup('-f', self.fGroup)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000774 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
775 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
776 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
777
778 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000779 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000780 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000781 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000782 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000783 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000784 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
785 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000786 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000787 self.addOption(FlagOption('-femit-all-decls', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000788 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000789 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.Clang_fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000790 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Douglas Gregor3573c0c2009-02-14 20:49:29 +0000791 self.f_freestandingOption = self.addOption(FlagOption('-ffreestanding', self.Clang_fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000792 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.Clang_fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000793 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000794 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000795 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000796 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000797 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
798 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
799 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000800 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.Clang_fGroup))
801 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000802 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
803 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
804 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000805 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.Clang_fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000806 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000807 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.Clang_fGroup))
808 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.Clang_fGroup))
809 self.f_objcNonfragileAbiOption = self.addOption(FlagOption('-fobjc-nonfragile-abi', self.Clang_fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000810 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000811 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000812 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000813 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000814 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.Clang_fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000815 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000816 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
817 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
818 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000819 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
820 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000821 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000822 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000823 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000824 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar33244aa2009-02-04 21:21:08 +0000825 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.Clang_fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000826 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000827 self.fOption = self.addOption(JoinedOption('-f', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000828
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000829 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000830
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000831 self.mGroup = OptionGroup('-m')
832 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
833 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
834 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
835 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
836 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
837 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000838 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
839 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
840 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
841 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
842 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
843 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000844 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000845
846 # Ugh. Need to disambiguate our naming convetion. -m x goes to
847 # the linker sometimes, wheres -mxxxx is used for a variety of
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000848 # other things.
849 self.mSeparate = self.addOption(SeparateOption('-m', self.mGroup))
850 self.mJoined = self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000851
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000852 # FIXME: Why does Darwin send -a* to cc1?
853 self.aGroup = OptionGroup('-a')
854 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000855
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000856 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
857
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000858 self.pedanticGroup = OptionGroup('-pedantic')
859 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
860 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000861 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000862
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000863 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000864 self.ClangWGroup = OptionGroup('-W', self.WGroup)
865
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000866 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000867 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
868 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
869 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
870 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
871 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
872 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
873 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000874
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000875 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
876 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
877 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000878
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000879 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000880 # works. There is something else going on which interprets the
881 # '='.
882 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000883
Daniel Dunbardff9f502009-01-12 18:51:02 +0000884 # FIXME: What is this? I think only one is valid, but have a
885 # log that uses both.
886 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000887 self.addOption(FlagOption('-pthreads'))
888
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000889 # Version control.
890 # FIXME: Figure out what to do about these.
Daniel Dunbar76715912009-01-28 19:26:20 +0000891 self.BOption = self.addOption(JoinedOrSeparateOption('-B', unsupported=True))
892 self.addOption(JoinedOrSeparateOption('-V', unsupported=True))
893 self.addOption(JoinedOrSeparateOption('-b', unsupported=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000894
Daniel Dunbarde388a52009-01-21 01:07:49 +0000895 # Clang static analyzer options (also see -WA,).
896 self.analyzeOption = self.addOption(FlagOption('--analyze'))
897
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000898 # Long option handling (aliases).
899 self.addOption(FlagOption('--help'))
900 self.addOption(FlagOption('--target-help'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000901 # FIXME: Who handles this?
902 self.addOption(FlagOption('--version'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000903
904 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
905 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
906 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000907 self.addOption(FlagOption('--combine', alias=self.combineOption))
908 self.addOption(FlagOption('--comments', alias=self.COption))
909 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
910 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000911 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000912 self.addOption(FlagOption('--dependencies', alias=self.MOption))
913 self.addOption(FlagOption('--entry', alias=self.eOption))
914 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
915 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
916 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
917 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
918 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
919# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
920 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
921 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
922 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
923 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
924 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
925 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
926# self.addOption(FlagOption('--pie', alias=self.pieOption))
927 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
928 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000929 self.addOption(JoinedOption('--param=', alias=self._paramOption,
930 forceSeparateRender=True))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000931 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
932 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000933 self.addOption(FlagOption('--print-libgcc-file-name',
934 alias=self.printLibgccFileNameOption))
935 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
936 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
937 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
938 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000939 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
940 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000941 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
942 self.addOption(FlagOption('--profile', alias=self.pOption))
943 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
944# self.addOption(FlagOption('--quiet', alias=self.qOption))
945# self.addOption(FlagOption('--shared', alias=self.sharedOption))
946# self.addOption(FlagOption('--silent', alias=self.qOption))
947 self.addOption(FlagOption('--static', alias=self.staticOption))
948# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
949# self.addOption(FlagOption('--time', alias=self.timeOption))
950 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
951 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
952 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
953 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
954 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
955 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000956 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000957 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
958 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000959
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000960 # Long options with joined & separate forms (coercing to
961 # joined form).
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000962
963 self.addOption(SeparateOption('--assert', alias=self.AOption))
964 self.addOption(JoinedOption('--assert=', alias=self.AOption,
965 forceSeparateRender=True))
966 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
967 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
968 forceJoinedRender=True))
969 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
970 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
971 forceJoinedRender=True))
972 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
973 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
974 forceJoinedRender=True))
975 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
976 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
977 forceJoinedRender=True))
978 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
979 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
980 forceJoinedRender=True))
981 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
982 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
983 forceJoinedRender=True))
984 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
985 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
986 forceJoinedRender=True))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000987 self.addOption(JoinedOption('--machine=', alias=self.mJoined))
988 self.addOption(SeparateOption('--machine', alias=self.mJoined,
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000989 forceJoinedRender=True))
990 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
991 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
992 forceJoinedRender=True))
993 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
994 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
995 forceJoinedRender=True))
996 self.addOption(JoinedOption('--specs=', alias=self.specsOption))
997 self.addOption(SeparateOption('--specs', alias=self.specsOption,
998 forceJoinedRender=True))
999 self.addOption(JoinedOption('--std=', alias=self.stdOption))
1000 self.addOption(SeparateOption('--std', alias=self.stdOption,
1001 forceJoinedRender=True))
1002 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
1003 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
1004 forceJoinedRender=True))
1005 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
1006 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
1007 forceJoinedRender=True))
1008
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001009 # Long options with joined & separate forms (coercing to
1010 # separate form).
1011
1012# self.addOption(JoinedOption('--dump=', alias=self.dOption,
1013# forceSeparateRender=True))
1014# self.addOption(SeparateOption('--dump', alias=self.dOption))
1015# self.addOption(JoinedOption('--dumpbase=', alias=self.dumpbaseOption,
1016# forceSeparateRender=True))
1017# self.addOption(SeparateOption('--dumpbase', alias=self.dumpbaseOption))
1018# self.addOption(JoinedOption('--for-assembler=', alias=self.WaOption,
1019# forceSeparateRender=True))
1020# self.addOption(SeparateOption('--for-assembler', alias=self.WaOption))
1021 self.addOption(JoinedOption('--for-linker=', alias=self.XlinkerOption,
1022 forceSeparateRender=True,
1023 isLinkerInput=True,
1024 noOptAsInput=True))
1025 self.addOption(SeparateOption('--for-linker', alias=self.XlinkerOption,
1026 isLinkerInput=True,
1027 noOptAsInput=True))
1028 self.addOption(JoinedOption('--force-link=', alias=self.uOption,
1029 forceSeparateRender=True))
1030 self.addOption(SeparateOption('--force-link', alias=self.uOption))
1031 self.addOption(JoinedOption('--imacros=', alias=self.imacrosOption,
1032 forceSeparateRender=True))
1033 self.addOption(SeparateOption('--imacros', alias=self.imacrosOption))
1034 self.addOption(JoinedOption('--include=', alias=self.includeOption,
1035 forceSeparateRender=True))
1036 self.addOption(SeparateOption('--include', alias=self.includeOption))
1037 self.addOption(JoinedOption('--include-directory-after=', alias=self.idirafterOption,
1038 forceSeparateRender=True))
1039 self.addOption(SeparateOption('--include-directory-after', alias=self.idirafterOption))
1040 self.addOption(JoinedOption('--include-prefix=', alias=self.iprefixOption,
1041 forceSeparateRender=True))
1042 self.addOption(SeparateOption('--include-prefix', alias=self.iprefixOption))
1043 self.addOption(JoinedOption('--include-with-prefix=', alias=self.iwithprefixOption,
1044 forceSeparateRender=True))
1045 self.addOption(SeparateOption('--include-with-prefix', alias=self.iwithprefixOption))
1046 self.addOption(JoinedOption('--include-with-prefix-before=', alias=self.iwithprefixbeforeOption,
1047 forceSeparateRender=True))
1048 self.addOption(SeparateOption('--include-with-prefix-before', alias=self.iwithprefixbeforeOption))
1049 self.addOption(JoinedOption('--include-with-prefix-after=', alias=self.iwithprefixOption,
1050 forceSeparateRender=True))
1051 self.addOption(SeparateOption('--include-with-prefix-after', alias=self.iwithprefixOption))
1052 self.addOption(JoinedOption('--language=', alias=self.xOption,
1053 forceSeparateRender=True))
1054 self.addOption(SeparateOption('--language', alias=self.xOption))
1055 self.addOption(JoinedOption('--library-directory=', alias=self.LOption,
1056 forceSeparateRender=True))
1057 self.addOption(SeparateOption('--library-directory', alias=self.LOption))
1058 self.addOption(JoinedOption('--output=', alias=self.oOption,
1059 forceSeparateRender=True))
1060 self.addOption(SeparateOption('--output', alias=self.oOption))
1061 self.addOption(JoinedOption('--prefix=', alias=self.BOption,
1062 forceSeparateRender=True))
1063 self.addOption(SeparateOption('--prefix', alias=self.BOption))
1064
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001065 # Long options with joined forms. gcc's handling of '=' for
1066 # long forms makes these a bit odd.
1067 #
1068 # FIXME: We do not currently support these options. The
1069 # problem is that they need to be reparsed in their translated
1070 # form; they need to map to the correct option and we have to
1071 # find a way to do so without replicating all the declared
1072 # names.
1073 self.addOption(JoinedOption('--debug=', alias=self.gOption,
1074 unsupported=True))
1075 self.addOption(FlagOption('--debug', alias=self.gOption,
1076 unsupported=True))
1077 self.addOption(JoinedOption('--machine-=', alias=self.mJoined,
1078 unsupported=True))
1079 self.addOption(JoinedOption('--machine-', alias=self.mJoined,
1080 unsupported=True))
1081 self.addOption(JoinedOption('--optimize=', alias=self.OOption,
1082 unsupported=True))
1083 self.addOption(FlagOption('--optimize', alias=self.OOption,
1084 unsupported=True))
1085 self.addOption(JoinedOption('--warn-=', alias=self.WOption,
1086 unsupported=True))
1087 self.addOption(JoinedOption('--warn-', alias=self.WOption,
1088 unsupported=True))
1089
1090 # Ugh.
1091 self.addOption(JoinedOption('--', alias=self.fOption,
1092 unsupported=True))
1093
Daniel Dunbara5677512009-01-05 19:53:30 +00001094 def addOption(self, opt):
1095 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +00001096 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +00001097
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001098 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +00001099 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001100 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +00001101
1102 Parse command line into individual option instances.
1103 """
1104
1105 iargs = enumerate(argv)
1106 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001107 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +00001108 for pos,a in it:
1109 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +00001110 if not a:
1111 # gcc's handling of empty arguments doesn't make
1112 # sense, but this is not a common use case. :)
1113 #
1114 # We just ignore them here (note that other things may
1115 # still take them as arguments).
1116 pass
Daniel Dunbar5e83baa2009-02-06 01:28:59 +00001117 elif a[0] == '@':
Daniel Dunbar83d67902009-02-16 18:18:43 +00001118 # @<filename> is only an argument list if it actually
1119 # exists, otherwise it is treated like an input.
1120 if os.path.exists(a[1:]):
1121 # FIXME: Handle '@'
1122 raise InvalidArgumentsError('@ style argument lists are unsupported')
1123 else:
1124 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001125 elif a[0] == '-' and a != '-':
1126 args.append(self.lookupOptForArg(i, a, it))
1127 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +00001128 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001129 return args
1130
Daniel Dunbar5039f212009-01-06 02:30:10 +00001131 def lookupOptForArg(self, i, string, it):
1132 for o in self.options:
1133 arg = o.accept(i, string, it)
1134 if arg is not None:
1135 return arg
1136 return PositionalArg(i, self.unknownOption)