549 lines
23 KiB
CMake
549 lines
23 KiB
CMake
# CMake Project for SDL3_shadercross - Simple DirectMedia Layer Shader Cross Compiler
|
|
# Written by @thatcosmonaut
|
|
cmake_minimum_required(VERSION 3.22...4.0)
|
|
|
|
# Version
|
|
set(MAJOR_VERSION 3)
|
|
set(MINOR_VERSION 0)
|
|
set(MICRO_VERSION 0)
|
|
set(SDL_REQUIRED_VERSION "3.1.3")
|
|
|
|
# option() honors normal variables.
|
|
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
|
|
|
|
project(SDL3_shadercross LANGUAGES C VERSION "${MAJOR_VERSION}.${MINOR_VERSION}.${MICRO_VERSION}")
|
|
|
|
set(SHADERCROSS_MAINPROJECT ${SDL3_shadercross_IS_TOP_LEVEL})
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
|
|
include(CMakeDependentOption)
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/GetGitRevisionDescription.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/PrivateSdlFunctions.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlcpu.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlplatform.cmake")
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/sdlmanpages.cmake")
|
|
|
|
if(NOT (TARGET SDL3::Headers AND TARGET SDL3::SDL3 AND (TARGET SDL3::SDL3-static OR TARGET SDL3::SDL3-shared)))
|
|
find_package(SDL3 ${SDL_REQUIRED_VERSION})
|
|
endif()
|
|
|
|
if(TARGET SDL3::SDL3-shared)
|
|
set(SDLSHADERCROSS_SHARED_DEFAULT ON)
|
|
set(SDLSHADERCROSS_STATIC_DEFAULT OFF)
|
|
else()
|
|
set(SDLSHADERCROSS_SHARED_DEFAULT OFF)
|
|
set(SDLSHADERCROSS_STATIC_DEFAULT ON)
|
|
endif()
|
|
|
|
# Options
|
|
option(SDLSHADERCROSS_DXC "Enable HLSL compilation via DXC" ON)
|
|
option(SDLSHADERCROSS_SHARED "Build shared SDL_shadercross library" ${SDLSHADERCROSS_SHARED_DEFAULT})
|
|
option(SDLSHADERCROSS_STATIC "Build static SDL_shadercross library" ${SDLSHADERCROSS_STATIC_DEFAULT})
|
|
option(SDLSHADERCROSS_SPIRVCROSS_SHARED "Link to shared library variants of dependencies" ON)
|
|
option(SDLSHADERCROSS_VENDORED "Use vendored dependencies" OFF)
|
|
option(SDLSHADERCROSS_CLI "Build command line executable" ON)
|
|
cmake_dependent_option(SDLSHADERCROSS_CLI_STATIC "Link CLI with static libraries" OFF "SDLSHADERCROSS_CLI;SDLSHADERCROSS_STATIC;TARGET SDL3::SDL3-static" OFF)
|
|
cmake_dependent_option(SDLSHADERCROSS_CLI_LEAKCHECK "Check shadercross for memory leaks" OFF "SDLSHADERCROSS_CLI;TARGET SDL3::SDL3_test" OFF)
|
|
option(SDLSHADERCROSS_WERROR "Enable Werror" OFF)
|
|
option(SDLSHADERCROSS_INSTALL "Enable installation" ${SHADERCROSS_MAINPROJECT})
|
|
cmake_dependent_option(SDLSHADERCROSS_INSTALL_CPACK "Enable CPack installation" ${SHADERCROSS_MAINPROJECT} "SDLSHADERCROSS_INSTALL" OFF)
|
|
cmake_dependent_option(SDLSHADERCROSS_INSTALL_MAN "Install man pages for SDL3_shadercross" OFF "SDLSHADERCROSS_INSTALL" OFF)
|
|
cmake_dependent_option(SDLSHADERCROSS_INSTALL_RUNTIME "Download, build and install runtime dependencies" OFF "SDLSHADERCROSS_INSTALL" OFF)
|
|
|
|
option(SDLSHADERCROSS_TESTS "Build unit tests?" OFF)
|
|
cmake_dependent_option(SDLSHADERCROSS_TESTS_TRACKMEM "Enable memory tracking in tests" OFF SDLSHADERCROSS_TESTS OFF)
|
|
|
|
sdl_calculate_derived_version_variables(${MAJOR_VERSION} ${MINOR_VERSION} ${MICRO_VERSION})
|
|
SDL_DetectTargetCPUArchitectures(SDL_CPU_NAMES)
|
|
SDL_DetectCMakePlatform()
|
|
|
|
if(SDLSHADERCROSS_INSTALL)
|
|
include(GNUInstallDirs)
|
|
endif()
|
|
|
|
if(NOT SDLSHADERCROSS_SHARED AND NOT SDLSHADERCROSS_STATIC)
|
|
message(FATAL_ERROR "SDLSHADERCROSS_SHARED and SDLSHADERCROSS_STATIC cannot be both disabled")
|
|
endif()
|
|
|
|
# Platform Flags
|
|
if(APPLE)
|
|
set(CMAKE_MACOSX_RPATH ON)
|
|
set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0)
|
|
endif()
|
|
|
|
if(NOT MSVC)
|
|
add_compile_options(-pedantic) # -Wno-strict-aliasing
|
|
endif()
|
|
|
|
set(spirv_static_targets spirv-cross-c spirv-cross-glsl spirv-cross-hlsl spirv-cross-msl spirv-cross-cpp spirv-cross-reflect spirv-cross-core)
|
|
|
|
set(pc_requires )
|
|
set(vendored_targets )
|
|
if(SDLSHADERCROSS_VENDORED)
|
|
set(SPIRV_CROSS_SKIP_INSTALL ON)
|
|
set(SPIRV_CROSS_CLI OFF)
|
|
set(SPIRV_CROSS_ENABLE_TESTS OFF)
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
set(SPIRV_CROSS_SHARED ON)
|
|
set(SPIRV_CROSS_STATIC OFF)
|
|
else()
|
|
set(SPIRV_CROSS_SHARED OFF)
|
|
set(SPIRV_CROSS_STATIC ON)
|
|
endif()
|
|
|
|
sdl_check_project_in_subfolder(external/SPIRV-Cross SPIRV-Cross SDLSHADERCROSS_VENDORED)
|
|
set(SPIRV_CROSS_ENABLE_TESTS ON)
|
|
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
|
add_subdirectory(external/SPIRV-Cross EXCLUDE_FROM_ALL)
|
|
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
list(APPEND vendored_targets spirv-cross-c-shared)
|
|
list(APPEND pc_requires "spirv-cross-c-shared")
|
|
else()
|
|
enable_language(CXX)
|
|
if(SDLSHADERCROSS_STATIC)
|
|
foreach(extra IN LISTS spirv_static_targets)
|
|
if(TARGET ${extra})
|
|
list(APPEND vendored_targets ${extra})
|
|
list(APPEND pc_requires "${extra}")
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
sdl_check_project_in_subfolder(external/SPIRV-Headers SPIRV-Headers SDLSHADERCROSS_VENDORED)
|
|
add_subdirectory(external/SPIRV-Headers EXCLUDE_FROM_ALL)
|
|
sdl_check_project_in_subfolder(external/SPIRV-Tools SPIRV-Tools SDLSHADERCROSS_VENDORED)
|
|
add_subdirectory(external/SPIRV-Tools EXCLUDE_FROM_ALL)
|
|
|
|
sdl_check_project_in_subfolder(external/DirectXShaderCompiler DirectXShaderCompiler SDLSHADERCROSS_VENDORED)
|
|
if(MINGW)
|
|
set(CMAKE_C_COMPILER_ARCHITECTURE_ID "${SDL_CPU_NAMES}")
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_DXC)
|
|
# LLVM dependencies of dxc does not support building as a shared library
|
|
set(BUILD_SHARED_LIBS OFF)
|
|
# Enabling HLSL_ENABLE_DEBUG_ITERATORS blocks DirectXShaderCompiler from adding /D_ITERATOR_DEBUG_LEVEL=0
|
|
set(HLSL_ENABLE_DEBUG_ITERATORS ON)
|
|
set(DXC_COVERAGE OFF)
|
|
set(HLSL_INCLUDE_TESTS OFF)
|
|
set(LLVM_INCLUDE_TESTS OFF)
|
|
set(HLSL_DISABLE_SOURCE_GENERATION TRUE)
|
|
set(SPIRV_BUILD_TESTS FALSE)
|
|
include(external/DirectXShaderCompiler/cmake/caches/PredefinedParams.cmake)
|
|
add_subdirectory(external/DirectXShaderCompiler EXCLUDE_FROM_ALL)
|
|
add_library(DirectXShaderCompiler::dxcompiler ALIAS dxcompiler)
|
|
add_library(DirectXShaderCompiler::dxil ALIAS dxildll)
|
|
list(APPEND vendored_targets dxcompiler dxildll)
|
|
add_dependencies(dxcompiler dxildll)
|
|
endif()
|
|
|
|
export(TARGETS ${vendored_targets} NAMESPACE "SDL3_shadercross::" FILE "SDL3_shadercross-vendored-targets.cmake")
|
|
else()
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
if(NOT TARGET spirv_cross_c_shared)
|
|
find_package(spirv_cross_c_shared REQUIRED)
|
|
endif()
|
|
else()
|
|
enable_language(CXX)
|
|
if(NOT TARGET spirv_cross_c)
|
|
find_package(spirv_cross_core QUIET)
|
|
find_package(spirv_cross_glsl QUIET)
|
|
find_package(spirv_cross_hlsl QUIET)
|
|
find_package(spirv_cross_msl QUIET)
|
|
find_package(spirv_cross_cpp QUIET)
|
|
find_package(spirv_cross_reflect QUIET)
|
|
find_package(spirv_cross_c REQUIRED)
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_DXC)
|
|
set(DirectXShaderCompiler_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/external/DirectXShaderCompiler-binaries")
|
|
find_package(DirectXShaderCompiler REQUIRED)
|
|
endif()
|
|
endif()
|
|
|
|
# Source lists
|
|
set(SOURCE_FILES
|
|
# Public Headers
|
|
include/SDL3_shadercross/SDL_shadercross.h
|
|
# Source Files
|
|
src/SDL_shadercross.c
|
|
)
|
|
|
|
set(SDL3_shadercross_targets)
|
|
if(SDLSHADERCROSS_SHARED)
|
|
list(APPEND SDL3_shadercross_targets SDL3_shadercross-shared)
|
|
if(NOT TARGET SDL3::SDL3-shared)
|
|
find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS SDL3-shared)
|
|
endif()
|
|
|
|
add_library(SDL3_shadercross-shared SHARED ${SOURCE_FILES})
|
|
add_library(SDL3_shadercross::SDL3_shadercross ALIAS SDL3_shadercross-shared)
|
|
|
|
set_property(TARGET SDL3_shadercross-shared PROPERTY DEFINE_SYMBOL DLL_EXPORT)
|
|
sdl_target_link_option_version_file(SDL3_shadercross-shared "${CMAKE_CURRENT_SOURCE_DIR}/src/SDL_shadercross.sym")
|
|
sdl_target_link_options_no_undefined(SDL3_shadercross-shared)
|
|
|
|
# Build flags
|
|
if(WIN32)
|
|
target_sources(SDL3_shadercross-shared PRIVATE "src/version.rc")
|
|
set_property(TARGET SDL3_shadercross-shared PROPERTY PREFIX "")
|
|
endif()
|
|
|
|
# SDL3_shadercross folders as includes, for other targets to consume
|
|
target_include_directories(SDL3_shadercross-shared PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
|
|
target_include_directories(SDL3_shadercross-shared PUBLIC "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
|
|
|
# Soname
|
|
set_target_properties(SDL3_shadercross-shared PROPERTIES
|
|
OUTPUT_NAME "SDL3_shadercross"
|
|
SOVERSION "${SO_VERSION_MAJOR}"
|
|
VERSION "${SO_VERSION}"
|
|
)
|
|
|
|
target_link_libraries(SDL3_shadercross-shared PRIVATE
|
|
SDL3::SDL3-shared
|
|
)
|
|
export(TARGETS SDL3_shadercross-shared NAMESPACE "SDL3_shadercross::" FILE "SDL3_shadercross-shared-targets.cmake")
|
|
endif()
|
|
|
|
|
|
if(SDLSHADERCROSS_STATIC)
|
|
list(APPEND SDL3_shadercross_targets SDL3_shadercross-static)
|
|
if(NOT TARGET SDL3::Headers)
|
|
find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED COMPONENTS Headers)
|
|
endif()
|
|
|
|
add_library(SDL3_shadercross-static STATIC ${SOURCE_FILES})
|
|
add_library(SDL3_shadercross::SDL3_shadercross-static ALIAS SDL3_shadercross-static)
|
|
|
|
if(NOT MSVC)
|
|
set_property(TARGET SDL3_shadercross-static PROPERTY OUTPUT_NAME "SDL3_shadercross")
|
|
endif()
|
|
|
|
# SDL3_shadercross folders as includes, for other targets to consume
|
|
target_include_directories(SDL3_shadercross-static PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>")
|
|
target_include_directories(SDL3_shadercross-static PUBLIC "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>")
|
|
|
|
target_link_libraries(SDL3_shadercross-static PUBLIC
|
|
SDL3::Headers
|
|
)
|
|
export(TARGETS SDL3_shadercross-static NAMESPACE "SDL3_shadercross::" FILE "SDL3_shadercross-static-targets.cmake")
|
|
endif()
|
|
|
|
# Copy dependencies of SDL3_shadercross-config.cmake to build directory.
|
|
# This allows usage of the package without installation.
|
|
file(COPY
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/sdlcpu.cmake"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindDirectXShaderCompiler.cmake"
|
|
DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
|
|
|
|
foreach(target IN LISTS SDL3_shadercross_targets)
|
|
sdl_add_warning_options(${target} WARNING_AS_ERROR ${SDLSHADERCROSS_WERROR})
|
|
target_compile_features(${target} PRIVATE c_std_99)
|
|
|
|
if(SDLSHADERCROSS_DXC)
|
|
add_compile_definitions(SDL_SHADERCROSS_DXC)
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
target_link_libraries(${target} PRIVATE spirv-cross-c-shared)
|
|
else()
|
|
target_link_libraries(${target} PRIVATE spirv-cross-c)
|
|
endif()
|
|
if(SDLSHADERCROSS_DXC)
|
|
target_link_libraries(${target} PRIVATE DirectXShaderCompiler::dxcompiler)
|
|
endif()
|
|
if(NOT SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
# spirv-cross uses C++
|
|
set_property(TARGET ${target} PROPERTY LINKER_LANGUAGE CXX)
|
|
endif()
|
|
endforeach()
|
|
|
|
if(NOT TARGET SDL3_shadercross::SDL3_shadercross)
|
|
if(TARGET SDL3_shadercross-shared)
|
|
add_library(SDL3_shadercross::SDL3_shadercross ALIAS SDL3_shadercross-shared)
|
|
else()
|
|
add_library(SDL3_shadercross::SDL3_shadercross ALIAS SDL3_shadercross-static)
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_CLI)
|
|
add_executable(shadercross src/cli.c)
|
|
sdl_add_warning_options(shadercross WARNING_AS_ERROR ${SDLSHADERCROSS_WERROR})
|
|
sdl_target_link_options_no_undefined(shadercross)
|
|
|
|
if(SDLSHADERCROSS_CLI_LEAKCHECK)
|
|
target_link_libraries(shadercross PRIVATE SDL3::SDL3_test)
|
|
target_compile_definitions(shadercross PRIVATE LEAKCHECK)
|
|
endif()
|
|
if(SDLSHADERCROSS_CLI_STATIC)
|
|
target_link_libraries(shadercross PRIVATE SDL3_shadercross::SDL3_shadercross-static)
|
|
target_link_libraries(shadercross PRIVATE SDL3::SDL3-static)
|
|
else()
|
|
if(NOT TARGET SDL3::SDL3)
|
|
find_package(SDL3 ${SDL_REQUIRED_VERSION} REQUIRED CONFIG COMPONENTS SDL3)
|
|
endif()
|
|
target_link_libraries(shadercross PRIVATE SDL3_shadercross::SDL3_shadercross)
|
|
target_link_libraries(shadercross PRIVATE SDL3::SDL3)
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_INSTALL)
|
|
if(WIN32 AND NOT MINGW)
|
|
set(INSTALL_CMAKEDIR_ROOT_DEFAULT "cmake")
|
|
else()
|
|
set(INSTALL_CMAKEDIR_ROOT_DEFAULT "${CMAKE_INSTALL_LIBDIR}/cmake")
|
|
endif()
|
|
set(SDLSHADERCROSS_INSTALL_CMAKEDIR_ROOT "${INSTALL_CMAKEDIR_ROOT_DEFAULT}" CACHE STRING "Root folder where to install SDL3_shadercross cmake related files (SDL3_shadercross subfolder for MSVC projects)")
|
|
set(SDLSHADERCROSS_PKGCONFIG_INSTALLDIR "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
|
|
if(WIN32 AND NOT MINGW)
|
|
set(SDLSHADERCROSS_INSTALL_CMAKEDIR "${SDLSHADERCROSS_INSTALL_CMAKEDIR_ROOT}")
|
|
else()
|
|
set(SDLSHADERCROSS_INSTALL_CMAKEDIR "${SDLSHADERCROSS_INSTALL_CMAKEDIR_ROOT}/SDL3_shadercross")
|
|
endif()
|
|
|
|
if(TARGET SDL3_shadercross-shared)
|
|
install(TARGETS SDL3_shadercross-shared EXPORT SDL3_shadercross-shared-export
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
|
|
)
|
|
install(EXPORT SDL3_shadercross-shared-export
|
|
FILE SDL3_shadercross-shared-targets.cmake
|
|
NAMESPACE SDL3_shadercross::
|
|
DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
endif()
|
|
if(TARGET SDL3_shadercross-static)
|
|
install(TARGETS SDL3_shadercross-static EXPORT SDL3_shadercross-static-export
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
|
|
)
|
|
install(EXPORT SDL3_shadercross-static-export
|
|
FILE SDL3_shadercross-static-targets.cmake
|
|
NAMESPACE SDL3_shadercross::
|
|
DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
endif()
|
|
if(vendored_targets)
|
|
install(TARGETS ${vendored_targets} EXPORT SDL3_shadercross-vendored
|
|
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT devel
|
|
RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" COMPONENT library
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" COMPONENT library
|
|
)
|
|
install(EXPORT SDL3_shadercross-vendored
|
|
FILE SDL3_shadercross-vendored-targets.cmake
|
|
NAMESPACE SDL3_shadercross::vendored::
|
|
DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
endif()
|
|
install(
|
|
FILES "${CMAKE_CURRENT_SOURCE_DIR}/include/SDL3_shadercross/SDL_shadercross.h"
|
|
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/SDL3_shadercross" COMPONENT DEVEL
|
|
)
|
|
if(SDLSHADERCROSS_CLI)
|
|
install(TARGETS shadercross RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
|
endif()
|
|
|
|
include(CMakePackageConfigHelpers)
|
|
configure_package_config_file(cmake/SDL3_shadercrossConfig.cmake.in SDL3_shadercrossConfig.cmake
|
|
NO_SET_AND_CHECK_MACRO
|
|
INSTALL_DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
)
|
|
write_basic_package_version_file("${PROJECT_BINARY_DIR}/SDL3_shadercrossConfigVersion.cmake"
|
|
COMPATIBILITY AnyNewerVersion
|
|
)
|
|
install(
|
|
FILES
|
|
"${CMAKE_CURRENT_BINARY_DIR}/SDL3_shadercrossConfig.cmake"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/SDL3_shadercrossConfigVersion.cmake"
|
|
DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
if(NOT SDLSHADERCROSS_VENDORED)
|
|
install(
|
|
FILES
|
|
"cmake/sdlcpu.cmake"
|
|
"cmake/FindDirectXShaderCompiler.cmake"
|
|
DESTINATION "${SDLSHADERCROSS_INSTALL_CMAKEDIR}"
|
|
COMPONENT devel
|
|
)
|
|
endif()
|
|
|
|
if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
set(INCLUDEDIR_FOR_PKG_CONFIG "${CMAKE_INSTALL_INCLUDEDIR}")
|
|
else()
|
|
set(INCLUDEDIR_FOR_PKG_CONFIG "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
endif()
|
|
if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
|
|
set(LIBDIR_FOR_PKG_CONFIG "${CMAKE_INSTALL_LIBDIR}")
|
|
else()
|
|
set(LIBDIR_FOR_PKG_CONFIG "\${prefix}/${CMAKE_INSTALL_LIBDIR}")
|
|
endif()
|
|
|
|
file(RELATIVE_PATH SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${CMAKE_INSTALL_PREFIX}/${SDLSHADERCROSS_PKGCONFIG_INSTALLDIR}" "${CMAKE_INSTALL_PREFIX}")
|
|
string(REGEX REPLACE "[/]+$" "" SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG "${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}")
|
|
set(SDL_PKGCONFIG_PREFIX "\${pcfiledir}/${SDL_PATH_PREFIX_RELATIVE_TO_PKGCONFIG}")
|
|
if(NOT SDLSHADERCROSS_VENDORED)
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
set(PC_REQUIRES "spirv-cross-c-shared")
|
|
else()
|
|
set(PC_REQUIRES "spirv-cross-c")
|
|
endif()
|
|
endif()
|
|
set(PC_LIBS "-ldxcompiler")
|
|
configure_file(cmake/sdl3-shadercross.pc.in sdl3-shadercross.pc @ONLY)
|
|
|
|
# Always install sdl3-shadercross.pc file: libraries might be different between config modes
|
|
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sdl3-shadercross.pc"
|
|
DESTINATION "${SDLSHADERCROSS_PKGCONFIG_INSTALLDIR}" COMPONENT devel)
|
|
|
|
install(FILES "LICENSE.txt"
|
|
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/${PROJECT_NAME}"
|
|
COMPONENT library
|
|
)
|
|
if(SDLSHADERCROSS_INSTALL_CPACK)
|
|
if(MSVC)
|
|
set(CPACK_GENERATOR "ZIP")
|
|
else()
|
|
set(CPACK_GENERATOR "TGZ")
|
|
endif()
|
|
configure_file(cmake/CPackProjectConfig.cmake.in CPackProjectConfig.cmake @ONLY)
|
|
set(CPACK_PROJECT_CONFIG_FILE "${PROJECT_BINARY_DIR}/CPackProjectConfig.cmake")
|
|
# CPACK_SOURCE_PACKAGE_FILE_NAME must end with "-src" (so we can block creating a source archive)
|
|
set(CPACK_SOURCE_PACKAGE_FILE_NAME "SDL3_shadercross-${PROJECT_VERSION}-src")
|
|
set(CPACK_PACKAGE_DIRECTORY "${CMAKE_BINARY_DIR}/dist")
|
|
include(CPack)
|
|
endif()
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_INSTALL_MAN)
|
|
sdl_get_git_revision_hash(SDLSHADERCROSS_REVISION)
|
|
SDL_generate_manpages(
|
|
HEADERS_DIR "${PROJECT_SOURCE_DIR}/include/SDL3_shadercross"
|
|
SYMBOL "SDL_ShaderCross_Init"
|
|
WIKIHEADERS_PL_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build-scripts/wikiheaders.pl"
|
|
REVISION "${SDLSHADERCROSS_REVISION}"
|
|
)
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_TESTS)
|
|
enable_testing()
|
|
add_subdirectory(test)
|
|
endif()
|
|
|
|
if(SDLSHADERCROSS_INSTALL_RUNTIME)
|
|
set(chmod_0755 OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
|
if(APPLE)
|
|
set(rpath_origin "@executable_path")
|
|
else()
|
|
set(rpath_origin "\$ORIGIN")
|
|
endif()
|
|
|
|
if(NOT SDLSHADERCROSS_VENDORED)
|
|
if(SDLSHADERCROSS_DXC)
|
|
install(IMPORTED_RUNTIME_ARTIFACTS DirectXShaderCompiler::dxcompiler DirectXShaderCompiler::dxil RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
|
endif()
|
|
if(SDLSHADERCROSS_SPIRVCROSS_SHARED)
|
|
install(IMPORTED_RUNTIME_ARTIFACTS spirv-cross-c-shared RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
|
if(WIN32)
|
|
install(CODE "
|
|
set(CMAKE_GET_RUNTIME_DEPENDENCIES_PLATFORM \"windows+pe\")
|
|
set(CMAKE_GET_RUNTIME_DEPENDENCIES_TOOL \"$<IF:$<BOOL:${MSVC}>,dumpbin,objdump>\")
|
|
set(CMAKE_GET_RUNTIME_DEPENDENCIES_COMMAND \"${CMAKE_OBJDUMP}\")
|
|
file(GET_RUNTIME_DEPENDENCIES
|
|
RESOLVED_DEPENDENCIES_VAR resolved
|
|
UNRESOLVED_DEPENDENCIES_VAR unresolved
|
|
DIRECTORIES \"$<TARGET_FILE_DIR:spirv-cross-c-shared>\" \"${CMAKE_INSTALL_PREFIX}${CMAKE_INSTALL_BINDIR}\"
|
|
LIBRARIES \"$<TARGET_FILE:spirv-cross-c-shared>\"
|
|
POST_EXCLUDE_REGEXES \".*[sS][yY][sS][tT][eE][mM]32.*\" \".*[aA][pP][iI]-[mM][sS].*\" \".*[aA][pP][iI]-[eE][xX][tT].*\"
|
|
)
|
|
file(INSTALL DESTINATION \"\${CMAKE_INSTALL_PREFIX}/bin\" TYPE SHARED_LIBRARY FILES \${resolved})
|
|
")
|
|
endif()
|
|
endif()
|
|
endif()
|
|
|
|
if(TARGET shadercross)
|
|
file(RELATIVE_PATH bin_to_lib "${CMAKE_INSTALL_FULL_BINDIR}" "${CMAKE_INSTALL_FULL_LIBDIR}")
|
|
set_property(TARGET shadercross PROPERTY INSTALL_RPATH "${rpath_origin}/${bin_to_lib}")
|
|
endif()
|
|
|
|
# Install SDL3
|
|
if(SDLSHADERCROSS_CLI AND NOT SDLSHADERCROSS_CLI_STATIC)
|
|
install(IMPORTED_RUNTIME_ARTIFACTS SDL3::SDL3-shared RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}")
|
|
endif()
|
|
include(ExternalProject)
|
|
|
|
if(NOT WIN32)
|
|
set(configure_CFLAGS "${CMAKE_C_FLAGS}")
|
|
if(APPLE)
|
|
foreach(osx_arch IN LISTS CMAKE_OSX_ARCHITECTURES)
|
|
string(APPEND configure_CFLAGS " -arch ${osx_arch}")
|
|
endforeach()
|
|
endif()
|
|
string(REPLACE ";" "$<SEMICOLON>" genex_CMAKE_OSX_ARCHITECTURES "${CMAKE_OSX_ARCHITECTURES}")
|
|
|
|
ExternalProject_Add(spirv_headers
|
|
GIT_REPOSITORY "https://github.com/KhronosGroup/SPIRV-Headers.git"
|
|
GIT_TAG "main"
|
|
CMAKE_ARGS "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_LIBDIR=lib" "-DCMAKE_INSTALL_BINDIR=bin" "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>" "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DCMAKE_OSX_ARCHITECTURES=${genex_CMAKE_OSX_ARCHITECTURES}" "-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
|
|
BUILD_COMMAND "${CMAKE_COMMAND}" "--build" "<BINARY_DIR>" --config "Release"
|
|
INSTALL_COMMAND "${CMAKE_COMMAND}" "--install" "<BINARY_DIR>" --config "Release"
|
|
)
|
|
ExternalProject_Get_property(spirv_headers INSTALL_DIR)
|
|
set(spirv_headers_install_dir "${INSTALL_DIR}")
|
|
|
|
ExternalProject_Add(vulkan_headers
|
|
GIT_REPOSITORY "https://github.com/KhronosGroup/Vulkan-Headers"
|
|
GIT_TAG "main"
|
|
CMAKE_ARGS "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_LIBDIR=lib" "-DCMAKE_INSTALL_BINDIR=bin" "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>" "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DCMAKE_OSX_ARCHITECTURES=${genex_CMAKE_OSX_ARCHITECTURES}" "-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}"
|
|
BUILD_COMMAND "${CMAKE_COMMAND}" "--build" "<BINARY_DIR>" --config "Release"
|
|
INSTALL_COMMAND "${CMAKE_COMMAND}" "--install" "<BINARY_DIR>" --config "Release"
|
|
)
|
|
ExternalProject_Get_property(vulkan_headers INSTALL_DIR)
|
|
set(vulkan_headers_install_dir "${INSTALL_DIR}")
|
|
|
|
ExternalProject_Add(vulkan_loader
|
|
DEPENDS spirv_headers vulkan_headers
|
|
GIT_REPOSITORY "https://github.com/KhronosGroup/Vulkan-Loader.git"
|
|
GIT_TAG "main"
|
|
CMAKE_ARGS "-DCMAKE_BUILD_TYPE=Release" "-DCMAKE_INSTALL_LIBDIR=lib" "-DCMAKE_INSTALL_BINDIR=bin" "-DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>" "-DCMAKE_C_COMPILER=${CMAKE_C_COMPILER}" "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}" "-DCMAKE_OSX_ARCHITECTURES=${genex_CMAKE_OSX_ARCHITECTURES}" "-DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET}" "-DCMAKE_PREFIX_PATH=${vulkan_headers_install_dir}"
|
|
BUILD_COMMAND "${CMAKE_COMMAND}" "--build" "<BINARY_DIR>" --config "Release"
|
|
INSTALL_COMMAND "${CMAKE_COMMAND}" "--install" "<BINARY_DIR>" --config "Release"
|
|
)
|
|
ExternalProject_Get_property(vulkan_loader INSTALL_DIR)
|
|
set(vulkan_loader_install_dir "${INSTALL_DIR}")
|
|
|
|
find_package(BISON REQUIRED)
|
|
ExternalProject_Add(vkd3d
|
|
DEPENDS spirv_headers vulkan_headers vulkan_loader
|
|
URL "https://dl.winehq.org/vkd3d/source/vkd3d-2.0.tar.xz"
|
|
URL_HASH "SHA256=9ad29bb236808186a47ec66e853b21e6fca59b9dc62a9474b05d5e3eda2710ef"
|
|
DOWNLOAD_EXTRACT_TIMESTAMP "1"
|
|
CONFIGURE_COMMAND "sh" "<SOURCE_DIR>/configure" "--prefix=<INSTALL_DIR>" "--enable-tests=no" "--enable-demos=no" "--disable-doxygen-doc" "CFLAGS=-I${spirv_headers_install_dir}/include -I${vulkan_headers_install_dir}/include -I${vulkan_loader_install_dir}/include ${configure_CFLAGS}" "LDFLAGS=-L${vulkan_loader_install_dir}/lib" "BISON=${BISON_EXECUTABLE}"
|
|
BUILD_COMMAND "make"
|
|
INSTALL_COMMAND "make" "install"
|
|
)
|
|
ExternalProject_Get_property(vkd3d SOURCE_DIR)
|
|
ExternalProject_Get_property(vkd3d INSTALL_DIR)
|
|
install(DIRECTORY "${INSTALL_DIR}/lib/" DESTINATION "${CMAKE_INSTALL_LIBDIR}" FILES_MATCHING PATTERN "*.so*" PERMISSIONS ${chmod_0755})
|
|
install(DIRECTORY "${INSTALL_DIR}/lib/" DESTINATION "${CMAKE_INSTALL_LIBDIR}" FILES_MATCHING PATTERN "*.dylib*" PERMISSIONS ${chmod_0755})
|
|
install(FILES "${SOURCE_DIR}/COPYING" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/licenses/vkd3d")
|
|
endif()
|
|
if(LINUX)
|
|
find_program(PATCHELF_BIN NAMES "patchelf" REQUIRED)
|
|
install(CODE "file(GLOB so_paths \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/*so*\")\n foreach(so_path \${so_paths})\n if(NOT IS_SYMLINK \${so_path})\n message(STATUS \"Adding \\\"\$ORIGIN\\\" to RPATH of \${so_path}\")\n execute_process(COMMAND ${PATCHELF_BIN} \"\${so_path}\" --add-rpath \"\$ORIGIN\")\n endif()\n endforeach()")
|
|
elseif(APPLE)
|
|
find_program(INT_BIN NAMES "install_name_tool" REQUIRED)
|
|
install(CODE "file(GLOB so_paths \"\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}/*dylib*\")\n foreach(so_path \${so_paths})\n if(NOT IS_SYMLINK \${so_path})\n message(STATUS \"Adding \\\"\@loader_path\\\" to RPATH of \${so_path}\")\n execute_process(COMMAND ${INT_BIN} \"\${so_path}\" -add_rpath \"\@loader_path\")\n endif()\n endforeach()")
|
|
endif()
|
|
endif()
|