build: Use Vulkan-Loader on windows
authorCharles Giessen <charles@lunarg.com>
Sat, 19 Aug 2023 20:08:34 +0000 (14:08 -0600)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Mon, 21 Aug 2023 22:44:30 +0000 (16:44 -0600)
Previously, the vulkan-1.lib file was checked into the tree, so that it wasn't
a required build step for windows builds. This means that to use functions in
new versions of vulkan, the vulkan-1.lib file would have to be updated, which
is annoying.

This commit makes the necessary changes to allow linking to the vulkan-1.lib
built by Vulkan-Loader directly, as well as adding Vulkan-Loader as a
dependency for windows builds. It was previously only built for linux & macOS.

With the use of the Vulkan-Loader, the FindVulkan.cmake file could be removed,
as well as the checked in vulkan-1.lib files, one each for x86 and x64.

CMakeLists.txt
cmake/FindVulkan.cmake [deleted file]
external/x64/lib/vulkan-1.lib [deleted file]
external/x86/lib/vulkan-1.lib [deleted file]
scripts/known_good.json
tests/CMakeLists.txt

index 6525f51..57d05a3 100644 (file)
@@ -53,29 +53,6 @@ set_property(GLOBAL PROPERTY USE_FOLDERS ON)
 # "Helper" targets that don't have interesting source code should set their FOLDER property to this
 set(TOOLS_HELPER_FOLDER "Helper Targets")
 
-# ~~~
-# Find Vulkan Headers and Loader
-# Search order:
-#  User-supplied CMAKE_PREFIX_PATH containing paths to the header and/or loader install dirs
-#  CMake options VULKAN_HEADERS_INSTALL_DIR and/or VULKAN_LOADER_INSTALL_DIR
-#  Env vars VULKAN_HEADERS_INSTALL_DIR and/or VULKAN_LOADER_INSTALL_DIR
-#  If on MacOS
-#   CMake option MOTLENVK_REPO_ROOT
-#   Env vars MOLTENVK_REPO_ROOT
-#  Fallback to FindVulkan operation using SDK install or system installed components.
-# ~~~
-set(VULKAN_HEADERS_INSTALL_DIR "HEADERS-NOTFOUND" CACHE PATH "Absolute path to a Vulkan-Headers install directory")
-set(VULKAN_LOADER_INSTALL_DIR "LOADER-NOTFOUND" CACHE PATH "Absolute path to a Vulkan-Loader install directory")
-if(WIN32 AND "${VULKAN_LOADER_INSTALL_DIR}" STREQUAL "LOADER-NOTFOUND")
-    if(CMAKE_CL_64)
-        set(VULKAN_LOADER_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/x64")
-    else()
-        set(VULKAN_LOADER_INSTALL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/external/x86")
-    endif()
-endif()
-set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH};${VULKAN_HEADERS_INSTALL_DIR};${VULKAN_LOADER_INSTALL_DIR};
-    $ENV{VULKAN_HEADERS_INSTALL_DIR};$ENV{VULKAN_LOADER_INSTALL_DIR})
-
 if(APPLE)
     set(MOLTENVK_REPO_ROOT "MOLTENVK-NOTFOUND" CACHE PATH "Absolute path to a MoltenVK repo directory")
     if(NOT MOLTENVK_REPO_ROOT AND NOT DEFINED ENV{MOLTENVK_REPO_ROOT})
@@ -87,13 +64,15 @@ if(APPLE)
     endif()
     message(STATUS "Using MoltenVK repo location at ${MOLTENVK_REPO_ROOT}")
 endif()
-message(STATUS "Using find_package to locate Vulkan")
-find_package(Vulkan)
+
 find_package(VulkanHeaders REQUIRED CONFIG)
-get_filename_component(Vulkan_LIBRARY_DIR ${Vulkan_LIBRARY} DIRECTORY)
-message(STATUS "Vulkan FOUND = ${Vulkan_FOUND}")
-message(STATUS "Vulkan Lib Dir = ${Vulkan_LIBRARY_DIR}")
-message(STATUS "Vulkan Lib = ${Vulkan_LIBRARY}")
+
+# Find and create the Vulkan::Vulkan library
+find_library(Vulkan_LIBRARY NAMES vulkan vulkan-1)
+add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
+set_target_properties(Vulkan::Vulkan PROPERTIES
+    IMPORTED_LOCATION ${Vulkan_LIBRARY})
+target_link_libraries(Vulkan::Vulkan INTERFACE Vulkan::Headers)
 
 include(GNUInstallDirs)
 
