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