From 5aaa64364e7a255948a44ef151208fe85dcd5834 Mon Sep 17 00:00:00 2001 From: Charles Giessen Date: Sat, 25 Apr 2020 18:53:21 -0600 Subject: vulkaninfo: use generate_source.py for autogen Previously, to update the autogen for vulkaninfo required running a separate cmake target. This commit puts it all into the same target for ease of maintenance. Change-Id: I98e35b01ee164e9917564f6b603e4a78c6138041 --- scripts/generate_source.py | 99 +++++++++++++++++++++++++---------------- scripts/kvt_genvk.py | 2 + scripts/vulkaninfo_generator.py | 15 +++---- 3 files changed, 69 insertions(+), 47 deletions(-) (limited to 'scripts') diff --git a/scripts/generate_source.py b/scripts/generate_source.py index c4be24f5..a2002aae 100755 --- a/scripts/generate_source.py +++ b/scripts/generate_source.py @@ -39,52 +39,72 @@ def main(argv): 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: @@ -94,13 +114,14 @@ def main(argv): 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 diff --git a/scripts/kvt_genvk.py b/scripts/kvt_genvk.py index 840d292c..c4bb2df4 100644 --- a/scripts/kvt_genvk.py +++ b/scripts/kvt_genvk.py @@ -275,6 +275,8 @@ if __name__ == '__main__': parser.add_argument('-defaultExtensions', action='store', default='vulkan', help='Specify a single class of extensions to add to targets') + parser.add_argument('-directory', action='store', + help='Specify where the built file is place') parser.add_argument('-extension', action='append', default=[], help='Specify an extension or extensions to add to targets') diff --git a/scripts/vulkaninfo_generator.py b/scripts/vulkaninfo_generator.py index 2d15526a..adc01865 100644 --- a/scripts/vulkaninfo_generator.py +++ b/scripts/vulkaninfo_generator.py @@ -80,6 +80,7 @@ std::string to_hex_str(Printer &p, T i) { else return to_hex_str(i); } + ''' @@ -104,14 +105,12 @@ predefined_types = ['char', 'VkBool32', 'uint32_t', 'uint8_t', 'int32_t', '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, -- cgit v1.2.3