Skip to content

Commit 87cc29d

Browse files
committed
cmake: make the embedded file generator reusable
1 parent d2a30a8 commit 87cc29d

File tree

7 files changed

+197
-147
lines changed

7 files changed

+197
-147
lines changed

CMakeLists.txt

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1037,39 +1037,8 @@ if (BUILD_CLIENT)
10371037
Tests ${CLIENTTESTLIST}
10381038
)
10391039

1040-
# generate glsl include files
1041-
set(GLSL_SOURCE_DIR ${ENGINE_DIR}/renderer/glsl_source)
1042-
set(EMBED_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/embed_data)
1043-
file(MAKE_DIRECTORY ${EMBED_INCLUDE_DIR})
1044-
1045-
set(SHADERS_CPP_TEXT "// This file is auto-generated by CMakeLists.txt.\n")
1046-
string(APPEND SHADERS_CPP_TEXT "#include \"common/Common.h\"\n\n")
1047-
set(SHADERMAP_TEXT "")
1048-
1049-
foreach(res ${GLSLSOURCELIST})
1050-
get_filename_component(filename_no_ext ${res} NAME_WE)
1051-
set(outpath ${EMBED_INCLUDE_DIR}/${filename_no_ext}.glsl.h)
1052-
1053-
add_custom_command(
1054-
OUTPUT ${outpath}
1055-
COMMAND ${CMAKE_COMMAND} "-DINPUT_FILE=${res}" "-DOUTPUT_FILE=${outpath}"
1056-
"-DVARIABLE_NAME=${filename_no_ext}_glsl" -P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake
1057-
MAIN_DEPENDENCY ${res}
1058-
)
1059-
1060-
set_property(TARGET client-objects APPEND PROPERTY SOURCES ${outpath})
1061-
1062-
string(APPEND SHADERS_CPP_TEXT "#include \"../embed_data/${filename_no_ext}.glsl.h\"\n")
1063-
string(APPEND SHADERMAP_TEXT "\t{ \"${filename_no_ext}.glsl\", ")
1064-
string(APPEND SHADERMAP_TEXT "std::string(reinterpret_cast<const char *>( ${filename_no_ext}_glsl ), ")
1065-
string(APPEND SHADERMAP_TEXT "sizeof( ${filename_no_ext}_glsl )) },\n")
1066-
endforeach()
1067-
1068-
string(APPEND SHADERS_CPP_TEXT "\nextern const std::unordered_map<std::string, std::string> shadermap\n{\n")
1069-
string(APPEND SHADERS_CPP_TEXT "${SHADERMAP_TEXT}")
1070-
string(APPEND SHADERS_CPP_TEXT "};\n")
1071-
1072-
daemon_write_generated("shaders.cpp" "${SHADERS_CPP_TEXT}")
1040+
# Generate GLSL include files.
1041+
daemon_embed_files("EngineShaders" "GLSL" "client-objects")
10731042
endif()
10741043

10751044
if (BUILD_SERVER)

cmake/DaemonBuildInfo.cmake

