summaryrefslogtreecommitdiff
path: root/source/slang-stdlib/CMakeLists.txt
blob: 6303bc1b91e2ab5d85ce763404d4e38a254398a5 (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
#
# 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
)

add_custom_target(generate_stdlib_headers DEPENDS ${stdlib_meta_generated_headers})

#
# 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}
    REQUIRES generate_stdlib_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
)