summaryrefslogtreecommitdiff
path: root/source/slang/CMakeLists.txt
diff options
context:
space:
mode:
authorEllie Hermaszewska <ellieh@nvidia.com>2024-10-11 21:06:23 +0800
committerGitHub <noreply@github.com>2024-10-11 21:06:23 +0800
commite91e1d4d54a14d985626318e5cf46635bfa4006d (patch)
tree18e5d045235b743429821c249b5611b70c8cd02d /source/slang/CMakeLists.txt
parentdfab34e4bf508fc517d4d645ebb3b6b1179a5003 (diff)
Restrict stdlib embed macros to single source file (#5251)
* Restrict stdlib embed macros to single source file * Build slang-without-embedded-stdlib with the same target type as libslang To avoid building everything twice
Diffstat (limited to 'source/slang/CMakeLists.txt')
-rw-r--r--source/slang/CMakeLists.txt188
1 files changed, 76 insertions, 112 deletions
diff --git a/source/slang/CMakeLists.txt b/source/slang/CMakeLists.txt
index 78d2376a7..27600e3f8 100644
--- a/source/slang/CMakeLists.txt
+++ b/source/slang/CMakeLists.txt
@@ -1,50 +1,3 @@
-#
-# Compiling the meta.slang files
-#
-
-# List of *.meta.slang headers
-glob_append(SLANG_STDLIB_META_SOURCE "*.meta.slang")
-
-set(SLANG_STDLIB_META_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/stdlib-meta")
-
-# Generate the output file list
-set(SLANG_STDLIB_META_GENERATED_HEADERS)
-foreach(meta_source ${SLANG_STDLIB_META_SOURCE})
- file(
- RELATIVE_PATH
- meta_source_relative
- ${CMAKE_CURRENT_LIST_DIR}
- ${meta_source}
- )
- list(
- APPEND
- SLANG_STDLIB_META_GENERATED_HEADERS
- "${SLANG_STDLIB_META_OUTPUT_DIR}/${meta_source_relative}.h"
- )
-endforeach()
-
-add_custom_command(
- OUTPUT ${SLANG_STDLIB_META_GENERATED_HEADERS}
- COMMAND ${CMAKE_COMMAND} -E make_directory ${SLANG_STDLIB_META_OUTPUT_DIR}
- COMMAND
- slang-generate ${SLANG_STDLIB_META_SOURCE} --target-directory
- ${SLANG_STDLIB_META_OUTPUT_DIR}
- DEPENDS ${SLANG_STDLIB_META_SOURCE} slang-generate
- WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
- VERBATIM
-)
-
-add_library(
- slang-meta-headers
- INTERFACE
- EXCLUDE_FROM_ALL
- ${SLANG_STDLIB_META_GENERATED_HEADERS}
-)
-set_target_properties(slang-meta-headers PROPERTIES FOLDER generated)
-target_include_directories(
- slang-meta-headers
- INTERFACE ${SLANG_STDLIB_META_OUTPUT_DIR}
-)
#
# generate capability files
@@ -211,33 +164,6 @@ slang_add_target(
)
#
-# Generate an embeddable stdlib
-#
-
-set(SLANG_STDLIB_GENERATED_HEADER
- ${CMAKE_CURRENT_BINARY_DIR}/slang-stdlib-generated.h
-)
-add_custom_command(
- OUTPUT ${SLANG_STDLIB_GENERATED_HEADER}
- COMMAND
- slang-bootstrap -archive-type riff-lz4 -save-stdlib-bin-source
- ${SLANG_STDLIB_GENERATED_HEADER}
- DEPENDS slang-bootstrap
- VERBATIM
-)
-add_library(
- slang-stdlib-embed-headers
- INTERFACE
- EXCLUDE_FROM_ALL
- ${SLANG_STDLIB_GENERATED_HEADER}
-)
-set_target_properties(slang-stdlib-embed-headers PROPERTIES FOLDER generated)
-target_include_directories(
- slang-stdlib-embed-headers
- INTERFACE ${CMAKE_CURRENT_BINARY_DIR}
-)
-
-#
# Generate the version header
#
@@ -247,60 +173,98 @@ configure_file(${slang_SOURCE_DIR}/slang-tag-version.h.in slang-version-header/s
# Slang itself
#
-set(slang_common_args
- EXTRA_SOURCE_DIRS ${SLANG_RECORD_REPLAY_SYSTEM}
+set(slang_build_args
USE_EXTRA_WARNINGS
+ EXTRA_COMPILE_OPTIONS_PRIVATE
+ # a warning is disabled for a memset boundary check.
+ # everything looked fine and it is unclear why the checking fails
+ $<$<CXX_COMPILER_ID:GNU>:-Wno-error=stringop-overflow>
+ # slang.h is in the project root, so include that directory in the interface
+ # for slang
+ INCLUDE_DIRECTORIES_PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header
+ EXPORT_MACRO_PREFIX SLANG
+ EXPORT_TYPE_AS ${SLANG_LIB_TYPE}
+ EXTRA_SOURCE_DIRS ${SLANG_RECORD_REPLAY_SYSTEM}
+)
+set(slang_link_args
LINK_WITH_PRIVATE
core
+ prelude
compiler-core
slang-capability-defs
slang-capability-lookup
slang-reflect-headers
slang-lookup-tables
SPIRV-Headers
- EXTRA_COMPILE_OPTIONS_PRIVATE
- # a warning is disabled for a memset boundary check.
- # everything looked fine and it is unclear why the checking fails
- $<$<CXX_COMPILER_ID:GNU>:-Wno-error=stringop-overflow>
- # slang.h is in the project root, so include that directory in the interface
- # for slang
+)
+set(slang_interface_args
INCLUDE_DIRECTORIES_PUBLIC ${slang_SOURCE_DIR}
- INCLUDE_DIRECTORIES_PRIVATE ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header
- EXPORT_MACRO_PREFIX SLANG
+)
+set(slang_public_lib_args
+ PUBLIC_HEADERS
+ ${slang_SOURCE_DIR}/slang*.h
+ ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header/*.h
+ LINK_WITH_PRIVATE
+ $<IF:$<BOOL:${SLANG_EMBED_STDLIB}>,slang-embedded-stdlib,slang-no-embedded-stdlib>
+ $<IF:$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>,slang-embedded-stdlib-source,slang-no-embedded-stdlib-source>
+ INSTALL
)
#
# Minimal static slang used in generating the embedded stdlib
#
-slang_add_target(
- .
- OBJECT
- ${slang_common_args}
- TARGET_NAME slang-no-embedded-stdlib
- EXCLUDE_FROM_ALL
- LINK_WITH_PRIVATE slang-meta-headers
- EXTRA_COMPILE_DEFINITIONS_PUBLIC SLANG_STATIC
- EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_WITHOUT_EMBEDDED_STD_LIB
- FOLDER generators
-)
-
#
-# Slang with whatever options
+# Slang itself
#
-slang_add_target(
- .
- ${SLANG_LIB_TYPE}
- ${slang_common_args}
- LINK_WITH_PRIVATE
- prelude
- $<$<BOOL:${SLANG_EMBED_STDLIB}>:slang-stdlib-embed-headers>
- $<$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>:slang-meta-headers>
- EXTRA_COMPILE_DEFINITIONS_PRIVATE
- $<$<NOT:$<BOOL:${SLANG_EMBED_STDLIB}>>:SLANG_WITHOUT_EMBEDDED_STD_LIB>
- $<$<NOT:$<BOOL:${SLANG_EMBED_STDLIB_SOURCE}>>:SLANG_DISABLE_STDLIB_SOURCE>
- EXPORT_MACRO_PREFIX SLANG
- INSTALL
- PUBLIC_HEADERS ${slang_SOURCE_DIR}/slang*.h ${CMAKE_CURRENT_BINARY_DIR}/slang-version-header/*.h
-)
+if(NOT SLANG_EMBED_STDLIB)
+ # If we're not embedding stdlib we can just do a normal build of slang,
+ # including all the options, this can also serve as our no embedded stdlib
+ # library for slang-bootstrap (not that we need that anyway)
+ slang_add_target(
+ .
+ ${SLANG_LIB_TYPE}
+ ${slang_build_args}
+ ${slang_link_args}
+ ${slang_interface_args}
+ ${slang_public_lib_args}
+ )
+ add_library(slang-without-embedded-stdlib ALIAS slang)
+else()
+ # However if we're embedding stdlib, we need to make two different
+ # libraries, one with the embedded stdlib and one without, so first define
+ # the shared objects as one target so we don't build them twice.
+ slang_add_target(
+ .
+ OBJECT
+ ${slang_build_args}
+ ${slang_link_args}
+ TARGET_NAME slang-common-objects
+ EXCLUDE_FROM_ALL
+ )
+ slang_add_target(
+ .
+ ${SLANG_LIB_TYPE}
+ ${slang_link_args}
+ ${slang_interface_args}
+ NO_SOURCE
+ TARGET_NAME
+ slang-without-embedded-stdlib
+ EXCLUDE_FROM_ALL
+ LINK_WITH_PRIVATE
+ slang-common-objects
+ slang-no-embedded-stdlib
+ slang-embedded-stdlib-source
+ )
+ slang_add_target(
+ .
+ ${SLANG_LIB_TYPE}
+ ${slang_link_args}
+ ${slang_interface_args}
+ ${slang_public_lib_args}
+ LINK_WITH_PRIVATE
+ slang-common-objects
+ NO_SOURCE
+ )
+endif()