Lines changed: 2 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,2 @@
1-
set(DAEMON_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/GeneratedSource")
2-
3-
set(DAEMON_BUILDINFO_DIR "DaemonBuildInfo")
4-
set(DAEMON_BUILDINFO_HEADER "// Automatically generated, do not modify!\n")
5-
set(DAEMON_BUILDINFO_CPP_EXT ".cpp")
6-
set(DAEMON_BUILDINFO_H_EXT ".h")
7-
set(BUILDINFOLIST)
8-
9-
file(MAKE_DIRECTORY "${DAEMON_GENERATED_DIR}")
10-
include_directories("${DAEMON_GENERATED_DIR}")
11-
12-
file(MAKE_DIRECTORY "${DAEMON_GENERATED_DIR}/${DAEMON_BUILDINFO_DIR}")
13-
14-
foreach(kind CPP H)
15-
set(DAEMON_BUILDINFO_${kind} "${DAEMON_BUILDINFO_HEADER}")
16-
endforeach()
17-
18-
macro(daemon_add_buildinfo TYPE NAME VALUE)
19-
set(DAEMON_BUILDINFO_CPP "${DAEMON_BUILDINFO_CPP}const ${TYPE} ${NAME}=${VALUE};\n")
20-
set(DAEMON_BUILDINFO_H "${DAEMON_BUILDINFO_H}extern const ${TYPE} ${NAME};\n")
21-
endmacro()
22-
23-
macro(daemon_write_generated GENERATED_PATH GENERATED_CONTENT)
24-
set(DAEMON_GENERATED_FILE ${DAEMON_GENERATED_DIR}/${GENERATED_PATH})
25-
26-
if (EXISTS "${DAEMON_GENERATED_FILE}")
27-
file(READ "${DAEMON_GENERATED_FILE}" GENERATED_CONTENT_READ)
28-
endif()
29-
30-
if (NOT "${GENERATED_CONTENT}" STREQUAL "${GENERATED_CONTENT_READ}")
31-
message(STATUS "Generating ${GENERATED_PATH}")
32-
file(WRITE "${DAEMON_GENERATED_FILE}" "${GENERATED_CONTENT}")
33-
endif()
34-
endmacro()
35-
36-
macro(daemon_write_buildinfo NAME)
37-
foreach(kind CPP H)
38-
set(DAEMON_BUILDINFO_${kind}_NAME "${NAME}${DAEMON_BUILDINFO_${kind}_EXT}")
39-
set(DAEMON_BUILDINFO_${kind}_PATH "${DAEMON_BUILDINFO_DIR}/${DAEMON_BUILDINFO_${kind}_NAME}")
40-
41-
daemon_write_generated("${DAEMON_BUILDINFO_${kind}_PATH}" "${DAEMON_BUILDINFO_${kind}}")
42-
list(APPEND BUILDINFOLIST "${DAEMON_GENERATED_FILE}")
43-
endforeach()
44-
endmacro()
1+
# TODO(0.56): NUKE this file.
2+
include(DaemonGeneratedSource)

cmake/DaemonGeneratedSource.cmake

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
set(DAEMON_GENERATED_SUBDIR "GeneratedSource")
2+
set(DAEMON_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/${DAEMON_GENERATED_SUBDIR}")
3+
4+
set(DAEMON_BUILDINFO_SUBDIR "DaemonBuildInfo")
5+
set(DAEMON_EMBEDDED_SUBDIR "DaemonEmbedded")
6+
7+
set(DAEMON_BUILDINFO_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_BUILDINFO_SUBDIR}")
8+
set(DAEMON_EMBEDDED_DIR "${DAEMON_GENERATED_DIR}/${DAEMON_EMBEDDED_SUBDIR}")
9+
10+
file(MAKE_DIRECTORY "${DAEMON_GENERATED_DIR}")
11+
include_directories("${DAEMON_GENERATED_DIR}")
12+
13+
file(MAKE_DIRECTORY "${DAEMON_BUILDINFO_DIR}")
14+
file(MAKE_DIRECTORY "${DAEMON_EMBEDDED_DIR}")
15+
16+
set(DAEMON_GENERATED_HEADER "// Automatically generated, do not modify!\n")
17+
set(DAEMON_GENERATED_CPP_EXT ".cpp")
18+
set(DAEMON_GENERATED_H_EXT ".h")
19+
20+
set(BUILDINFOLIST)
21+
22+
foreach(kind CPP H)
23+
set(DAEMON_BUILDINFO_${kind}_TEXT "${DAEMON_GENERATED_HEADER}")
24+
endforeach()
25+
26+
macro(daemon_add_buildinfo TYPE NAME VALUE)
27+
string(APPEND DAEMON_BUILDINFO_CPP_TEXT "const ${TYPE} ${NAME}=${VALUE};\n")
28+
string(APPEND DAEMON_BUILDINFO_H_TEXT "extern const ${TYPE} ${NAME};\n")
29+
endmacro()
30+
31+
macro(daemon_write_generated GENERATED_PATH GENERATED_CONTENT)
32+
set(DAEMON_GENERATED_FILE ${DAEMON_GENERATED_DIR}/${GENERATED_PATH})
33+
34+
if (EXISTS "${DAEMON_GENERATED_FILE}")
35+
file(READ "${DAEMON_GENERATED_FILE}" GENERATED_CONTENT_READ)
36+
endif()
37+
38+
if (NOT "${GENERATED_CONTENT}" STREQUAL "${GENERATED_CONTENT_READ}")
39+
message(STATUS "Generating ${GENERATED_PATH}")
40+
file(WRITE "${DAEMON_GENERATED_FILE}" "${GENERATED_CONTENT}")
41+
endif()
42+
endmacro()
43+
44+
macro(daemon_write_buildinfo NAME)
45+
foreach(kind CPP H)
46+
set(DAEMON_BUILDINFO_${kind}_NAME "${NAME}${DAEMON_GENERATED_${kind}_EXT}")
47+
set(DAEMON_BUILDINFO_${kind}_PATH "${DAEMON_BUILDINFO_SUBDIR}/${DAEMON_BUILDINFO_${kind}_NAME}")
48+
49+
daemon_write_generated("${DAEMON_BUILDINFO_${kind}_PATH}" "${DAEMON_BUILDINFO_${kind}_TEXT}")
50+
list(APPEND BUILDINFOLIST "${DAEMON_GENERATED_FILE}")
51+
endforeach()
52+
endmacro()
53+
54+
macro(daemon_embed_files BASENAME SLUG TARGETNAME)
55+
set(EMBED_SOURCE_DIR "${SLUG}_EMBED_DIR")
56+
set(EMBED_SOURCE_LIST "${SLUG}_EMBED_LIST")
57+
58+
set(EMBED_SUBDIR "${DAEMON_EMBEDDED_SUBDIR}/${BASENAME}")
59+
set(EMBED_DIR "${DAEMON_GENERATED_DIR}/${EMBED_SUBDIR}")
60+
61+
foreach(kind CPP H)
62+
set(EMBED_${kind}_FILE "${DAEMON_EMBEDDED_SUBDIR}/${BASENAME}${DAEMON_GENERATED_${kind}_EXT}")
63+
set(EMBED_${kind}_TEXT "${DAEMON_GENERATED_HEADER}")
64+
endforeach()
65+
66+
string(APPEND EMBED_CPP_TEXT "#include \"${EMBED_H_FILE}\"\n\n")
67+
68+
set(EMBED_MAP_TEXT "")
69+
70+
foreach(filename ${${EMBED_SOURCE_LIST}})
71+
string(REPLACE "/" "_" filename_symbol "${filename}")
72+
string(REPLACE "." "_" filename_symbol "${filename_symbol}")
73+
74+
set(inpath "${${EMBED_SOURCE_DIR}}/${filename}")
75+
set(outpath "${EMBED_DIR}/${filename_symbol}${DAEMON_GENERATED_H_EXT}")
76+
77+
add_custom_command(
78+
OUTPUT ${outpath}
79+
COMMAND ${CMAKE_COMMAND}
80+
"-DINPUT_FILE=${inpath}"
81+
"-DOUTPUT_FILE=${outpath}"
82+
"-DVARIABLE_NAME=${filename_symbol}"
83+
-P ${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake
84+
MAIN_DEPENDENCY ${inpath}
85+
)
86+
87+
set_property(TARGET "${TARGETNAME}" APPEND PROPERTY SOURCES ${outpath})
88+
89+
string(APPEND EMBED_CPP_TEXT
90+
"#include \"${BASENAME}/${filename_symbol}.h\"\n")
91+
string(APPEND EMBED_MAP_TEXT
92+
"\t{ \"${filename}\", "
93+
"std::string(reinterpret_cast<const char *>( ${filename_symbol} ), "
94+
"sizeof( ${filename_symbol} )) },\n")
95+
endforeach()
96+
97+
string(APPEND EMBED_CPP_TEXT
98+
"\n"
99+
"namespace ${BASENAME} {\n"
100+
"const std::unordered_map<std::string, std::string> FileMap\n{\n"
101+
"${EMBED_MAP_TEXT}\n"
102+
"};\n"
103+
"\n"
104+
"bool HasFile(Str::StringRef filename)\n"
105+
"{\n"
106+
"\treturn FileMap.find(filename) != FileMap.end();\n"
107+
"}\n"
108+
"\n"
109+
"const std::string ReadFile(Str::StringRef filename)\n"
110+
"{\n"
111+
" auto it = FileMap.find(filename);\n"
112+
" if (it != FileMap.end())\n"
113+
" return it->second;\n"
114+
" return \"\";\n"
115+
"}\n"
116+
"}"
117+
)
118+
119+
string(APPEND EMBED_H_TEXT
120+
"#include \"common/Common.h\"\n"
121+
"\n"
122+
"namespace ${BASENAME} {\n"
123+
"extern const std::unordered_map<std::string, std::string> FileMap;\n"
124+
"bool HasFile(Str::StringRef filename);\n"
125+
"const std::string ReadFile(Str::StringRef filename);\n"
126+
"};\n"
127+
)
128+
129+
foreach(kind CPP H)
130+
daemon_write_generated("${EMBED_${kind}_FILE}" "${EMBED_${kind}_TEXT}")
131+
endforeach()
132+
endmacro()

cmake/EmbedText.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@
44

55
# Inspired by https://stackoverflow.com/questions/11813271/embed-resources-eg-shader-code-images-into-executable-library-with-cmake/27206982#27206982
66
file(READ ${INPUT_FILE} contents HEX)
7-
string(REGEX REPLACE "(0d)?(..)" "0x\\2," contents ${contents}) # Strip \r for consistency
7+
string(REGEX REPLACE "(..)" "0x\\1," contents ${contents})
88
file(WRITE ${OUTPUT_FILE} "const unsigned char ${VARIABLE_NAME}[] = {${contents}};\n")

src.cmake

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -86,68 +86,68 @@ else()
8686
include (${ENGINE_DIR}/renderer/src.cmake)
8787
endif()
8888

89-
set(GLSLSOURCELIST
89+
set(GLSL_EMBED_DIR "${ENGINE_DIR}/renderer/glsl_source")
90+
set(GLSL_EMBED_LIST
9091
# Common shader libraries
91-
${ENGINE_DIR}/renderer/glsl_source/common.glsl
92-
${ENGINE_DIR}/renderer/glsl_source/common_cp.glsl
93-
${ENGINE_DIR}/renderer/glsl_source/fogEquation_fp.glsl
94-
${ENGINE_DIR}/renderer/glsl_source/shaderProfiler_vp.glsl
95-
${ENGINE_DIR}/renderer/glsl_source/shaderProfiler_fp.glsl
96-
92+
common.glsl
93+
common_cp.glsl
94+
fogEquation_fp.glsl
95+
shaderProfiler_vp.glsl
96+
shaderProfiler_fp.glsl
9797
# Material system shaders
98-
${ENGINE_DIR}/renderer/glsl_source/material_cp.glsl
99-
${ENGINE_DIR}/renderer/glsl_source/material_vp.glsl
100-
${ENGINE_DIR}/renderer/glsl_source/material_fp.glsl
101-
${ENGINE_DIR}/renderer/glsl_source/clearSurfaces_cp.glsl
102-
${ENGINE_DIR}/renderer/glsl_source/cull_cp.glsl
103-
${ENGINE_DIR}/renderer/glsl_source/depthReduction_cp.glsl
104-
${ENGINE_DIR}/renderer/glsl_source/processSurfaces_cp.glsl
98+
material_cp.glsl
99+
material_vp.glsl
100+
material_fp.glsl
101+
clearSurfaces_cp.glsl
102+
cull_cp.glsl
103+
depthReduction_cp.glsl
104+
processSurfaces_cp.glsl
105105

106106
# Screen-space shaders
107-
${ENGINE_DIR}/renderer/glsl_source/screenSpace_vp.glsl
108-
${ENGINE_DIR}/renderer/glsl_source/blur_fp.glsl
109-
${ENGINE_DIR}/renderer/glsl_source/cameraEffects_fp.glsl
110-
${ENGINE_DIR}/renderer/glsl_source/contrast_fp.glsl
111-
${ENGINE_DIR}/renderer/glsl_source/fogGlobal_fp.glsl
112-
${ENGINE_DIR}/renderer/glsl_source/fxaa_fp.glsl
113-
${ENGINE_DIR}/renderer/glsl_source/fxaa3_11_fp.glsl
114-
${ENGINE_DIR}/renderer/glsl_source/motionblur_fp.glsl
115-
${ENGINE_DIR}/renderer/glsl_source/ssao_fp.glsl
107+
screenSpace_vp.glsl
108+
blur_fp.glsl
109+
cameraEffects_fp.glsl
110+
contrast_fp.glsl
111+
fogGlobal_fp.glsl
112+
fxaa_fp.glsl
113+
fxaa3_11_fp.glsl
114+
motionblur_fp.glsl
115+
ssao_fp.glsl
116116

117117
# Lighting shaders
118-
${ENGINE_DIR}/renderer/glsl_source/depthtile1_vp.glsl
119-
${ENGINE_DIR}/renderer/glsl_source/depthtile1_fp.glsl
120-
${ENGINE_DIR}/renderer/glsl_source/depthtile2_fp.glsl
121-
${ENGINE_DIR}/renderer/glsl_source/lighttile_vp.glsl
122-
${ENGINE_DIR}/renderer/glsl_source/lighttile_fp.glsl
123-
${ENGINE_DIR}/renderer/glsl_source/computeLight_fp.glsl
124-
${ENGINE_DIR}/renderer/glsl_source/reliefMapping_fp.glsl
118+
depthtile1_vp.glsl
119+
depthtile1_fp.glsl
120+
depthtile2_fp.glsl
121+
lighttile_vp.glsl
122+
lighttile_fp.glsl
123+
computeLight_fp.glsl
124+
reliefMapping_fp.glsl
125125

126126
# Common vertex shader libraries
127-
${ENGINE_DIR}/renderer/glsl_source/deformVertexes_vp.glsl
128-
${ENGINE_DIR}/renderer/glsl_source/vertexAnimation_vp.glsl
129-
${ENGINE_DIR}/renderer/glsl_source/vertexSimple_vp.glsl
130-
${ENGINE_DIR}/renderer/glsl_source/vertexSkinning_vp.glsl
127+
deformVertexes_vp.glsl
128+
vertexAnimation_vp.glsl
129+
vertexSimple_vp.glsl
130+
vertexSkinning_vp.glsl
131131

132132
# Regular shaders
133-
${ENGINE_DIR}/renderer/glsl_source/fogQuake3_vp.glsl
134-
${ENGINE_DIR}/renderer/glsl_source/fogQuake3_fp.glsl
135-
${ENGINE_DIR}/renderer/glsl_source/generic_vp.glsl
136-
${ENGINE_DIR}/renderer/glsl_source/generic_fp.glsl
137-
${ENGINE_DIR}/renderer/glsl_source/heatHaze_vp.glsl
138-
${ENGINE_DIR}/renderer/glsl_source/heatHaze_fp.glsl
139-
${ENGINE_DIR}/renderer/glsl_source/lightMapping_vp.glsl
140-
${ENGINE_DIR}/renderer/glsl_source/lightMapping_fp.glsl
141-
${ENGINE_DIR}/renderer/glsl_source/liquid_vp.glsl
142-
${ENGINE_DIR}/renderer/glsl_source/liquid_fp.glsl
143-
${ENGINE_DIR}/renderer/glsl_source/portal_vp.glsl
144-
${ENGINE_DIR}/renderer/glsl_source/portal_fp.glsl
145-
${ENGINE_DIR}/renderer/glsl_source/reflection_CB_vp.glsl
146-
${ENGINE_DIR}/renderer/glsl_source/reflection_CB_fp.glsl
147-
${ENGINE_DIR}/renderer/glsl_source/screen_vp.glsl
148-
${ENGINE_DIR}/renderer/glsl_source/screen_fp.glsl
149-
${ENGINE_DIR}/renderer/glsl_source/skybox_vp.glsl
150-
${ENGINE_DIR}/renderer/glsl_source/skybox_fp.glsl
133+
fogQuake3_vp.glsl
134+
fogQuake3_fp.glsl
135+
generic_vp.glsl
136+
generic_fp.glsl
137+
heatHaze_vp.glsl
138+
heatHaze_fp.glsl
139+
lightMapping_vp.glsl
140+
lightMapping_fp.glsl
141+
liquid_vp.glsl
142+
liquid_fp.glsl
143+
portal_vp.glsl
144+
portal_fp.glsl
145+
reflection_CB_vp.glsl
146+
reflection_CB_fp.glsl
147+
screen_vp.glsl
148+
screen_fp.glsl
149+
skybox_vp.glsl
150+
skybox_fp.glsl
151151
)
152152

153153
set(SERVERLIST

0 commit comments

Comments
 (0)