X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fnetradiant.git;a=blobdiff_plain;f=utils.py;h=1e9774af7c81d137097197eaf89f2e149452b8b0;hp=f88389527e0a9c3a8dbb9dc58a05e59a8904b6a4;hb=7a51df0e11e3aac1dc929775a0bc82f18b16f4eb;hpb=287cde2548fe80cf16fb523fc3993d3dd2f40500 diff --git a/utils.py b/utils.py index f8838952..1e9774af 100644 --- a/utils.py +++ b/utils.py @@ -1,130 +1,130 @@ -# -*- mode: python -*- -# QuakeZero build scripts -# TTimo -# http://scons.sourceforge.net - -import os, commands, platform, xml.sax, re, string, platform - -class vcproj( xml.sax.handler.ContentHandler ): - def __init__( self, filepath ): - self.source_files = [] - self.misc_files = [] - self._files = [] - print 'parse %s' % filepath - xml.sax.parse( filepath, self ) - - def getSourceFiles( self ): - return self.source_files - - def filterSource( self, expression, filelist = None ): - if ( filelist is None ): - filelist = self.source_files - match = [] - nomatch = [] - for s in filelist: - if ( re.match( expression, s ) ): - match.append( s ) - else: - nomatch.append( s ) - return ( match, nomatch ) - - def startElement( self, name, attrs ): - if ( name == 'File' ): - self._files.append( attrs.getValue('RelativePath') ) - - def endDocument( self ): - # split into source and headers, remap path seperator to the platform - for f in self._files: - if ( platform.system() != 'Windows' ): - f = f.replace( '\\', '/' ) - if ( f[-2:] == '.c' or f[-4:] == '.cpp' ): - self.source_files.append( f.encode('ascii') ) - else: - self.misc_files.append( f ) - print '%d source files' % len( self.source_files ) - -# action uses LDD to verify that the source doesn't hold unresolved symbols -# setup as an AddPostAction of a regular SharedLibrary call -def CheckUnresolved( source, target, env ): - # TODO: implement this for OSX - if ( platform.system() == 'Darwin' ): - return None - print 'CheckUnresolved %s' % target[0].abspath - if ( not os.path.isfile( target[0].abspath ) ): - print 'CheckUnresolved: %s does not exist' % target[0] - return 1 # fail - ( status, output ) = commands.getstatusoutput( 'ldd -r %s' % target[0] ) - if ( status != 0 ): - print 'CheckUnresolved: ldd command failed (exit code %d)' % status - os.system( 'rm %s' % target[ 0 ] ) - return 1 # fail - lines = string.split( output, '\n' ) - have_undef = 0 - for i_line in lines: - regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)') - if ( regex.match( i_line ) ): - symbol = regex.sub( '\\1', i_line ) - try: - env['ALLOWED_SYMBOLS'].index( symbol ) - except: - have_undef = 1 - if ( have_undef ): - print output - print "CheckUnresolved: undefined symbols" - os.system('rm %s' % target[0]) - return 1 - -# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486 - -def Enum(*names): - ##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment! - - class EnumClass(object): - __slots__ = names - def __iter__(self): return iter(constants) - def __len__(self): return len(constants) - def __getitem__(self, i): return constants[i] - def __repr__(self): return 'Enum' + str(names) - def __str__(self): return 'enum ' + str(constants) - - class EnumValue(object): - __slots__ = ('__value') - def __init__(self, value): self.__value = value - Value = property(lambda self: self.__value) - EnumType = property(lambda self: EnumType) - def __hash__(self): return hash(self.__value) - def __cmp__(self, other): - # C fans might want to remove the following assertion - # to make all enums comparable by ordinal value {;)) - assert self.EnumType is other.EnumType, "Only values from the same enum are comparable" - return cmp(self.__value, other.__value) - def __invert__(self): return constants[maximum - self.__value] - def __nonzero__(self): return bool(self.__value) - def __repr__(self): return str(names[self.__value]) - - maximum = len(names) - 1 - constants = [None] * len(names) - for i, each in enumerate(names): - val = EnumValue(i) - setattr(EnumClass, each, val) - constants[i] = val - constants = tuple(constants) - EnumType = EnumClass() - return EnumType - -#if __name__ == '__main__': -# print '\n*** Enum Demo ***' -# print '--- Days of week ---' -# Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su') -# print Days -# print Days.Mo -# print Days.Fr -# print Days.Mo < Days.Fr -# print list(Days) -# for each in Days: -# print 'Day:', each -# print '--- Yes/No ---' -# Confirmation = Enum('No', 'Yes') -# answer = Confirmation.No -# print 'Your answer is not', ~answer - +# -*- mode: python -*- +# QuakeZero build scripts +# TTimo +# http://scons.sourceforge.net + +import os, commands, platform, xml.sax, re, string, platform + +class vcproj( xml.sax.handler.ContentHandler ): + def __init__( self, filepath ): + self.source_files = [] + self.misc_files = [] + self._files = [] + print 'parse %s' % filepath + xml.sax.parse( filepath, self ) + + def getSourceFiles( self ): + return self.source_files + + def filterSource( self, expression, filelist = None ): + if ( filelist is None ): + filelist = self.source_files + match = [] + nomatch = [] + for s in filelist: + if ( re.match( expression, s ) ): + match.append( s ) + else: + nomatch.append( s ) + return ( match, nomatch ) + + def startElement( self, name, attrs ): + if ( name == 'File' ): + self._files.append( attrs.getValue('RelativePath') ) + + def endDocument( self ): + # split into source and headers, remap path seperator to the platform + for f in self._files: + if ( platform.system() != 'Windows' ): + f = f.replace( '\\', '/' ) + if ( f[-2:] == '.c' or f[-4:] == '.cpp' ): + self.source_files.append( f.encode('ascii') ) + else: + self.misc_files.append( f ) + print '%d source files' % len( self.source_files ) + +# action uses LDD to verify that the source doesn't hold unresolved symbols +# setup as an AddPostAction of a regular SharedLibrary call +def CheckUnresolved( source, target, env ): + # TODO: implement this for OSX + if ( platform.system() == 'Darwin' ): + return None + print 'CheckUnresolved %s' % target[0].abspath + if ( not os.path.isfile( target[0].abspath ) ): + print 'CheckUnresolved: %s does not exist' % target[0] + return 1 # fail + ( status, output ) = commands.getstatusoutput( 'ldd -r %s' % target[0] ) + if ( status != 0 ): + print 'CheckUnresolved: ldd command failed (exit code %d)' % status + os.system( 'rm %s' % target[ 0 ] ) + return 1 # fail + lines = string.split( output, '\n' ) + have_undef = 0 + for i_line in lines: + regex = re.compile('undefined symbol: (.*)\t\\((.*)\\)') + if ( regex.match( i_line ) ): + symbol = regex.sub( '\\1', i_line ) + try: + env['ALLOWED_SYMBOLS'].index( symbol ) + except: + have_undef = 1 + if ( have_undef ): + print output + print "CheckUnresolved: undefined symbols" + os.system('rm %s' % target[0]) + return 1 + +# http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/413486 + +def Enum(*names): + ##assert names, "Empty enums are not supported" # <- Don't like empty enums? Uncomment! + + class EnumClass(object): + __slots__ = names + def __iter__(self): return iter(constants) + def __len__(self): return len(constants) + def __getitem__(self, i): return constants[i] + def __repr__(self): return 'Enum' + str(names) + def __str__(self): return 'enum ' + str(constants) + + class EnumValue(object): + __slots__ = ('__value') + def __init__(self, value): self.__value = value + Value = property(lambda self: self.__value) + EnumType = property(lambda self: EnumType) + def __hash__(self): return hash(self.__value) + def __cmp__(self, other): + # C fans might want to remove the following assertion + # to make all enums comparable by ordinal value {;)) + assert self.EnumType is other.EnumType, "Only values from the same enum are comparable" + return cmp(self.__value, other.__value) + def __invert__(self): return constants[maximum - self.__value] + def __nonzero__(self): return bool(self.__value) + def __repr__(self): return str(names[self.__value]) + + maximum = len(names) - 1 + constants = [None] * len(names) + for i, each in enumerate(names): + val = EnumValue(i) + setattr(EnumClass, each, val) + constants[i] = val + constants = tuple(constants) + EnumType = EnumClass() + return EnumType + +#if __name__ == '__main__': +# print '\n*** Enum Demo ***' +# print '--- Days of week ---' +# Days = Enum('Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su') +# print Days +# print Days.Mo +# print Days.Fr +# print Days.Mo < Days.Fr +# print list(Days) +# for each in Days: +# print 'Day:', each +# print '--- Yes/No ---' +# Confirmation = Enum('No', 'Yes') +# answer = Confirmation.No +# print 'Your answer is not', ~answer +