| class InputType(object): |
| """InputType - Information about various classes of files which |
| the driver recognizes and control processing.""" |
| |
| def __init__(self, name, preprocess=None, onlyAssemble=False, |
| onlyPrecompile=False, tempSuffix=None, |
| canBeUserSpecified=False): |
| assert preprocess is None or isinstance(preprocess, InputType) |
| self.name = name |
| self.preprocess = preprocess |
| self.onlyAssemble = onlyAssemble |
| self.onlyPrecompile = onlyPrecompile |
| self.tempSuffix = tempSuffix |
| self.canBeUserSpecified = canBeUserSpecified |
| |
| def __repr__(self): |
| return '%s(%r, %r, %r, %r, %r)' % (self.__class__.__name__, |
| self.name, |
| self.preprocess, |
| self.onlyAssemble, |
| self.onlyPrecompile, |
| self.tempSuffix, |
| self.canBeUserSpecified) |
| |
| # C family source language (with and without preprocessing). |
| CTypeNoPP = InputType('cpp-output', tempSuffix='i', |
| canBeUserSpecified=True) |
| CType = InputType('c', CTypeNoPP, |
| canBeUserSpecified=True) |
| ObjCTypeNoPP = InputType('objective-c-cpp-output', tempSuffix='mi', |
| canBeUserSpecified=True) |
| ObjCType = InputType('objective-c', ObjCTypeNoPP, |
| canBeUserSpecified=True) |
| CXXTypeNoPP = InputType('c++-cpp-output', tempSuffix='ii', |
| canBeUserSpecified=True) |
| CXXType = InputType('c++', CXXTypeNoPP, |
| canBeUserSpecified=True) |
| ObjCXXTypeNoPP = InputType('objective-c++-cpp-output', tempSuffix='mii', |
| canBeUserSpecified=True) |
| ObjCXXType = InputType('objective-c++', ObjCXXTypeNoPP, |
| canBeUserSpecified=True) |
| |
| # C family input files to precompile. |
| CHeaderNoPPType = InputType('c-header-cpp-output', onlyPrecompile=True, tempSuffix='pch') |
| CHeaderType = InputType('c-header', CHeaderNoPPType, onlyPrecompile=True, |
| canBeUserSpecified=True) |
| ObjCHeaderNoPPType = InputType('objective-c-header-cpp-output', onlyPrecompile=True, tempSuffix='pch') |
| ObjCHeaderType = InputType('objective-c-header', ObjCHeaderNoPPType, onlyPrecompile=True, |
| canBeUserSpecified=True) |
| CXXHeaderNoPPType = InputType('c++-header-cpp-output', onlyPrecompile=True, tempSuffix='pch') |
| CXXHeaderType = InputType('c++-header', CXXHeaderNoPPType, onlyPrecompile=True, |
| canBeUserSpecified=True) |
| ObjCXXHeaderNoPPType = InputType('objective-c++-header-cpp-output', onlyPrecompile=True, tempSuffix='pch') |
| ObjCXXHeaderType = InputType('objective-c++-header', ObjCXXHeaderNoPPType, onlyPrecompile=True, |
| canBeUserSpecified=True) |
| |
| # Other languages. |
| AdaType = InputType('ada', canBeUserSpecified=True) |
| AsmTypeNoPP = InputType('assembler', onlyAssemble=True, tempSuffix='s', |
| canBeUserSpecified=True) |
| AsmType = InputType('assembler-with-cpp', AsmTypeNoPP, onlyAssemble=True, |
| canBeUserSpecified=True) |
| FortranTypeNoPP = InputType('f95', canBeUserSpecified=True) |
| FortranType = InputType('f95-cpp-input', FortranTypeNoPP, canBeUserSpecified=True) |
| JavaType = InputType('java', canBeUserSpecified=True) |
| |
| # Misc. |
| PCHType = InputType('precompiled-header') |
| ObjectType = InputType('object', tempSuffix='o') |
| TreelangType = InputType('treelang', canBeUserSpecified=True) |
| ImageType = InputType('image', tempSuffix='out') |
| NothingType = InputType('nothing') |
| |
| ### |
| |
| kDefaultOutput = "a.out" |
| kTypeSuffixMap = { |
| '.c' : CType, |
| '.i' : CTypeNoPP, |
| '.ii' : CXXTypeNoPP, |
| '.m' : ObjCType, |
| '.mi' : ObjCTypeNoPP, |
| '.mm' : ObjCXXType, |
| '.M' : ObjCXXType, |
| '.mii' : ObjCXXTypeNoPP, |
| '.h' : CHeaderType, |
| '.cc' : CXXType, |
| '.cc' : CXXType, |
| '.cp' : CXXType, |
| '.cxx' : CXXType, |
| '.cpp' : CXXType, |
| '.CPP' : CXXType, |
| '.cXX' : CXXType, |
| '.C' : CXXType, |
| '.hh' : CXXHeaderType, |
| '.H' : CXXHeaderType, |
| '.f' : FortranTypeNoPP, |
| '.for' : FortranTypeNoPP, |
| '.FOR' : FortranTypeNoPP, |
| '.F' : FortranType, |
| '.fpp' : FortranType, |
| '.FPP' : FortranType, |
| '.f90' : FortranTypeNoPP, |
| '.f95' : FortranTypeNoPP, |
| '.F90' : FortranType, |
| '.F95' : FortranType, |
| # Apparently the Ada F-E hardcodes these suffixes in many |
| # places. This explains why there is only one -x option for ada. |
| '.ads' : AdaType, |
| '.adb' : AdaType, |
| # FIXME: Darwin always uses a preprocessor for asm input. Where |
| # does this fit? |
| '.s' : AsmTypeNoPP, |
| '.S' : AsmType, |
| } |
| kTypeSpecifierMap = { |
| 'none' : None, |
| |
| 'c' : CType, |
| 'c-header' : CHeaderType, |
| # NOTE: gcc.info claims c-cpp-output works but the actual spelling |
| # is cpp-output. Nice. |
| 'cpp-output' : CTypeNoPP, |
| 'c++' : CXXType, |
| 'c++-header' : CXXHeaderType, |
| 'c++-cpp-output' : CXXTypeNoPP, |
| 'objective-c' : ObjCType, |
| 'objective-c-header' : ObjCHeaderType, |
| 'objective-c-cpp-output' : ObjCTypeNoPP, |
| 'objective-c++' : ObjCXXType, |
| 'objective-c++-header' : ObjCXXHeaderType, |
| 'objective-c++-cpp-output' : ObjCXXTypeNoPP, |
| 'assembler' : AsmTypeNoPP, |
| 'assembler-with-cpp' : AsmType, |
| 'ada' : AdaType, |
| 'f95-cpp-input' : FortranType, |
| 'f95' : FortranTypeNoPP, |
| 'java' : JavaType, |
| 'treelang' : TreelangType, |
| } |
| |
| # Check that the type specifier map at least matches what the types |
| # believe to be true. |
| assert not [name for name,type in kTypeSpecifierMap.items() |
| if type and (type.name != name or not type.canBeUserSpecified)] |