vulkaninfo: use generate_source.py for autogen
authorCharles Giessen <charles@lunarg.com>
Sun, 26 Apr 2020 00:53:21 +0000 (18:53 -0600)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Tue, 26 May 2020 16:39:18 +0000 (10:39 -0600)
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

.gitattributes
scripts/generate_source.py
scripts/kvt_genvk.py
scripts/vulkaninfo_generator.py
vulkaninfo/CMakeLists.txt
vulkaninfo/generated/vulkaninfo.hpp

index 905e0e0..1687690 100644 (file)
@@ -17,4 +17,4 @@
 # Generated source files will always have LF (unix) line endings on checkout.
 icd/generated/*.cpp text eol=lf
 icd/generated/*.h text eol=lf
-
+vulkaninfo/generated/*.hpp text eol=lf
index c4be24f..a2002aa 100755 (executable)
@@ -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
 
index 840d292..c4bb2df 100644 (file)
@@ -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')
index 2d15526..adc0186 100644 (file)
@@ -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,
index ac3070c..05b3f9e 100644 (file)
 
 # CMakeLists.txt file for building Vulkaninfo
 
-find_package(PythonInterp 3 QUIET)
-set (PYTHON_CMD ${PYTHON_EXECUTABLE})
-
-set(VKINFO_DIR ${CMAKE_CURRENT_SOURCE_DIR})
-set(KVULKANTOOLS_SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/scripts)
-
-if(PYTHONINTERP_FOUND)
-    add_custom_target(generate_vulkaninfo_hpp
-        COMMAND ${PYTHON_CMD} ${KVULKANTOOLS_SCRIPTS_DIR}/kvt_genvk.py -registry ${VulkanRegistry_DIR}/vk.xml -scripts ${VulkanRegistry_DIR} vulkaninfo.hpp
-        DEPENDS ${VulkanRegistry_DIR}/vk.xml ${VulkanRegistry_DIR}/generator.py ${KVULKANTOOLS_SCRIPTS_DIR}/vulkaninfo_generator.py ${KVULKANTOOLS_SCRIPTS_DIR}/kvt_genvk.py ${VulkanRegistry_DIR}/reg.py
-        WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}/vulkaninfo/generated
-        )
-    else()
-        message("WARNING: generate_vulkaninfo_hpp target requires python 3")
-endif()
-
 if(WIN32)
     add_executable(vulkaninfo vulkaninfo.cpp vulkaninfo.rc)
 elseif(APPLE)
index 03c32e0..cfca732 100644 (file)
@@ -48,6 +48,7 @@ std::string to_hex_str(Printer &p, T i) {
     else
         return to_hex_str(i);
 }
+
 static const char *VkResultString(VkResult value) {
     switch (value) {
         case (0): return "SUCCESS";