blob: a4347c1e474c9434d2aabf62cf240e3a6304ac6f [file] [log] [blame]
Mark Lobodzinski2d589822016-12-12 09:44:34 -07001#!/usr/bin/python3
Mark Lobodzinskif19fef92016-10-11 15:23:51 -06002#
Mark Lobodzinski733f7f42017-01-10 11:42:22 -07003# Copyright (c) 2013-2017 The Khronos Group Inc.
Mark Lobodzinskif19fef92016-10-11 15:23:51 -06004#
5# Licensed under the Apache License, Version 2.0 (the "License");
6# you may not use this file except in compliance with the License.
7# You may obtain a copy of the License at
8#
9# http://www.apache.org/licenses/LICENSE-2.0
10#
11# Unless required by applicable law or agreed to in writing, software
12# distributed under the License is distributed on an "AS IS" BASIS,
13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14# See the License for the specific language governing permissions and
15# limitations under the License.
16
17import argparse, cProfile, pdb, string, sys, time
18from reg import *
19from generator import write
Mark Lobodzinski36c33862017-02-13 10:15:53 -070020from cgenerator import CGeneratorOptions, COutputGenerator
21# LoaderAndValidationLayer Generator Modifications
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060022from threading_generator import ThreadGeneratorOptions, ThreadOutputGenerator
Mark Lobodzinskid4950072017-08-01 13:02:20 -060023from parameter_validation_generator import ParameterValidationGeneratorOptions, ParameterValidationOutputGenerator
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060024from unique_objects_generator import UniqueObjectsGeneratorOptions, UniqueObjectsOutputGenerator
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -060025from object_tracker_generator import ObjectTrackerGeneratorOptions, ObjectTrackerOutputGenerator
Mark Young0f183a82017-02-28 09:58:04 -070026from dispatch_table_helper_generator import DispatchTableHelperOutputGenerator, DispatchTableHelperOutputGeneratorOptions
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -070027from helper_file_generator import HelperFileOutputGenerator, HelperFileOutputGeneratorOptions
Mark Young0f183a82017-02-28 09:58:04 -070028from loader_extension_generator import LoaderExtensionOutputGenerator, LoaderExtensionGeneratorOptions
Tobin Ehlis45a0a802017-10-13 09:26:20 -060029from mock_icd_generator import MockICDGeneratorOptions, MockICDOutputGenerator
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060030
31# Simple timer functions
32startTime = None
33
34def startTimer(timeit):
35 global startTime
36 startTime = time.clock()
37
38def endTimer(timeit, msg):
39 global startTime
40 endTime = time.clock()
41 if (timeit):
42 write(msg, endTime - startTime, file=sys.stderr)
43 startTime = None
44
45# Turn a list of strings into a regexp string matching exactly those strings
46def makeREstring(list):
47 return '^(' + '|'.join(list) + ')$'
48
49# Returns a directory of [ generator function, generator options ] indexed
50# by specified short names. The generator options incorporate the following
51# parameters:
52#
Mark Lobodzinski16530212017-09-18 15:13:54 -060053# features - list of <feature> names to include; defaults to all features
54# extensions - list of <extension> names to include.
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060055# protect - True if re-inclusion protection should be added to headers
56# directory - path to directory in which to generate the target(s)
Mark Lobodzinski16530212017-09-18 15:13:54 -060057def makeGenOpts(features = [],
58 extensions = [],
59 removeExtensions = [],
60 protect = True,
61 directory = '.'):
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060062 global genOpts
63 genOpts = {}
64
65 # Descriptive names for various regexp patterns used to select
66 # versions and extensions
Mark Lobodzinski16530212017-09-18 15:13:54 -060067 allFeatures = allExtensions = '.*'
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060068 noVersions = noExtensions = None
69
70 addExtensions = makeREstring(extensions)
Mark Lobodzinski2d589822016-12-12 09:44:34 -070071 removeExtensions = makeREstring(removeExtensions)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060072
Mark Lobodzinski16530212017-09-18 15:13:54 -060073 if len(features) > 0:
74 features = makeREstring(features)
75 else:
76 features = allFeatures
77
78 # write('* Selecting features: ', features, file=sys.stderr)
79
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060080 # Copyright text prefixing all headers (list of strings).
81 prefixStrings = [
82 '/*',
Mark Lobodzinski36c33862017-02-13 10:15:53 -070083 '** Copyright (c) 2015-2017 The Khronos Group Inc.',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -060084 '**',
85 '** Licensed under the Apache License, Version 2.0 (the "License");',
86 '** you may not use this file except in compliance with the License.',
87 '** You may obtain a copy of the License at',
88 '**',
89 '** http://www.apache.org/licenses/LICENSE-2.0',
90 '**',
91 '** Unless required by applicable law or agreed to in writing, software',
92 '** distributed under the License is distributed on an "AS IS" BASIS,',
93 '** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.',
94 '** See the License for the specific language governing permissions and',
95 '** limitations under the License.',
96 '*/',
97 ''
98 ]
99
100 # Text specific to Vulkan headers
101 vkPrefixStrings = [
102 '/*',
103 '** This header is generated from the Khronos Vulkan XML API Registry.',
104 '**',
105 '*/',
106 ''
107 ]
108
109 # Defaults for generating re-inclusion protection wrappers (or not)
110 protectFile = protect
111 protectFeature = protect
112 protectProto = protect
113
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700114
115 #
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600116 # LoaderAndValidationLayer Generators
117 # Options for threading layer
118 genOpts['thread_check.h'] = [
119 ThreadOutputGenerator,
120 ThreadGeneratorOptions(
121 filename = 'thread_check.h',
122 directory = directory,
123 apiname = 'vulkan',
124 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600125 versions = features,
126 emitversions = features,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600127 defaultExtensions = 'vulkan',
128 addExtensions = addExtensions,
129 removeExtensions = removeExtensions,
130 prefixText = prefixStrings + vkPrefixStrings,
131 protectFeature = False,
132 apicall = 'VKAPI_ATTR ',
133 apientry = 'VKAPI_CALL ',
134 apientryp = 'VKAPI_PTR *',
135 alignFuncParam = 48)
136 ]
137
138 # Options for parameter validation layer
Mark Lobodzinskid4950072017-08-01 13:02:20 -0600139 genOpts['parameter_validation.cpp'] = [
140 ParameterValidationOutputGenerator,
141 ParameterValidationGeneratorOptions(
142 filename = 'parameter_validation.cpp',
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600143 directory = directory,
144 apiname = 'vulkan',
145 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600146 versions = features,
147 emitversions = features,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600148 defaultExtensions = 'vulkan',
149 addExtensions = addExtensions,
150 removeExtensions = removeExtensions,
151 prefixText = prefixStrings + vkPrefixStrings,
152 protectFeature = False,
153 apicall = 'VKAPI_ATTR ',
154 apientry = 'VKAPI_CALL ',
155 apientryp = 'VKAPI_PTR *',
156 alignFuncParam = 48)
157 ]
158
159 # Options for unique objects layer
160 genOpts['unique_objects_wrappers.h'] = [
161 UniqueObjectsOutputGenerator,
162 UniqueObjectsGeneratorOptions(
163 filename = 'unique_objects_wrappers.h',
164 directory = directory,
165 apiname = 'vulkan',
166 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600167 versions = features,
168 emitversions = features,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600169 defaultExtensions = 'vulkan',
170 addExtensions = addExtensions,
171 removeExtensions = removeExtensions,
172 prefixText = prefixStrings + vkPrefixStrings,
173 protectFeature = False,
174 apicall = 'VKAPI_ATTR ',
175 apientry = 'VKAPI_CALL ',
176 apientryp = 'VKAPI_PTR *',
177 alignFuncParam = 48)
178 ]
179
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600180 # Options for object_tracker layer
181 genOpts['object_tracker.cpp'] = [
182 ObjectTrackerOutputGenerator,
183 ObjectTrackerGeneratorOptions(
184 filename = 'object_tracker.cpp',
185 directory = directory,
186 apiname = 'vulkan',
187 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600188 versions = features,
189 emitversions = features,
Mark Lobodzinski0740bcf2017-07-18 13:49:05 -0600190 defaultExtensions = 'vulkan',
191 addExtensions = addExtensions,
192 removeExtensions = removeExtensions,
193 prefixText = prefixStrings + vkPrefixStrings,
194 protectFeature = False,
195 apicall = 'VKAPI_ATTR ',
196 apientry = 'VKAPI_CALL ',
197 apientryp = 'VKAPI_PTR *',
198 alignFuncParam = 48)
199 ]
200
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700201 # Options for dispatch table helper generator
202 genOpts['vk_dispatch_table_helper.h'] = [
Mark Young0f183a82017-02-28 09:58:04 -0700203 DispatchTableHelperOutputGenerator,
204 DispatchTableHelperOutputGeneratorOptions(
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700205 filename = 'vk_dispatch_table_helper.h',
206 directory = directory,
207 apiname = 'vulkan',
208 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600209 versions = features,
210 emitversions = features,
Mark Lobodzinskieb0b5ef2016-12-06 11:30:50 -0700211 defaultExtensions = 'vulkan',
212 addExtensions = addExtensions,
213 removeExtensions = removeExtensions,
214 prefixText = prefixStrings + vkPrefixStrings,
215 protectFeature = False,
216 apicall = 'VKAPI_ATTR ',
217 apientry = 'VKAPI_CALL ',
218 apientryp = 'VKAPI_PTR *',
219 alignFuncParam = 48)
220 ]
221
Mark Young0f183a82017-02-28 09:58:04 -0700222 # Options for Layer dispatch table generator
223 genOpts['vk_layer_dispatch_table.h'] = [
224 LoaderExtensionOutputGenerator,
225 LoaderExtensionGeneratorOptions(
226 filename = 'vk_layer_dispatch_table.h',
227 directory = directory,
228 apiname = 'vulkan',
229 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600230 versions = features,
231 emitversions = features,
Mark Young0f183a82017-02-28 09:58:04 -0700232 defaultExtensions = 'vulkan',
233 addExtensions = addExtensions,
234 removeExtensions = removeExtensions,
235 prefixText = prefixStrings + vkPrefixStrings,
236 protectFeature = False,
237 apicall = 'VKAPI_ATTR ',
238 apientry = 'VKAPI_CALL ',
239 apientryp = 'VKAPI_PTR *',
240 alignFuncParam = 48)
241 ]
242
243 # Options for loader extension source generator
244 genOpts['vk_loader_extensions.h'] = [
245 LoaderExtensionOutputGenerator,
246 LoaderExtensionGeneratorOptions(
247 filename = 'vk_loader_extensions.h',
248 directory = directory,
249 apiname = 'vulkan',
250 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600251 versions = features,
252 emitversions = features,
Mark Young0f183a82017-02-28 09:58:04 -0700253 defaultExtensions = 'vulkan',
254 addExtensions = addExtensions,
255 removeExtensions = removeExtensions,
256 prefixText = prefixStrings + vkPrefixStrings,
257 protectFeature = False,
258 apicall = 'VKAPI_ATTR ',
259 apientry = 'VKAPI_CALL ',
260 apientryp = 'VKAPI_PTR *',
261 alignFuncParam = 48)
262 ]
263
264 # Options for loader extension source generator
265 genOpts['vk_loader_extensions.c'] = [
266 LoaderExtensionOutputGenerator,
267 LoaderExtensionGeneratorOptions(
268 filename = 'vk_loader_extensions.c',
269 directory = directory,
270 apiname = 'vulkan',
271 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600272 versions = features,
273 emitversions = features,
Mark Young0f183a82017-02-28 09:58:04 -0700274 defaultExtensions = 'vulkan',
275 addExtensions = addExtensions,
276 removeExtensions = removeExtensions,
277 prefixText = prefixStrings + vkPrefixStrings,
278 protectFeature = False,
279 apicall = 'VKAPI_ATTR ',
280 apientry = 'VKAPI_CALL ',
281 apientryp = 'VKAPI_PTR *',
282 alignFuncParam = 48)
283 ]
284
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700285 # Helper file generator options for vk_enum_string_helper.h
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700286 genOpts['vk_enum_string_helper.h'] = [
287 HelperFileOutputGenerator,
288 HelperFileOutputGeneratorOptions(
289 filename = 'vk_enum_string_helper.h',
290 directory = directory,
291 apiname = 'vulkan',
292 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600293 versions = features,
294 emitversions = features,
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700295 defaultExtensions = 'vulkan',
296 addExtensions = addExtensions,
297 removeExtensions = removeExtensions,
298 prefixText = prefixStrings + vkPrefixStrings,
299 protectFeature = False,
300 apicall = 'VKAPI_ATTR ',
301 apientry = 'VKAPI_CALL ',
302 apientryp = 'VKAPI_PTR *',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700303 alignFuncParam = 48,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700304 helper_file_type = 'enum_string_header')
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700305 ]
306
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700307 # Helper file generator options for vk_struct_size_helper.h
308 genOpts['vk_struct_size_helper.h'] = [
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700309 HelperFileOutputGenerator,
310 HelperFileOutputGeneratorOptions(
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700311 filename = 'vk_struct_size_helper.h',
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700312 directory = directory,
313 apiname = 'vulkan',
314 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600315 versions = features,
316 emitversions = features,
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700317 defaultExtensions = 'vulkan',
318 addExtensions = addExtensions,
319 removeExtensions = removeExtensions,
320 prefixText = prefixStrings + vkPrefixStrings,
321 protectFeature = False,
322 apicall = 'VKAPI_ATTR ',
323 apientry = 'VKAPI_CALL ',
324 apientryp = 'VKAPI_PTR *',
325 alignFuncParam = 48,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700326 helper_file_type = 'struct_size_header')
327 ]
328
329 # Helper file generator options for vk_struct_size_helper.c
330 genOpts['vk_struct_size_helper.c'] = [
331 HelperFileOutputGenerator,
332 HelperFileOutputGeneratorOptions(
333 filename = 'vk_struct_size_helper.c',
334 directory = directory,
335 apiname = 'vulkan',
336 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600337 versions = features,
338 emitversions = features,
Mark Lobodzinski46d388f2016-12-28 10:46:26 -0700339 defaultExtensions = 'vulkan',
340 addExtensions = addExtensions,
341 removeExtensions = removeExtensions,
342 prefixText = prefixStrings + vkPrefixStrings,
343 protectFeature = False,
344 apicall = 'VKAPI_ATTR ',
345 apientry = 'VKAPI_CALL ',
346 apientryp = 'VKAPI_PTR *',
347 alignFuncParam = 48,
348 helper_file_type = 'struct_size_source')
Mark Lobodzinski79839b72016-12-28 08:49:29 -0700349 ]
Mark Lobodzinski41d9bb32016-12-27 13:50:05 -0700350
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700351 # Helper file generator options for vk_safe_struct.h
352 genOpts['vk_safe_struct.h'] = [
353 HelperFileOutputGenerator,
354 HelperFileOutputGeneratorOptions(
355 filename = 'vk_safe_struct.h',
356 directory = directory,
357 apiname = 'vulkan',
358 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600359 versions = features,
360 emitversions = features,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700361 defaultExtensions = 'vulkan',
362 addExtensions = addExtensions,
363 removeExtensions = removeExtensions,
364 prefixText = prefixStrings + vkPrefixStrings,
365 protectFeature = False,
366 apicall = 'VKAPI_ATTR ',
367 apientry = 'VKAPI_CALL ',
368 apientryp = 'VKAPI_PTR *',
369 alignFuncParam = 48,
370 helper_file_type = 'safe_struct_header')
371 ]
372
373 # Helper file generator options for vk_safe_struct.cpp
374 genOpts['vk_safe_struct.cpp'] = [
375 HelperFileOutputGenerator,
376 HelperFileOutputGeneratorOptions(
377 filename = 'vk_safe_struct.cpp',
378 directory = directory,
379 apiname = 'vulkan',
380 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600381 versions = features,
382 emitversions = features,
Mark Lobodzinskiaf631782017-01-03 10:55:13 -0700383 defaultExtensions = 'vulkan',
384 addExtensions = addExtensions,
385 removeExtensions = removeExtensions,
386 prefixText = prefixStrings + vkPrefixStrings,
387 protectFeature = False,
388 apicall = 'VKAPI_ATTR ',
389 apientry = 'VKAPI_CALL ',
390 apientryp = 'VKAPI_PTR *',
391 alignFuncParam = 48,
392 helper_file_type = 'safe_struct_source')
393 ]
394
Mark Lobodzinski70972012017-04-03 16:59:15 -0600395 # Helper file generator options for vk_object_types.h
396 genOpts['vk_object_types.h'] = [
397 HelperFileOutputGenerator,
398 HelperFileOutputGeneratorOptions(
399 filename = 'vk_object_types.h',
400 directory = directory,
401 apiname = 'vulkan',
402 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600403 versions = features,
404 emitversions = features,
Mark Lobodzinski70972012017-04-03 16:59:15 -0600405 defaultExtensions = 'vulkan',
406 addExtensions = addExtensions,
407 removeExtensions = removeExtensions,
408 prefixText = prefixStrings + vkPrefixStrings,
409 protectFeature = False,
410 apicall = 'VKAPI_ATTR ',
411 apientry = 'VKAPI_CALL ',
412 apientryp = 'VKAPI_PTR *',
413 alignFuncParam = 48,
414 helper_file_type = 'object_types_header')
415 ]
416
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600417 # Helper file generator options for extension_helper.h
418 genOpts['vk_extension_helper.h'] = [
419 HelperFileOutputGenerator,
420 HelperFileOutputGeneratorOptions(
421 filename = 'vk_extension_helper.h',
422 directory = directory,
423 apiname = 'vulkan',
424 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600425 versions = features,
426 emitversions = features,
Mark Lobodzinskib2a2aa02017-06-01 07:41:46 -0600427 defaultExtensions = 'vulkan',
428 addExtensions = addExtensions,
429 removeExtensions = removeExtensions,
430 prefixText = prefixStrings + vkPrefixStrings,
431 protectFeature = False,
432 apicall = 'VKAPI_ATTR ',
433 apientry = 'VKAPI_CALL ',
434 apientryp = 'VKAPI_PTR *',
435 alignFuncParam = 48,
436 helper_file_type = 'extension_helper_header')
437 ]
438
John Zulaufde972ac2017-10-26 12:07:05 -0600439 # Helper file generator options for typemap_helper.h
440 genOpts['vk_typemap_helper.h'] = [
441 HelperFileOutputGenerator,
442 HelperFileOutputGeneratorOptions(
443 filename = 'vk_typemap_helper.h',
444 directory = directory,
445 apiname = 'vulkan',
446 profile = None,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600447 versions = featuresPat,
448 emitversions = featuresPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600449 defaultExtensions = 'vulkan',
Mark Lobodzinski16530212017-09-18 15:13:54 -0600450 addExtensions = addExtensionsPat,
451 removeExtensions = removeExtensionsPat,
452 emitExtensions = emitExtensionsPat,
John Zulaufde972ac2017-10-26 12:07:05 -0600453 prefixText = prefixStrings + vkPrefixStrings,
454 protectFeature = False,
455 apicall = 'VKAPI_ATTR ',
456 apientry = 'VKAPI_CALL ',
457 apientryp = 'VKAPI_PTR *',
458 alignFuncParam = 48,
Mark Lobodzinski16530212017-09-18 15:13:54 -0600459 expandEnumerants = False,
John Zulaufde972ac2017-10-26 12:07:05 -0600460 helper_file_type = 'typemap_helper_header')
461 ]
462
Tobin Ehlis45a0a802017-10-13 09:26:20 -0600463 # Options for mock ICD header
464 genOpts['mock_icd.h'] = [
465 MockICDOutputGenerator,
466 MockICDGeneratorOptions(
467 filename = 'mock_icd.h',
468 directory = directory,
469 apiname = 'vulkan',
470 profile = None,
471 versions = allVersions,
472 emitversions = allVersions,
473 defaultExtensions = 'vulkan',
474 addExtensions = addExtensions,
475 removeExtensions = removeExtensions,
476 prefixText = prefixStrings + vkPrefixStrings,
477 protectFeature = False,
478 apicall = 'VKAPI_ATTR ',
479 apientry = 'VKAPI_CALL ',
480 apientryp = 'VKAPI_PTR *',
481 alignFuncParam = 48,
482 helper_file_type = 'mock_icd_header')
483 ]
484
485 # Options for mock ICD cpp
486 genOpts['mock_icd.cpp'] = [
487 MockICDOutputGenerator,
488 MockICDGeneratorOptions(
489 filename = 'mock_icd.cpp',
490 directory = directory,
491 apiname = 'vulkan',
492 profile = None,
493 versions = allVersions,
494 emitversions = allVersions,
495 defaultExtensions = 'vulkan',
496 addExtensions = addExtensions,
497 removeExtensions = removeExtensions,
498 prefixText = prefixStrings + vkPrefixStrings,
499 protectFeature = False,
500 apicall = 'VKAPI_ATTR ',
501 apientry = 'VKAPI_CALL ',
502 apientryp = 'VKAPI_PTR *',
503 alignFuncParam = 48,
504 helper_file_type = 'mock_icd_source')
505 ]
Mark Lobodzinski70972012017-04-03 16:59:15 -0600506
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600507# Generate a target based on the options in the matching genOpts{} object.
508# This is encapsulated in a function so it can be profiled and/or timed.
509# The args parameter is an parsed argument object containing the following
510# fields that are used:
511# target - target to generate
512# directory - directory to generate it in
513# protect - True if re-inclusion wrappers should be created
514# extensions - list of additional extensions to include in generated
515# interfaces
516def genTarget(args):
517 global genOpts
518
519 # Create generator options with specified parameters
Mark Lobodzinski16530212017-09-18 15:13:54 -0600520 makeGenOpts(features = args.feature,
521 extensions = args.extension,
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700522 removeExtensions = args.removeExtension,
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600523 protect = args.protect,
524 directory = args.directory)
525
526 if (args.target in genOpts.keys()):
527 createGenerator = genOpts[args.target][0]
528 options = genOpts[args.target][1]
529
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700530 if not args.quiet:
531 write('* Building', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600532
533 startTimer(args.time)
534 gen = createGenerator(errFile=errWarn,
535 warnFile=errWarn,
536 diagFile=diag)
537 reg.setGenerator(gen)
538 reg.apiGen(options)
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700539
540 if not args.quiet:
541 write('* Generated', options.filename, file=sys.stderr)
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600542 endTimer(args.time, '* Time to generate ' + options.filename + ' =')
543 else:
544 write('No generator options for unknown target:',
545 args.target, file=sys.stderr)
546
Mark Lobodzinski16530212017-09-18 15:13:54 -0600547# -feature name
548# -extension name
549# For both, "name" may be a single name, or a space-separated list
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600550# of names, or a regular expression.
551if __name__ == '__main__':
552 parser = argparse.ArgumentParser()
553
554 parser.add_argument('-extension', action='append',
555 default=[],
556 help='Specify an extension or extensions to add to targets')
Mark Lobodzinski16530212017-09-18 15:13:54 -0600557 parser.add_argument('-feature', action='append',
558 default=[],
559 help='Specify a core API feature name or names to add to targets')
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700560 parser.add_argument('-removeExtension', action='append',
561 default=[],
562 help='Specify an extension or extensions to remove from targets')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600563 parser.add_argument('-debug', action='store_true',
564 help='Enable debugging')
565 parser.add_argument('-dump', action='store_true',
566 help='Enable dump to stderr')
567 parser.add_argument('-diagfile', action='store',
568 default=None,
569 help='Write diagnostics to specified file')
570 parser.add_argument('-errfile', action='store',
571 default=None,
572 help='Write errors and warnings to specified file instead of stderr')
573 parser.add_argument('-noprotect', dest='protect', action='store_false',
574 help='Disable inclusion protection in output headers')
575 parser.add_argument('-profile', action='store_true',
576 help='Enable profiling')
577 parser.add_argument('-registry', action='store',
578 default='vk.xml',
579 help='Use specified registry file instead of vk.xml')
580 parser.add_argument('-time', action='store_true',
581 help='Enable timing')
582 parser.add_argument('-validate', action='store_true',
583 help='Enable group validation')
584 parser.add_argument('-o', action='store', dest='directory',
585 default='.',
586 help='Create target and related files in specified directory')
587 parser.add_argument('target', metavar='target', nargs='?',
588 help='Specify target')
Mark Lobodzinskicbaa2cd2016-12-19 09:41:16 -0700589 parser.add_argument('-quiet', action='store_true', default=False,
590 help='Suppress script output during normal execution.')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600591
592 args = parser.parse_args()
593
594 # This splits arguments which are space-separated lists
Mark Lobodzinski16530212017-09-18 15:13:54 -0600595 args.feature = [name for arg in args.feature for name in arg.split()]
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600596 args.extension = [name for arg in args.extension for name in arg.split()]
597
598 # Load & parse registry
599 reg = Registry()
600
601 startTimer(args.time)
602 tree = etree.parse(args.registry)
603 endTimer(args.time, '* Time to make ElementTree =')
604
605 startTimer(args.time)
606 reg.loadElementTree(tree)
607 endTimer(args.time, '* Time to parse ElementTree =')
608
609 if (args.validate):
610 reg.validateGroups()
611
612 if (args.dump):
613 write('* Dumping registry to regdump.txt', file=sys.stderr)
Mark Lobodzinski36c33862017-02-13 10:15:53 -0700614 reg.dumpReg(filehandle = open('regdump.txt', 'w', encoding='utf-8'))
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600615
616 # create error/warning & diagnostic files
617 if (args.errfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700618 errWarn = open(args.errfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600619 else:
620 errWarn = sys.stderr
621
622 if (args.diagfile):
Mark Lobodzinski2d589822016-12-12 09:44:34 -0700623 diag = open(args.diagfile, 'w', encoding='utf-8')
Mark Lobodzinskif19fef92016-10-11 15:23:51 -0600624 else:
625 diag = None
626
627 if (args.debug):
628 pdb.run('genTarget(args)')
629 elif (args.profile):
630 import cProfile, pstats
631 cProfile.run('genTarget(args)', 'profile.txt')
632 p = pstats.Stats('profile.txt')
633 p.strip_dirs().sort_stats('time').print_stats(50)
634 else:
635 genTarget(args)