Browse Source
[externals] Update SPIRV externals to fix MSVC18/VS2026 build (#3401)
[externals] Update SPIRV externals to fix MSVC18/VS2026 build (#3401)
Fixes build on Visual Studio 2026, aka MSVC 18. Just updates spirv stuff since Khronos implemented some build fixes there as it would seem. Signed-off-by: crueter <crueter@eden-emu.dev> Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3401pull/3398/head
No known key found for this signature in database
GPG Key ID: 425ACD2D4830EBC6
2 changed files with 293 additions and 5 deletions
@ -0,0 +1,287 @@ |
|||
From 67bf3d1381b1faf59e87001d6156ba4e21cada14 Mon Sep 17 00:00:00 2001 |
|||
From: crueter <crueter@eden-emu.dev> |
|||
Date: Mon, 29 Dec 2025 21:22:36 -0500 |
|||
Subject: [PATCH] [cmake] refactor: shared/static handling |
|||
|
|||
This significantly redoes the way shared and static libraries are |
|||
handled. Now, it's controlled by two options: `SPIRV_TOOLS_BUILD_STATIC` |
|||
and `SPIRV_TOOLS_BUILD_SHARED`. |
|||
|
|||
The default configuration (no `BUILD_SHARED_LIBS` set, options left at |
|||
default) is to build shared ONLY if this is the master project, or |
|||
static ONLY if this is a subproject (e.g. FetchContent, CPM.cmake). Also |
|||
I should note that static-only (i.e. no shared) is now a supported |
|||
target, this is done because projects including it as a submodule e.g. |
|||
on Android or Windows may prefer this. |
|||
|
|||
Now the shared/static handling: |
|||
- static ON, shared OFF: Only generates `.a` libraries.
|
|||
- static ON, shared ON: Generates `.a` libraries, but also
|
|||
`libSPIRV-Tools.so` |
|||
- static OFF, shared ON: Only generates `.so` libraries.
|
|||
|
|||
Notable TODOs: |
|||
- SPIRV-Tools-shared.pc seems redundant--how should we handle which one
|
|||
to use in the case of distributions that distribute both types (MSYS2 |
|||
for instance)? |
|||
* *Note: pkgconfig sucks at this and usually just leaves it up to the |
|||
user, so the optimal solution may indeed be doing absolutely |
|||
nothing.* CMake is unaffected :) |
|||
- use namespaces in the CMake config files pleaaaaase
|
|||
|
|||
This is going to change things a good bit for package maintainers, but |
|||
cest la vie. It's for the greater good, I promise. |
|||
|
|||
Signed-off-by: crueter <crueter@eden-emu.dev> |
|||
---
|
|||
CMakeLists.txt | 108 +++++++++++++++++++++++++----------------- |
|||
source/CMakeLists.txt | 62 ++++++++++++------------ |
|||
2 files changed, 94 insertions(+), 76 deletions(-) |
|||
|
|||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
|||
index 4d843b4d2f..07201f690f 100644
|
|||
--- a/CMakeLists.txt
|
|||
+++ b/CMakeLists.txt
|
|||
@@ -14,6 +14,15 @@
|
|||
|
|||
cmake_minimum_required(VERSION 3.22.1) |
|||
|
|||
+# master project detection--useful for FetchContent/submodule inclusion
|
|||
+set(master_project OFF)
|
|||
+set(subproject ON)
|
|||
+
|
|||
+if (NOT DEFINED PROJECT_NAME)
|
|||
+ set(master_project ON)
|
|||
+ set(subproject OFF)
|
|||
+endif()
|
|||
+
|
|||
project(spirv-tools) |
|||
|
|||
# Avoid a bug in CMake 3.22.1. By default it will set -std=c++11 for |
|||
@@ -135,46 +144,49 @@ if (DEFINED SPIRV_TOOLS_EXTRA_DEFINITIONS)
|
|||
add_definitions(${SPIRV_TOOLS_EXTRA_DEFINITIONS}) |
|||
endif() |
|||
|
|||
-# Library build setting definitions:
|
|||
-#
|
|||
-# * SPIRV_TOOLS_BUILD_STATIC - ON or OFF - Defaults to ON.
|
|||
-# If enabled the following targets will be created:
|
|||
-# ${SPIRV_TOOLS}-static - STATIC library.
|
|||
-# Has full public symbol visibility.
|
|||
-# ${SPIRV_TOOLS}-shared - SHARED library.
|
|||
-# Has default-hidden symbol visibility.
|
|||
-# ${SPIRV_TOOLS} - will alias to one of above, based on BUILD_SHARED_LIBS.
|
|||
-# If disabled the following targets will be created:
|
|||
-# ${SPIRV_TOOLS} - either STATIC or SHARED based on SPIRV_TOOLS_LIBRARY_TYPE.
|
|||
-# Has full public symbol visibility.
|
|||
-# ${SPIRV_TOOLS}-shared - SHARED library.
|
|||
-# Has default-hidden symbol visibility.
|
|||
-#
|
|||
-# * SPIRV_TOOLS_LIBRARY_TYPE - SHARED or STATIC.
|
|||
-# Specifies the library type used for building SPIRV-Tools libraries.
|
|||
-# Defaults to SHARED when BUILD_SHARED_LIBS=1, otherwise STATIC.
|
|||
-#
|
|||
-# * SPIRV_TOOLS_FULL_VISIBILITY - "${SPIRV_TOOLS}-static" or "${SPIRV_TOOLS}"
|
|||
-# Evaluates to the SPIRV_TOOLS target library name that has no hidden symbols.
|
|||
-# This is used by internal targets for accessing symbols that are non-public.
|
|||
-# Note this target provides no API stability guarantees.
|
|||
-#
|
|||
-# Ideally, all of these will go away - see https://github.com/KhronosGroup/SPIRV-Tools/issues/3909.
|
|||
-option(ENABLE_EXCEPTIONS_ON_MSVC "Build SPIRV-TOOLS with c++ exceptions enabled in MSVC" ON)
|
|||
-option(SPIRV_TOOLS_BUILD_STATIC "Build ${SPIRV_TOOLS}-static target. ${SPIRV_TOOLS} will alias to ${SPIRV_TOOLS}-static or ${SPIRV_TOOLS}-shared based on BUILD_SHARED_LIBS" ON)
|
|||
-if(SPIRV_TOOLS_BUILD_STATIC)
|
|||
- set(SPIRV_TOOLS_FULL_VISIBILITY ${SPIRV_TOOLS}-static)
|
|||
+# If BUILD_SHARED_LIBS is undefined, set it based on whether we are
|
|||
+# the master project or a subproject
|
|||
+if (NOT DEFINED BUILD_SHARED_LIBS)
|
|||
+ set(BUILD_SHARED_LIBS ${master_project})
|
|||
+endif()
|
|||
+
|
|||
+if (BUILD_SHARED_LIBS)
|
|||
+ set(static_default OFF)
|
|||
+else()
|
|||
+ set(static_default ON)
|
|||
+endif()
|
|||
+
|
|||
+option(SPIRV_TOOLS_BUILD_SHARED "Build ${SPIRV_TOOLS} as a shared library"
|
|||
+ ${BUILD_SHARED_LIBS})
|
|||
+option(SPIRV_TOOLS_BUILD_STATIC "Build ${SPIRV_TOOLS} as a static library"
|
|||
+ ${static_default})
|
|||
+
|
|||
+# Avoid conflict between the dll import library and
|
|||
+# the static library (thanks microsoft)
|
|||
+if(CMAKE_STATIC_LIBRARY_PREFIX STREQUAL "" AND
|
|||
+ CMAKE_STATIC_LIBRARY_SUFFIX STREQUAL ".lib")
|
|||
+ set(SPIRV_TOOLS_STATIC_LIBNAME "${SPIRV_TOOLS}-static")
|
|||
+else()
|
|||
+ set(SPIRV_TOOLS_STATIC_LIBNAME "${SPIRV_TOOLS}")
|
|||
+endif()
|
|||
+
|
|||
+if (SPIRV_TOOLS_BUILD_STATIC)
|
|||
+ # If building a static library at all, always build other libraries as static,
|
|||
+ # and link to the static SPIRV-Tools library.
|
|||
set(SPIRV_TOOLS_LIBRARY_TYPE "STATIC") |
|||
-else(SPIRV_TOOLS_BUILD_STATIC)
|
|||
- set(SPIRV_TOOLS_FULL_VISIBILITY ${SPIRV_TOOLS})
|
|||
- if (NOT DEFINED SPIRV_TOOLS_LIBRARY_TYPE)
|
|||
- if(BUILD_SHARED_LIBS)
|
|||
- set(SPIRV_TOOLS_LIBRARY_TYPE "SHARED")
|
|||
- else()
|
|||
- set(SPIRV_TOOLS_LIBRARY_TYPE "STATIC")
|
|||
- endif()
|
|||
- endif()
|
|||
-endif(SPIRV_TOOLS_BUILD_STATIC)
|
|||
+ set(SPIRV_TOOLS_FULL_VISIBILITY ${SPIRV_TOOLS}-static)
|
|||
+elseif (SPIRV_TOOLS_BUILD_SHARED)
|
|||
+ # If only building a shared library, link other libraries to the
|
|||
+ # shared library. Also, other libraries should be shared
|
|||
+ set(SPIRV_TOOLS_LIBRARY_TYPE "SHARED")
|
|||
+ set(SPIRV_TOOLS_FULL_VISIBILITY ${SPIRV_TOOLS}-shared)
|
|||
+else()
|
|||
+ message(FATAL_ERROR "You must set one of "
|
|||
+ "SPIRV_TOOLS_BUILD_STATIC or SPIRV_TOOLS_BUILD_SHARED!")
|
|||
+endif()
|
|||
+
|
|||
+option(ENABLE_EXCEPTIONS_ON_MSVC
|
|||
+ "Build SPIRV-TOOLS with C++ exceptions enabled in MSVC" ON)
|
|||
|
|||
function(spvtools_default_compile_options TARGET) |
|||
target_compile_options(${TARGET} PRIVATE ${SPIRV_WARNINGS}) |
|||
@@ -372,7 +384,7 @@ if (NOT "${SPIRV_SKIP_TESTS}")
|
|||
endif() |
|||
|
|||
set(SPIRV_LIBRARIES "-lSPIRV-Tools-opt -lSPIRV-Tools -lSPIRV-Tools-link") |
|||
-set(SPIRV_SHARED_LIBRARIES "-lSPIRV-Tools-shared")
|
|||
+set(SPIRV_SHARED_LIBRARIES "-lSPIRV-Tools")
|
|||
|
|||
# Build pkg-config file |
|||
# Use a first-class target so it's regenerated when relevant files are updated. |
|||
@@ -388,7 +400,12 @@ add_custom_command(
|
|||
-DSPIRV_LIBRARIES=${SPIRV_LIBRARIES} |
|||
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake |
|||
DEPENDS "CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools.pc.in" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake") |
|||
-add_custom_command(
|
|||
+
|
|||
+set(pc_files ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc)
|
|||
+
|
|||
+# TODO(crueter): remove?
|
|||
+if (SPIRV_TOOLS_BUILD_SHARED)
|
|||
+ add_custom_command(
|
|||
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc |
|||
COMMAND ${CMAKE_COMMAND} |
|||
-DCHANGES_FILE=${CMAKE_CURRENT_SOURCE_DIR}/CHANGES |
|||
@@ -400,9 +417,12 @@ add_custom_command(
|
|||
-DSPIRV_SHARED_LIBRARIES=${SPIRV_SHARED_LIBRARIES} |
|||
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake |
|||
DEPENDS "CHANGES" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/SPIRV-Tools-shared.pc.in" "${CMAKE_CURRENT_SOURCE_DIR}/cmake/write_pkg_config.cmake") |
|||
-add_custom_target(spirv-tools-pkg-config
|
|||
- ALL
|
|||
- DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools.pc)
|
|||
+ set(pc_files ${pc_files} ${CMAKE_CURRENT_BINARY_DIR}/SPIRV-Tools-shared.pc)
|
|||
+endif()
|
|||
+
|
|||
+add_custom_target(spirv-tools-pkg-config
|
|||
+ ALL
|
|||
+ DEPENDS ${pc_files})
|
|||
|
|||
# Install pkg-config file |
|||
if (ENABLE_SPIRV_TOOLS_INSTALL) |
|||
diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt
|
|||
index bfa1e661bc..fd3712c70c 100644
|
|||
--- a/source/CMakeLists.txt
|
|||
+++ b/source/CMakeLists.txt
|
|||
@@ -337,49 +337,44 @@ function(spirv_tools_default_target_options target)
|
|||
) |
|||
set_property(TARGET ${target} PROPERTY FOLDER "SPIRV-Tools libraries") |
|||
spvtools_check_symbol_exports(${target}) |
|||
- add_dependencies(${target} spirv-tools-build-version core_tables extinst_tables)
|
|||
+ add_dependencies(${target}
|
|||
+ spirv-tools-build-version core_tables extinst_tables)
|
|||
endfunction() |
|||
|
|||
-# Always build ${SPIRV_TOOLS}-shared. This is expected distro packages, and
|
|||
-# unlike the other SPIRV_TOOLS target, defaults to hidden symbol visibility.
|
|||
-add_library(${SPIRV_TOOLS}-shared SHARED ${SPIRV_SOURCES})
|
|||
-if (SPIRV_TOOLS_USE_MIMALLOC)
|
|||
- target_link_libraries(${SPIRV_TOOLS}-shared PRIVATE mimalloc-static)
|
|||
+if (SPIRV_TOOLS_BUILD_SHARED)
|
|||
+ add_library(${SPIRV_TOOLS}-shared SHARED ${SPIRV_SOURCES})
|
|||
+ if (SPIRV_TOOLS_USE_MIMALLOC)
|
|||
+ target_link_libraries(${SPIRV_TOOLS}-shared PRIVATE mimalloc-static)
|
|||
+ endif()
|
|||
+
|
|||
+ set_target_properties(${SPIRV_TOOLS}-shared PROPERTIES
|
|||
+ OUTPUT_NAME "${SPIRV_TOOLS}")
|
|||
+ spirv_tools_default_target_options(${SPIRV_TOOLS}-shared)
|
|||
+
|
|||
+ target_compile_definitions(${SPIRV_TOOLS}-shared
|
|||
+ PRIVATE SPIRV_TOOLS_IMPLEMENTATION
|
|||
+ PUBLIC SPIRV_TOOLS_SHAREDLIB)
|
|||
+
|
|||
+ list(APPEND SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-shared)
|
|||
endif() |
|||
-spirv_tools_default_target_options(${SPIRV_TOOLS}-shared)
|
|||
-set_target_properties(${SPIRV_TOOLS}-shared PROPERTIES CXX_VISIBILITY_PRESET hidden)
|
|||
-target_compile_definitions(${SPIRV_TOOLS}-shared
|
|||
- PRIVATE SPIRV_TOOLS_IMPLEMENTATION
|
|||
- PUBLIC SPIRV_TOOLS_SHAREDLIB
|
|||
-)
|
|||
|
|||
if(SPIRV_TOOLS_BUILD_STATIC) |
|||
add_library(${SPIRV_TOOLS}-static STATIC ${SPIRV_SOURCES}) |
|||
if (SPIRV_TOOLS_USE_MIMALLOC AND SPIRV_TOOLS_USE_MIMALLOC_IN_STATIC_BUILD) |
|||
target_link_libraries(${SPIRV_TOOLS}-shared PRIVATE mimalloc-static) |
|||
endif() |
|||
+
|
|||
spirv_tools_default_target_options(${SPIRV_TOOLS}-static) |
|||
- # The static target does not have the '-static' suffix.
|
|||
- set_target_properties(${SPIRV_TOOLS}-static PROPERTIES OUTPUT_NAME "${SPIRV_TOOLS}")
|
|||
-
|
|||
- # Create the "${SPIRV_TOOLS}" target as an alias to either "${SPIRV_TOOLS}-static"
|
|||
- # or "${SPIRV_TOOLS}-shared" depending on the value of BUILD_SHARED_LIBS.
|
|||
- if(BUILD_SHARED_LIBS)
|
|||
- add_library(${SPIRV_TOOLS} ALIAS ${SPIRV_TOOLS}-shared)
|
|||
- else()
|
|||
- add_library(${SPIRV_TOOLS} ALIAS ${SPIRV_TOOLS}-static)
|
|||
- endif()
|
|||
+ set_target_properties(${SPIRV_TOOLS}-static PROPERTIES
|
|||
+ OUTPUT_NAME "${SPIRV_TOOLS_STATIC_LIBNAME}")
|
|||
|
|||
- set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-static ${SPIRV_TOOLS}-shared)
|
|||
-else()
|
|||
- add_library(${SPIRV_TOOLS} ${SPIRV_TOOLS_LIBRARY_TYPE} ${SPIRV_SOURCES})
|
|||
- if (SPIRV_TOOLS_USE_MIMALLOC)
|
|||
- target_link_libraries(${SPIRV_TOOLS} PRIVATE mimalloc-static)
|
|||
- endif()
|
|||
- spirv_tools_default_target_options(${SPIRV_TOOLS})
|
|||
- set(SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS} ${SPIRV_TOOLS}-shared)
|
|||
+ list(APPEND SPIRV_TOOLS_TARGETS ${SPIRV_TOOLS}-static)
|
|||
endif() |
|||
|
|||
+# Create the "SPIRV-Tools" target as an alias to either "SPIRV-Tools-static"
|
|||
+# or "SPIRV-Tools-shared" depending on the value of SPIRV_TOOLS_BUILD_SHARED.
|
|||
+add_library(${SPIRV_TOOLS} ALIAS ${SPIRV_TOOLS_FULL_VISIBILITY})
|
|||
+
|
|||
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") |
|||
find_library(LIBRT rt) |
|||
if(LIBRT) |
|||
@@ -390,14 +385,17 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
|
|||
endif() |
|||
|
|||
if(ENABLE_SPIRV_TOOLS_INSTALL) |
|||
- if (SPIRV_TOOLS_USE_MIMALLOC AND (NOT SPIRV_TOOLS_BUILD_STATIC OR SPIRV_TOOLS_USE_MIMALLOC_IN_STATIC_BUILD))
|
|||
+ if (SPIRV_TOOLS_USE_MIMALLOC AND
|
|||
+ (NOT SPIRV_TOOLS_BUILD_STATIC OR SPIRV_TOOLS_USE_MIMALLOC_IN_STATIC_BUILD))
|
|||
list(APPEND SPIRV_TOOLS_TARGETS mimalloc-static) |
|||
endif() |
|||
install(TARGETS ${SPIRV_TOOLS_TARGETS} EXPORT ${SPIRV_TOOLS}Targets) |
|||
export(EXPORT ${SPIRV_TOOLS}Targets FILE ${SPIRV_TOOLS}Target.cmake) |
|||
|
|||
spvtools_config_package_dir(${SPIRV_TOOLS} PACKAGE_DIR) |
|||
- install(EXPORT ${SPIRV_TOOLS}Targets FILE ${SPIRV_TOOLS}Target.cmake DESTINATION ${PACKAGE_DIR})
|
|||
+ install(EXPORT ${SPIRV_TOOLS}Targets
|
|||
+ FILE ${SPIRV_TOOLS}Target.cmake
|
|||
+ DESTINATION ${PACKAGE_DIR})
|
|||
|
|||
# Special config file for root library compared to other libs. |
|||
file(WRITE ${CMAKE_BINARY_DIR}/${SPIRV_TOOLS}Config.cmake |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue