# This macro is for internal use only # # It is used in the function trailbook_ev_generate_rst_from_manifest(). # It adds an custom command to generate the RST file from the manifest file macro(_trailbook_ev_generate_rst_from_manifest_generate_command) string(REPLACE "/manifest.yaml" ".rst" GENERATED_FILE "${TRAILBOOK_EV_REFERENCE_MODULES_DIRECTORY}/${RELATIVE_PATH_MANIFEST}") get_filename_component(RELATIVE_PATH ${RELATIVE_PATH_MANIFEST} DIRECTORY) set(GENERATED_FILE "${TRAILBOOK_EV_REFERENCE_MODULES_DIRECTORY}/${RELATIVE_PATH}/autogenerated.rst") get_filename_component(GENERATED_PATH ${GENERATED_FILE} DIRECTORY) set(TEMPLATES_DIRECTORY "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/templates") if(EXISTS "${MODULE_DIR}/docs/") set(HANDWRITTEN_MODULE_DOC "--module-handwritten-doc" "index.inc") endif() add_custom_command( OUTPUT ${GENERATED_FILE} DEPENDS ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/process_template.py ${args_MANIFEST_FILE} ${TEMPLATES_DIRECTORY}/module.rst.jinja ${TEMPLATES_DIRECTORY}/macros.jinja trailbook_${args_TRAILBOOK_NAME}_stage_prepare_sphinx_source_after ${DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER} COMMENT "Generating RST file ${GENERATED_FILE} from manifest ${args_MANIFEST_FILE}" COMMAND ${CMAKE_COMMAND} -E make_directory "${GENERATED_PATH}" COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/process_template.py --template-dir "${TEMPLATES_DIRECTORY}" --template-file "${TEMPLATES_DIRECTORY}/module.rst.jinja" --name "${MODULE_NAME}" --data-file "${args_MANIFEST_FILE}" --target-file "${GENERATED_FILE}" ${HANDWRITTEN_MODULE_DOC} ) set(TOP_LEVEL_MODULE_DIRECTORY "${CMAKE_SOURCE_DIR}") get_filename_component(CURRENT_RELATIVE_FOLDER_TMP "${RELATIVE_PATH_MANIFEST}" DIRECTORY) get_filename_component(CURRENT_RELATIVE_FOLDER "modules/${CURRENT_RELATIVE_FOLDER_TMP}" DIRECTORY) while(NOT CURRENT_RELATIVE_FOLDER STREQUAL "modules") set(CURRENT_INDEX_DIRECTORY_CONCAT "${CMAKE_SOURCE_DIR}/${CURRENT_RELATIVE_FOLDER}") get_filename_component(CURRENT_INDEX_DIRECTORY "${CURRENT_INDEX_DIRECTORY_CONCAT}" ABSOLUTE) set(CURRENT_DEST_DIRECTORY_CONCAT "${TRAILBOOK_EV_REFERENCE_DIRECTORY}/${CURRENT_RELATIVE_FOLDER}") get_filename_component(CURRENT_DEST_DIRECTORY "${CURRENT_DEST_DIRECTORY_CONCAT}" ABSOLUTE) set(INDEX_FILE "${CURRENT_DEST_DIRECTORY}/autogenerated.rst") get_filename_component(CURRENT_FOLDER_NAME "${CURRENT_INDEX_DIRECTORY}" NAME) string(REPLACE "/" "_" INDEX_TARGET_SUFFIX "${CURRENT_RELATIVE_FOLDER}") get_property(is_create_index_cmd_added DIRECTORY "${CURRENT_INDEX_DIRECTORY}" PROPERTY did_add_create_index_cmd SET) if (NOT ${is_create_index_cmd_added}) message(VERBOSE "ADDING DEFINITION OF add_custom_command FOR THE INDEX FILE OF ${CURRENT_DEST_DIRECTORY} FOR ${INDEX_FILE}") set(INDEX_TEMPLATE_FILE "${TEMPLATES_DIRECTORY}/module_ref_index.rst.jinja") set(CUSTOM_TEMPLATE_SUBSTITUTION_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/DOCS_process_index_template_${INDEX_TARGET_SUFFIX}.py") configure_file( "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/process_index_template.py.in" "${CUSTOM_TEMPLATE_SUBSTITUTION_SCRIPT}" @ONLY ) add_custom_command( OUTPUT "${INDEX_FILE}" COMMAND ${CMAKE_COMMAND} -E make_directory "${CURRENT_DEST_DIRECTORY}" COMMAND ${Python3_EXECUTABLE} "${CUSTOM_TEMPLATE_SUBSTITUTION_SCRIPT}" DEPENDS "${INDEX_TEMPLATE_FILE}" "${CUSTOM_TEMPLATE_SUBSTITUTION_SCRIPT}" trailbook_${args_TRAILBOOK_NAME}_stage_prepare_sphinx_source_after ${DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER} COMMENT "Rendering Jinja2 template for ${INDEX_TARGET_SUFFIX}" VERBATIM ) set_property( DIRECTORY "${CURRENT_INDEX_DIRECTORY}" PROPERTY did_add_create_index_cmd "TRUE" ) add_custom_target( trailbook_${args_TRAILBOOK_NAME}_generate_reference_index_for_module_${INDEX_TARGET_SUFFIX} DEPENDS "${INDEX_FILE}" trailbook_${args_TRAILBOOK_NAME}_stage_prepare_sphinx_source_after ${DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER} COMMENT "Target to generate RST file ${INDEX_FILE}" ) set_property( TARGET trailbook_${args_TRAILBOOK_NAME} APPEND PROPERTY ADDITIONAL_DEPS_STAGE_BUILD_SPHINX_BEFORE "${INDEX_FILE}" trailbook_${args_TRAILBOOK_NAME}_generate_reference_index_for_module_${INDEX_TARGET_SUFFIX} ) else() message(VERBOSE "SKIPPING DEFINITION OF add_custom_command FOR THE INDEX FILE OF ${CURRENT_FOLDER_NAME}") endif() # go up one level get_filename_component(CURRENT_RELATIVE_FOLDER "${CURRENT_RELATIVE_FOLDER}" DIRECTORY) endwhile() endmacro() # This function generates an RST file from a manifest definition file. # It takes the following arguments: # TRAILBOOK_NAME (required): The name of the trailbook. # MANIFEST_FILE (required): The absolute path to the manifest # definition file. # Usage: # trailbook_ev_generate_rst_from_manifest( # TRAILBOOK_NAME # MANIFEST_FILE # ) function(trailbook_ev_generate_rst_from_manifest) set(options) set(one_value_args TRAILBOOK_NAME MANIFEST_FILE ) set(multi_value_args) cmake_parse_arguments( "args" "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN} ) # Parameter TRAILBOOK_NAME # - is required # - there should be a target named trailbook_ if(NOT args_TRAILBOOK_NAME) message(FATAL_ERROR "trailbook_ext_ev_generate_rst_from_manifest: TRAILBOOK_NAME argument is required") endif() if(NOT TARGET trailbook_${args_TRAILBOOK_NAME}) message( FATAL_ERROR "trailbook_ext_ev_generate_rst_from_manifest: No target named trailbook_${args_TRAILBOOK_NAME} found." " Did you forget to call add_trailbook() first?" ) endif() # Parameter MANIFEST_FILE # - is required # - must be a absolute path # - must exist if(NOT args_MANIFEST_FILE) message(FATAL_ERROR "trailbook_ext_ev_generate_rst_from_manifest: MANIFEST_FILE argument is required") endif() if(NOT IS_ABSOLUTE "${args_MANIFEST_FILE}") message(FATAL_ERROR "trailbook_ext_ev_generate_rst_from_manifest: MANIFEST_FILE must be an absolute path") endif() if(NOT EXISTS "${args_MANIFEST_FILE}") message(FATAL_ERROR "trailbook_ext_ev_generate_rst_from_manifest: MANIFEST_FILE must exist") endif() get_target_property( TRAILBOOK_INSTANCE_SOURCE_DIRECTORY trailbook_${args_TRAILBOOK_NAME} TRAILBOOK_INSTANCE_SOURCE_DIRECTORY ) get_target_property( DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER trailbook_${args_TRAILBOOK_NAME} DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER ) set(TRAILBOOK_EV_REFERENCE_DIRECTORY "${TRAILBOOK_INSTANCE_SOURCE_DIRECTORY}/reference") set(TRAILBOOK_EV_REFERENCE_MODULES_DIRECTORY "${TRAILBOOK_EV_REFERENCE_DIRECTORY}/modules") get_filename_component(MODULE_DIR ${args_MANIFEST_FILE} DIRECTORY) get_filename_component(MODULE_NAME ${MODULE_DIR} NAME_WE) file(RELATIVE_PATH RELATIVE_PATH_MANIFEST "${CMAKE_SOURCE_DIR}/modules" "${args_MANIFEST_FILE}" ) _trailbook_ev_generate_rst_from_manifest_generate_command() add_custom_target( trailbook_${args_TRAILBOOK_NAME}_generate_rst_from_manifest_${MODULE_NAME} DEPENDS ${GENERATED_FILE} trailbook_${args_TRAILBOOK_NAME}_stage_prepare_sphinx_source_after ${DEPS_STAGE_PREPARE_SPHINX_SOURCE_AFTER} COMMENT "Target to generate RST file ${GENERATED_FILE} from manifest definition ${args_MANIFEST_FILE}" ) set_property( TARGET trailbook_${args_TRAILBOOK_NAME} APPEND PROPERTY ADDITIONAL_DEPS_STAGE_BUILD_SPHINX_BEFORE ${GENERATED_FILE} trailbook_${args_TRAILBOOK_NAME}_generate_rst_from_manifest_${MODULE_NAME} ) endfunction()