summaryrefslogtreecommitdiff
path: root/source/slang-stdlib/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-stdlib/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-stdlib/CMakeLists.txt')
-rw-r--r--source/slang-stdlib/CMakeLists.txt125
1 files changed, 125 insertions, 0 deletions
diff --git a/source/slang-stdlib/CMakeLists.txt b/source/slang-stdlib/CMakeLists.txt
new file mode 100644
index 000000000..eca23859a
--- /dev/null
+++ b/source/slang-stdlib/CMakeLists.txt
@@ -0,0 +1,125 @@
+#
+# In this file, for stdlib source embed and stdlib embed itself, we define two
+# targets, one which includes the embed and one which does not, these are
+# linked in as needed to libslang and libslang-without-embedded-stdlib (for
+# slang-bootstrap)
+#
+# If MSVC supported weak linking we could just have a single library for each
+# and just not link it if we didn't want the embed...
+#
+
+#
+# Generate an embeddable stdlib
+#
+
+set(stdlib_generated_header_dir ${CMAKE_CURRENT_BINARY_DIR})
+set(stdlib_generated_header
+ ${stdlib_generated_header_dir}/slang-stdlib-generated.h
+)
+add_custom_command(
+ OUTPUT ${stdlib_generated_header}
+ COMMAND
+ slang-bootstrap -archive-type riff-lz4 -save-stdlib-bin-source
+ ${stdlib_generated_header}
+ DEPENDS slang-bootstrap
+ VERBATIM
+)
+
+set(stdlib_common_args
+ .
+ OBJECT
+ EXCLUDE_FROM_ALL
+ EXPORT_MACRO_PREFIX SLANG
+ EXPORT_TYPE_AS ${SLANG_LIB_TYPE}
+ FOLDER generated
+ LINK_WITH_PRIVATE core
+ USE_EXTRA_WARNINGS
+ EXPLICIT_SOURCE ./slang-embedded-stdlib.cpp
+)
+
+slang_add_target(
+ ${stdlib_common_args}
+ TARGET_NAME slang-embedded-stdlib
+ EXPLICIT_SOURCE ${stdlib_generated_header}
+ EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_EMBED_STDLIB
+ INCLUDE_DIRECTORIES_PRIVATE ${stdlib_generated_header_dir}
+)
+
+slang_add_target(
+ ${stdlib_common_args}
+ TARGET_NAME slang-no-embedded-stdlib
+)
+
+#
+# Compiling the meta.slang files
+#
+
+# List of *.meta.slang headers
+set(stdlib_meta_source_dir "${slang_SOURCE_DIR}/source/slang")
+glob_append(stdlib_meta_source "${stdlib_meta_source_dir}/*.meta.slang")
+
+set(stdlib_meta_output_dir "${CMAKE_CURRENT_BINARY_DIR}/stdlib-meta")
+
+# Generate the output file list
+set(stdlib_meta_generated_headers)
+foreach(meta_source ${stdlib_meta_source})
+ file(
+ RELATIVE_PATH
+ meta_source_relative
+ "${stdlib_meta_source_dir}"
+ ${meta_source}
+ )
+ list(
+ APPEND
+ stdlib_meta_generated_headers
+ "${stdlib_meta_output_dir}/${meta_source_relative}.h"
+ )
+endforeach()
+
+add_custom_command(
+ OUTPUT ${stdlib_meta_generated_headers}
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${stdlib_meta_output_dir}
+ COMMAND
+ slang-generate ${stdlib_meta_source} --target-directory
+ ${stdlib_meta_output_dir}
+ DEPENDS ${stdlib_meta_source} slang-generate
+ WORKING_DIRECTORY "${stdlib_meta_source_dir}"
+ VERBATIM
+)
+
+#
+# Generate embedded stdlib source
+#
+
+set(stdlib_source_common_args
+ .
+ OBJECT
+ EXCLUDE_FROM_ALL
+ USE_EXTRA_WARNINGS
+ LINK_WITH_PRIVATE
+ core
+ slang-capability-defs
+ slang-reflect-headers
+ SPIRV-Headers
+ INCLUDE_DIRECTORIES_PRIVATE ../slang
+ FOLDER generated
+ EXPLICIT_SOURCE
+ ./slang-embedded-stdlib-source.cpp
+ ${stdlib_meta_generated_headers}
+ EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_EMBED_STDLIB_SOURCE
+ INCLUDE_DIRECTORIES_PRIVATE
+ ${stdlib_meta_output_dir}
+ EXPORT_MACRO_PREFIX SLANG
+ EXPORT_TYPE_AS ${SLANG_LIB_TYPE}
+)
+
+slang_add_target(
+ ${stdlib_source_common_args}
+ TARGET_NAME slang-embedded-stdlib-source
+ EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_EMBED_STDLIB_SOURCE
+)
+
+slang_add_target(
+ ${stdlib_source_common_args}
+ TARGET_NAME slang-no-embedded-stdlib-source
+)