diff options
| author | Tobias Frisch <jacki@thejackimonster.de> | 2024-10-04 10:34:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-10-04 16:34:12 +0800 |
| commit | 25c17b9fcbf7a21e9fa19c4a8f08b0406437be24 (patch) | |
| tree | a85a734b32ea4f27a9cd594586a328858965893b | |
| parent | 9f246a43667b4893040669873400e2e3813328ff (diff) | |
Allow building using external dependencies (#5076)
* Add options to prevent usage of own submodules
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Allow using external unordered dense headers
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Link system wide installed unordered dense
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Allow external header usage for lz4 and spirv
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Add more options to disable targets
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Add option to provide explizit path for spirv headers and remove earlier options that break the build process
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Rename options to use common prefix
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Fix indentation for the cmake changes
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Add advanced_option function for cmake
* Normalize includes between system and submodule dependencies
Fix any before-accidentally-working problems
* Add option for enabling/disabling slang-rhi
Signed-off-by: Jacki <jacki@thejackimonster.de>
* Pass correct include path for cpu tests
* Correct include path
---------
Signed-off-by: Jacki <jacki@thejackimonster.de>
Co-authored-by: Ellie Hermaszewska <ellieh@nvidia.com>
| -rw-r--r-- | CMakeLists.txt | 86 | ||||
| -rw-r--r-- | cmake/AutoOption.cmake | 5 | ||||
| -rw-r--r-- | cmake/SlangTarget.cmake | 14 | ||||
| -rw-r--r-- | external/CMakeLists.txt | 68 | ||||
| -rw-r--r-- | prelude/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | source/compiler-core/slang-spirv-core-grammar.h | 4 | ||||
| -rw-r--r-- | source/core/slang-dictionary.h | 4 | ||||
| -rw-r--r-- | source/core/slang-hash.h | 4 | ||||
| -rw-r--r-- | source/core/slang-lz4-compression-system.cpp | 2 | ||||
| -rw-r--r-- | source/slang/CMakeLists.txt | 8 | ||||
| -rw-r--r-- | source/slang/slang-ir-glsl-legalize.cpp | 5 | ||||
| -rw-r--r-- | tools/slang-test/slang-test-main.cpp | 4 |
12 files changed, 146 insertions, 59 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 38486b699..b505cbf53 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,8 +81,8 @@ auto_option( Aftermath "Enable Aftermath in GFX, and add aftermath crash example to project" ) -option(SLANG_ENABLE_DX_ON_VK "Use dxvk and vkd3d-proton for DirectX support") -mark_as_advanced(SLANG_ENABLE_DX_ON_VK) +advanced_option(SLANG_ENABLE_DX_ON_VK "Use dxvk and vkd3d-proton for DirectX support" OFF) +advanced_option(SLANG_ENABLE_SLANG_RHI "Use slang-rhi as dependency" ON) option(SLANG_EMBED_STDLIB_SOURCE "Embed stdlib source in the binary" ON) option(SLANG_EMBED_STDLIB "Build slang with an embedded version of the stdlib") @@ -103,6 +103,27 @@ option(SLANG_ENABLE_REPLAYER "Enable slang-replay tool" ON) option(SLANG_GITHUB_TOKEN "Use a given token value for accessing Github REST API" "") +advanced_option(SLANG_USE_SYSTEM_MINIZ "Build using system Miniz library" OFF) +advanced_option(SLANG_USE_SYSTEM_LZ4 "Build using system LZ4 library" OFF) +advanced_option(SLANG_USE_SYSTEM_VULKAN_HEADERS "Build using system Vulkan headers" OFF) +advanced_option(SLANG_USE_SYSTEM_SPIRV_HEADERS "Build using system SPIR-V headers" OFF) +advanced_option(SLANG_USE_SYSTEM_UNORDERED_DENSE "Build using system unordered dense" OFF) + +option(SLANG_SPIRV_HEADERS_INCLUDE_DIR "Provide a specific path for the SPIR-V headers and grammar files") +mark_as_advanced(SLANG_SPIRV_HEADERS_INCLUDE_DIR) + +if (${SLANG_USE_SYSTEM_LZ4}) + add_compile_definitions(SLANG_USE_SYSTEM_LZ4_HEADER) +endif() + +if (${SLANG_USE_SYSTEM_SPIRV_HEADERS}) + add_compile_definitions(SLANG_USE_SYSTEM_SPIRV_HEADER) +endif() + +if (${SLANG_USE_SYSTEM_UNORDERED_DENSE}) + add_compile_definitions(SLANG_USE_SYSTEM_UNORDERED_DENSE_HEADER) +endif() + enum_option( SLANG_LIB_TYPE # Default @@ -200,8 +221,15 @@ if(SLANG_SLANG_LLVM_FLAVOR STREQUAL "USE_SYSTEM_LLVM") find_package(Clang REQUIRED CONFIG) endif() +if (${SLANG_USE_SYSTEM_UNORDERED_DENSE}) + find_package(unordered_dense CONFIG QUIET) +endif() + add_subdirectory(external) +set(SLANG_CORE_LIBRARIES "") +list(APPEND SLANG_CORE_LIBRARIES miniz lz4_static Threads::Threads ${CMAKE_DL_LIBS}) + # # Our targets # @@ -211,7 +239,8 @@ slang_add_target( STATIC EXCLUDE_FROM_ALL USE_EXTRA_WARNINGS - LINK_WITH_PRIVATE miniz lz4_static Threads::Threads ${CMAKE_DL_LIBS} + LINK_WITH_PRIVATE ${SLANG_CORE_LIBRARIES} + LINK_WITH_PUBLIC unordered_dense::unordered_dense INCLUDE_DIRECTORIES_PUBLIC source include ) @@ -222,7 +251,8 @@ if(SLANG_ENABLE_SLANGRT) # This compiles 'core' again with the SLANG_RT_DYNAMIC_EXPORT macro defined EXTRA_SOURCE_DIRS source/core USE_EXTRA_WARNINGS - LINK_WITH_PRIVATE miniz lz4_static Threads::Threads ${CMAKE_DL_LIBS} + LINK_WITH_PRIVATE ${SLANG_CORE_LIBRARIES} + LINK_WITH_PUBLIC unordered_dense::unordered_dense EXPORT_MACRO_PREFIX SLANG_RT INCLUDE_DIRECTORIES_PUBLIC include INSTALL @@ -235,6 +265,7 @@ slang_add_target( EXCLUDE_FROM_ALL USE_EXTRA_WARNINGS LINK_WITH_PRIVATE core + INCLUDE_FROM_PUBLIC SPIRV-Headers ) if(NOT MSVC) # This is necessary to compile the DXC headers @@ -291,12 +322,14 @@ function(generator dir) ) endif() endfunction() + generator(tools/slang-cpp-extractor USE_FEWER_WARNINGS LINK_WITH_PRIVATE compiler-core) generator(tools/slang-embed) generator(tools/slang-generate USE_FEWER_WARNINGS) generator(tools/slang-lookup-generator LINK_WITH_PRIVATE compiler-core) generator(tools/slang-capability-generator LINK_WITH_PRIVATE compiler-core) generator(tools/slang-spirv-embed-generator LINK_WITH_PRIVATE compiler-core) + generator( source/slangc TARGET_NAME slang-bootstrap @@ -319,6 +352,7 @@ if(SLANG_ENABLE_SLANGD) EXECUTABLE LINK_WITH_PRIVATE core + compiler-core slang slang-reflect-headers slang-capability-defs @@ -618,7 +652,7 @@ if(SLANG_ENABLE_TESTS) tools/unit-test OBJECT EXCLUDE_FROM_ALL - INCLUDE_FROM_PRIVATE slang + INCLUDE_FROM_PRIVATE slang core INCLUDE_DIRECTORIES_PRIVATE include FOLDER test ) @@ -636,26 +670,28 @@ if(SLANG_ENABLE_TESTS) REQUIRED_BY slang-test FOLDER test/tools ) - slang_add_target( - tools/render-test - MODULE - EXCLUDE_FROM_ALL - EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_SHARED_LIBRARY_TOOL - USE_FEWER_WARNINGS - LINK_WITH_PRIVATE - core - compiler-core - slang - slang-rhi - platform - $<$<BOOL:${SLANG_ENABLE_CUDA}>:CUDA::cuda_driver> - EXTRA_COMPILE_DEFINITIONS_PRIVATE - $<$<BOOL:${SLANG_ENABLE_CUDA}>:RENDER_TEST_CUDA> - $<$<BOOL:${SLANG_ENABLE_OPTIX}>:RENDER_TEST_OPTIX> - OUTPUT_NAME render-test-tool - REQUIRED_BY slang-test - FOLDER test/tools - ) + if(SLANG_ENABLE_SLANG_RHI) + slang_add_target( + tools/render-test + MODULE + EXCLUDE_FROM_ALL + EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_SHARED_LIBRARY_TOOL + USE_FEWER_WARNINGS + LINK_WITH_PRIVATE + core + compiler-core + slang + slang-rhi + platform + $<$<BOOL:${SLANG_ENABLE_CUDA}>:CUDA::cuda_driver> + EXTRA_COMPILE_DEFINITIONS_PRIVATE + $<$<BOOL:${SLANG_ENABLE_CUDA}>:RENDER_TEST_CUDA> + $<$<BOOL:${SLANG_ENABLE_OPTIX}>:RENDER_TEST_OPTIX> + OUTPUT_NAME render-test-tool + REQUIRED_BY slang-test + FOLDER test/tools + ) + endif() endif() slang_add_target( tools/slang-unit-test diff --git a/cmake/AutoOption.cmake b/cmake/AutoOption.cmake index 3f7cdee0e..d25ea17b8 100644 --- a/cmake/AutoOption.cmake +++ b/cmake/AutoOption.cmake @@ -42,3 +42,8 @@ function(enum_option name init description) endforeach() message(FATAL_ERROR "${name} must be one of ${enums}") endfunction() + +function(advanced_option name description default) + option(${name} ${description} ${default}) + mark_as_advanced(${name}) +endfunction() diff --git a/cmake/SlangTarget.cmake b/cmake/SlangTarget.cmake index e370a4987..5387cd2ce 100644 --- a/cmake/SlangTarget.cmake +++ b/cmake/SlangTarget.cmake @@ -55,10 +55,16 @@ function(slang_add_target dir type) EXTRA_COMPILE_OPTIONS_PRIVATE # Targets with which to link privately LINK_WITH_PRIVATE + # Targets with which to link publicly, for example if their headers + # appear in our headers + LINK_WITH_PUBLIC # Frameworks with which to link privately LINK_WITH_FRAMEWORK # Targets whose headers we use, but don't link with INCLUDE_FROM_PRIVATE + # Targets whose headers we use in our headers, so need to make sure + # dependencies of this target also include them + INCLUDE_FROM_PUBLIC # Any include directories other targets need to use this target INCLUDE_DIRECTORIES_PUBLIC # Any include directories this target only needs @@ -214,6 +220,7 @@ function(slang_add_target dir type) # Link and include from dependencies # target_link_libraries(${target} PRIVATE ${ARG_LINK_WITH_PRIVATE}) + target_link_libraries(${target} PUBLIC ${ARG_LINK_WITH_PUBLIC}) if(CMAKE_SYSTEM_NAME MATCHES "Darwin") foreach(link_framework ${ARG_LINK_WITH_FRAMEWORK}) @@ -228,6 +235,13 @@ function(slang_add_target dir type) $<TARGET_PROPERTY:${include_from},INTERFACE_INCLUDE_DIRECTORIES> ) endforeach() + foreach(include_from ${ARG_INCLUDE_FROM_PUBLIC}) + target_include_directories( + ${target} + PUBLIC + $<TARGET_PROPERTY:${include_from},INTERFACE_INCLUDE_DIRECTORIES> + ) + endforeach() # # Set our exported include directories diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index ce8b76c70..dfee0a610 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -17,35 +17,47 @@ if(NOT SLANG_ENABLE_EXTERNAL_COMPILER_WARNINGS) endif() endif() +if (NOT ${SLANG_USE_SYSTEM_UNORDERED_DENSE}) + add_subdirectory(unordered_dense EXCLUDE_FROM_ALL SYSTEM) +endif() + # Miniz -add_subdirectory(miniz EXCLUDE_FROM_ALL SYSTEM) -set_property(TARGET miniz PROPERTY POSITION_INDEPENDENT_CODE ON) -# Work around https://github.com/richgel999/miniz/pull/292 -get_target_property(miniz_c_launcher miniz C_COMPILER_LAUNCHER) -if(MSVC AND miniz_c_launcher MATCHES "ccache") - set_property(TARGET miniz PROPERTY C_COMPILER_LAUNCHER) - set_property(TARGET miniz PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") +if (NOT ${SLANG_USE_SYSTEM_MINIZ}) + add_subdirectory(miniz EXCLUDE_FROM_ALL SYSTEM) + set_property(TARGET miniz PROPERTY POSITION_INDEPENDENT_CODE ON) + # Work around https://github.com/richgel999/miniz/pull/292 + get_target_property(miniz_c_launcher miniz C_COMPILER_LAUNCHER) + if(MSVC AND miniz_c_launcher MATCHES "ccache") + set_property(TARGET miniz PROPERTY C_COMPILER_LAUNCHER) + set_property(TARGET miniz PROPERTY MSVC_DEBUG_INFORMATION_FORMAT "") + endif() endif() # LZ4 -set(LZ4_BUNDLED_MODE ON) -add_subdirectory(lz4/build/cmake EXCLUDE_FROM_ALL SYSTEM) -if(MSVC) - target_compile_options( - lz4_static - PRIVATE /wd5045 /wd4820 /wd4711 /wd6385 /wd6262 - ) +if (NOT ${SLANG_USE_SYSTEM_LZ4}) + set(LZ4_BUNDLED_MODE ON) + add_subdirectory(lz4/build/cmake EXCLUDE_FROM_ALL SYSTEM) + if(MSVC) + target_compile_options( + lz4_static + PRIVATE /wd5045 /wd4820 /wd4711 /wd6385 /wd6262 + ) + endif() endif() # Vulkan headers -add_subdirectory(vulkan EXCLUDE_FROM_ALL SYSTEM) +if (NOT ${SLANG_USE_SYSTEM_VULKAN_HEADERS}) + add_subdirectory(vulkan EXCLUDE_FROM_ALL SYSTEM) +endif() # metal-cpp headers add_library(metal-cpp INTERFACE) target_include_directories(metal-cpp INTERFACE "${CMAKE_CURRENT_LIST_DIR}/metal-cpp") # SPIRV-Headers -add_subdirectory(spirv-headers EXCLUDE_FROM_ALL SYSTEM) +if (NOT ${SLANG_USE_SYSTEM_SPIRV_HEADERS}) + add_subdirectory(spirv-headers EXCLUDE_FROM_ALL SYSTEM) +endif() if(SLANG_ENABLE_SLANG_GLSLANG) # SPIRV-Tools @@ -66,18 +78,20 @@ endif() add_library(imgui INTERFACE) target_include_directories(imgui INTERFACE "${CMAKE_CURRENT_LIST_DIR}/imgui") -# slang-rhi -set(SLANG_RHI_BINARY_DIR ${CMAKE_BINARY_DIR}/$<CONFIG>/bin) -set(SLANG_RHI_SLANG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) -set(SLANG_RHI_SLANG_BINARY_DIR ${CMAKE_BINARY_DIR}) -set(SLANG_RHI_BUILD_TESTS OFF) -if(CMAKE_SYSTEM_NAME STREQUAL "Linux") - set(SLANG_RHI_ENABLE_WGPU OFF) -endif() -if(SLANG_ENABLE_DX_ON_VK) - set(SLANG_RHI_HAS_D3D12 ON) +if(SLANG_ENABLE_SLANG_RHI) + # slang-rhi + set(SLANG_RHI_BINARY_DIR ${CMAKE_BINARY_DIR}/$<CONFIG>/bin) + set(SLANG_RHI_SLANG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/include) + set(SLANG_RHI_SLANG_BINARY_DIR ${CMAKE_BINARY_DIR}) + set(SLANG_RHI_BUILD_TESTS OFF) + if(SLANG_ENABLE_DX_ON_VK) + set(SLANG_RHI_HAS_D3D12 ON) + endif() + if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(SLANG_RHI_ENABLE_WGPU OFF) + endif() + add_subdirectory(slang-rhi) endif() -add_subdirectory(slang-rhi) # Tidy things up: diff --git a/prelude/CMakeLists.txt b/prelude/CMakeLists.txt index 173cce542..49503ddf7 100644 --- a/prelude/CMakeLists.txt +++ b/prelude/CMakeLists.txt @@ -25,6 +25,7 @@ slang_add_target( EXCLUDE_FROM_ALL TARGET_NAME prelude INCLUDE_DIRECTORIES_PUBLIC ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/../include + LINK_WITH_PRIVATE unordered_dense::unordered_dense PUBLIC_HEADERS ${CMAKE_CURRENT_LIST_DIR}/slang*.h # It's an object library, so the install step only installs the headers INSTALL diff --git a/source/compiler-core/slang-spirv-core-grammar.h b/source/compiler-core/slang-spirv-core-grammar.h index 958aaaef2..d78a339f1 100644 --- a/source/compiler-core/slang-spirv-core-grammar.h +++ b/source/compiler-core/slang-spirv-core-grammar.h @@ -4,7 +4,9 @@ #include "../core/slang-string.h" #include "../core/slang-string-slice-pool.h" #include "../core/slang-dictionary.h" -#include "../../external/spirv-headers/include/spirv/unified1/spirv.h" + +#include <spirv/unified1/spirv.h> + #include <optional> namespace Slang diff --git a/source/core/slang-dictionary.h b/source/core/slang-dictionary.h index ba4672740..9c445c3c9 100644 --- a/source/core/slang-dictionary.h +++ b/source/core/slang-dictionary.h @@ -8,7 +8,9 @@ #include "slang-exception.h" #include "slang-math.h" #include "slang-hash.h" -#include "../../external/unordered_dense/include/ankerl/unordered_dense.h" + +#include <ankerl/unordered_dense.h> + #include <initializer_list> namespace Slang diff --git a/source/core/slang-hash.h b/source/core/slang-hash.h index 784f7fd23..3e255f7db 100644 --- a/source/core/slang-hash.h +++ b/source/core/slang-hash.h @@ -3,7 +3,9 @@ #include "../../include/slang.h" #include "slang-math.h" -#include "../../external/unordered_dense/include/ankerl/unordered_dense.h" + +#include <ankerl/unordered_dense.h> + #include <cstring> #include <type_traits> diff --git a/source/core/slang-lz4-compression-system.cpp b/source/core/slang-lz4-compression-system.cpp index c20b457df..1e2ab9558 100644 --- a/source/core/slang-lz4-compression-system.cpp +++ b/source/core/slang-lz4-compression-system.cpp @@ -5,7 +5,7 @@ #include "slang-blob.h" -#include "../../external/lz4/lib/lz4.h" +#include <lz4.h> namespace Slang { diff --git a/source/slang/CMakeLists.txt b/source/slang/CMakeLists.txt index fd20bbe22..78d2376a7 100644 --- a/source/slang/CMakeLists.txt +++ b/source/slang/CMakeLists.txt @@ -152,8 +152,12 @@ target_include_directories( # generated lookup tables # +if (NOT SLANG_USE_SYSTEM_SPIRV_HEADERS) + set(SLANG_SPIRV_HEADERS_INCLUDE_DIR "${slang_SOURCE_DIR}/external/spirv-headers/include") +endif() + set(SLANG_LOOKUP_GENERATOR_INPUT_JSON - "${slang_SOURCE_DIR}/external/spirv-headers/include/spirv/unified1/extinst.glsl.std.450.grammar.json" + "${SLANG_SPIRV_HEADERS_INCLUDE_DIR}/spirv/unified1/extinst.glsl.std.450.grammar.json" ) set(SLANG_LOOKUP_GENERATOR_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/slang-lookup-tables/" @@ -179,7 +183,7 @@ add_custom_command( ) set(SLANG_SPIRV_CORE_SOURCE_JSON - "${slang_SOURCE_DIR}/external/spirv-headers/include/spirv/unified1/spirv.core.grammar.json" + "${SLANG_SPIRV_HEADERS_INCLUDE_DIR}/spirv/unified1/spirv.core.grammar.json" ) set(SLANG_SPIRV_CORE_GRAMMAR_SOURCE "${SLANG_LOOKUP_GENERATOR_OUTPUT_DIR}/slang-spirv-core-grammar-embed.cpp" diff --git a/source/slang/slang-ir-glsl-legalize.cpp b/source/slang/slang-ir-glsl-legalize.cpp index 2d7e0c804..4f19d45a2 100644 --- a/source/slang/slang-ir-glsl-legalize.cpp +++ b/source/slang/slang-ir-glsl-legalize.cpp @@ -11,7 +11,12 @@ #include "slang-ir-clone.h" #include "slang-ir-single-return.h" #include "slang-glsl-extension-tracker.h" + +#ifdef SLANG_USE_SYSTEM_SPIRV_HEADER +#include <spirv/unified1/spirv.h> +#else #include "../../external/spirv-headers/include/spirv/unified1/spirv.h" +#endif namespace Slang { diff --git a/tools/slang-test/slang-test-main.cpp b/tools/slang-test/slang-test-main.cpp index 47a87ddc2..a620a7120 100644 --- a/tools/slang-test/slang-test-main.cpp +++ b/tools/slang-test/slang-test-main.cpp @@ -1659,6 +1659,8 @@ TestResult runExecutableTest(TestContext* context, TestInput& input) args.add("exe"); args.add("-Xgenericcpp"); args.add("-I./include"); + args.add("-Xgenericcpp"); + args.add("-I./external/unordered_dense/include"); for (auto arg : args) { // If unescaping is needed, do it @@ -2426,7 +2428,7 @@ static TestResult runCPPCompilerSharedLibrary(TestContext* context, TestInput& i TerminatedCharSlice includePaths[] = { TerminatedCharSlice(".") }; options.sourceArtifacts = makeSlice(sourceArtifact.readRef(), 1); - options.includePaths = makeSlice(includePaths, 1); + options.includePaths = makeSlice(includePaths, SLANG_COUNT_OF(includePaths)); options.modulePath = SliceUtil::asTerminatedCharSlice(modulePath); ComPtr<IArtifact> artifact; |
