if(NOT DEFINED QMSETUP_MODULES_DIR) include("${CMAKE_CURRENT_LIST_DIR}/../QMSetupAPI.cmake") endif() include_guard(DIRECTORY) #[[ Add Doxygen documentation generating target. qm_setup_doxygen( [NAME ] [VERSION ] [DESCRIPTION ] [LOGO ] [MDFILE ] [OUTPUT_DIR ] [INSTALL_DIR ] [TAGFILES ...] [GENERATE_TAGFILE ] [INPUT ...] [INCLUDE_DIRECTORIES ...] [COMPILE_DEFINITIONS ...] [TARGETS ...] [ENVIRONMENT_EXPORTS ...] [NO_EXPAND_MACROS ...] [DEPENDS ...] ) ]] # function(qm_setup_doxygen _target) set(options) set(oneValueArgs NAME VERSION DESCRIPTION LOGO MDFILE OUTPUT_DIR INSTALL_DIR GENERATE_TAGFILE) set(multiValueArgs INPUT TAGFILES INCLUDE_DIRECTORIES COMPILE_DEFINITIONS TARGETS ENVIRONMENT_EXPORTS NO_EXPAND_MACROS DEPENDS ) cmake_parse_arguments(FUNC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT DOXYGEN_EXECUTABLE) message(FATAL_ERROR "qm_setup_doxygen: DOXYGEN_EXECUTABLE not defined. Add find_package(Doxygen) to CMake to enable.") endif() set(DOXYGEN_FILE_DIR ${QMSETUP_MODULES_DIR}/doxygen) qm_set_value(_name FUNC_NAME "${PROJECT_NAME}") qm_set_value(_version FUNC_VERSION "${PROJECT_VERSION}") qm_set_value(_desc FUNC_DESCRIPTION "${PROJECT_DESCRIPTION}") qm_set_value(_logo FUNC_LOGO "") qm_set_value(_mdfile FUNC_MDFILE "") qm_set_value(_tagfile FUNC_GENERATE_TAGFILE "") if(_desc STREQUAL "") set(${_desc} "${_name}") endif() set(_sep " \\\n ") # Generate include file set(_doxy_includes "${CMAKE_CURRENT_BINARY_DIR}/cmake/doxygen_${_target}_$.inc") set(_doxy_output_dir "${CMAKE_CURRENT_BINARY_DIR}/doxygen_${_target}") set(_input "") set(_tagfiles "") set(_includes "") set(_defines "") set(_no_expand "") if(FUNC_INPUT) set(_input "INPUT = $\n\n") else() set(_input "INPUT = \n\n") endif() if(FUNC_TAGFILES) set(_tagfiles "TAGFILES = $\n\n") else() set(_tagfiles "TAGFILES = \n\n") endif() if(FUNC_INCLUDE_DIRECTORIES) set(_includes "INCLUDE_PATH = $\n\n") else() set(_includes "INCLUDE_PATH = \n\n") endif() if(FUNC_COMPILE_DEFINITIONS) set(_defines "PREDEFINED = $\n\n") else() set(_defines "PREDEFINED = \n\n") endif() if(FUNC_NO_EXPAND_MACROS) set(_temp_list) foreach(_item IN LISTS FUNC_NO_EXPAND_MACROS) list(APPEND _temp_list "${_item}=") endforeach() set(_no_expand "PREDEFINED += $\n\n") unset(_temp_list) endif() # Extra set(_extra_arguments) if(FUNC_TARGETS) foreach(item IN LISTS FUNC_TARGETS) set(_extra_arguments "${_extra_arguments}INCLUDE_PATH += $,${_sep}>\n\n") set(_extra_arguments "${_extra_arguments}PREDEFINED += $,${_sep}>\n\n") endforeach() endif() if(FUNC_OUTPUT_DIR) set(_doxy_output_dir ${FUNC_OUTPUT_DIR}) endif() if(_mdfile) set(_extra_arguments "${_extra_arguments}INPUT += ${_mdfile}\n\n") endif() file(GENERATE OUTPUT "${_doxy_includes}" CONTENT "${_input}${_tagfiles}${_includes}${_defines}${_extra_arguments}${_no_expand}" ) set(_env) foreach(_export IN LISTS FUNC_ENVIRONMENT_EXPORTS) if(NOT DEFINED "${_export}") message(FATAL_ERROR "qm_setup_doxygen: ${_export} is not known when trying to export it.") endif() list(APPEND _env "${_export}=${${_export}}") endforeach() list(APPEND _env "DOXY_FILE_DIR=${DOXYGEN_FILE_DIR}") list(APPEND _env "DOXY_INCLUDE_FILE=${_doxy_includes}") list(APPEND _env "DOXY_PROJECT_NAME=${_name}") list(APPEND _env "DOXY_PROJECT_VERSION=${_version}") list(APPEND _env "DOXY_PROJECT_BRIEF=${_desc}") list(APPEND _env "DOXY_PROJECT_LOGO=${_logo}") list(APPEND _env "DOXY_MAINPAGE_MD_FILE=${_mdfile}") set(_build_command "${CMAKE_COMMAND}" "-E" "env" ${_env} "DOXY_OUTPUT_DIR=${_doxy_output_dir}" "DOXY_GENERATE_TAGFILE=${_tagfile}" "${DOXYGEN_EXECUTABLE}" "${DOXYGEN_FILE_DIR}/Doxyfile" ) if(FUNC_DEPENDS) set(_dependencies DEPENDS ${FUNC_DEPENDS}) endif() if(_tagfile) get_filename_component(_tagfile_dir ${_tagfile} ABSOLUTE) get_filename_component(_tagfile_dir ${_tagfile_dir} DIRECTORY) set(_make_tagfile_dir_cmd COMMAND ${CMAKE_COMMAND} -E make_directory ${_tagfile_dir}) else() set(_make_tagfile_dir_cmd) endif() add_custom_target(${_target} COMMAND ${CMAKE_COMMAND} -E make_directory ${_doxy_output_dir} ${_make_tagfile_dir_cmd} COMMAND ${_build_command} COMMENT "Building HTML documentation" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" VERBATIM ${_dependencies} ) if(FUNC_INSTALL_DIR) set(_install_dir ${FUNC_INSTALL_DIR}) if(_tagfile) get_filename_component(_name ${_tagfile} NAME) set(_install_tagfile ${_name}) else() set(_install_tagfile) endif() set(_install_command "${CMAKE_COMMAND}" "-E" "env" ${_env} "DOXY_OUTPUT_DIR=\${_install_dir}" "DOXY_GENERATE_TAGFILE=\${_install_dir}/${_install_tagfile}" "${DOXYGEN_EXECUTABLE}" "${DOXYGEN_FILE_DIR}/Doxyfile" ) set(_install_command_quoted) foreach(_item IN LISTS _install_command) set(_install_command_quoted "${_install_command_quoted}\"${_item}\" ") endforeach() install(CODE " message(STATUS \"Install HTML documentation\") get_filename_component(_install_dir \"${_install_dir}\" ABSOLUTE BASE_DIR \${CMAKE_INSTALL_PREFIX}) file(MAKE_DIRECTORY \${_install_dir}) execute_process( COMMAND ${_install_command_quoted} WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\" OUTPUT_QUIET ) ") endif() endfunction()