yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Julius IkkalaFix slang-no-embedded-core-module-source embedding core module (#7885)2db6ac97a

master
4.4 KiB161 linesraw
1#
2# In this file, for core module source embed and core module embed itself, we define two
3# targets, one which includes the embed and one which does not, these are
4# linked in as needed to libslang and libslang-without-embedded-core-module (for
5# slang-bootstrap)
6#
7# If MSVC supported weak linking we could just have a single library for each
8# and just not link it if we didn't want the embed...
9#
10
11#
12# Compiling the meta.slang files
13#
14
15# List of *.meta.slang headers
16set(core_module_meta_source_dir "${slang_SOURCE_DIR}/source/slang")
17glob_append(
18    core_module_meta_source
19    "${core_module_meta_source_dir}/*.meta.slang"
20)
21
22set(core_module_meta_output_dir "${CMAKE_CURRENT_BINARY_DIR}/core-module-meta")
23
24# Generate the output file list
25set(core_module_meta_generated_headers)
26foreach(meta_source ${core_module_meta_source})
27    file(
28        RELATIVE_PATH
29        meta_source_relative
30        "${core_module_meta_source_dir}"
31        ${meta_source}
32    )
33    list(
34        APPEND
35        core_module_meta_generated_headers
36        "${core_module_meta_output_dir}/${meta_source_relative}.h"
37    )
38endforeach()
39
40add_custom_command(
41    OUTPUT ${core_module_meta_generated_headers}
42    COMMAND ${CMAKE_COMMAND} -E make_directory ${core_module_meta_output_dir}
43    COMMAND
44        slang-generate ${core_module_meta_source} --target-directory
45        ${core_module_meta_output_dir}
46    DEPENDS ${core_module_meta_source} slang-generate
47    WORKING_DIRECTORY "${core_module_meta_source_dir}"
48    VERBATIM
49)
50
51#
52# Generate embedded core module source library (or a dummy library with just nullptrs)
53#
54
55set(core_module_source_common_args
56    .
57    OBJECT
58    EXCLUDE_FROM_ALL
59    USE_EXTRA_WARNINGS
60    LINK_WITH_PRIVATE
61    core
62    slang-capability-defs
63    slang-fiddle-output
64    SPIRV-Headers::SPIRV-Headers
65    INCLUDE_DIRECTORIES_PRIVATE
66    ../slang
67    ${core_module_meta_output_dir}
68    FOLDER
69    generated
70    EXPLICIT_SOURCE
71    ./slang-embedded-core-module-source.cpp
72    EXPORT_MACRO_PREFIX
73    SLANG
74    EXPORT_TYPE_AS
75    ${SLANG_LIB_TYPE}
76)
77
78slang_add_target(
79    ${core_module_source_common_args}
80    TARGET_NAME slang-embedded-core-module-source
81    EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_EMBED_CORE_MODULE_SOURCE
82    EXPLICIT_SOURCE ${core_module_meta_generated_headers}
83    EXCLUDE_FROM_ALL
84)
85
86slang_add_target(
87    ${core_module_source_common_args}
88    TARGET_NAME slang-no-embedded-core-module-source
89    EXCLUDE_FROM_ALL
90)
91
92#
93# Use that source to generate an embeddable core module, this uses
94# slang-bootstrap which will include the embedded source we have above
95#
96
97set(core_module_generated_header_dir ${CMAKE_CURRENT_BINARY_DIR})
98set(core_module_generated_header
99    ${core_module_generated_header_dir}/slang-core-module-generated.h
100)
101set(glsl_module_generated_header_dir
102    ${CMAKE_CURRENT_BINARY_DIR}/../slang-glsl-module
103)
104set(glsl_module_generated_header
105    ${glsl_module_generated_header_dir}/slang-glsl-module-generated.h
106)
107
108# Propagate to parent directory scope, so they're visible to
109# slang-glsl-module/CMakeLists.txt
110set(glsl_module_generated_header_dir
111    ${glsl_module_generated_header_dir}
112    PARENT_SCOPE
113)
114set(glsl_module_generated_header ${glsl_module_generated_header} PARENT_SCOPE)
115
116add_custom_command(
117    OUTPUT ${core_module_generated_header} ${glsl_module_generated_header}
118    COMMAND
119        slang-bootstrap -archive-type riff-lz4 -save-core-module-bin-source
120        ${core_module_generated_header} -save-glsl-module-bin-source
121        ${glsl_module_generated_header}
122    DEPENDS slang-bootstrap slang-without-embedded-core-module
123    VERBATIM
124)
125# Add a target so that we can depend on the above step when we create the glsl
126# module
127add_custom_target(
128    generate_core_module_headers
129    DEPENDS ${core_module_generated_header} ${glsl_module_generated_header}
130)
131set_target_properties(generate_core_module_headers PROPERTIES FOLDER generated)
132
133set(core_module_common_args
134    .
135    OBJECT
136    EXCLUDE_FROM_ALL
137    EXPORT_MACRO_PREFIX
138    SLANG
139    EXPORT_TYPE_AS
140    ${SLANG_LIB_TYPE}
141    FOLDER
142    generated
143    LINK_WITH_PRIVATE
144    core
145    USE_EXTRA_WARNINGS
146    EXPLICIT_SOURCE
147    ./slang-embedded-core-module.cpp
148)
149
150slang_add_target(
151    ${core_module_common_args}
152    TARGET_NAME slang-embedded-core-module
153    REQUIRES generate_core_module_headers
154    EXTRA_COMPILE_DEFINITIONS_PRIVATE SLANG_EMBED_CORE_MODULE
155    INCLUDE_DIRECTORIES_PRIVATE ${core_module_generated_header_dir}
156)
157
158slang_add_target(
159    ${core_module_common_args}
160    TARGET_NAME slang-no-embedded-core-module
161)