aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.patch/spirv-tools/0002-allow-static-only.patch287
-rw-r--r--externals/cpmfile.json11
2 files changed, 293 insertions, 5 deletions
diff --git a/.patch/spirv-tools/0002-allow-static-only.patch b/.patch/spirv-tools/0002-allow-static-only.patch
new file mode 100644
index 0000000000..873589a5ac
--- /dev/null
+++ b/.patch/spirv-tools/0002-allow-static-only.patch
@@ -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
diff --git a/externals/cpmfile.json b/externals/cpmfile.json
index 7ff4fb4eae..174b17776b 100644
--- a/externals/cpmfile.json
+++ b/externals/cpmfile.json
@@ -127,21 +127,22 @@
"spirv-tools": {
"package": "SPIRV-Tools",
"repo": "crueter/SPIRV-Tools",
- "sha": "2fa2d44485",
- "hash": "3124bbddf7bd44f11445edeca6786b5bba9fb314f27dc087d0bbd9951b0936884ece2b9b40b75cfc8e31ab10ba55854e73aa63df835c40423b1c81dd47b1437d",
+ "sha": "0a7e28689a",
+ "hash": "eadfcceb82f4b414528d99962335e4f806101168474028f3cf7691ac40c37f323decf2a42c525e2d5bfa6f14ff132d6c5cf9b87c151490efad01f5e13ade1520",
"git_version": "2025.4",
"options": [
"SPIRV_SKIP_EXECUTABLES ON"
],
"patches": [
- "0001-netbsd-fix.patch"
+ "0001-netbsd-fix.patch",
+ "0002-allow-static-only.patch"
]
},
"spirv-headers": {
"package": "SPIRV-Headers",
"repo": "KhronosGroup/SPIRV-Headers",
- "sha": "01e0577914",
- "hash": "e2b90e95b6f492e640cd27c090d7072f0d03c8fc7382be67cbe176fc8f3fdd78b59f5f0b906198e09808fde645427f409cb9ab8fe4843de7f7dc5b510d454a0a",
+ "sha": "04f10f650d",
+ "hash": "cae8cd179c9013068876908fecc1d158168310ad6ac250398a41f0f5206ceff6469e2aaeab9c820bce9d1b08950c725c89c46e94b89a692be9805432cf749396",
"options": [
"SPIRV_WERROR OFF"
]