summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Frisch <jacki@thejackimonster.de>2024-10-04 10:34:12 +0200
committerGitHub <noreply@github.com>2024-10-04 16:34:12 +0800
commit25c17b9fcbf7a21e9fa19c4a8f08b0406437be24 (patch)
treea85a734b32ea4f27a9cd594586a328858965893b
parent9f246a43667b4893040669873400e2e3813328ff (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.txt86
-rw-r--r--cmake/AutoOption.cmake5
-rw-r--r--cmake/SlangTarget.cmake14
-rw-r--r--external/CMakeLists.txt68
-rw-r--r--prelude/CMakeLists.txt1
-rw-r--r--source/compiler-core/slang-spirv-core-grammar.h4
-rw-r--r--source/core/slang-dictionary.h4
-rw-r--r--source/core/slang-hash.h4
-rw-r--r--source/core/slang-lz4-compression-system.cpp2
-rw-r--r--source/slang/CMakeLists.txt8
-rw-r--r--source/slang/slang-ir-glsl-legalize.cpp5
-rw-r--r--tools/slang-test/slang-test-main.cpp4
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;