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 \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 \n" "#include \n" "#include \n\n" "${EMBEDDED_INCLUDES}\n" "namespace rex::codegen {\n\n" "inline const std::unordered_map& embeddedTemplates() {\n" " static const std::unordered_map map = {\n" "${EMBEDDED_MAP_ENTRIES}" " };\n" " return map;\n" "}\n\n" "} // namespace rex::codegen\n" )