blob: dcf1e70188f55bb30d1b235596acd465976cdbd1 [file] [log] [blame]
Daniel Dunbar94713452009-01-16 23:12:12 +00001
2###
3
4class InvalidArgumentsError(ValueError):
5 """InvalidArgumentsError - The driver arguments are invalid or
6 inconsistent."""
7
8class MissingArgumentError(ValueError):
9 """MissingArgumentError - An option required an argument but none
10 was given."""
11
12###
13
Daniel Dunbara5677512009-01-05 19:53:30 +000014class Option(object):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000015 """Option - Root option class."""
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000016
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000017 def __init__(self, name, group=None, alias=None,
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000018 isLinkerInput=False, noOptAsInput=False,
19 forceSeparateRender=False,
Daniel Dunbard9fb9722009-01-23 20:08:16 +000020 forceJoinedRender=False,
21 unsupported=False):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000022 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000023 # Multi-level aliases are not supported, and alias options
24 # cannot have groups. This just simplifies option tracking, it
25 # is not an inherent limitation.
26 assert alias is None or (alias.alias is None and
27 group is None)
28
Daniel Dunbara5677512009-01-05 19:53:30 +000029 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000030 self.group = group
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000031 self.alias = alias
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000032 self.isLinkerInput = isLinkerInput
33 self.noOptAsInput = noOptAsInput
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +000034 self.forceSeparateRender = forceSeparateRender
35 self.forceJoinedRender = forceJoinedRender
Daniel Dunbard9fb9722009-01-23 20:08:16 +000036 self.unsupported = unsupported
Daniel Dunbara5677512009-01-05 19:53:30 +000037
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000038 def getUnaliasedOption(self):
39 if self.alias:
40 return self.alias.getUnaliasedOption()
41 return self
42
43 def getRenderName(self):
44 return self.getUnaliasedOption().name
45
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000046 def matches(self, opt):
47 """matches(opt) -> bool
48
49 Predicate for whether this option is part of the given option
50 (which may be a group)."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +000051
52 if self.alias:
53 return self.alias.matches(opt)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000054 if self is opt:
55 return True
56 elif self.group:
57 return self.group.matches(opt)
58 else:
59 return False
60
Daniel Dunbara5677512009-01-05 19:53:30 +000061 def accept(self, index, arg, it):
62 """accept(index, arg, iterator) -> Arg or None
63
64 Accept the argument at the given index, returning an Arg, or
65 return None if the option does not accept this argument.
66
67 May raise MissingArgumentError.
68 """
69 abstract
70
71 def __repr__(self):
72 return '<%s name=%r>' % (self.__class__.__name__,
73 self.name)
74
Daniel Dunbar11672ec2009-01-13 18:51:26 +000075 def forwardToGCC(self):
76 # FIXME: Get rid of this hack.
77 if self.name == '<input>':
78 return False
79
80 if self.isLinkerInput:
81 return False
82
83 return self.name not in ('-E', '-S', '-c',
84 '-arch', '-fsyntax-only', '-combine', '-x',
Daniel Dunbarfd8d98f2009-01-26 18:00:14 +000085 '-###', '-o')
Daniel Dunbar11672ec2009-01-13 18:51:26 +000086
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000087class OptionGroup(Option):
88 """OptionGroup - A fake option class used to group options so that
89 the driver can efficiently refer to an entire set of options."""
90
Daniel Dunbar3cde3252009-01-14 19:42:31 +000091 def __init__(self, name, group=None):
92 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000093
94 def accept(self, index, arg, it):
95 raise RuntimeError,"accept() should never be called on an OptionGroup"
96
Daniel Dunbar5039f212009-01-06 02:30:10 +000097# Dummy options
98
99class InputOption(Option):
100 def __init__(self):
101 super(InputOption, self).__init__('<input>')
102
103 def accept(self):
104 raise RuntimeError,"accept() should never be used on InputOption instance."
105
106class UnknownOption(Option):
107 def __init__(self):
108 super(UnknownOption, self).__init__('<unknown>')
109
110 def accept(self):
111 raise RuntimeError,"accept() should never be used on UnknownOption instance."
112
113# Normal options
114
Daniel Dunbara5677512009-01-05 19:53:30 +0000115class FlagOption(Option):
116 """An option which takes no arguments."""
117
118 def accept(self, index, arg, it):
119 if arg == self.name:
120 return Arg(index, self)
121
122class JoinedOption(Option):
123 """An option which literally prefixes its argument."""
124
125 def accept(self, index, arg, it):
126 if arg.startswith(self.name):
127 return JoinedValueArg(index, self)
128
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000129class CommaJoinedOption(Option):
130 """An option which literally prefixs its argument, but which
131 conceptually may have an arbitrary number of arguments which are
132 separated by commas."""
133
134 def accept(self, index, arg, it):
135 if arg.startswith(self.name):
136 return CommaJoinedValuesArg(index, self)
137
Daniel Dunbara5677512009-01-05 19:53:30 +0000138class SeparateOption(Option):
139 """An option which is followed by its value."""
140
141 def accept(self, index, arg, it):
142 if arg == self.name:
143 try:
144 _,value = it.next()
145 except StopIteration:
146 raise MissingArgumentError,self
147 return SeparateValueArg(index, self)
148
149class MultiArgOption(Option):
150 """An option which takes multiple arguments."""
151
152 def __init__(self, name, numArgs):
153 assert numArgs > 1
154 super(MultiArgOption, self).__init__(name)
155 self.numArgs = numArgs
156
157 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000158 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000159 try:
160 values = [it.next()[1] for i in range(self.numArgs)]
161 except StopIteration:
162 raise MissingArgumentError,self
163 return MultipleValuesArg(index, self)
164
165class JoinedOrSeparateOption(Option):
166 """An option which either literally prefixes its value or is
167 followed by an value."""
168
169 def accept(self, index, arg, it):
170 if arg.startswith(self.name):
171 if len(arg) != len(self.name): # Joined case
172 return JoinedValueArg(index, self)
173 else:
174 try:
175 _,value = it.next()
176 except StopIteration:
177 raise MissingArgumentError,self
178 return SeparateValueArg(index, self)
179
180class JoinedAndSeparateOption(Option):
181 """An option which literally prefixes its value and is followed by
182 an value."""
183
184 def accept(self, index, arg, it):
185 if arg.startswith(self.name):
186 try:
187 _,value = it.next()
188 except StopIteration:
189 raise MissingArgumentError,self
190 return JoinedAndSeparateValuesArg(index, self)
191
192###
193
194class Arg(object):
195 """Arg - Base class for actual driver arguments."""
196 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000197 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000198 self.index = index
199 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000200
Daniel Dunbara5677512009-01-05 19:53:30 +0000201 def __repr__(self):
202 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
203 self.index,
204 self.opt)
205
206 def render(self, args):
207 """render(args) -> [str]
208
209 Map the argument into a list of actual program arguments,
210 given the source argument array."""
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000211 return [self.opt.getRenderName()]
Daniel Dunbara5677512009-01-05 19:53:30 +0000212
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000213 def renderAsInput(self, args):
214 return self.render(args)
215
Daniel Dunbara5677512009-01-05 19:53:30 +0000216class ValueArg(Arg):
217 """ValueArg - An instance of an option which has an argument."""
218
219 def getValue(self, args):
220 abstract
221
Daniel Dunbar996ce962009-01-12 07:40:25 +0000222 def getValues(self, args):
223 return [self.getValue(args)]
224
Daniel Dunbar5039f212009-01-06 02:30:10 +0000225class PositionalArg(ValueArg):
226 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000227
228 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000229 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000230
231 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000232 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000233
234class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000235 """JoinedValueArg - A single value argument where the value is
236 joined (suffixed) to the option."""
237
Daniel Dunbara5677512009-01-05 19:53:30 +0000238 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000239 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000240
Daniel Dunbara5677512009-01-05 19:53:30 +0000241 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000242 if self.opt.forceSeparateRender:
243 return [self.opt.getRenderName(),
244 self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000245 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000246
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000247 def renderAsInput(self, args):
248 if self.opt.noOptAsInput:
249 return [self.getValue(args)]
250 return self.render(args)
251
Daniel Dunbara5677512009-01-05 19:53:30 +0000252class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000253 """SeparateValueArg - A single value argument where the value
254 follows the option in the argument vector."""
255
Daniel Dunbara5677512009-01-05 19:53:30 +0000256 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000257 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000258
Daniel Dunbara5677512009-01-05 19:53:30 +0000259 def render(self, args):
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000260 if self.opt.forceJoinedRender:
261 return [self.opt.getRenderName() + self.getValue(args)]
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000262 return [self.opt.getRenderName(), self.getValue(args)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000263
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000264 def renderAsInput(self, args):
265 if self.opt.noOptAsInput:
266 return [self.getValue(args)]
267 return self.render(args)
268
Daniel Dunbara5677512009-01-05 19:53:30 +0000269class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000270 """MultipleValuesArg - An argument with multiple values which
271 follow the option in the argument vector."""
272
273 # FIXME: Should we unify this with SeparateValueArg?
274
Daniel Dunbara5677512009-01-05 19:53:30 +0000275 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000276 return [args.getInputString(self.index, offset=1+i)
277 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000278
Daniel Dunbara5677512009-01-05 19:53:30 +0000279 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000280 return [self.opt.getRenderName()] + self.getValues(args)
Daniel Dunbara5677512009-01-05 19:53:30 +0000281
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000282class CommaJoinedValuesArg(Arg):
283 """CommaJoinedValuesArg - An argument with multiple values joined
284 by commas and joined (suffixed) to the option.
285
286 The key point of this arg is that it renders its values into
287 separate arguments, which allows it to be used as a generic
288 mechanism for passing arguments through to tools."""
289
290 def getValues(self, args):
291 return args.getInputString(self.index)[len(self.opt.name):].split(',')
292
293 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000294 return [self.opt.getRenderName() + ','.join(self.getValues(args))]
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000295
296 def renderAsInput(self, args):
297 return self.getValues(args)
298
Daniel Dunbara5677512009-01-05 19:53:30 +0000299# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
300# just special case?
301class JoinedAndSeparateValuesArg(Arg):
302 """JoinedAndSeparateValuesArg - An argument with both joined and
303 separate values."""
304
305 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000306 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000307
308 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000309 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000310
311 def render(self, args):
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000312 return ([self.opt.getRenderName() + self.getJoinedValue(args)] +
Daniel Dunbara5677512009-01-05 19:53:30 +0000313 [self.getSeparateValue(args)])
314
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000315###
316
317class InputIndex:
318 def __init__(self, sourceId, pos):
319 self.sourceId = sourceId
320 self.pos = pos
321
322 def __repr__(self):
323 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
324
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000325class ArgList(object):
326 """ArgList - Collect an input argument vector along with a set of
327 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000328
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000329 def __init__(self, parser, argv):
330 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000331 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000332 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000333 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000334 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000335
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000336 def getArgs(self, option):
337 # FIXME: How efficient do we want to make this. One reasonable
338 # solution would be to embed a linked list inside each arg and
339 # automatically chain them (with pointers to head and
340 # tail). This gives us efficient access to the (first, last,
341 # all) arg(s) with little overhead.
342 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000343 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000344 yield arg
345
Daniel Dunbar996ce962009-01-12 07:40:25 +0000346 def getArgs2(self, optionA, optionB):
347 """getArgs2 - Iterate over all arguments for two options, in
348 the order they were specified."""
349 # As long as getArgs is efficient, we can easily make this
350 # efficient by iterating both at once and always taking the
351 # earlier arg.
352 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000353 if (arg.opt.matches(optionA) or
354 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000355 yield arg
356
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000357 def getArgs3(self, optionA, optionB, optionC):
358 """getArgs3 - Iterate over all arguments for three options, in
359 the order they were specified."""
360 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000361 if (arg.opt.matches(optionA) or
362 arg.opt.matches(optionB) or
363 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000364 yield arg
365
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000366 def getLastArg(self, option):
367 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000368
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000369 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000370 # Source 0 is argv.
371 if index.sourceId == 0:
372 return self.argv[index.pos + offset]
373
374 # Source 1 is synthetic argv.
375 if index.sourceId == 1:
376 return self.syntheticArgv[index.pos + offset]
377
378 raise RuntimeError,'Unknown source ID for index.'
379
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000380 def addLastArg(self, output, option):
381 """addLastArgs - Extend the given output vector with the last
382 instance of a given option."""
383 arg = self.getLastArg(option)
384 if arg:
385 output.extend(self.render(arg))
386
387 def addAllArgs(self, output, option):
388 """addAllArgs - Extend the given output vector with all
389 instances of a given option."""
390 for arg in self.getArgs(option):
391 output.extend(self.render(arg))
392
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000393 def addAllArgs2(self, output, optionA, optionB):
394 """addAllArgs2 - Extend the given output vector with all
395 instances of two given option, with relative order preserved."""
396 for arg in self.getArgs2(optionA, optionB):
397 output.extend(self.render(arg))
398
399 def addAllArgs3(self, output, optionA, optionB, optionC):
400 """addAllArgs3 - Extend the given output vector with all
401 instances of three given option, with relative order preserved."""
402 for arg in self.getArgs3(optionA, optionB, optionC):
403 output.extend(self.render(arg))
404
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000405 def addAllArgsTranslated(self, output, option, translation):
406 """addAllArgsTranslated - Extend the given output vector with
407 all instances of a given option, rendered as separate
408 arguments with the actual option name translated to a user
409 specified string. For example, '-foox' will be render as
410 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
411 translation.
412
413 This routine expects that the option can only yield ValueArg
414 instances."""
415 for arg in self.getArgs(option):
416 assert isinstance(arg, ValueArg)
417 output.append(translation)
418 output.append(self.getValue(arg))
419
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000420 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000421 pos = len(self.syntheticArgv)
422 self.syntheticArgv.extend(strings)
423 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000424
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000425 def makeFlagArg(self, option):
426 return Arg(self.makeIndex(option.name),
427 option)
428
429 def makeInputArg(self, string):
430 return PositionalArg(self.makeIndex(string),
431 self.parser.inputOption)
432
433 def makeUnknownArg(self, string):
434 return PositionalArg(self.makeIndex(string),
435 self.parser.unknownOption)
436
437 def makeSeparateArg(self, string, option):
438 return SeparateValueArg(self.makeIndex(option.name, string),
439 option)
440
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000441 def makeJoinedArg(self, string, option):
442 return JoinedValueArg(self.makeIndex(option.name + string),
443 option)
444
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000445 # Support use as a simple arg list.
446
447 def __iter__(self):
448 return iter(self.args)
449
450 def append(self, arg):
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000451 if arg.opt.unsupported:
452 raise InvalidArgumentsError('option %r is unsupported' % arg.opt.name)
453
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000454 self.args.append(arg)
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000455
456 opt = arg.opt
457 if opt.alias:
458 opt = opt.alias
459 self.lastArgs[opt] = arg
460 if opt.group is not None:
461 self.lastArgs[opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000462
463 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000464 #
465 # FIXME: Clean this up once restructuring is done.
466
467 def render(self, arg):
468 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000469
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000470 def renderAsInput(self, arg):
471 return arg.renderAsInput(self)
472
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000473 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000474 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000475
476 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000477 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000478
479 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000480 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000481
482 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000483 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000484
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000485class DerivedArgList(ArgList):
486 def __init__(self, args):
487 super(DerivedArgList, self).__init__(args.parser, args.argv)
488 self.parser = args.parser
489 self.argv = args.argv
490 self.syntheticArgv = args.syntheticArgv
491 self.lastArgs = {}
492 self.args = []
493
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000494###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000495
Daniel Dunbara5677512009-01-05 19:53:30 +0000496class OptionParser:
497 def __init__(self):
498 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000499 self.inputOption = InputOption()
500 self.unknownOption = UnknownOption()
501
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000502 # Driver driver options
503 self.archOption = self.addOption(SeparateOption('-arch'))
504
505 # Misc driver options
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000506 self.passExitCodesOption = self.addOption(FlagOption('-pass-exit-codes'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000507 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
508 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
509 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
510 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000511 self.printLibgccFileNameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
512 self.printFileNameOption = self.addOption(JoinedOption('-print-file-name='))
513 self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000514 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000515 self.printMultiOsDirectoryOption = self.addOption(FlagOption('-print-multi-os-directory'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000516 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000517
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000518 # Pipeline control
519 self.hashHashHashOption = self.addOption(FlagOption('-###'))
520 self.EOption = self.addOption(FlagOption('-E'))
521 self.SOption = self.addOption(FlagOption('-S'))
522 self.cOption = self.addOption(FlagOption('-c'))
Daniel Dunbare4c0da82009-01-30 00:12:29 +0000523 self.combineOption = self.addOption(FlagOption('-combine', unsupported=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000524 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
525 self.pipeOption = self.addOption(FlagOption('-pipe'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000526 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000527
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000528 # FIXME: Error out if this is used.
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000529 self.specsOption = self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000530 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000531 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000532 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000533 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000534
535 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000536 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000537 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
538
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000539 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
540 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000541
542 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
543 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000544
545 # FIXME: This is broken in Darwin cc1, it wants std* and this
546 # is std=. May need an option group for this as well.
547 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000548 self.addOption(JoinedOrSeparateOption('--sysroot'))
549
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000550 # Blanket pass-through options.
551
Daniel Dunbar6949ce42009-01-30 00:24:16 +0000552 self.XanalyzerOption = self.addOption(SeparateOption('-Xanalyzer'))
553 self.XclangOption = self.addOption(SeparateOption('-Xclang'))
Daniel Dunbarde388a52009-01-21 01:07:49 +0000554
Daniel Dunbar996ce962009-01-12 07:40:25 +0000555 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
556 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000557
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000558 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
559 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000560
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000561 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000562 self.XlinkerOption = self.addOption(SeparateOption('-Xlinker',
563 isLinkerInput=True,
564 noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000565
566 ####
567 # Bring on the random garbage.
568
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000569 self.sOption = self.addOption(FlagOption('-s'))
570
Daniel Dunbarfce72bc2009-01-20 01:53:54 +0000571 self.MGroup = OptionGroup('-M')
572 self.MOption = self.addOption(FlagOption('-M', self.MGroup))
573 self.MDOption = self.addOption(FlagOption('-MD', self.MGroup))
574 self.MGOption = self.addOption(FlagOption('-MG', self.MGroup))
575 self.MMDOption = self.addOption(FlagOption('-MMD', self.MGroup))
576 self.MPOption = self.addOption(FlagOption('-MP', self.MGroup))
577 self.MMOption = self.addOption(FlagOption('-MM', self.MGroup))
578 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF', self.MGroup))
579 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT', self.MGroup))
580 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ', self.MGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000581 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000582 self.uGroup = OptionGroup('-u')
583 self.undefOption = self.addOption(FlagOption('-undef', self.uGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000584
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000585 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000586 self.bundle_loaderOption = self.addOption(SeparateOption('-bundle_loader'))
587 self.bundleOption = self.addOption(FlagOption('-bundle'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000588 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
589 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
590 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000591 self.dependencyFileOption = self.addOption(SeparateOption('-dependency-file'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000592 self.dynamiclibOption = self.addOption(FlagOption('-dynamiclib'))
593 self.dynamicOption = self.addOption(FlagOption('-dynamic'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000594 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000595 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000596
597 self.iGroup = OptionGroup('-i')
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000598 self.idirafterOption = self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
599 self.imacrosOption = self.addOption(JoinedOrSeparateOption('-imacros', self.iGroup))
600 self.iprefixOption = self.addOption(JoinedOrSeparateOption('-iprefix', self.iGroup))
601 self.iwithprefixOption = self.addOption(JoinedOrSeparateOption('-iwithprefix', self.iGroup))
602 self.iwithprefixbeforeOption = self.addOption(JoinedOrSeparateOption('-iwithprefixbefore', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000603 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
604 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
Daniel Dunbar89db21f2009-01-14 23:26:40 +0000605 self.includeOption = self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000606
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000607 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
608 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
609 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
610 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
611 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
612 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000613 self.umbrellaOption = self.addOption(SeparateOption('-umbrella', self.uGroup))
614 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000615 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
616 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
617 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
618 self.prebindOption = self.addOption(FlagOption('-prebind'))
619 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
620 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
621 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000622 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000623 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000624 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
625 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
626 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
627 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000628 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000629 self.objectOption = self.addOption(FlagOption('-object'))
630 self.preloadOption = self.addOption(FlagOption('-preload'))
631 self.staticOption = self.addOption(FlagOption('-static'))
632 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000633 self.sharedOption = self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000634 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
635 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000636 self.COption = self.addOption(FlagOption('-C'))
637 self.CCOption = self.addOption(FlagOption('-CC'))
638 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000639 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000640 self.POption = self.addOption(FlagOption('-P'))
641 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000642 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000643 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000644 self.traditionalOption = self.addOption(FlagOption('-traditional'))
645 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
646 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000647 self.addOption(FlagOption('--traditional'))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000648 self.no_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000649 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
650 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
651 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000652 self.whyloadOption = self.addOption(FlagOption('-whyload'))
653 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
654 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
655 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
656 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000657 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
658 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
659 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
660 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000661
662 self.all_loadOption = self.addOption(FlagOption('-all_load'))
663 self.allowable_clientOption = self.addOption(SeparateOption('-allowable_client'))
664 self.bind_at_loadOption = self.addOption(FlagOption('-bind_at_load'))
665 self.dead_stripOption = self.addOption(FlagOption('-dead_strip'))
666 self.dylib_fileOption = self.addOption(SeparateOption('-dylib_file'))
667 self.exported_symbols_listOption = self.addOption(SeparateOption('-exported_symbols_list'))
668 self.flat_namespaceOption = self.addOption(FlagOption('-flat_namespace'))
669 self.force_cpusubtype_ALLOption = self.addOption(FlagOption('-force_cpusubtype_ALL'))
670 self.force_flat_namespaceOption = self.addOption(FlagOption('-force_flat_namespace'))
671 self.image_baseOption = self.addOption(FlagOption('-image_base'))
672 self.initOption = self.addOption(SeparateOption('-init'))
673 self.install_nameOption = self.addOption(SeparateOption('-install_name'))
674 self.multi_moduleOption = self.addOption(FlagOption('-multi_module'))
675 self.multiply_definedOption = self.addOption(SeparateOption('-multiply_defined'))
676 self.multiply_defined_unusedOption = self.addOption(SeparateOption('-multiply_defined_unused'))
677 self.seg_addr_table_filenameOption = self.addOption(SeparateOption('-seg_addr_table_filename'))
678 self.seg_addr_tableOption = self.addOption(SeparateOption('-seg_addr_table'))
679 self.segaddrOption = self.addOption(SeparateOption('-segaddr'))
680 self.segs_read_only_addrOption = self.addOption(SeparateOption('-segs_read_only_addr'))
681 self.segs_read_write_addrOption = self.addOption(SeparateOption('-segs_read_write_addr'))
682 # FIXME: This probably isn't necessary.
683 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
684 self.single_moduleOption = self.addOption(FlagOption('-single_module'))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000685 self.unexported_symbols_listOption = self.addOption(SeparateOption('-unexported_symbols_list', self.uGroup))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000686 self.weak_reference_mismatchesOption = self.addOption(SeparateOption('-weak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000687
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000688 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
689 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000690
691 self.addOption(JoinedOption('-i', self.iGroup))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000692
Daniel Dunbarb2f37952009-01-26 17:09:15 +0000693 self.emitLLVMOption = self.addOption(FlagOption('-emit-llvm'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000694 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
695 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000696
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000697 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000698 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000699
700 doNotReallySupport = 1
701 if doNotReallySupport:
702 # Archaic gcc option.
703 self.addOption(FlagOption('-cpp-precomp'))
704 self.addOption(FlagOption('-no-cpp-precomp'))
705
706 # C options for testing
707
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000708 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
709
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000710 # FIXME: This is broken, we need -A as a single option to send
711 # stuff to cc1, but the way the ld spec is constructed it
712 # wants to see -A options but only as a separate arg.
713 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
714 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000715 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000716
717 self.IGroup = OptionGroup('-I')
718 self.I_Option = self.addOption(FlagOption('-I-', self.IGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000719 self.IOption = self.addOption(JoinedOrSeparateOption('-I', self.IGroup))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000720
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000721 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
722 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000723 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000724 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
725
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000726 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000727 self.uOption = self.addOption(JoinedOrSeparateOption('-u', self.uGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000728 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
729 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000730
731 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000732 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000733 # Not exactly sure how to decompose this. I split out -Xarch_
734 # because we need to recognize that in the driver driver part.
735 # FIXME: Man, this is lame it needs its own option.
736 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
737 self.addOption(JoinedOption('-X'))
738
739 # The driver needs to know about this flag.
740 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
741
742 # FIXME: Wrong?
743 # FIXME: What to do about the ambiguity of options like
744 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000745 # FIXME: Naming convention.
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000746 self.dGroup = OptionGroup('-d')
747 self.dAOption = self.addOption(FlagOption('-dA', self.dGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000748 self.dOption = self.addOption(FlagOption('-d', self.dGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000749
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000750 # Use a group for this in anticipation of adding more -d
751 # options explicitly. Note that we don't put many -d things in
752 # the -d group (like -dylinker, or '-d' by itself) because it
753 # is really a gcc bug that it ships these to cc1.
754 self.dGroup = OptionGroup('-d')
755 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000756
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000757 self.gGroup = OptionGroup('-g')
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000758 self.gfullOption = self.addOption(JoinedOption('-gfull', self.gGroup))
759 self.gusedOption = self.addOption(JoinedOption('-gused', self.gGroup))
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000760 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
761 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000762 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
Daniel Dunbar105132e2009-01-16 21:07:21 +0000763 # FIXME: Naming.
764 self.gOption = self.addOption(FlagOption('-g', self.gGroup))
765 self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000766
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000767 # FIXME: How should we handle clang specific options? Do we
768 # want to avoid passing them to gcc/cc1 (which will generally
769 # not eat them), or should we let the user sort it out.
770
Mike Stumpb55cc632009-01-30 08:22:07 +0000771 self.fblocksGroup = OptionGroup('-fblocks')
772 self.f_blocks = self.addOption(FlagOption('-fblocks', self.fblocksGroup))
773 self.f_noblocks = self.addOption(FlagOption('-fno-blocks', self.fblocksGroup))
774 # self.fblocksOption = self.addOption(JoinedOption('-fblocks', self.fblocksGroup))
775
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000776 self.fGroup = OptionGroup('-f')
777 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
778 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
779 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
780
781 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000782 self.f_bootclasspathOption = self.addOption(JoinedOption('-fbootclasspath=', self.fGroup))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000783 self.f_classpathOption = self.addOption(JoinedOption('-fclasspath=', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000784 self.f_compileResourceOption = self.addOption(JoinedOption('-fcompile-resource=', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000785 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000786 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000787 self.f_debugPassArgumentsOption = self.addOption(FlagOption('-fdebug-pass-arguments', self.fGroup))
788 self.f_debugPassStructureOption = self.addOption(FlagOption('-fdebug-pass-structure', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000789 self.f_eliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-feliminate-unused-debug-symbols', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000790 self.f_encodingOption = self.addOption(JoinedOption('-fencoding=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000791 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000792 self.f_extdirsOption = self.addOption(JoinedOption('-fextdirs=', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000793 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000794 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000795 self.f_indirectVirtualCallsOption = self.addOption(FlagOption('-findirect-virtual-calls', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000796 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000797 self.f_limitedPrecisionOption = self.addOption(JoinedOption('-flimited-precision=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000798 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000799 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
800 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
801 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000802 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
803 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
804 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
805 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
806 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
807 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
Daniel Dunbar06172d62009-01-20 00:47:24 +0000808 self.f_noWorkingDirectoryOption = self.addOption(FlagOption('-fno-working-directory', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000809 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
810 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
Daniel Dunbarba362f62009-01-30 04:43:19 +0000811 self.f_objcNonfragileAbiOption = self.addOption(FlagOption('-fobjc-nonfragile-abi', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000812 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000813 self.f_omitFramePointerOption = self.addOption(FlagOption('-fomit-frame-pointer', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000814 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000815 self.f_outputClassDirOption = self.addOption(JoinedOption('-foutput-class-dir=', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000816 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000817 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000818 self.f_PIEOption = self.addOption(FlagOption('-fPIE', self.fGroup))
819 self.f_picOption = self.addOption(FlagOption('-fpic', self.fGroup))
820 self.f_PICOption = self.addOption(FlagOption('-fPIC', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000821 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
822 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar9c3ea762009-01-16 20:25:36 +0000823 self.f_terminatedVtablesOption = self.addOption(FlagOption('-fterminated-vtables', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000824 self.f_timeReportOption = self.addOption(FlagOption('-ftime-report', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000825 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000826 self.f_unwindTablesOption = self.addOption(FlagOption('-funwind-tables', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000827 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar1e1d2c62009-01-22 01:55:46 +0000828 self.f_zeroInitializedInBssOption = self.addOption(FlagOption('-fzero-initialized-in-bss', self.fGroup))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000829 self.fOption = self.addOption(JoinedOption('-f', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000830
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000831 self.coverageOption = self.addOption(FlagOption('-coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000832
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000833 self.mGroup = OptionGroup('-m')
834 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
835 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
836 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
837 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
838 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
839 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000840 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
841 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
842 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
843 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
844 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
845 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000846 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000847
848 # Ugh. Need to disambiguate our naming convetion. -m x goes to
849 # the linker sometimes, wheres -mxxxx is used for a variety of
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000850 # other things.
851 self.mSeparate = self.addOption(SeparateOption('-m', self.mGroup))
852 self.mJoined = self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000853
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000854 # FIXME: Why does Darwin send -a* to cc1?
855 self.aGroup = OptionGroup('-a')
856 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
Daniel Dunbar6fbb2fb2009-01-23 00:54:03 +0000857
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000858 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
859
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000860 self.pedanticGroup = OptionGroup('-pedantic')
861 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
862 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000863 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000864
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000865 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000866 self.ClangWGroup = OptionGroup('-W', self.WGroup)
867
Daniel Dunbar990bd1e2009-01-23 00:14:46 +0000868 self.WallOption = self.addOption(FlagOption('-Wall', self.WGroup))
Daniel Dunbarab95c392009-01-21 18:49:34 +0000869 self.addOption(FlagOption('-Wunused-macros', self.ClangWGroup))
870 self.addOption(FlagOption('-Wfloat-equal', self.ClangWGroup))
871 self.addOption(FlagOption('-Wreadonly-setter-attrs', self.ClangWGroup))
872 self.addOption(FlagOption('-Wno-format-nonliteral', self.ClangWGroup))
873 self.addOption(FlagOption('-Wundef', self.ClangWGroup))
874 self.addOption(FlagOption('-Wimplicit-function-declaration', self.ClangWGroup))
875 self.addOption(FlagOption('-Wno-strict-selector-match', self.ClangWGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000876
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000877 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
878 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
879 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000880
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000881 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000882 # works. There is something else going on which interprets the
883 # '='.
884 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000885
Daniel Dunbardff9f502009-01-12 18:51:02 +0000886 # FIXME: What is this? I think only one is valid, but have a
887 # log that uses both.
888 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000889 self.addOption(FlagOption('-pthreads'))
890
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000891 # Version control.
892 # FIXME: Figure out what to do about these.
Daniel Dunbar76715912009-01-28 19:26:20 +0000893 self.BOption = self.addOption(JoinedOrSeparateOption('-B', unsupported=True))
894 self.addOption(JoinedOrSeparateOption('-V', unsupported=True))
895 self.addOption(JoinedOrSeparateOption('-b', unsupported=True))
Daniel Dunbar470104e2009-01-17 00:53:19 +0000896
Daniel Dunbarde388a52009-01-21 01:07:49 +0000897 # Clang static analyzer options (also see -WA,).
898 self.analyzeOption = self.addOption(FlagOption('--analyze'))
899
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000900 # Long option handling (aliases).
901 self.addOption(FlagOption('--help'))
902 self.addOption(FlagOption('--target-help'))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000903 # FIXME: Who handles this?
904 self.addOption(FlagOption('--version'))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000905
906 self.addOption(FlagOption('--all-warnings', alias=self.WallOption))
907 self.addOption(FlagOption('--ansi', alias=self.ansiOption))
908 self.addOption(FlagOption('--assemble', alias=self.SOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000909 self.addOption(FlagOption('--combine', alias=self.combineOption))
910 self.addOption(FlagOption('--comments', alias=self.COption))
911 self.addOption(FlagOption('--comments-in-macros', alias=self.CCOption))
912 self.addOption(FlagOption('--compile', alias=self.cOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000913 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000914 self.addOption(FlagOption('--dependencies', alias=self.MOption))
915 self.addOption(FlagOption('--entry', alias=self.eOption))
916 self.addOption(FlagOption('--extra-warnings', alias=self.WOption))
917 self.addOption(FlagOption('--coverage', alias=self.coverageOption))
918 self.addOption(FlagOption('--include-barrier', alias=self.I_Option))
919 self.addOption(FlagOption('--no-integrated-cpp', alias=self.noIntegratedCPPOption))
920 self.addOption(FlagOption('--no-line-commands', alias=self.POption))
921# self.addOption(FlagOption('--no-precompiled-includes', alias=self.noprecompOption))
922 self.addOption(FlagOption('--no-standard-includes', alias=self.nostdincOption))
923 self.addOption(FlagOption('--no-standard-libraries', alias=self.nostdlibOption))
924 self.addOption(FlagOption('--no-warnings', alias=self.wOption))
925 self.addOption(FlagOption('--pass-exit-codes', alias=self.passExitCodesOption))
926 self.addOption(FlagOption('--pedantic', alias=self.pedanticOption))
927 self.addOption(FlagOption('--pedantic-errors', alias=self.pedanticErrorsOption))
928# self.addOption(FlagOption('--pie', alias=self.pieOption))
929 self.addOption(FlagOption('--pipe', alias=self.pipeOption))
930 self.addOption(FlagOption('--preprocess', alias=self.EOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000931 self.addOption(JoinedOption('--param=', alias=self._paramOption,
932 forceSeparateRender=True))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000933 self.addOption(JoinedOption('--print-file-name=', alias=self.printFileNameOption))
934 self.addOption(SeparateOption('--print-file-name', alias=self.printFileNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000935 self.addOption(FlagOption('--print-libgcc-file-name',
936 alias=self.printLibgccFileNameOption))
937 self.addOption(FlagOption('--print-missing-file-dependencies', alias=self.MGOption))
938 self.addOption(FlagOption('--print-multi-lib', alias=self.printMultiLibOption))
939 self.addOption(FlagOption('--print-multi-directory', alias=self.printMultiDirectoryOption))
940 self.addOption(FlagOption('--print-multi-os-directory', alias=self.printMultiOsDirectoryOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000941 self.addOption(JoinedOption('--print-prog-name=', alias=self.printProgNameOption))
942 self.addOption(SeparateOption('--print-prog-name', alias=self.printProgNameOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000943 self.addOption(FlagOption('--print-search-dirs', alias=self.printSearchDirsOption))
944 self.addOption(FlagOption('--profile', alias=self.pOption))
945 self.addOption(FlagOption('--profile-blocks', alias=self.aOption))
946# self.addOption(FlagOption('--quiet', alias=self.qOption))
947# self.addOption(FlagOption('--shared', alias=self.sharedOption))
948# self.addOption(FlagOption('--silent', alias=self.qOption))
949 self.addOption(FlagOption('--static', alias=self.staticOption))
950# self.addOption(FlagOption('--symbolic', alias=self.symbolicOption))
951# self.addOption(FlagOption('--time', alias=self.timeOption))
952 self.addOption(FlagOption('--trace-includes', alias=self.HOption))
953 self.addOption(FlagOption('--traditional', alias=self.traditionalOption))
954 self.addOption(FlagOption('--traditional-cpp', alias=self.traditionalCPPOption))
955 self.addOption(FlagOption('--trigraphs', alias=self.trigraphsOption))
956 self.addOption(FlagOption('--user-dependencies', alias=self.MMOption))
957 self.addOption(FlagOption('--verbose', alias=self.vOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000958 self.addOption(FlagOption('--save-temps', alias=self.saveTempsOption))
Daniel Dunbarf86fa322009-01-23 02:00:46 +0000959 self.addOption(FlagOption('--write-dependencies', alias=self.MDOption))
960 self.addOption(FlagOption('--write-user-dependencies', alias=self.MMDOption))
Daniel Dunbar5ac00d02009-01-23 01:31:44 +0000961
Daniel Dunbard013f4a2009-01-23 19:40:54 +0000962 # Long options with joined & separate forms (coercing to
963 # joined form).
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000964
965 self.addOption(SeparateOption('--assert', alias=self.AOption))
966 self.addOption(JoinedOption('--assert=', alias=self.AOption,
967 forceSeparateRender=True))
968 self.addOption(JoinedOption('--bootclasspath=', alias=self.f_bootclasspathOption))
969 self.addOption(SeparateOption('--bootclasspath', alias=self.f_bootclasspathOption,
970 forceJoinedRender=True))
971 self.addOption(JoinedOption('--CLASSPATH=', alias=self.f_classpathOption))
972 self.addOption(SeparateOption('--CLASSPATH', alias=self.f_classpathOption,
973 forceJoinedRender=True))
974 self.addOption(JoinedOption('--classpath=', alias=self.f_classpathOption))
975 self.addOption(SeparateOption('--classpath', alias=self.f_classpathOption,
976 forceJoinedRender=True))
977 self.addOption(JoinedOption('--define-macro=', alias=self.DOption))
978 self.addOption(SeparateOption('--define-macro', alias=self.DOption,
979 forceJoinedRender=True))
980 self.addOption(JoinedOption('--encoding=', alias=self.f_encodingOption))
981 self.addOption(SeparateOption('--encoding', alias=self.f_encodingOption,
982 forceJoinedRender=True))
983 self.addOption(JoinedOption('--extdirs=', alias=self.f_extdirsOption))
984 self.addOption(SeparateOption('--extdirs', alias=self.f_extdirsOption,
985 forceJoinedRender=True))
986 self.addOption(JoinedOption('--include-directory=', alias=self.IOption))
987 self.addOption(SeparateOption('--include-directory', alias=self.IOption,
988 forceJoinedRender=True))
Daniel Dunbard9fb9722009-01-23 20:08:16 +0000989 self.addOption(JoinedOption('--machine=', alias=self.mJoined))
990 self.addOption(SeparateOption('--machine', alias=self.mJoined,
Daniel Dunbar09d5b162009-01-23 08:16:41 +0000991 forceJoinedRender=True))
992 self.addOption(JoinedOption('--output-class-directory=', alias=self.f_outputClassDirOption))
993 self.addOption(SeparateOption('--output-class-directory', alias=self.f_outputClassDirOption,
994 forceJoinedRender=True))
995 self.addOption(JoinedOption('--resource=', alias=self.f_compileResourceOption))
996 self.addOption(SeparateOption('--resource', alias=self.f_compileResourceOption,
997 forceJoinedRender=True))
998 self.addOption(JoinedOption('--specs=', alias=self.specsOption))
999 self.addOption(SeparateOption('--specs', alias=self.specsOption,
1000 forceJoinedRender=True))
1001 self.addOption(JoinedOption('--std=', alias=self.stdOption))
1002 self.addOption(SeparateOption('--std', alias=self.stdOption,
1003 forceJoinedRender=True))
1004 self.sysrootOption = self.addOption(JoinedOption('--sysroot='))
1005 self.addOption(SeparateOption('--sysroot', alias=self.sysrootOption,
1006 forceJoinedRender=True))
1007 self.addOption(JoinedOption('--undefine-macro=', alias=self.UOption))
1008 self.addOption(SeparateOption('--undefine-macro', alias=self.UOption,
1009 forceJoinedRender=True))
1010
Daniel Dunbard013f4a2009-01-23 19:40:54 +00001011 # Long options with joined & separate forms (coercing to
1012 # separate form).
1013
1014# self.addOption(JoinedOption('--dump=', alias=self.dOption,
1015# forceSeparateRender=True))
1016# self.addOption(SeparateOption('--dump', alias=self.dOption))
1017# self.addOption(JoinedOption('--dumpbase=', alias=self.dumpbaseOption,
1018# forceSeparateRender=True))
1019# self.addOption(SeparateOption('--dumpbase', alias=self.dumpbaseOption))
1020# self.addOption(JoinedOption('--for-assembler=', alias=self.WaOption,
1021# forceSeparateRender=True))
1022# self.addOption(SeparateOption('--for-assembler', alias=self.WaOption))
1023 self.addOption(JoinedOption('--for-linker=', alias=self.XlinkerOption,
1024 forceSeparateRender=True,
1025 isLinkerInput=True,
1026 noOptAsInput=True))
1027 self.addOption(SeparateOption('--for-linker', alias=self.XlinkerOption,
1028 isLinkerInput=True,
1029 noOptAsInput=True))
1030 self.addOption(JoinedOption('--force-link=', alias=self.uOption,
1031 forceSeparateRender=True))
1032 self.addOption(SeparateOption('--force-link', alias=self.uOption))
1033 self.addOption(JoinedOption('--imacros=', alias=self.imacrosOption,
1034 forceSeparateRender=True))
1035 self.addOption(SeparateOption('--imacros', alias=self.imacrosOption))
1036 self.addOption(JoinedOption('--include=', alias=self.includeOption,
1037 forceSeparateRender=True))
1038 self.addOption(SeparateOption('--include', alias=self.includeOption))
1039 self.addOption(JoinedOption('--include-directory-after=', alias=self.idirafterOption,
1040 forceSeparateRender=True))
1041 self.addOption(SeparateOption('--include-directory-after', alias=self.idirafterOption))
1042 self.addOption(JoinedOption('--include-prefix=', alias=self.iprefixOption,
1043 forceSeparateRender=True))
1044 self.addOption(SeparateOption('--include-prefix', alias=self.iprefixOption))
1045 self.addOption(JoinedOption('--include-with-prefix=', alias=self.iwithprefixOption,
1046 forceSeparateRender=True))
1047 self.addOption(SeparateOption('--include-with-prefix', alias=self.iwithprefixOption))
1048 self.addOption(JoinedOption('--include-with-prefix-before=', alias=self.iwithprefixbeforeOption,
1049 forceSeparateRender=True))
1050 self.addOption(SeparateOption('--include-with-prefix-before', alias=self.iwithprefixbeforeOption))
1051 self.addOption(JoinedOption('--include-with-prefix-after=', alias=self.iwithprefixOption,
1052 forceSeparateRender=True))
1053 self.addOption(SeparateOption('--include-with-prefix-after', alias=self.iwithprefixOption))
1054 self.addOption(JoinedOption('--language=', alias=self.xOption,
1055 forceSeparateRender=True))
1056 self.addOption(SeparateOption('--language', alias=self.xOption))
1057 self.addOption(JoinedOption('--library-directory=', alias=self.LOption,
1058 forceSeparateRender=True))
1059 self.addOption(SeparateOption('--library-directory', alias=self.LOption))
1060 self.addOption(JoinedOption('--output=', alias=self.oOption,
1061 forceSeparateRender=True))
1062 self.addOption(SeparateOption('--output', alias=self.oOption))
1063 self.addOption(JoinedOption('--prefix=', alias=self.BOption,
1064 forceSeparateRender=True))
1065 self.addOption(SeparateOption('--prefix', alias=self.BOption))
1066
Daniel Dunbard9fb9722009-01-23 20:08:16 +00001067 # Long options with joined forms. gcc's handling of '=' for
1068 # long forms makes these a bit odd.
1069 #
1070 # FIXME: We do not currently support these options. The
1071 # problem is that they need to be reparsed in their translated
1072 # form; they need to map to the correct option and we have to
1073 # find a way to do so without replicating all the declared
1074 # names.
1075 self.addOption(JoinedOption('--debug=', alias=self.gOption,
1076 unsupported=True))
1077 self.addOption(FlagOption('--debug', alias=self.gOption,
1078 unsupported=True))
1079 self.addOption(JoinedOption('--machine-=', alias=self.mJoined,
1080 unsupported=True))
1081 self.addOption(JoinedOption('--machine-', alias=self.mJoined,
1082 unsupported=True))
1083 self.addOption(JoinedOption('--optimize=', alias=self.OOption,
1084 unsupported=True))
1085 self.addOption(FlagOption('--optimize', alias=self.OOption,
1086 unsupported=True))
1087 self.addOption(JoinedOption('--warn-=', alias=self.WOption,
1088 unsupported=True))
1089 self.addOption(JoinedOption('--warn-', alias=self.WOption,
1090 unsupported=True))
1091
1092 # Ugh.
1093 self.addOption(JoinedOption('--', alias=self.fOption,
1094 unsupported=True))
1095
Daniel Dunbara5677512009-01-05 19:53:30 +00001096 def addOption(self, opt):
1097 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +00001098 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +00001099
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001100 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +00001101 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +00001102 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +00001103
1104 Parse command line into individual option instances.
1105 """
1106
1107 iargs = enumerate(argv)
1108 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +00001109 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +00001110 for pos,a in it:
1111 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +00001112 # FIXME: Handle '@'
1113 if not a:
1114 # gcc's handling of empty arguments doesn't make
1115 # sense, but this is not a common use case. :)
1116 #
1117 # We just ignore them here (note that other things may
1118 # still take them as arguments).
1119 pass
1120 elif a[0] == '-' and a != '-':
1121 args.append(self.lookupOptForArg(i, a, it))
1122 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +00001123 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +00001124 return args
1125
Daniel Dunbar5039f212009-01-06 02:30:10 +00001126 def lookupOptForArg(self, i, string, it):
1127 for o in self.options:
1128 arg = o.accept(i, string, it)
1129 if arg is not None:
1130 return arg
1131 return PositionalArg(i, self.unknownOption)