Doxygen.cmake 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. include_guard(DIRECTORY)
  2. #[[
  3. Add Doxygen documentation generating target.
  4. qm_setup_doxygen(<target>
  5. [NAME <name>]
  6. [VERSION <version>]
  7. [DESCRIPTION <desc>]
  8. [LOGO <file>]
  9. [MDFILE <file>]
  10. [OUTPUT_DIR <dir>]
  11. [INSTALL_DIR <dir>]
  12. [TAGFILES <file> ...]
  13. [GENERATE_TAGFILE <file>]
  14. [INPUT <file> ...]
  15. [INCLUDE_DIRECTORIES <dir> ...]
  16. [COMPILE_DEFINITIONS <NAME=VALUE> ...]
  17. [TARGETS <target> ...]
  18. [ENVIRONMENT_EXPORTS <key> ...]
  19. [NO_EXPAND_MACROS <macro> ...]
  20. [DEPENDS <dependency> ...]
  21. )
  22. ]] #
  23. function(qm_setup_doxygen _target)
  24. set(options)
  25. set(oneValueArgs NAME VERSION DESCRIPTION LOGO MDFILE OUTPUT_DIR INSTALL_DIR GENERATE_TAGFILE)
  26. set(multiValueArgs INPUT TAGFILES INCLUDE_DIRECTORIES COMPILE_DEFINITIONS TARGETS ENVIRONMENT_EXPORTS
  27. NO_EXPAND_MACROS DEPENDS
  28. )
  29. cmake_parse_arguments(FUNC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  30. if(NOT DOXYGEN_EXECUTABLE)
  31. message(FATAL_ERROR "qm_setup_doxygen: DOXYGEN_EXECUTABLE not defined. Add find_package(Doxygen) to CMake to enable.")
  32. endif()
  33. set(DOXYGEN_FILE_DIR ${QMSETUP_MODULES_DIR}/doxygen)
  34. if(FUNC_NAME)
  35. set(_name ${FUNC_NAME})
  36. else()
  37. set(_name ${PROJECT_NAME})
  38. endif()
  39. if(FUNC_VERSION)
  40. set(_version ${FUNC_VERSION})
  41. else()
  42. set(_version ${PROJECT_VERSION})
  43. endif()
  44. if(FUNC_DESCRIPTION)
  45. set(_desc ${FUNC_DESCRIPTION})
  46. elseif(PROJECT_DESCRIPTION)
  47. set(_desc ${PROJECT_DESCRIPTION})
  48. else()
  49. set(_desc ${_name})
  50. endif()
  51. if(FUNC_LOGO)
  52. set(_logo ${FUNC_LOGO})
  53. else()
  54. set(_logo)
  55. endif()
  56. if(FUNC_MDFILE)
  57. set(_mdfile ${FUNC_MDFILE})
  58. else()
  59. set(_mdfile)
  60. endif()
  61. if(FUNC_GENERATE_TAGFILE)
  62. set(_tagfile ${FUNC_GENERATE_TAGFILE})
  63. else()
  64. set(_tagfile)
  65. endif()
  66. set(_sep " \\\n ")
  67. # Generate include file
  68. set(_doxy_includes "${CMAKE_CURRENT_BINARY_DIR}/cmake/doxygen_${_target}_$<CONFIG>.inc")
  69. set(_doxy_output_dir "${CMAKE_CURRENT_BINARY_DIR}/doxygen_${_target}")
  70. set(_input "")
  71. set(_tagfiles "")
  72. set(_includes "")
  73. set(_defines "")
  74. set(_no_expand "")
  75. if(FUNC_INPUT)
  76. set(_input "INPUT = $<JOIN:${FUNC_INPUT},${_sep}>\n\n")
  77. else()
  78. set(_input "INPUT = \n\n")
  79. endif()
  80. if(FUNC_TAGFILES)
  81. set(_tagfiles "TAGFILES = $<JOIN:${FUNC_TAGFILES},${_sep}>\n\n")
  82. else()
  83. set(_tagfiles "TAGFILES = \n\n")
  84. endif()
  85. if(FUNC_INCLUDE_DIRECTORIES)
  86. set(_includes "INCLUDE_PATH = $<JOIN:${FUNC_INCLUDE_DIRECTORIES},${_sep}>\n\n")
  87. else()
  88. set(_includes "INCLUDE_PATH = \n\n")
  89. endif()
  90. if(FUNC_COMPILE_DEFINITIONS)
  91. set(_defines "PREDEFINED = $<JOIN:${FUNC_COMPILE_DEFINITIONS},${_sep}>\n\n")
  92. else()
  93. set(_defines "PREDEFINED = \n\n")
  94. endif()
  95. if(FUNC_NO_EXPAND_MACROS)
  96. set(_temp_list)
  97. foreach(_item IN LISTS FUNC_NO_EXPAND_MACROS)
  98. list(APPEND _temp_list "${_item}=")
  99. endforeach()
  100. set(_no_expand "PREDEFINED += $<JOIN:${_temp_list},${_sep}>\n\n")
  101. unset(_temp_list)
  102. endif()
  103. # Extra
  104. set(_extra_arguments)
  105. if(FUNC_TARGETS)
  106. foreach(item IN LISTS FUNC_TARGETS)
  107. set(_extra_arguments
  108. "${_extra_arguments}INCLUDE_PATH += $<JOIN:$<TARGET_PROPERTY:${item},INCLUDE_DIRECTORIES>,${_sep}>\n\n")
  109. set(_extra_arguments
  110. "${_extra_arguments}PREDEFINED += $<JOIN:$<TARGET_PROPERTY:${item},COMPILE_DEFINITIONS>,${_sep}>\n\n")
  111. endforeach()
  112. endif()
  113. if(FUNC_OUTPUT_DIR)
  114. set(_doxy_output_dir ${FUNC_OUTPUT_DIR})
  115. endif()
  116. if(_mdfile)
  117. set(_extra_arguments "${_extra_arguments}INPUT += ${_mdfile}\n\n")
  118. endif()
  119. file(GENERATE
  120. OUTPUT "${_doxy_includes}"
  121. CONTENT "${_input}${_tagfiles}${_includes}${_defines}${_extra_arguments}${_no_expand}"
  122. )
  123. set(_env)
  124. foreach(_export IN LISTS FUNC_ENVIRONMENT_EXPORTS)
  125. if(NOT DEFINED "${_export}")
  126. message(FATAL_ERROR "qm_setup_doxygen: ${_export} is not known when trying to export it.")
  127. endif()
  128. list(APPEND _env "${_export}=${${_export}}")
  129. endforeach()
  130. list(APPEND _env "DOXY_FILE_DIR=${DOXYGEN_FILE_DIR}")
  131. list(APPEND _env "DOXY_INCLUDE_FILE=${_doxy_includes}")
  132. list(APPEND _env "DOXY_PROJECT_NAME=${_name}")
  133. list(APPEND _env "DOXY_PROJECT_VERSION=${_version}")
  134. list(APPEND _env "DOXY_PROJECT_BRIEF=${_desc}")
  135. list(APPEND _env "DOXY_PROJECT_LOGO=${_logo}")
  136. list(APPEND _env "DOXY_MAINPAGE_MD_FILE=${_mdfile}")
  137. set(_build_command "${CMAKE_COMMAND}" "-E" "env"
  138. ${_env}
  139. "DOXY_OUTPUT_DIR=${_doxy_output_dir}"
  140. "DOXY_GENERATE_TAGFILE=${_tagfile}"
  141. "${DOXYGEN_EXECUTABLE}"
  142. "${DOXYGEN_FILE_DIR}/Doxyfile"
  143. )
  144. if(FUNC_DEPENDS)
  145. set(_dependencies DEPENDS ${FUNC_DEPENDS})
  146. endif()
  147. if(_tagfile)
  148. get_filename_component(_tagfile_dir ${_tagfile} ABSOLUTE)
  149. get_filename_component(_tagfile_dir ${_tagfile_dir} DIRECTORY)
  150. set(_make_tagfile_dir_cmd COMMAND ${CMAKE_COMMAND} -E make_directory ${_tagfile_dir})
  151. else()
  152. set(_make_tagfile_dir_cmd)
  153. endif()
  154. add_custom_target(${_target}
  155. COMMAND ${CMAKE_COMMAND} -E make_directory ${_doxy_output_dir}
  156. ${_make_tagfile_dir_cmd}
  157. COMMAND ${_build_command}
  158. COMMENT "Building HTML documentation"
  159. WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
  160. VERBATIM
  161. ${_dependencies}
  162. )
  163. if(FUNC_INSTALL_DIR)
  164. set(_install_dir ${FUNC_INSTALL_DIR})
  165. if(_tagfile)
  166. get_filename_component(_name ${_tagfile} NAME)
  167. set(_install_tagfile ${_name})
  168. else()
  169. set(_install_tagfile)
  170. endif()
  171. set(_install_command "${CMAKE_COMMAND}" "-E" "env"
  172. ${_env}
  173. "DOXY_OUTPUT_DIR=\${_install_dir}"
  174. "DOXY_GENERATE_TAGFILE=\${_install_dir}/${_install_tagfile}"
  175. "${DOXYGEN_EXECUTABLE}"
  176. "${DOXYGEN_FILE_DIR}/Doxyfile"
  177. )
  178. set(_install_command_quoted)
  179. foreach(_item IN LISTS _install_command)
  180. set(_install_command_quoted "${_install_command_quoted}\"${_item}\" ")
  181. endforeach()
  182. install(CODE "
  183. message(STATUS \"Installing HTML documentation\")
  184. get_filename_component(_install_dir \"${_install_dir}\" ABSOLUTE BASE_DIR \${CMAKE_INSTALL_PREFIX})
  185. file(MAKE_DIRECTORY \${_install_dir})
  186. execute_process(
  187. COMMAND ${_install_command_quoted}
  188. WORKING_DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\"
  189. OUTPUT_QUIET
  190. )
  191. ")
  192. endif()
  193. endfunction()