1+ # ===========================================================================
2+ #
3+ # Daemon BSD Source Code
4+ # Copyright (c) 2025 Daemon Developers
5+ # All rights reserved.
6+ #
7+ # This file is part of the Daemon BSD Source Code (Daemon Source Code).
8+ #
9+ # Redistribution and use in source and binary forms, with or without
10+ # modification, are permitted provided that the following conditions are met:
11+ # * Redistributions of source code must retain the above copyright
12+ # notice, this list of conditions and the following disclaimer.
13+ # * Redistributions in binary form must reproduce the above copyright
14+ # notice, this list of conditions and the following disclaimer in the
15+ # documentation and/or other materials provided with the distribution.
16+ # * Neither the name of the Daemon developers nor the
17+ # names of its contributors may be used to endorse or promote products
18+ # derived from this software without specific prior written permission.
19+ #
20+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
21+ # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
22+ # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23+ # DISCLAIMED. IN NO EVENT SHALL DAEMON DEVELOPERS BE LIABLE FOR ANY
24+ # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25+ # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
26+ # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
27+ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
29+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+ #
31+ # ===========================================================================
32+
33+ function (GenerateEmbedFile srcPath dstPath filename_symbol format target mode srcList headerList baseName filename)
34+ add_custom_command (
35+ OUTPUT ${dstPath}
36+ COMMAND ${CMAKE_COMMAND}
37+ "-DINPUT_FILE=${srcPath} "
38+ "-DOUTPUT_FILE=${dstPath} "
39+ "-DFILE_FORMAT=${format} "
40+ "-DVARIABLE_NAME=${filename_symbol} "
41+ "-DEMBED_MODE=${mode} "
42+ -P "${CMAKE_CURRENT_SOURCE_DIR} /cmake/EmbedText.cmake"
43+ MAIN_DEPENDENCY ${srcPath}
44+ )
45+
46+ target_sources (${target} PRIVATE ${dstPath} )
47+
48+ string (APPEND srcList
49+ "#include \" ${baseName} /${filename_symbol} .h\"\n " )
50+ string (APPEND headerList
51+ "\t { \" ${filename} \" , "
52+ "std::string(reinterpret_cast<const char *>( ${filename_symbol} ), "
53+ "sizeof( ${filename_symbol} )) },\n " )
54+ endfunction ()
55+
56+ function (GenerateEmbedFileH srcPaths dstPath format target )
57+ set (first TRUE )
58+ foreach (srcPath IN LISTS srcPaths)
59+ get_filename_component (filename "${srcPath} " NAME_WE )
60+
61+ if (first)
62+ set (mode WRITE)
63+ set (first FALSE )
64+ else ()
65+ set (mode APPEND )
66+ endif ()
67+
68+ set (cmd ${CMAKE_COMMAND}
69+ "-DINPUT_FILE=${srcPath} "
70+ "-DOUTPUT_FILE=${dstPath} "
71+ "-DFILE_FORMAT=${format} "
72+ "-DVARIABLE_NAME=${filename} "
73+ "-DEMBED_MODE=${mode} "
74+ -P "${CMAKE_CURRENT_SOURCE_DIR} /cmake/EmbedText.cmake" )
75+ list (APPEND cmdList ${cmd} )
76+ endforeach ()
77+
78+ add_custom_command (
79+ OUTPUT ${dstPath}
80+ COMMAND ${cmdList}
81+ MAIN_DEPENDENCY ${srcPath}
82+ )
83+
84+ target_sources (${target} PRIVATE ${dstPath} )
85+ endfunction ()
86+
87+ macro (daemon_embed_files BASENAME SLUG FORMAT TARGETNAME)
88+ set (EMBED_SOURCE_DIR "${SLUG} _EMBED_DIR" )
89+ set (EMBED_SOURCE_LIST "${SLUG} _EMBED_LIST" )
90+
91+ set (EMBED_SUBDIR "${DAEMON_EMBEDDED_SUBDIR} /${BASENAME} " )
92+ set (EMBED_DIR "${DAEMON_GENERATED_DIR} /${EMBED_SUBDIR} " )
93+
94+ foreach (kind CPP H)
95+ set (EMBED_${kind} _FILE "${DAEMON_EMBEDDED_SUBDIR} /${BASENAME} ${DAEMON_GENERATED_${kind} _EXT}" )
96+ set (EMBED_${kind} _TEXT "${DAEMON_GENERATED_HEADER} " )
97+ endforeach ()
98+
99+ string (APPEND EMBED_CPP_TEXT "#include \" ${EMBED_H_FILE} \"\n\n " )
100+
101+ set (EMBED_MAP_TEXT "" )
102+
103+ foreach (filename ${${EMBED_SOURCE_LIST} })
104+ string (REPLACE "/" "_" filename_symbol "${filename} " )
105+ string (REPLACE "." "_" filename_symbol "${filename_symbol} " )
106+
107+ set (inpath "${${EMBED_SOURCE_DIR} }/${filename} " )
108+ set (outpath "${EMBED_DIR} /${filename_symbol}${DAEMON_GENERATED_H_EXT} " )
109+
110+ GenerateEmbedFile(${inpath} ${outpath} ${filename_symbol} ${FORMAT} ${TARGETNAME} "WRITE" ${EMBED_CPP_TEXT} ${EMBED_MAP_TEXT} TRUE ${BASENAME} ${filename} )
111+ endforeach ()
112+
113+ string (APPEND EMBED_CPP_TEXT
114+ "\n "
115+ "namespace ${BASENAME} {\n "
116+ "const std::unordered_map<std::string, std::string> FileMap\n {\n "
117+ "${EMBED_MAP_TEXT} \n "
118+ "};\n "
119+ "\n "
120+ "bool HasFile(Str::StringRef filename)\n "
121+ "{\n "
122+ "\t return FileMap.find(filename) != FileMap.end();\n "
123+ "}\n "
124+ "\n "
125+ "const std::string ReadFile(Str::StringRef filename)\n "
126+ "{\n "
127+ " auto it = FileMap.find(filename);\n "
128+ " if (it != FileMap.end())\n "
129+ " return it->second;\n "
130+ " return \"\" ;\n "
131+ "}\n "
132+ "}"
133+ )
134+
135+ string (APPEND EMBED_H_TEXT
136+ "#include \" common/Common.h\"\n "
137+ "\n "
138+ "namespace ${BASENAME} {\n "
139+ "extern const std::unordered_map<std::string, std::string> FileMap;\n "
140+ "bool HasFile(Str::StringRef filename);\n "
141+ "const std::string ReadFile(Str::StringRef filename);\n "
142+ "};\n "
143+ )
144+
145+ foreach (kind CPP H)
146+ daemon_write_generated("${EMBED_${kind} _FILE}" "${EMBED_${kind} _TEXT}" )
147+ endforeach ()
148+ endmacro ()
0 commit comments