diff --git a/cmake/FindVulkan.cmake b/cmake/FindVulkan.cmake
deleted file mode 100644 (file)
index 846708e..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
-# file Copyright.txt or https://cmake.org/licensing for details.
-
-#.rst:
-# FindVulkan
-# ----------
-#
-# Try to find Vulkan
-#
-# IMPORTED Targets
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines :prop_tgt:`IMPORTED` target ``Vulkan::Vulkan``, if
-# Vulkan has been found.
-#
-# Result Variables
-# ^^^^^^^^^^^^^^^^
-#
-# This module defines the following variables::
-#
-#   Vulkan_FOUND          - True if Vulkan was found
-#   Vulkan_INCLUDE_DIRS   - include directories for Vulkan
-#   Vulkan_LIBRARIES      - link against this library to use Vulkan
-#
-# The module will also define two cache variables::
-#
-#   Vulkan_INCLUDE_DIR    - the Vulkan include directory
-#   Vulkan_LIBRARY        - the path to the Vulkan library
-#
-
-if(WIN32)
-  find_path(Vulkan_INCLUDE_DIR
-    NAMES vulkan/vulkan.h
-    HINTS
-      "$ENV{VULKAN_SDK}/Include"
-    )
-
-  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-    find_library(Vulkan_LIBRARY
-      NAMES vulkan-1
-      HINTS
-        "$ENV{VULKAN_SDK}/Lib"
-        "$ENV{VULKAN_SDK}/Bin"
-        )
-  elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
-    find_library(Vulkan_LIBRARY
-      NAMES vulkan-1
-      HINTS
-        "$ENV{VULKAN_SDK}/Lib32"
-        "$ENV{VULKAN_SDK}/Bin32"
-        NO_SYSTEM_ENVIRONMENT_PATH
-        )
-  endif()
-else()
-    find_path(Vulkan_INCLUDE_DIR
-      NAMES vulkan/vulkan.h
-      HINTS
-        "$ENV{VULKAN_SDK}/include")
-    find_library(Vulkan_LIBRARY
-      NAMES vulkan
-      HINTS
-        "$ENV{VULKAN_SDK}/lib")
-endif()
-
-set(Vulkan_LIBRARIES ${Vulkan_LIBRARY})
-set(Vulkan_INCLUDE_DIRS ${Vulkan_INCLUDE_DIR})
-
-include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(Vulkan
-  DEFAULT_MSG
-  Vulkan_LIBRARY Vulkan_INCLUDE_DIR)
-
-mark_as_advanced(Vulkan_INCLUDE_DIR Vulkan_LIBRARY)
-
-if(Vulkan_FOUND AND NOT TARGET Vulkan::Vulkan)
-  add_library(Vulkan::Vulkan UNKNOWN IMPORTED)
-  set_target_properties(Vulkan::Vulkan PROPERTIES
-    IMPORTED_LOCATION "${Vulkan_LIBRARIES}"
-    INTERFACE_INCLUDE_DIRECTORIES "${Vulkan_INCLUDE_DIRS}")
-endif()
diff --git a/external/x64/lib/vulkan-1.lib b/external/x64/lib/vulkan-1.lib
deleted file mode 100644 (file)
index 3e23a7b..0000000
Binary files a/external/x64/lib/vulkan-1.lib and /dev/null differ
diff --git a/external/x86/lib/vulkan-1.lib b/external/x86/lib/vulkan-1.lib
deleted file mode 100644 (file)
index 3caa7ba..0000000
Binary files a/external/x86/lib/vulkan-1.lib and /dev/null differ
index adbb34c..52d78d0 100644 (file)
                     "var_name": "VULKAN_HEADERS_INSTALL_DIR",
                     "repo_name": "Vulkan-Headers"
                 }
-            ],
-            "build_platforms": [
-                "linux",
-                "darwin"
             ]
         },
         {
index 481c68d..66d9adc 100644 (file)
 # limitations under the License.
 # ~~~
 
+# On Windows, We only need the .lib to build the repo, but to run tests we need the .dll.
+# Thus, we have to fixup the Vulkan::Vulkan target to contain the correct details.
+if (WIN32)
+    list(APPEND CMAKE_PROGRAM_PATH ${VULKAN_LOADER_INSTALL_DIR})
+
+    find_program(Vulkan_LIBRARY_DLL NAMES vulkan-1.dll)
+    find_library(Vulkan_LIBRARY_IMPLIB NAMES vulkan-1)
+
+    # Change Vulkan::Vulkan's location to vulkan-1.dll and set the IMPLIB to vulkan-1.lib
+    set_target_properties(Vulkan::Vulkan PROPERTIES
+        IMPORTED_LOCATION ${Vulkan_LIBRARY_DLL})
+    set_target_properties(Vulkan::Vulkan PROPERTIES
+        IMPORTED_IMPLIB ${Vulkan_LIBRARY_IMPLIB})
+endif()
+
 # setup binary_locations_$<CONFIG>.h.in using binary_locations.h.in as a source
 file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/binary_locations_$<CONFIG>.h" INPUT "${CMAKE_CURRENT_SOURCE_DIR}/binary_locations.h.in")