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