blob: 97564558a610ae11f65f4190650c0f54406db821 [file] [log] [blame]
Daniel Dunbara5677512009-01-05 19:53:30 +00001class Option(object):
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +00002 """Option - Root option class."""
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00003
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +00004 def __init__(self, name, group=None, isLinkerInput=False, noOptAsInput=False):
5 assert group is None or isinstance(group, OptionGroup)
Daniel Dunbara5677512009-01-05 19:53:30 +00006 self.name = name
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +00007 self.group = group
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +00008 self.isLinkerInput = isLinkerInput
9 self.noOptAsInput = noOptAsInput
Daniel Dunbara5677512009-01-05 19:53:30 +000010
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000011 def matches(self, opt):
12 """matches(opt) -> bool
13
14 Predicate for whether this option is part of the given option
15 (which may be a group)."""
16 if self is opt:
17 return True
18 elif self.group:
19 return self.group.matches(opt)
20 else:
21 return False
22
Daniel Dunbara5677512009-01-05 19:53:30 +000023 def accept(self, index, arg, it):
24 """accept(index, arg, iterator) -> Arg or None
25
26 Accept the argument at the given index, returning an Arg, or
27 return None if the option does not accept this argument.
28
29 May raise MissingArgumentError.
30 """
31 abstract
32
33 def __repr__(self):
34 return '<%s name=%r>' % (self.__class__.__name__,
35 self.name)
36
Daniel Dunbar11672ec2009-01-13 18:51:26 +000037 def forwardToGCC(self):
38 # FIXME: Get rid of this hack.
39 if self.name == '<input>':
40 return False
41
42 if self.isLinkerInput:
43 return False
44
45 return self.name not in ('-E', '-S', '-c',
46 '-arch', '-fsyntax-only', '-combine', '-x',
47 '-###')
48
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000049class OptionGroup(Option):
50 """OptionGroup - A fake option class used to group options so that
51 the driver can efficiently refer to an entire set of options."""
52
Daniel Dunbar3cde3252009-01-14 19:42:31 +000053 def __init__(self, name, group=None):
54 super(OptionGroup, self).__init__(name, group)
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +000055
56 def accept(self, index, arg, it):
57 raise RuntimeError,"accept() should never be called on an OptionGroup"
58
Daniel Dunbar5039f212009-01-06 02:30:10 +000059# Dummy options
60
61class InputOption(Option):
62 def __init__(self):
63 super(InputOption, self).__init__('<input>')
64
65 def accept(self):
66 raise RuntimeError,"accept() should never be used on InputOption instance."
67
68class UnknownOption(Option):
69 def __init__(self):
70 super(UnknownOption, self).__init__('<unknown>')
71
72 def accept(self):
73 raise RuntimeError,"accept() should never be used on UnknownOption instance."
74
75# Normal options
76
Daniel Dunbara5677512009-01-05 19:53:30 +000077class FlagOption(Option):
78 """An option which takes no arguments."""
79
80 def accept(self, index, arg, it):
81 if arg == self.name:
82 return Arg(index, self)
83
84class JoinedOption(Option):
85 """An option which literally prefixes its argument."""
86
87 def accept(self, index, arg, it):
88 if arg.startswith(self.name):
89 return JoinedValueArg(index, self)
90
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +000091class CommaJoinedOption(Option):
92 """An option which literally prefixs its argument, but which
93 conceptually may have an arbitrary number of arguments which are
94 separated by commas."""
95
96 def accept(self, index, arg, it):
97 if arg.startswith(self.name):
98 return CommaJoinedValuesArg(index, self)
99
Daniel Dunbara5677512009-01-05 19:53:30 +0000100class SeparateOption(Option):
101 """An option which is followed by its value."""
102
103 def accept(self, index, arg, it):
104 if arg == self.name:
105 try:
106 _,value = it.next()
107 except StopIteration:
108 raise MissingArgumentError,self
109 return SeparateValueArg(index, self)
110
111class MultiArgOption(Option):
112 """An option which takes multiple arguments."""
113
114 def __init__(self, name, numArgs):
115 assert numArgs > 1
116 super(MultiArgOption, self).__init__(name)
117 self.numArgs = numArgs
118
119 def accept(self, index, arg, it):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000120 if arg == self.name:
Daniel Dunbara5677512009-01-05 19:53:30 +0000121 try:
122 values = [it.next()[1] for i in range(self.numArgs)]
123 except StopIteration:
124 raise MissingArgumentError,self
125 return MultipleValuesArg(index, self)
126
127class JoinedOrSeparateOption(Option):
128 """An option which either literally prefixes its value or is
129 followed by an value."""
130
131 def accept(self, index, arg, it):
132 if arg.startswith(self.name):
133 if len(arg) != len(self.name): # Joined case
134 return JoinedValueArg(index, self)
135 else:
136 try:
137 _,value = it.next()
138 except StopIteration:
139 raise MissingArgumentError,self
140 return SeparateValueArg(index, self)
141
142class JoinedAndSeparateOption(Option):
143 """An option which literally prefixes its value and is followed by
144 an value."""
145
146 def accept(self, index, arg, it):
147 if arg.startswith(self.name):
148 try:
149 _,value = it.next()
150 except StopIteration:
151 raise MissingArgumentError,self
152 return JoinedAndSeparateValuesArg(index, self)
153
154###
155
156class Arg(object):
157 """Arg - Base class for actual driver arguments."""
158 def __init__(self, index, opt):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000159 assert opt is not None
Daniel Dunbara5677512009-01-05 19:53:30 +0000160 self.index = index
161 self.opt = opt
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000162
Daniel Dunbara5677512009-01-05 19:53:30 +0000163 def __repr__(self):
164 return '<%s index=%r opt=%r>' % (self.__class__.__name__,
165 self.index,
166 self.opt)
167
168 def render(self, args):
169 """render(args) -> [str]
170
171 Map the argument into a list of actual program arguments,
172 given the source argument array."""
173 assert self.opt
174 return [self.opt.name]
175
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000176 def renderAsInput(self, args):
177 return self.render(args)
178
Daniel Dunbara5677512009-01-05 19:53:30 +0000179class ValueArg(Arg):
180 """ValueArg - An instance of an option which has an argument."""
181
182 def getValue(self, args):
183 abstract
184
Daniel Dunbar996ce962009-01-12 07:40:25 +0000185 def getValues(self, args):
186 return [self.getValue(args)]
187
Daniel Dunbar5039f212009-01-06 02:30:10 +0000188class PositionalArg(ValueArg):
189 """PositionalArg - A simple positional argument."""
Daniel Dunbara5677512009-01-05 19:53:30 +0000190
191 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000192 return args.getInputString(self.index)
Daniel Dunbara5677512009-01-05 19:53:30 +0000193
194 def render(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000195 return [args.getInputString(self.index)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000196
197class JoinedValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000198 """JoinedValueArg - A single value argument where the value is
199 joined (suffixed) to the option."""
200
Daniel Dunbara5677512009-01-05 19:53:30 +0000201 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000202 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000203
Daniel Dunbara5677512009-01-05 19:53:30 +0000204 def render(self, args):
205 return [self.opt.name + self.getValue(args)]
206
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000207 def renderAsInput(self, args):
208 if self.opt.noOptAsInput:
209 return [self.getValue(args)]
210 return self.render(args)
211
Daniel Dunbara5677512009-01-05 19:53:30 +0000212class SeparateValueArg(ValueArg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000213 """SeparateValueArg - A single value argument where the value
214 follows the option in the argument vector."""
215
Daniel Dunbara5677512009-01-05 19:53:30 +0000216 def getValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000217 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000218
Daniel Dunbara5677512009-01-05 19:53:30 +0000219 def render(self, args):
220 return [self.opt.name, self.getValue(args)]
221
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000222 def renderAsInput(self, args):
223 if self.opt.noOptAsInput:
224 return [self.getValue(args)]
225 return self.render(args)
226
Daniel Dunbara5677512009-01-05 19:53:30 +0000227class MultipleValuesArg(Arg):
Daniel Dunbar5039f212009-01-06 02:30:10 +0000228 """MultipleValuesArg - An argument with multiple values which
229 follow the option in the argument vector."""
230
231 # FIXME: Should we unify this with SeparateValueArg?
232
Daniel Dunbara5677512009-01-05 19:53:30 +0000233 def getValues(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000234 return [args.getInputString(self.index, offset=1+i)
235 for i in range(self.opt.numArgs)]
Daniel Dunbara5677512009-01-05 19:53:30 +0000236
Daniel Dunbara5677512009-01-05 19:53:30 +0000237 def render(self, args):
238 return [self.opt.name] + self.getValues(args)
239
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000240class CommaJoinedValuesArg(Arg):
241 """CommaJoinedValuesArg - An argument with multiple values joined
242 by commas and joined (suffixed) to the option.
243
244 The key point of this arg is that it renders its values into
245 separate arguments, which allows it to be used as a generic
246 mechanism for passing arguments through to tools."""
247
248 def getValues(self, args):
249 return args.getInputString(self.index)[len(self.opt.name):].split(',')
250
251 def render(self, args):
252 return [self.opt.name + ','.join(self.getValues(args))]
253
254 def renderAsInput(self, args):
255 return self.getValues(args)
256
Daniel Dunbara5677512009-01-05 19:53:30 +0000257# FIXME: Man, this is lame. It is only used by -Xarch. Maybe easier to
258# just special case?
259class JoinedAndSeparateValuesArg(Arg):
260 """JoinedAndSeparateValuesArg - An argument with both joined and
261 separate values."""
262
263 def getJoinedValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000264 return args.getInputString(self.index)[len(self.opt.name):]
Daniel Dunbara5677512009-01-05 19:53:30 +0000265
266 def getSeparateValue(self, args):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000267 return args.getInputString(self.index, offset=1)
Daniel Dunbara5677512009-01-05 19:53:30 +0000268
269 def render(self, args):
270 return ([self.opt.name + self.getJoinedValue(args)] +
271 [self.getSeparateValue(args)])
272
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000273###
274
275class InputIndex:
276 def __init__(self, sourceId, pos):
277 self.sourceId = sourceId
278 self.pos = pos
279
280 def __repr__(self):
281 return 'InputIndex(%d, %d)' % (self.sourceId, self.pos)
282
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000283class ArgList(object):
284 """ArgList - Collect an input argument vector along with a set of
285 parsed Args and supporting information."""
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000286
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000287 def __init__(self, parser, argv):
288 self.parser = parser
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000289 self.argv = list(argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000290 self.syntheticArgv = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000291 self.lastArgs = {}
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000292 self.args = []
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000293
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000294 def getArgs(self, option):
295 # FIXME: How efficient do we want to make this. One reasonable
296 # solution would be to embed a linked list inside each arg and
297 # automatically chain them (with pointers to head and
298 # tail). This gives us efficient access to the (first, last,
299 # all) arg(s) with little overhead.
300 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000301 if arg.opt.matches(option):
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000302 yield arg
303
Daniel Dunbar996ce962009-01-12 07:40:25 +0000304 def getArgs2(self, optionA, optionB):
305 """getArgs2 - Iterate over all arguments for two options, in
306 the order they were specified."""
307 # As long as getArgs is efficient, we can easily make this
308 # efficient by iterating both at once and always taking the
309 # earlier arg.
310 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000311 if (arg.opt.matches(optionA) or
312 arg.opt.matches(optionB)):
Daniel Dunbar996ce962009-01-12 07:40:25 +0000313 yield arg
314
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000315 def getArgs3(self, optionA, optionB, optionC):
316 """getArgs3 - Iterate over all arguments for three options, in
317 the order they were specified."""
318 for arg in self.args:
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000319 if (arg.opt.matches(optionA) or
320 arg.opt.matches(optionB) or
321 arg.opt.matches(optionC)):
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000322 yield arg
323
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000324 def getLastArg(self, option):
325 return self.lastArgs.get(option)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000326
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000327 def getInputString(self, index, offset=0):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000328 # Source 0 is argv.
329 if index.sourceId == 0:
330 return self.argv[index.pos + offset]
331
332 # Source 1 is synthetic argv.
333 if index.sourceId == 1:
334 return self.syntheticArgv[index.pos + offset]
335
336 raise RuntimeError,'Unknown source ID for index.'
337
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000338 def addLastArg(self, output, option):
339 """addLastArgs - Extend the given output vector with the last
340 instance of a given option."""
341 arg = self.getLastArg(option)
342 if arg:
343 output.extend(self.render(arg))
344
345 def addAllArgs(self, output, option):
346 """addAllArgs - Extend the given output vector with all
347 instances of a given option."""
348 for arg in self.getArgs(option):
349 output.extend(self.render(arg))
350
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000351 def addAllArgs2(self, output, optionA, optionB):
352 """addAllArgs2 - Extend the given output vector with all
353 instances of two given option, with relative order preserved."""
354 for arg in self.getArgs2(optionA, optionB):
355 output.extend(self.render(arg))
356
357 def addAllArgs3(self, output, optionA, optionB, optionC):
358 """addAllArgs3 - Extend the given output vector with all
359 instances of three given option, with relative order preserved."""
360 for arg in self.getArgs3(optionA, optionB, optionC):
361 output.extend(self.render(arg))
362
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000363 def addAllArgsTranslated(self, output, option, translation):
364 """addAllArgsTranslated - Extend the given output vector with
365 all instances of a given option, rendered as separate
366 arguments with the actual option name translated to a user
367 specified string. For example, '-foox' will be render as
368 ['-bar', 'x'] if '-foo' was the option and '-bar' was the
369 translation.
370
371 This routine expects that the option can only yield ValueArg
372 instances."""
373 for arg in self.getArgs(option):
374 assert isinstance(arg, ValueArg)
375 output.append(translation)
376 output.append(self.getValue(arg))
377
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000378 def makeIndex(self, *strings):
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000379 pos = len(self.syntheticArgv)
380 self.syntheticArgv.extend(strings)
381 return InputIndex(1, pos)
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000382
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000383 def makeFlagArg(self, option):
384 return Arg(self.makeIndex(option.name),
385 option)
386
387 def makeInputArg(self, string):
388 return PositionalArg(self.makeIndex(string),
389 self.parser.inputOption)
390
391 def makeUnknownArg(self, string):
392 return PositionalArg(self.makeIndex(string),
393 self.parser.unknownOption)
394
395 def makeSeparateArg(self, string, option):
396 return SeparateValueArg(self.makeIndex(option.name, string),
397 option)
398
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000399 def makeJoinedArg(self, string, option):
400 return JoinedValueArg(self.makeIndex(option.name + string),
401 option)
402
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000403 # Support use as a simple arg list.
404
405 def __iter__(self):
406 return iter(self.args)
407
408 def append(self, arg):
409 self.args.append(arg)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000410 self.lastArgs[arg.opt] = arg
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000411 if arg.opt.group is not None:
412 self.lastArgs[arg.opt.group] = arg
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000413
414 # Forwarding methods.
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000415 #
416 # FIXME: Clean this up once restructuring is done.
417
418 def render(self, arg):
419 return arg.render(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000420
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000421 def renderAsInput(self, arg):
422 return arg.renderAsInput(self)
423
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000424 def getValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000425 return arg.getValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000426
427 def getValues(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000428 return arg.getValues(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000429
430 def getSeparateValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000431 return arg.getSeparateValue(self)
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000432
433 def getJoinedValue(self, arg):
Daniel Dunbarfb2c5c42009-01-07 01:29:28 +0000434 return arg.getJoinedValue(self)
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000435
Daniel Dunbar11672ec2009-01-13 18:51:26 +0000436class DerivedArgList(ArgList):
437 def __init__(self, args):
438 super(DerivedArgList, self).__init__(args.parser, args.argv)
439 self.parser = args.parser
440 self.argv = args.argv
441 self.syntheticArgv = args.syntheticArgv
442 self.lastArgs = {}
443 self.args = []
444
Daniel Dunbar1dd2ada2009-01-06 06:32:49 +0000445###
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000446
Daniel Dunbara5677512009-01-05 19:53:30 +0000447class OptionParser:
448 def __init__(self):
449 self.options = []
Daniel Dunbar5039f212009-01-06 02:30:10 +0000450 self.inputOption = InputOption()
451 self.unknownOption = UnknownOption()
452
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000453 # Driver driver options
454 self.archOption = self.addOption(SeparateOption('-arch'))
455
456 # Misc driver options
457 self.addOption(FlagOption('-pass-exit-codes'))
458 self.addOption(FlagOption('--help'))
459 self.addOption(FlagOption('--target-help'))
460
461 self.dumpspecsOption = self.addOption(FlagOption('-dumpspecs'))
462 self.dumpversionOption = self.addOption(FlagOption('-dumpversion'))
463 self.dumpmachineOption = self.addOption(FlagOption('-dumpmachine'))
464 self.printSearchDirsOption = self.addOption(FlagOption('-print-search-dirs'))
465 self.printLibgccFilenameOption = self.addOption(FlagOption('-print-libgcc-file-name'))
466 # FIXME: Hrm, where does this come from? It isn't always true that
467 # we take both - and --. For example, gcc --S ... ends up sending
468 # -fS to cc1. Investigate.
469 #
470 # FIXME: Need to implement some form of alias support inside
471 # getLastOption to handle this.
472 self.printLibgccFileNameOption2 = self.addOption(FlagOption('--print-libgcc-file-name'))
473 self.printFileNameOption = self.addOption(JoinedOption('-print-file-name='))
474 self.printProgNameOption = self.addOption(JoinedOption('-print-prog-name='))
475 self.printProgNameOption2 = self.addOption(JoinedOption('--print-prog-name='))
476 self.printMultiDirectoryOption = self.addOption(FlagOption('-print-multi-directory'))
477 self.printMultiLibOption = self.addOption(FlagOption('-print-multi-lib'))
478 self.addOption(FlagOption('-print-multi-os-directory'))
479
480 # Hmmm, who really takes this?
481 self.addOption(FlagOption('--version'))
482
483 # Pipeline control
484 self.hashHashHashOption = self.addOption(FlagOption('-###'))
485 self.EOption = self.addOption(FlagOption('-E'))
486 self.SOption = self.addOption(FlagOption('-S'))
487 self.cOption = self.addOption(FlagOption('-c'))
488 self.combineOption = self.addOption(FlagOption('-combine'))
489 self.noIntegratedCPPOption = self.addOption(FlagOption('-no-integrated-cpp'))
490 self.pipeOption = self.addOption(FlagOption('-pipe'))
491 self.saveTempsOption = self.addOption(FlagOption('-save-temps'))
492 self.saveTempsOption2 = self.addOption(FlagOption('--save-temps'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000493 # FIXME: Error out if this is used.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000494 self.addOption(JoinedOption('-specs='))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000495 # FIXME: Implement.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000496 self.addOption(FlagOption('-time'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000497 # FIXME: Implement.
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000498 self.vOption = self.addOption(FlagOption('-v'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000499
500 # Input/output stuff
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000501 self.oOption = self.addOption(JoinedOrSeparateOption('-o', noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000502 self.xOption = self.addOption(JoinedOrSeparateOption('-x'))
503
Daniel Dunbaree8cc262009-01-12 02:24:21 +0000504 self.ObjCOption = self.addOption(FlagOption('-ObjC'))
505 self.ObjCXXOption = self.addOption(FlagOption('-ObjC++'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000506
507 # FIXME: Weird, gcc claims this here in help but I'm not sure why;
508 # perhaps interaction with preprocessor? Investigate.
Daniel Dunbar816dd502009-01-12 17:53:19 +0000509
510 # FIXME: This is broken in Darwin cc1, it wants std* and this
511 # is std=. May need an option group for this as well.
512 self.stdOption = self.addOption(JoinedOption('-std='))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000513 self.addOption(JoinedOrSeparateOption('--sysroot'))
514
515 # Version control
516 self.addOption(JoinedOrSeparateOption('-B'))
517 self.addOption(JoinedOrSeparateOption('-V'))
518 self.addOption(JoinedOrSeparateOption('-b'))
519
520 # Blanket pass-through options.
521
Daniel Dunbar996ce962009-01-12 07:40:25 +0000522 self.WaOption = self.addOption(CommaJoinedOption('-Wa,'))
523 self.XassemblerOption = self.addOption(SeparateOption('-Xassembler'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000524
Daniel Dunbarb37c9652009-01-12 21:44:10 +0000525 self.WpOption = self.addOption(CommaJoinedOption('-Wp,'))
526 self.XpreprocessorOption = self.addOption(SeparateOption('-Xpreprocessor'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000527
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000528 self.addOption(CommaJoinedOption('-Wl,', isLinkerInput=True))
529 self.addOption(SeparateOption('-Xlinker', isLinkerInput=True, noOptAsInput=True))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000530
531 ####
532 # Bring on the random garbage.
533
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000534 self.MOption = self.addOption(FlagOption('-M'))
535 self.MDOption = self.addOption(FlagOption('-MD'))
536 self.MGOption = self.addOption(FlagOption('-MG'))
537 self.MMDOption = self.addOption(FlagOption('-MMD'))
538 self.MPOption = self.addOption(FlagOption('-MP'))
539 self.MMOption = self.addOption(FlagOption('-MM'))
540 self.MFOption = self.addOption(JoinedOrSeparateOption('-MF'))
541 self.MTOption = self.addOption(JoinedOrSeparateOption('-MT'))
542 self.MQOption = self.addOption(JoinedOrSeparateOption('-MQ'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000543 self.MachOption = self.addOption(FlagOption('-Mach'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000544 self.undefOption = self.addOption(FlagOption('-undef'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000545
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000546 self.wOption = self.addOption(FlagOption('-w'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000547 self.addOption(JoinedOrSeparateOption('-allowable_client'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000548 self.client_nameOption = self.addOption(JoinedOrSeparateOption('-client_name'))
549 self.compatibility_versionOption = self.addOption(JoinedOrSeparateOption('-compatibility_version'))
550 self.current_versionOption = self.addOption(JoinedOrSeparateOption('-current_version'))
551 self.dylinkerOption = self.addOption(FlagOption('-dylinker'))
552 self.dylinker_install_nameOption = self.addOption(JoinedOrSeparateOption('-dylinker_install_name'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000553 self.addOption(JoinedOrSeparateOption('-exported_symbols_list'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000554
555 self.iGroup = OptionGroup('-i')
556 self.addOption(JoinedOrSeparateOption('-idirafter', self.iGroup))
557 self.addOption(JoinedOrSeparateOption('-iquote', self.iGroup))
558 self.isysrootOption = self.addOption(JoinedOrSeparateOption('-isysroot', self.iGroup))
559 self.addOption(JoinedOrSeparateOption('-include', self.iGroup))
560 self.addOption(JoinedOption('-i', self.iGroup))
561
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000562 self.keep_private_externsOption = self.addOption(JoinedOrSeparateOption('-keep_private_externs'))
563 self.private_bundleOption = self.addOption(FlagOption('-private_bundle'))
564 self.seg1addrOption = self.addOption(JoinedOrSeparateOption('-seg1addr'))
565 self.segprotOption = self.addOption(JoinedOrSeparateOption('-segprot'))
566 self.sub_libraryOption = self.addOption(JoinedOrSeparateOption('-sub_library'))
567 self.sub_umbrellaOption = self.addOption(JoinedOrSeparateOption('-sub_umbrella'))
568 self.umbrellaOption = self.addOption(JoinedOrSeparateOption('-umbrella'))
569 self.undefinedOption = self.addOption(JoinedOrSeparateOption('-undefined'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000570 self.addOption(JoinedOrSeparateOption('-unexported_symbols_list'))
571 self.addOption(JoinedOrSeparateOption('-weak_framework'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000572 self.headerpad_max_install_namesOption = self.addOption(JoinedOption('-headerpad_max_install_names'))
573 self.twolevel_namespaceOption = self.addOption(FlagOption('-twolevel_namespace'))
574 self.twolevel_namespace_hintsOption = self.addOption(FlagOption('-twolevel_namespace_hints'))
575 self.prebindOption = self.addOption(FlagOption('-prebind'))
576 self.noprebindOption = self.addOption(FlagOption('-noprebind'))
577 self.nofixprebindingOption = self.addOption(FlagOption('-nofixprebinding'))
578 self.prebind_all_twolevel_modulesOption = self.addOption(FlagOption('-prebind_all_twolevel_modules'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000579 self.remapOption = self.addOption(FlagOption('-remap'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000580 self.read_only_relocsOption = self.addOption(SeparateOption('-read_only_relocs'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000581 self.addOption(FlagOption('-single_module'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000582 self.nomultidefsOption = self.addOption(FlagOption('-nomultidefs'))
583 self.nostartfilesOption = self.addOption(FlagOption('-nostartfiles'))
584 self.nodefaultlibsOption = self.addOption(FlagOption('-nodefaultlibs'))
585 self.nostdlibOption = self.addOption(FlagOption('-nostdlib'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000586 self.nostdincOption = self.addOption(FlagOption('-nostdinc'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000587 self.objectOption = self.addOption(FlagOption('-object'))
588 self.preloadOption = self.addOption(FlagOption('-preload'))
589 self.staticOption = self.addOption(FlagOption('-static'))
590 self.pagezero_sizeOption = self.addOption(FlagOption('-pagezero_size'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000591 self.addOption(FlagOption('-shared'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000592 self.staticLibgccOption = self.addOption(FlagOption('-static-libgcc'))
593 self.sharedLibgccOption = self.addOption(FlagOption('-shared-libgcc'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000594 self.COption = self.addOption(FlagOption('-C'))
595 self.CCOption = self.addOption(FlagOption('-CC'))
596 self.HOption = self.addOption(FlagOption('-H'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000597 self.addOption(FlagOption('-R'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000598 self.POption = self.addOption(FlagOption('-P'))
599 self.QOption = self.addOption(FlagOption('-Q'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000600 self.QnOption = self.addOption(FlagOption('-Qn'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000601 self.addOption(FlagOption('-all_load'))
602 self.addOption(FlagOption('--constant-cfstrings'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000603 self.traditionalOption = self.addOption(FlagOption('-traditional'))
604 self.traditionalCPPOption = self.addOption(FlagOption('-traditional-cpp'))
605 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000606 self.addOption(FlagOption('--traditional'))
607 self.addOption(FlagOption('-no_dead_strip_inits_and_terms'))
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000608 self.addOption(JoinedOption('-weak-l', isLinkerInput=True))
609 self.addOption(SeparateOption('-weak_framework', isLinkerInput=True))
610 self.addOption(SeparateOption('-weak_library', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000611 self.whyloadOption = self.addOption(FlagOption('-whyload'))
612 self.whatsloadedOption = self.addOption(FlagOption('-whatsloaded'))
613 self.sectalignOption = self.addOption(MultiArgOption('-sectalign', numArgs=3))
614 self.sectobjectsymbolsOption = self.addOption(MultiArgOption('-sectobjectsymbols', numArgs=2))
615 self.segcreateOption = self.addOption(MultiArgOption('-segcreate', numArgs=3))
616 self.segs_read_Option = self.addOption(JoinedOption('-segs_read_'))
617 self.seglinkeditOption = self.addOption(FlagOption('-seglinkedit'))
618 self.noseglinkeditOption = self.addOption(FlagOption('-noseglinkedit'))
619 self.sectcreateOption = self.addOption(MultiArgOption('-sectcreate', numArgs=3))
620 self.sectorderOption = self.addOption(MultiArgOption('-sectorder', numArgs=3))
621 self.Zall_loadOption = self.addOption(FlagOption('-Zall_load'))
622 self.Zallowable_clientOption = self.addOption(SeparateOption('-Zallowable_client'))
623 self.Zbind_at_loadOption = self.addOption(SeparateOption('-Zbind_at_load'))
624 self.ZbundleOption = self.addOption(FlagOption('-Zbundle'))
625 self.Zbundle_loaderOption = self.addOption(JoinedOrSeparateOption('-Zbundle_loader'))
626 self.Zdead_stripOption = self.addOption(FlagOption('-Zdead_strip'))
627 self.Zdylib_fileOption = self.addOption(JoinedOrSeparateOption('-Zdylib_file'))
628 self.ZdynamicOption = self.addOption(FlagOption('-Zdynamic'))
629 self.ZdynamiclibOption = self.addOption(FlagOption('-Zdynamiclib'))
630 self.Zexported_symbols_listOption = self.addOption(JoinedOrSeparateOption('-Zexported_symbols_list'))
631 self.Zflat_namespaceOption = self.addOption(FlagOption('-Zflat_namespace'))
632 self.Zfn_seg_addr_table_filenameOption = self.addOption(JoinedOrSeparateOption('-Zfn_seg_addr_table_filename'))
633 self.Zforce_cpusubtype_ALLOption = self.addOption(FlagOption('-Zforce_cpusubtype_ALL'))
634 self.Zforce_flat_namespaceOption = self.addOption(FlagOption('-Zforce_flat_namespace'))
635 self.Zimage_baseOption = self.addOption(FlagOption('-Zimage_base'))
636 self.ZinitOption = self.addOption(JoinedOrSeparateOption('-Zinit'))
637 self.Zmulti_moduleOption = self.addOption(FlagOption('-Zmulti_module'))
638 self.Zmultiply_definedOption = self.addOption(JoinedOrSeparateOption('-Zmultiply_defined'))
639 self.ZmultiplydefinedunusedOption = self.addOption(JoinedOrSeparateOption('-Zmultiplydefinedunused'))
640 self.ZmultiplydefinedunusedOption = self.addOption(JoinedOrSeparateOption('-Zmultiplydefinedunused'))
641 self.Zno_dead_strip_inits_and_termsOption = self.addOption(FlagOption('-Zno_dead_strip_inits_and_terms'))
642 self.Zseg_addr_tableOption = self.addOption(JoinedOrSeparateOption('-Zseg_addr_table'))
643 self.ZsegaddrOption = self.addOption(JoinedOrSeparateOption('-Zsegaddr'))
644 self.Zsegs_read_only_addrOption = self.addOption(JoinedOrSeparateOption('-Zsegs_read_only_addr'))
645 self.Zsegs_read_write_addrOption = self.addOption(JoinedOrSeparateOption('-Zsegs_read_write_addr'))
646 self.Zsingle_moduleOption = self.addOption(FlagOption('-Zsingle_module'))
Daniel Dunbar0fe5a4f2009-01-11 22:42:24 +0000647 self.ZumbrellaOption = self.addOption(JoinedOrSeparateOption('-Zumbrella'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000648 self.Zunexported_symbols_listOption = self.addOption(JoinedOrSeparateOption('-Zunexported_symbols_list'))
649 self.Zweak_reference_mismatchesOption = self.addOption(JoinedOrSeparateOption('-Zweak_reference_mismatches'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000650
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000651 self.addOption(SeparateOption('-filelist', isLinkerInput=True))
652 self.addOption(SeparateOption('-framework', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000653 # FIXME: Alias.
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000654 self.addOption(SeparateOption('-install_name'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000655 self.Zinstall_nameOption = self.addOption(JoinedOrSeparateOption('-Zinstall_name'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000656 self.addOption(SeparateOption('-seg_addr_table'))
657 self.addOption(SeparateOption('-seg_addr_table_filename'))
658
659 # Where are these coming from? I can't find them...
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000660 self.eOption = self.addOption(JoinedOrSeparateOption('-e'))
661 self.rOption = self.addOption(JoinedOrSeparateOption('-r'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000662
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000663 self.pgOption = self.addOption(FlagOption('-pg'))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000664 self.pOption = self.addOption(FlagOption('-p'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000665
666 doNotReallySupport = 1
667 if doNotReallySupport:
668 # Archaic gcc option.
669 self.addOption(FlagOption('-cpp-precomp'))
670 self.addOption(FlagOption('-no-cpp-precomp'))
671
672 # C options for testing
673
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000674 self.trigraphsOption = self.addOption(FlagOption('-trigraphs'))
675
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000676 # FIXME: This is broken, we need -A as a single option to send
677 # stuff to cc1, but the way the ld spec is constructed it
678 # wants to see -A options but only as a separate arg.
679 self.AOption = self.addOption(JoinedOrSeparateOption('-A'))
680 self.DOption = self.addOption(JoinedOrSeparateOption('-D'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000681 self.FOption = self.addOption(JoinedOrSeparateOption('-F'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000682 self.IOption = self.addOption(JoinedOrSeparateOption('-I'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000683 self.LOption = self.addOption(JoinedOrSeparateOption('-L'))
684 self.TOption = self.addOption(JoinedOrSeparateOption('-T'))
Daniel Dunbar6325fcf2009-01-12 09:23:15 +0000685 self.UOption = self.addOption(JoinedOrSeparateOption('-U'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000686 self.ZOption = self.addOption(JoinedOrSeparateOption('-Z'))
687
Daniel Dunbar2ec55bc2009-01-12 03:33:58 +0000688 self.addOption(JoinedOrSeparateOption('-l', isLinkerInput=True))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000689 self.uOption = self.addOption(JoinedOrSeparateOption('-u'))
690 self.tOption = self.addOption(JoinedOrSeparateOption('-t'))
691 self.yOption = self.addOption(JoinedOption('-y'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000692
693 # FIXME: What is going on here? '-X' goes to linker, and -X ... goes nowhere?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000694 self.XOption = self.addOption(FlagOption('-X'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000695 # Not exactly sure how to decompose this. I split out -Xarch_
696 # because we need to recognize that in the driver driver part.
697 # FIXME: Man, this is lame it needs its own option.
698 self.XarchOption = self.addOption(JoinedAndSeparateOption('-Xarch_'))
699 self.addOption(JoinedOption('-X'))
700
701 # The driver needs to know about this flag.
702 self.syntaxOnlyOption = self.addOption(FlagOption('-fsyntax-only'))
703
704 # FIXME: Wrong?
705 # FIXME: What to do about the ambiguity of options like
706 # -dumpspecs? How is this handled in gcc?
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000707 # FIXME: Naming convention.
708 self.dOption = self.addOption(FlagOption('-d'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000709
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000710 # Use a group for this in anticipation of adding more -d
711 # options explicitly. Note that we don't put many -d things in
712 # the -d group (like -dylinker, or '-d' by itself) because it
713 # is really a gcc bug that it ships these to cc1.
714 self.dGroup = OptionGroup('-d')
715 self.addOption(JoinedOption('-d', group=self.dGroup))
Daniel Dunbar996ce962009-01-12 07:40:25 +0000716
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000717 self.gGroup = OptionGroup('-g')
Daniel Dunbar841ceea2009-01-13 06:44:28 +0000718 self.gstabsOption = self.addOption(JoinedOption('-gstabs', self.gGroup))
719 self.g0Option = self.addOption(JoinedOption('-g0', self.gGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000720 self.g3Option = self.addOption(JoinedOption('-g3', self.gGroup))
721 self.gOption = self.addOption(JoinedOption('-g', self.gGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000722
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000723 # FIXME: How should we handle clang specific options? Do we
724 # want to avoid passing them to gcc/cc1 (which will generally
725 # not eat them), or should we let the user sort it out.
726
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000727 self.fGroup = OptionGroup('-f')
728 self.fastOption = self.addOption(FlagOption('-fast', self.fGroup))
729 self.fastfOption = self.addOption(FlagOption('-fastf', self.fGroup))
730 self.fastcpOption = self.addOption(FlagOption('-fastcp', self.fGroup))
731
732 self.f_appleKextOption = self.addOption(FlagOption('-fapple-kext', self.fGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000733 self.f_constantCfstringsOption = self.addOption(FlagOption('-fconstant-cfstrings', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000734 self.f_createProfileOption = self.addOption(FlagOption('-fcreate-profile', self.fGroup))
735 self.f_exceptionsOption = self.addOption(FlagOption('-fexceptions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000736 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000737 self.f_gnuRuntimeOption = self.addOption(FlagOption('-fgnu-runtime', self.fGroup))
738 self.f_laxVectorConversionsOption = self.addOption(FlagOption('-flax-vector-conversions', self.fGroup))
739 self.f_msExtensionsOption = self.addOption(FlagOption('-fms-extensions', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000740 self.f_mudflapOption = self.addOption(FlagOption('-fmudflap', self.fGroup))
741 self.f_mudflapthOption = self.addOption(FlagOption('-fmudflapth', self.fGroup))
742 self.f_nestedFunctionsOption = self.addOption(FlagOption('-fnested-functions', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000743 self.f_nextRuntimeOption = self.addOption(FlagOption('-fnext-runtime', self.fGroup))
744 self.f_noCaretDiagnosticsOption = self.addOption(FlagOption('-fno-caret-diagnostics', self.fGroup))
745 self.f_noConstantCfstringsOption = self.addOption(FlagOption('-fno-constant-cfstrings', self.fGroup))
746 self.f_noEliminateUnusedDebugSymbolsOption = self.addOption(FlagOption('-fno-eliminate-unused-debug-symbols', self.fGroup))
747 self.f_noPascalStringsOption = self.addOption(FlagOption('-fno-pascal-strings', self.fGroup))
748 self.f_noShowColumnOption = self.addOption(FlagOption('-fno-show-column', self.fGroup))
749 self.f_objcGcOnlyOption = self.addOption(FlagOption('-fobjc-gc-only', self.fGroup))
750 self.f_objcGcOption = self.addOption(FlagOption('-fobjc-gc', self.fGroup))
751 self.f_objcOption = self.addOption(FlagOption('-fobjc', self.fGroup))
752 self.f_openmpOption = self.addOption(FlagOption('-fopenmp', self.fGroup))
753 self.f_pascalStringsOption = self.addOption(FlagOption('-fpascal-strings', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000754 self.f_pieOption = self.addOption(FlagOption('-fpie', self.fGroup))
755 self.f_profileArcsOption = self.addOption(FlagOption('-fprofile-arcs', self.fGroup))
756 self.f_profileGenerateOption = self.addOption(FlagOption('-fprofile-generate', self.fGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000757 self.f_traditionalOption = self.addOption(FlagOption('-ftraditional', self.fGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000758 self.f_writableStringsOption = self.addOption(FlagOption('-fwritable-strings', self.fGroup))
Daniel Dunbar18a7c8c2009-01-13 07:39:45 +0000759 self.addOption(JoinedOption('-f', self.fGroup))
760
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000761 self.coverageOption = self.addOption(FlagOption('-coverage'))
762 self.coverageOption2 = self.addOption(FlagOption('--coverage'))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000763
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000764 self.mGroup = OptionGroup('-m')
765 self.m_32Option = self.addOption(FlagOption('-m32', self.mGroup))
766 self.m_64Option = self.addOption(FlagOption('-m64', self.mGroup))
767 self.m_dynamicNoPicOption = self.addOption(JoinedOption('-mdynamic-no-pic', self.mGroup))
768 self.m_iphoneosVersionMinOption = self.addOption(JoinedOption('-miphoneos-version-min=', self.mGroup))
769 self.m_kernelOption = self.addOption(FlagOption('-mkernel', self.mGroup))
770 self.m_macosxVersionMinOption = self.addOption(JoinedOption('-mmacosx-version-min=', self.mGroup))
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000771 self.m_constantCfstringsOption = self.addOption(FlagOption('-mconstant-cfstrings', self.mGroup))
772 self.m_noConstantCfstringsOption = self.addOption(FlagOption('-mno-constant-cfstrings', self.mGroup))
773 self.m_warnNonportableCfstringsOption = self.addOption(FlagOption('-mwarn-nonportable-cfstrings', self.mGroup))
774 self.m_noWarnNonportableCfstringsOption = self.addOption(FlagOption('-mno-warn-nonportable-cfstrings', self.mGroup))
775 self.m_pascalStringsOption = self.addOption(FlagOption('-mpascal-strings', self.mGroup))
776 self.m_noPascalStringsOption = self.addOption(FlagOption('-mno-pascal-strings', self.mGroup))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000777 self.m_tuneOption = self.addOption(JoinedOption('-mtune=', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000778
779 # Ugh. Need to disambiguate our naming convetion. -m x goes to
780 # the linker sometimes, wheres -mxxxx is used for a variety of
781 # other things.
782 self.mOption = self.addOption(SeparateOption('-m'))
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000783 self.addOption(JoinedOption('-m', self.mGroup))
Daniel Dunbar6f5d65a2009-01-11 22:12:37 +0000784
Daniel Dunbar8bf90fd2009-01-13 05:54:38 +0000785 # FIXME: Why does Darwin send -a* to cc1?
786 self.aGroup = OptionGroup('-a')
787 self.ansiOption = self.addOption(FlagOption('-ansi', self.aGroup))
788 self.aOption = self.addOption(JoinedOption('-a', self.aGroup))
789
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000790 self.pedanticGroup = OptionGroup('-pedantic')
791 self.pedanticOption = self.addOption(FlagOption('-pedantic', self.pedanticGroup))
792 self.pedanticErrorsOption = self.addOption(FlagOption('-pedantic-errors', self.pedanticGroup))
Daniel Dunbar816dd502009-01-12 17:53:19 +0000793 self.OOption = self.addOption(JoinedOption('-O'))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000794
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000795 self.WGroup = OptionGroup('-W')
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000796 self.ClangWGroup = OptionGroup('-W', self.WGroup)
797
798 self.addOption(JoinedOption('-Wunused-macros', self.ClangWGroup))
799 self.addOption(JoinedOption('-Wfloat-equal', self.ClangWGroup))
800 self.addOption(JoinedOption('-Wreadonly-setter-attrs', self.ClangWGroup))
801 self.addOption(JoinedOption('-Wno-format-nonliteral', self.ClangWGroup))
802 self.addOption(JoinedOption('-Wundef', self.ClangWGroup))
803 self.addOption(JoinedOption('-Wimplicit-function-declaration', self.ClangWGroup))
804 self.addOption(JoinedOption('-Wno-strict-selector-match', self.ClangWGroup))
805
Daniel Dunbar25d4a8f2009-01-13 21:07:43 +0000806 self.WnonportableCfstringsOption = self.addOption(JoinedOption('-Wnonportable-cfstrings', self.WGroup))
807 self.WnoNonportableCfstringsOption = self.addOption(JoinedOption('-Wno-nonportable-cfstrings', self.WGroup))
808 self.WOption = self.addOption(JoinedOption('-W', self.WGroup))
Daniel Dunbar3cde3252009-01-14 19:42:31 +0000809
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000810 # FIXME: Weird. This option isn't really separate, --param=a=b
Daniel Dunbar816dd502009-01-12 17:53:19 +0000811 # works. There is something else going on which interprets the
812 # '='.
813 self._paramOption = self.addOption(SeparateOption('--param'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000814
Daniel Dunbardff9f502009-01-12 18:51:02 +0000815 # FIXME: What is this? I think only one is valid, but have a
816 # log that uses both.
817 self.pthreadOption = self.addOption(FlagOption('-pthread'))
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000818 self.addOption(FlagOption('-pthreads'))
819
Daniel Dunbara5677512009-01-05 19:53:30 +0000820 def addOption(self, opt):
821 self.options.append(opt)
Daniel Dunbarba6e3232009-01-06 06:12:13 +0000822 return opt
Daniel Dunbara5677512009-01-05 19:53:30 +0000823
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000824 def parseArgs(self, argv):
Daniel Dunbara5677512009-01-05 19:53:30 +0000825 """
Daniel Dunbar1e5f3eb2009-01-06 01:35:44 +0000826 parseArgs([str]) -> ArgList
Daniel Dunbara5677512009-01-05 19:53:30 +0000827
828 Parse command line into individual option instances.
829 """
830
831 iargs = enumerate(argv)
832 it = iter(iargs)
Daniel Dunbar39cbfaa2009-01-07 18:54:26 +0000833 args = ArgList(self, argv)
Daniel Dunbarefb4aeb2009-01-07 01:57:39 +0000834 for pos,a in it:
835 i = InputIndex(0, pos)
Daniel Dunbara5677512009-01-05 19:53:30 +0000836 # FIXME: Handle '@'
837 if not a:
838 # gcc's handling of empty arguments doesn't make
839 # sense, but this is not a common use case. :)
840 #
841 # We just ignore them here (note that other things may
842 # still take them as arguments).
843 pass
844 elif a[0] == '-' and a != '-':
845 args.append(self.lookupOptForArg(i, a, it))
846 else:
Daniel Dunbar5039f212009-01-06 02:30:10 +0000847 args.append(PositionalArg(i, self.inputOption))
Daniel Dunbara5677512009-01-05 19:53:30 +0000848 return args
849
Daniel Dunbar5039f212009-01-06 02:30:10 +0000850 def lookupOptForArg(self, i, string, it):
851 for o in self.options:
852 arg = o.accept(i, string, it)
853 if arg is not None:
854 return arg
855 return PositionalArg(i, self.unknownOption)