summaryrefslogtreecommitdiffstats
path: root/source/slang-core-module/CMakeLists.txt
blob: 461908c3a631d36d82f350156cba73885f5707bd (plain)
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
#
# 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-fiddle-output
    SPIRV-Headers::SPIRV-Headers
    INCLUDE_DIRECTORIES_PRIVATE
    ../slang
    ${core_module_meta_output_dir}
    FOLDER
    generated
    EXPLICIT_SOURCE
    ./slang-embedded-core-module-source.cpp
    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
)