|
| 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 FORMAT 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 | + "-DFILE_FORMAT=${FORMAT}" |
| 83 | + "-DVARIABLE_NAME=${filename_symbol}" |
| 84 | + -P "${CMAKE_CURRENT_SOURCE_DIR}/cmake/EmbedText.cmake" |
| 85 | + MAIN_DEPENDENCY ${inpath} |
| 86 | + ) |
| 87 | + |
| 88 | + set_property(TARGET "${TARGETNAME}" APPEND PROPERTY SOURCES ${outpath}) |
| 89 | + |
| 90 | + string(APPEND EMBED_CPP_TEXT |
| 91 | + "#include \"${BASENAME}/${filename_symbol}.h\"\n") |
| 92 | + string(APPEND EMBED_MAP_TEXT |
| 93 | + "\t{ \"${filename}\", " |
| 94 | + "std::string(reinterpret_cast<const char *>( ${filename_symbol} ), " |
| 95 | + "sizeof( ${filename_symbol} )) },\n") |
| 96 | + endforeach() |
| 97 | + |
| 98 | + string(APPEND EMBED_CPP_TEXT |
| 99 | + "\n" |
| 100 | + "namespace ${BASENAME} {\n" |
| 101 | + "const std::unordered_map<std::string, std::string> FileMap\n{\n" |
| 102 | + "${EMBED_MAP_TEXT}\n" |
| 103 | + "};\n" |
| 104 | + "\n" |
| 105 | + "bool HasFile(Str::StringRef filename)\n" |
| 106 | + "{\n" |
| 107 | + "\treturn FileMap.find(filename) != FileMap.end();\n" |
| 108 | + "}\n" |
| 109 | + "\n" |
| 110 | + "const std::string ReadFile(Str::StringRef filename)\n" |
| 111 | + "{\n" |
| 112 | + " auto it = FileMap.find(filename);\n" |
| 113 | + " if (it != FileMap.end())\n" |
| 114 | + " return it->second;\n" |
| 115 | + " return \"\";\n" |
| 116 | + "}\n" |
| 117 | + "}" |
| 118 | + ) |
| 119 | + |
| 120 | + string(APPEND EMBED_H_TEXT |
| 121 | + "#include \"common/Common.h\"\n" |
| 122 | + "\n" |
| 123 | + "namespace ${BASENAME} {\n" |
| 124 | + "extern const std::unordered_map<std::string, std::string> FileMap;\n" |
| 125 | + "bool HasFile(Str::StringRef filename);\n" |
| 126 | + "const std::string ReadFile(Str::StringRef filename);\n" |
| 127 | + "};\n" |
| 128 | + ) |
| 129 | + |
| 130 | + foreach(kind CPP H) |
| 131 | + daemon_write_generated("${EMBED_${kind}_FILE}" "${EMBED_${kind}_TEXT}") |
| 132 | + endforeach() |
| 133 | +endmacro() |
0 commit comments