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