Home | History | Annotate | Download | only in registry
      1 #!/usr/bin/env python
      2 #
      3 # Copyright (c) 2013-2014 The Khronos Group Inc.
      4 #
      5 # Permission is hereby granted, free of charge, to any person obtaining a
      6 # copy of this software and/or associated documentation files (the
      7 # "Materials"), to deal in the Materials without restriction, including
      8 # without limitation the rights to use, copy, modify, merge, publish,
      9 # distribute, sublicense, and/or sell copies of the Materials, and to
     10 # permit persons to whom the Materials are furnished to do so, subject to
     11 # the following conditions:
     12 #
     13 # The above copyright notice and this permission notice shall be included
     14 # in all copies or substantial portions of the Materials.
     15 #
     16 # THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     17 # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18 # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     19 # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
     20 # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     21 # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     22 # MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
     23 
     24 import sys, time, pdb, string, cProfile
     25 from reg import *
     26 
     27 # debug - start header generation in debugger
     28 # dump - dump registry after loading
     29 # profile - enable Python profiling
     30 # protect - whether to use #ifndef protections
     31 # registry <filename> - use specified XML registry instead of gl.xml
     32 # target - string name of target header, or all targets if None
     33 # timeit - time length of registry loading & header generation
     34 # validate - validate return & parameter group tags against <group>
     35 debug   = False
     36 dump    = False
     37 profile = False
     38 protect = True
     39 target  = None
     40 timeit  = False
     41 validate= False
     42 # Default input / log files
     43 errFilename = None
     44 diagFilename = 'diag.txt'
     45 regFilename = 'gl.xml'
     46 
     47 if __name__ == '__main__':
     48     i = 1
     49     while (i < len(sys.argv)):
     50         arg = sys.argv[i]
     51         i = i + 1
     52         if (arg == '-debug'):
     53             write('Enabling debug (-debug)', file=sys.stderr)
     54             debug = True
     55         elif (arg == '-dump'):
     56             write('Enabling dump (-dump)', file=sys.stderr)
     57             dump = True
     58         elif (arg == '-noprotect'):
     59             write('Disabling inclusion protection in output headers', file=sys.stderr)
     60             protect = False
     61         elif (arg == '-profile'):
     62             write('Enabling profiling (-profile)', file=sys.stderr)
     63             profile = True
     64         elif (arg == '-registry'):
     65             regFilename = sys.argv[i]
     66             i = i+1
     67             write('Using registry ', regFilename, file=sys.stderr)
     68         elif (arg == '-time'):
     69             write('Enabling timing (-time)', file=sys.stderr)
     70             timeit = True
     71         elif (arg == '-validate'):
     72             write('Enabling group validation (-validate)', file=sys.stderr)
     73             validate = True
     74         elif (arg[0:1] == '-'):
     75             write('Unrecognized argument:', arg, file=sys.stderr)
     76             exit(1)
     77         else:
     78             target = arg
     79             write('Using target', target, file=sys.stderr)
     80 
     81 # Simple timer functions
     82 startTime = None
     83 def startTimer():
     84     global startTime
     85     startTime = time.clock()
     86 def endTimer(msg):
     87     global startTime
     88     endTime = time.clock()
     89     if (timeit):
     90         write(msg, endTime - startTime)
     91         startTime = None
     92 
     93 # Load & parse registry
     94 reg = Registry()
     95 
     96 startTimer()
     97 tree = etree.parse(regFilename)
     98 endTimer('Time to make ElementTree =')
     99 
    100 startTimer()
    101 reg.loadElementTree(tree)
    102 endTimer('Time to parse ElementTree =')
    103 
    104 if (validate):
    105     reg.validateGroups()
    106 
    107 if (dump):
    108     write('***************************************')
    109     write('Performing Registry dump to regdump.txt')
    110     write('***************************************')
    111     reg.dumpReg(filehandle = open('regdump.txt','w'))
    112 
    113 # Turn a list of strings into a regexp string matching exactly those strings
    114 def makeREstring(list):
    115     return '^(' + '|'.join(list) + ')$'
    116 
    117 # These are "mandatory" OpenGL ES 1 extensions, to
    118 # be included in the core GLES/gl.h header.
    119 es1CoreList = [
    120     'GL_OES_read_format',
    121     'GL_OES_compressed_paletted_texture',
    122     'GL_OES_point_size_array',
    123     'GL_OES_point_sprite'
    124 ]
    125 
    126 # Descriptive names for various regexp patterns used to select
    127 # versions and extensions
    128 
    129 allVersions     = allExtensions = '.*'
    130 noVersions      = noExtensions = None
    131 gl12andLaterPat = '1\.[2-9]|[234]\.[0-9]'
    132 gles2onlyPat    = '2\.[0-9]'
    133 gles2and30Pat   = '2\.[0-9]|3.0'
    134 gles2and30and31Pat    = '2.[0-9]|3.[01]'
    135 es1CorePat      = makeREstring(es1CoreList)
    136 # Extensions in old glcorearb.h but not yet tagged accordingly in gl.xml
    137 glCoreARBPat    = None
    138 glx13andLaterPat = '1\.[3-9]'
    139 
    140 # Copyright text prefixing all headers (list of strings).
    141 prefixStrings = [
    142     '/*',
    143     '** Copyright (c) 2013-2014 The Khronos Group Inc.',
    144     '**',
    145     '** Permission is hereby granted, free of charge, to any person obtaining a',
    146     '** copy of this software and/or associated documentation files (the',
    147     '** "Materials"), to deal in the Materials without restriction, including',
    148     '** without limitation the rights to use, copy, modify, merge, publish,',
    149     '** distribute, sublicense, and/or sell copies of the Materials, and to',
    150     '** permit persons to whom the Materials are furnished to do so, subject to',
    151     '** the following conditions:',
    152     '**',
    153     '** The above copyright notice and this permission notice shall be included',
    154     '** in all copies or substantial portions of the Materials.',
    155     '**',
    156     '** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,',
    157     '** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF',
    158     '** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.',
    159     '** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY',
    160     '** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,',
    161     '** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE',
    162     '** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.',
    163     '*/',
    164     '/*',
    165     '** This header is generated from the Khronos OpenGL / OpenGL ES XML',
    166     '** API Registry. The current version of the Registry, generator scripts',
    167     '** used to make the header, and the header can be found at',
    168     '**   http://www.opengl.org/registry/',
    169     '**',
    170     '** Khronos $' + 'Revision$ on $' + 'Date$',
    171     '*/',
    172     ''
    173 ]
    174 
    175 # glext.h / glcorearb.h define calling conventions inline (no GL *platform.h)
    176 glExtPlatformStrings = [
    177     '#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
    178     '#ifndef WIN32_LEAN_AND_MEAN',
    179     '#define WIN32_LEAN_AND_MEAN 1',
    180     '#endif',
    181     '#include <windows.h>',
    182     '#endif',
    183     '',
    184     '#ifndef APIENTRY',
    185     '#define APIENTRY',
    186     '#endif',
    187     '#ifndef APIENTRYP',
    188     '#define APIENTRYP APIENTRY *',
    189     '#endif',
    190     '#ifndef GLAPI',
    191     '#define GLAPI extern',
    192     '#endif',
    193     ''
    194 ]
    195 
    196 glCorearbPlatformStrings = glExtPlatformStrings + [
    197     '/* glcorearb.h is for use with OpenGL core profile implementations.',
    198     '** It should should be placed in the same directory as gl.h and',
    199     '** included as <GL/glcorearb.h>.',
    200     '**',
    201     '** glcorearb.h includes only APIs in the latest OpenGL core profile',
    202     '** implementation together with APIs in newer ARB extensions which ',
    203     '** can be supported by the core profile. It does not, and never will',
    204     '** include functionality removed from the core profile, such as',
    205     '** fixed-function vertex and fragment processing.',
    206     '**',
    207     '** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or',
    208     '** <GL/glext.h> in the same source file.',
    209     '*/',
    210     ''
    211 ]
    212 
    213 # wglext.h needs Windows include
    214 wglPlatformStrings = [
    215     '#if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)',
    216     '#define WIN32_LEAN_AND_MEAN 1',
    217     '#include <windows.h>',
    218     '#endif',
    219     '',
    220 ]
    221 
    222 # GLES 1/2/3 core .h have separate *platform.h files to define calling conventions
    223 gles1PlatformStrings = [ '#include <GLES/glplatform.h>', '' ]
    224 gles2PlatformStrings = [ '#include <GLES2/gl2platform.h>', '' ]
    225 gles3PlatformStrings = [ '#include <GLES3/gl3platform.h>', '' ]
    226 eglPlatformStrings   = [ '#include <EGL/eglplatform.h>', '' ]
    227 
    228 # GLES 1/2 extension .h have small addition to calling convention headers
    229 gles1ExtPlatformStrings = gles2ExtPlatformStrings = [
    230     '#ifndef GL_APIENTRYP',
    231     '#define GL_APIENTRYP GL_APIENTRY*',
    232     '#endif',
    233     ''
    234 ]
    235 
    236 # Insert generation date in a comment for headers not having *GLEXT_VERSION macros
    237 genDateCommentString = [
    238     format("/* Generated on date %s */" % time.strftime("%Y%m%d")),
    239     ''
    240 ]
    241 
    242 # GL_GLEXT_VERSION is defined only in glext.h
    243 glextVersionStrings = [
    244     format("#define GL_GLEXT_VERSION %s" % time.strftime("%Y%m%d")),
    245     ''
    246 ]
    247 # WGL_WGLEXT_VERSION is defined only in wglext.h
    248 wglextVersionStrings = [
    249     format("#define WGL_WGLEXT_VERSION %s" % time.strftime("%Y%m%d")),
    250     ''
    251 ]
    252 # GLX_GLXEXT_VERSION is defined only in glxext.h
    253 glxextVersionStrings = [
    254     format("#define GLX_GLXEXT_VERSION %s" % time.strftime("%Y%m%d")),
    255     ''
    256 ]
    257 # EGL_EGLEXT_VERSION is defined only in eglext.h
    258 eglextVersionStrings = [
    259     format("#define EGL_EGLEXT_VERSION %s" % time.strftime("%Y%m%d")),
    260     ''
    261 ]
    262 
    263 # Defaults for generating re-inclusion protection wrappers (or not)
    264 protectFile = protect
    265 protectFeature = protect
    266 protectProto = protect
    267 
    268 buildList = [
    269     # GL API 1.2+ + extensions - GL/glext.h
    270     CGeneratorOptions(
    271         filename          = 'GL/glext.h',
    272         apiname           = 'gl',
    273         profile           = 'compatibility',
    274         versions          = allVersions,
    275         emitversions      = gl12andLaterPat,
    276         defaultExtensions = 'gl',                   # Default extensions for GL
    277         addExtensions     = None,
    278         removeExtensions  = None,
    279         prefixText        = prefixStrings + glExtPlatformStrings + glextVersionStrings,
    280         genFuncPointers   = True,
    281         protectFile       = protectFile,
    282         protectFeature    = protectFeature,
    283         protectProto      = protectProto,
    284         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    285         apicall           = 'GLAPI ',
    286         apientry          = 'APIENTRY ',
    287         apientryp         = 'APIENTRYP '),
    288     # GL core profile + extensions - GL/glcorearb.h
    289     CGeneratorOptions(
    290         filename          = 'GL/glcorearb.h',
    291         apiname           = 'gl',
    292         profile           = 'core',
    293         versions          = allVersions,
    294         emitversions      = allVersions,
    295         defaultExtensions = 'glcore',               # Default extensions for GL core profile (only)
    296         addExtensions     = glCoreARBPat,
    297         removeExtensions  = None,
    298         prefixText        = prefixStrings + glCorearbPlatformStrings,
    299         genFuncPointers   = True,
    300         protectFile       = protectFile,
    301         protectFeature    = protectFeature,
    302         protectProto      = protectProto,
    303         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    304         apicall           = 'GLAPI ',
    305         apientry          = 'APIENTRY ',
    306         apientryp         = 'APIENTRYP '),
    307     # GLES 1.x API + mandatory extensions - GLES/gl.h (no function pointers)
    308     CGeneratorOptions(
    309         filename          = 'GLES/gl.h',
    310         apiname           = 'gles1',
    311         profile           = 'common',
    312         versions          = allVersions,
    313         emitversions      = allVersions,
    314         defaultExtensions = None,                   # No default extensions
    315         addExtensions     = es1CorePat,             # Add mandatory ES1 extensions in GLES1/gl.h
    316         removeExtensions  = None,
    317         prefixText        = prefixStrings + gles1PlatformStrings + genDateCommentString,
    318         genFuncPointers   = False,
    319         protectFile       = protectFile,
    320         protectFeature    = protectFeature,
    321         protectProto      = False,                  # Core ES API functions are in the static link libraries
    322         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    323         apicall           = 'GL_API ',
    324         apientry          = 'GL_APIENTRY ',
    325         apientryp         = 'GL_APIENTRYP '),
    326     # GLES 1.x extensions - GLES/glext.h
    327     CGeneratorOptions(
    328         filename          = 'GLES/glext.h',
    329         apiname           = 'gles1',
    330         profile           = 'common',
    331         versions          = allVersions,
    332         emitversions      = noVersions,
    333         defaultExtensions = 'gles1',                # Default extensions for GLES 1
    334         addExtensions     = None,
    335         removeExtensions  = es1CorePat,             # Remove mandatory ES1 extensions in GLES1/glext.h
    336         prefixText        = prefixStrings + gles1ExtPlatformStrings + genDateCommentString,
    337         genFuncPointers   = True,
    338         protectFile       = protectFile,
    339         protectFeature    = protectFeature,
    340         protectProto      = protectProto,
    341         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    342         apicall           = 'GL_API ',
    343         apientry          = 'GL_APIENTRY ',
    344         apientryp         = 'GL_APIENTRYP '),
    345     # GLES 2.0 API - GLES2/gl2.h (no function pointers)
    346     CGeneratorOptions(
    347         filename          = 'GLES2/gl2.h',
    348         apiname           = 'gles2',
    349         profile           = 'common',
    350         versions          = gles2onlyPat,
    351         emitversions      = allVersions,
    352         defaultExtensions = None,                   # No default extensions
    353         addExtensions     = None,
    354         removeExtensions  = None,
    355         prefixText        = prefixStrings + gles2PlatformStrings + genDateCommentString,
    356         genFuncPointers   = False,
    357         protectFile       = protectFile,
    358         protectFeature    = protectFeature,
    359         protectProto      = False,                  # Core ES API functions are in the static link libraries
    360         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    361         apicall           = 'GL_APICALL ',
    362         apientry          = 'GL_APIENTRY ',
    363         apientryp         = 'GL_APIENTRYP '),
    364     # GLES 3.1 / 3.0 / 2.0 extensions - GLES2/gl2ext.h
    365     CGeneratorOptions(
    366         filename          = 'GLES2/gl2ext.h',
    367         apiname           = 'gles2',
    368         profile           = 'common',
    369         versions          = gles2onlyPat,
    370         emitversions      = None,
    371         defaultExtensions = 'gles2',                # Default extensions for GLES 2
    372         addExtensions     = None,
    373         removeExtensions  = None,
    374         prefixText        = prefixStrings + gles2ExtPlatformStrings + genDateCommentString,
    375         genFuncPointers   = True,
    376         protectFile       = protectFile,
    377         protectFeature    = protectFeature,
    378         protectProto      = protectProto,
    379         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    380         apicall           = 'GL_APICALL ',
    381         apientry          = 'GL_APIENTRY ',
    382         apientryp         = 'GL_APIENTRYP '),
    383     # GLES 3.1 API - GLES3/gl31.h (no function pointers)
    384     CGeneratorOptions(
    385         filename          = 'GLES3/gl31.h',
    386         apiname           = 'gles2',
    387         profile           = 'common',
    388         versions          = gles2and30and31Pat,
    389         emitversions      = allVersions,
    390         defaultExtensions = None,                   # No default extensions
    391         addExtensions     = None,
    392         removeExtensions  = None,
    393         prefixText        = prefixStrings + gles3PlatformStrings + genDateCommentString,
    394         genFuncPointers   = False,
    395         protectFile       = protectFile,
    396         protectFeature    = protectFeature,
    397         protectProto      = False,                  # Core ES API functions are in the static link libraries
    398         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    399         apicall           = 'GL_APICALL ',
    400         apientry          = 'GL_APIENTRY ',
    401         apientryp         = 'GL_APIENTRYP '),
    402     # GLES 3.0 API - GLES3/gl3.h (no function pointers)
    403     CGeneratorOptions(
    404         filename          = 'GLES3/gl3.h',
    405         apiname           = 'gles2',
    406         profile           = 'common',
    407         versions          = gles2and30Pat,
    408         emitversions      = allVersions,
    409         defaultExtensions = None,                   # No default extensions
    410         addExtensions     = None,
    411         removeExtensions  = None,
    412         prefixText        = prefixStrings + gles3PlatformStrings + genDateCommentString,
    413         genFuncPointers   = False,
    414         protectFile       = protectFile,
    415         protectFeature    = protectFeature,
    416         protectProto      = False,                  # Core ES API functions are in the static link libraries
    417         protectProtoStr   = 'GL_GLEXT_PROTOTYPES',
    418         apicall           = 'GL_APICALL ',
    419         apientry          = 'GL_APIENTRY ',
    420         apientryp         = 'GL_APIENTRYP '),
    421     # EGL API - EGL/egl.h (no function pointers, yet @@@)
    422     CGeneratorOptions(
    423         filename          = 'EGL/egl.h',
    424         apiname           = 'egl',
    425         profile           = None,
    426         versions          = allVersions,
    427         emitversions      = allVersions,
    428         defaultExtensions = None,                   # No default extensions
    429         addExtensions     = None,
    430         removeExtensions  = None,
    431         prefixText        = prefixStrings + eglPlatformStrings + genDateCommentString,
    432         genFuncPointers   = False,
    433         protectFile       = protectFile,
    434         protectFeature    = protectFeature,
    435         protectProto      = False,
    436         protectProtoStr   = 'EGL_EGLEXT_PROTOTYPES',
    437         apicall           = 'EGLAPI ',
    438         apientry          = 'EGLAPIENTRY ',
    439         apientryp         = 'EGLAPIENTRYP '),
    440     # EGL extensions - EGL/eglext.h (no function pointers, yet @@@)
    441     CGeneratorOptions(
    442         filename          = 'EGL/eglext.h',
    443         apiname           = 'egl',
    444         profile           = None,
    445         versions          = allVersions,
    446         emitversions      = None,
    447         defaultExtensions = 'egl',                  # Default extensions for EGL
    448         addExtensions     = None,
    449         removeExtensions  = None,
    450         prefixText        = prefixStrings + eglPlatformStrings + eglextVersionStrings,
    451         genFuncPointers   = True,
    452         protectFile       = protectFile,
    453         protectFeature    = protectFeature,
    454         protectProto      = protectProto,
    455         protectProtoStr   = 'EGL_EGLEXT_PROTOTYPES',
    456         apicall           = 'EGLAPI ',
    457         apientry          = 'EGLAPIENTRY ',
    458         apientryp         = 'EGLAPIENTRYP '),
    459     # GLX 1.* API - GL/glx.h
    460     CGeneratorOptions(
    461         filename          = 'GL/glx.h',
    462         apiname           = 'glx',
    463         profile           = None,
    464         versions          = allVersions,
    465         emitversions      = allVersions,
    466         defaultExtensions = None,                   # No default extensions
    467         addExtensions     = None,
    468         removeExtensions  = None,
    469         # add glXPlatformStrings?
    470         prefixText        = prefixStrings + genDateCommentString,
    471         genFuncPointers   = True,
    472         protectFile       = protectFile,
    473         protectFeature    = protectFeature,
    474         protectProto      = protectProto,
    475         protectProtoStr   = 'GLX_GLXEXT_PROTOTYPES',
    476         apicall           = '',
    477         apientry          = '',
    478         apientryp         = ' *'),
    479     # GLX 1.3+ API + extensions - GL/glxext.h (no function pointers, yet @@@)
    480     CGeneratorOptions(
    481         filename          = 'GL/glxext.h',
    482         apiname           = 'glx',
    483         profile           = None,
    484         versions          = allVersions,
    485         emitversions      = glx13andLaterPat,
    486         defaultExtensions = 'glx',                  # Default extensions for GLX
    487         addExtensions     = None,
    488         removeExtensions  = None,
    489         # add glXPlatformStrings?
    490         prefixText        = prefixStrings + glxextVersionStrings,
    491         genFuncPointers   = True,
    492         protectFile       = protectFile,
    493         protectFeature    = protectFeature,
    494         protectProto      = protectProto,
    495         protectProtoStr   = 'GLX_GLXEXT_PROTOTYPES',
    496         apicall           = '',
    497         apientry          = '',
    498         apientryp         = ' *'),
    499     # WGL API + extensions - GL/wgl.h (no function pointers, yet @@@)
    500     CGeneratorOptions(
    501         filename          = 'GL/wgl.h',
    502         apiname           = 'wgl',
    503         profile           = None,
    504         versions          = allVersions,
    505         emitversions      = allVersions,
    506         defaultExtensions = 'wgl',                  # Default extensions for WGL
    507         addExtensions     = None,
    508         removeExtensions  = None,
    509         prefixText        = prefixStrings + wglPlatformStrings + genDateCommentString,
    510         genFuncPointers   = True,
    511         protectFile       = protectFile,
    512         protectFeature    = protectFeature,
    513         protectProto      = protectProto,
    514         protectProtoStr   = 'WGL_WGLEXT_PROTOTYPES',
    515         apicall           = '',
    516         apientry          = 'WINAPI ',
    517         apientryp         = 'WINAPI * '),
    518     # WGL extensions - GL/wglext.h (no function pointers, yet @@@)
    519     CGeneratorOptions(
    520         filename          = 'GL/wglext.h',
    521         apiname           = 'wgl',
    522         profile           = None,
    523         versions          = allVersions,
    524         emitversions      = None,
    525         defaultExtensions = 'wgl',                  # Default extensions for WGL
    526         addExtensions     = None,
    527         removeExtensions  = None,
    528         prefixText        = prefixStrings + wglPlatformStrings + wglextVersionStrings,
    529         genFuncPointers   = True,
    530         protectFile       = protectFile,
    531         protectFeature    = protectFeature,
    532         protectProto      = protectProto,
    533         protectProtoStr   = 'WGL_WGLEXT_PROTOTYPES',
    534         apicall           = '',
    535         apientry          = 'WINAPI ',
    536         apientryp         = 'WINAPI * '),
    537     # End of list
    538     None
    539 ]
    540 
    541 # create error/warning & diagnostic files
    542 if (errFilename):
    543     errWarn = open(errFilename,'w')
    544 else:
    545     errWarn = sys.stderr
    546 diag = open(diagFilename, 'w')
    547 
    548 def genHeaders():
    549     # Loop over targets, building each
    550     generated = 0
    551     for genOpts in buildList:
    552         if (genOpts == None):
    553             break
    554         if (target and target != genOpts.filename):
    555             # write('*** Skipping', genOpts.filename)
    556             continue
    557         write('*** Building', genOpts.filename)
    558         generated = generated + 1
    559         startTimer()
    560         gen = COutputGenerator(errFile=errWarn,
    561                                warnFile=errWarn,
    562                                diagFile=diag)
    563         reg.setGenerator(gen)
    564         reg.apiGen(genOpts)
    565         write('** Generated', genOpts.filename)
    566         endTimer('Time to generate ' + genOpts.filename + ' =')
    567     if (target and generated == 0):
    568         write('Failed to generate target:', target)
    569 
    570 if (debug):
    571     pdb.run('genHeaders()')
    572 elif (profile):
    573     import cProfile, pstats
    574     cProfile.run('genHeaders()', 'profile.txt')
    575     p = pstats.Stats('profile.txt')
    576     p.strip_dirs().sort_stats('time').print_stats(50)
    577 else:
    578     genHeaders()
    579