group.add_argument('-v', '--verify', action='store_true', help='verify repo files match generator output')
args = parser.parse_args(argv)
- gen_cmds = [[common_codegen.repo_relative('scripts/kvt_genvk.py'),
- '-registry', os.path.abspath(os.path.join(args.registry, 'vk.xml')),
- '-quiet',
- filename] for filename in ['vk_typemap_helper.h',
+ # output paths and the list of files in the path
+ files_to_gen = {str(os.path.join('icd','generated')) : ['vk_typemap_helper.h',
'mock_icd.h',
- 'mock_icd.cpp']]
+ 'mock_icd.cpp'],
+ str(os.path.join('vulkaninfo','generated')): ['vulkaninfo.hpp']}
- repo_dir = common_codegen.repo_relative('icd/generated')
+ #base directory for the source repository
+ repo_dir = common_codegen.repo_relative('')
- # get directory where generators will run
+ # get directory where generators will run if needed
if args.verify or args.incremental:
# generate in temp directory so we can compare or copy later
temp_obj = tempfile.TemporaryDirectory(prefix='VulkanLoader_generated_source_')
temp_dir = temp_obj.name
- gen_dir = temp_dir
- else:
- # generate directly in the repo
- gen_dir = repo_dir
+ for path in files_to_gen.keys():
+ os.makedirs(os.path.join(temp_dir, path))
# run each code generator
- for cmd in gen_cmds:
- print(' '.join(cmd))
- try:
- subprocess.check_call([sys.executable] + cmd, cwd=gen_dir)
- except Exception as e:
- print('ERROR:', str(e))
- return 1
+ for path, filenames in files_to_gen.items():
+ for filename in filenames:
+ if args.verify or args.incremental:
+ output_path = os.path.join(temp_dir, path)
+ else:
+ output_path = common_codegen.repo_relative(path)
+
+ cmd = [common_codegen.repo_relative(os.path.join('scripts','kvt_genvk.py')),
+ '-registry', os.path.abspath(os.path.join(args.registry, 'vk.xml')),
+ '-quiet', '-directory', output_path, filename]
+ print(' '.join(cmd))
+ try:
+ if args.verify or args.incremental:
+ subprocess.check_call([sys.executable] + cmd, cwd=temp_dir)
+ else:
+ subprocess.check_call([sys.executable] + cmd, cwd=repo_dir)
+
+ except Exception as e:
+ print('ERROR:', str(e))
+ return 1
# optional post-generation steps
if args.verify:
# compare contents of temp dir and repo
- temp_files = set(os.listdir(temp_dir))
- repo_files = set(os.listdir(repo_dir))
+ temp_files = {}
+ for path in files_to_gen.keys():
+ temp_files[path] = set()
+ temp_files[path].update(set(os.listdir(os.path.join(temp_dir, path))))
+
+ repo_files = {}
+ for path in files_to_gen.keys():
+ repo_files[path] = set()
+ repo_files[path].update(set(os.listdir(os.path.join(repo_dir, path))) - set(verify_exclude))
+
files_match = True
- for filename in sorted((temp_files | repo_files) - set(verify_exclude)):
- if filename not in repo_files:
- print('ERROR: Missing repo file', filename)
- files_match = False
- elif filename not in temp_files:
- print('ERROR: Missing generator for', filename)
- files_match = False
- elif not filecmp.cmp(os.path.join(temp_dir, filename),
- os.path.join(repo_dir, filename),
- shallow=False):
- print('ERROR: Repo files do not match generator output for', filename)
- files_match = False
+ for path in files_to_gen.keys():
+ for filename in sorted((temp_files[path] | repo_files[path])):
+ if filename not in repo_files[path]:
+ print('ERROR: Missing repo file', filename)
+ files_match = False
+ elif filename not in temp_files[path]:
+ print('ERROR: Missing generator for', filename)
+ files_match = False
+ elif not filecmp.cmp(os.path.join(temp_dir, path, filename),
+ os.path.join(repo_dir, path, filename),
+ shallow=False):
+ print('ERROR: Repo files do not match generator output for', filename)
+ files_match = False
# return code for test scripts
if files_match:
elif args.incremental:
# copy missing or differing files from temp directory to repo
- for filename in os.listdir(temp_dir):
- temp_filename = os.path.join(temp_dir, filename)
- repo_filename = os.path.join(repo_dir, filename)
- if not os.path.exists(repo_filename) or \
- not filecmp.cmp(temp_filename, repo_filename, shallow=False):
- print('update', repo_filename)
- shutil.copyfile(temp_filename, repo_filename)
+ for path in files_to_gen.keys():
+ for filename in os.listdir(os.path.join(temp_dir,path)):
+ temp_filename = os.path.join(temp_dir, path, filename)
+ repo_filename = os.path.join(repo_dir, path, filename)
+ if not os.path.exists(repo_filename) or \
+ not filecmp.cmp(temp_filename, repo_filename, shallow=False):
+ print('update', repo_filename)
+ shutil.copyfile(temp_filename, repo_filename)
return 0
else
return to_hex_str(i);
}
+
'''
'float', 'uint64_t', 'size_t', 'VkDeviceSize']
# Types that need pNext Chains built. 'extends' is the xml tag used in the structextends member. 'type' can be device, instance, or both
-EXTENSION_CATEGORIES = {'phys_device_props2': {'extends': 'VkPhysicalDeviceProperties2', 'type': 'both'},
- 'phys_device_mem_props2': {'extends': 'VkPhysicalDeviceMemoryProperties2', 'type': 'device'},
- 'phys_device_features2': {'extends': 'VkPhysicalDeviceFeatures2,VkDeviceCreateInfo', 'type': 'device'},
- 'surface_capabilities2': {'extends': 'VkSurfaceCapabilities2KHR', 'type': 'both'},
- 'format_properties2': {'extends': 'VkFormatProperties2', 'type': 'device'}
- }
-
-
+EXTENSION_CATEGORIES = OrderedDict((('phys_device_props2', {'extends': 'VkPhysicalDeviceProperties2', 'type': 'both'}),
+ ('phys_device_mem_props2', {'extends': 'VkPhysicalDeviceMemoryProperties2', 'type': 'device'}),
+ ('phys_device_features2', {'extends': 'VkPhysicalDeviceFeatures2,VkDeviceCreateInfo', 'type': 'device'}),
+ ('surface_capabilities2', {'extends': 'VkSurfaceCapabilities2KHR', 'type': 'both'}),
+ ('format_properties2', {'extends': 'VkFormatProperties2', 'type': 'device'})
+ ))
class VulkanInfoGeneratorOptions(GeneratorOptions):
def __init__(self,
conventions=None,