58 lines
2.2 KiB
CMake
58 lines
2.2 KiB
CMake
if(NOT DEFINED TEMPLATE_SOURCE_DIR OR NOT DEFINED TEMPLATE_OUTPUT_DIR)
|
|
message(FATAL_ERROR "embed_templates.cmake requires -DTEMPLATE_SOURCE_DIR and -DTEMPLATE_OUTPUT_DIR")
|
|
endif()
|
|
|
|
file(GLOB_RECURSE INJA_TEMPLATE_FILES "${TEMPLATE_SOURCE_DIR}/*.inja")
|
|
|
|
set(FORBIDDEN_DELIMITER ")__TMPL__\"")
|
|
|
|
set(EMBEDDED_INCLUDES "")
|
|
set(EMBEDDED_MAP_ENTRIES "")
|
|
|
|
foreach(TEMPLATE_FILE ${INJA_TEMPLATE_FILES})
|
|
file(READ "${TEMPLATE_FILE}" TEMPLATE_CONTENT)
|
|
|
|
string(FIND "${TEMPLATE_CONTENT}" "${FORBIDDEN_DELIMITER}" DELIMITER_POS)
|
|
if(NOT DELIMITER_POS EQUAL -1)
|
|
message(FATAL_ERROR
|
|
"Template file contains forbidden raw string delimiter ')__TMPL__\"':\n"
|
|
" ${TEMPLATE_FILE}\n"
|
|
"Please remove or rename this sequence in the template.")
|
|
endif()
|
|
|
|
file(RELATIVE_PATH REL_PATH "${TEMPLATE_SOURCE_DIR}" "${TEMPLATE_FILE}")
|
|
string(REGEX REPLACE "\\.inja$" "" CANONICAL_ID "${REL_PATH}")
|
|
|
|
string(REPLACE "/" "_" VAR_NAME "${CANONICAL_ID}")
|
|
string(REPLACE "-" "_" VAR_NAME "${VAR_NAME}")
|
|
|
|
set(HEADER_FILE "${TEMPLATE_OUTPUT_DIR}/${VAR_NAME}.inja.h")
|
|
file(WRITE "${HEADER_FILE}"
|
|
"// Auto-generated from resources/templates/${REL_PATH} -- DO NOT EDIT\n"
|
|
"#pragma once\n"
|
|
"#include <string_view>\n\n"
|
|
"namespace rex::codegen::embedded {\n"
|
|
"inline constexpr std::string_view ${VAR_NAME} = R\"__TMPL__(${TEMPLATE_CONTENT})__TMPL__\";\n"
|
|
"} // namespace rex::codegen::embedded\n"
|
|
)
|
|
|
|
string(APPEND EMBEDDED_INCLUDES "#include \"${VAR_NAME}.inja.h\"\n")
|
|
string(APPEND EMBEDDED_MAP_ENTRIES " {\"${CANONICAL_ID}\", embedded::${VAR_NAME}},\n")
|
|
endforeach()
|
|
|
|
file(WRITE "${TEMPLATE_OUTPUT_DIR}/embedded_templates.h"
|
|
"// Auto-generated master template index -- DO NOT EDIT\n"
|
|
"#pragma once\n\n"
|
|
"#include <string_view>\n"
|
|
"#include <unordered_map>\n"
|
|
"#include <string>\n\n"
|
|
"${EMBEDDED_INCLUDES}\n"
|
|
"namespace rex::codegen {\n\n"
|
|
"inline const std::unordered_map<std::string, std::string_view>& embeddedTemplates() {\n"
|
|
" static const std::unordered_map<std::string, std::string_view> map = {\n"
|
|
"${EMBEDDED_MAP_ENTRIES}"
|
|
" };\n"
|
|
" return map;\n"
|
|
"}\n\n"
|
|
"} // namespace rex::codegen\n"
|
|
)
|