Files
evolution/cmake/modules/GtkDoc.cmake
2016-11-08 19:02:30 +01:00

146 lines
4.7 KiB
CMake

# GtkDoc.cmake
#
# Macros to support develper documentation build from sources with gtk-doc.
#
# add_gtkdoc(_module _namespace _deprecated_guards _srcdirsvar _depsvar _ignoreheadersvar)
# Adds rules to build developer documentation using gtk-doc for some part.
# Arguments:
# _module - the module name, like 'camel'; it expects ${_part}-docs.sgml.in in the CMAKE_CURRENT_SOURCE_DIR
# _namespace - namespace for symbols
# _deprecated_guards - define name, which guards deprecated symbols
# _srcdirsvar - variable with dirs where the source files are located
# _depsvar - a variable with dependencies (targets)
# _ignoreheadersvar - a variable with a set of header files to ignore
#
# It also adds custom target gtkdoc-rebuild-${_module}-sgml to rebuild the sgml.in
# file based on the current sources.
include(PrintableOptions)
add_printable_option(ENABLE_GTK_DOC "Use gtk-doc to build documentation" OFF)
if(NOT ENABLE_GTK_DOC)
return()
endif(NOT ENABLE_GTK_DOC)
find_program(GTKDOC_SCAN gtkdoc-scan)
find_program(GTKDOC_MKDB gtkdoc-mkdb)
find_program(GTKDOC_MKHTML gtkdoc-mkhtml)
find_program(GTKDOC_FIXXREF gtkdoc-fixxref)
if(NOT (GTKDOC_SCAN AND GTKDOC_MKDB AND GTKDOC_MKHTML AND GTKDOC_FIXXREF))
message(FATAL_ERROR "Cannot find all gtk-doc binaries, install them or use -DENABLE_GTK_DOC=OFF instead")
return()
endif()
if(NOT TARGET gtkdocs)
add_custom_target(gtkdocs ALL)
endif(NOT TARGET gtkdocs)
if(NOT TARGET gtkdoc-rebuild-sgmls)
add_custom_target(gtkdoc-rebuild-sgmls)
endif(NOT TARGET gtkdoc-rebuild-sgmls)
macro(add_gtkdoc _module _namespace _deprecated_guards _srcdirsvar _depsvar _ignoreheadersvar)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in
${CMAKE_CURRENT_BINARY_DIR}/${_module}-docs.sgml
@ONLY
)
set(OUTPUT_DOCDIR ${SHARE_INSTALL_PREFIX}/gtk-doc/html/${_module})
set(_filedeps)
set(_srcdirs)
foreach(_srcdir ${${_srcdirsvar}})
set(_srcdirs ${_srcdirs} --source-dir="${_srcdir}")
file(GLOB _files ${_srcdir}/*.h* ${_srcdir}/*.c*)
list(APPEND _filedeps ${_files})
endforeach(_srcdir)
set(_mkhtml_prefix "")
if(APPLE)
set(_mkhtml_prefix "${CMAKE_COMMAND} -E env XML_CATALOG_FILES=\"/usr/local/etc/xml/catalog\"")
endif(APPLE)
add_custom_command(OUTPUT html/index.html
COMMAND ${GTKDOC_SCAN}
--module=${_module}
--deprecated-guards="${_deprecated_guards}"
--ignore-headers="${${_ignoreheadersvar}}"
--rebuild-sections
--rebuild-types
${_srcdirs}
COMMAND ${GTKDOC_MKDB}
--module=${_module}
--name-space=${_namespace}
--main-sgml-file="${CMAKE_CURRENT_BINARY_DIR}/${_module}-docs.sgml"
--sgml-mode
--output-format=xml
${_srcdirs}
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/html"
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/html" ${_mkhtml_prefix} ${GTKDOC_MKHTML} --path=.. ${_module} ../${_module}-docs.sgml
COMMAND ${GTKDOC_FIXXREF}
--module=${_module}
--module-dir=.
--extra-dir=..
--html-dir="${OUTPUT_DOCDIR}"
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${_module}-docs.sgml"
${_filedeps}
COMMENT "Generating ${_module} documentation"
)
add_custom_target(gtkdoc-${_module}
DEPENDS html/index.html
)
if(${_depsvar})
add_dependencies(gtkdoc-${_module} ${${_depsvar}})
endif(${_depsvar})
add_dependencies(gtkdocs gtkdoc-${_module})
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/html/
DESTINATION ${OUTPUT_DOCDIR}
)
# ***************************************
# sgml.in file rebuild, unconditional
# ***************************************
add_custom_target(gtkdoc-rebuild-${_module}-sgml
COMMAND ${CMAKE_COMMAND} -E remove_directory "${CMAKE_CURRENT_BINARY_DIR}/tmp"
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/tmp"
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/tmp"
${GTKDOC_SCAN}
--module=${_module}
--deprecated-guards="${_deprecated_guards}"
--ignore-headers="${_ignore_headers}"
--rebuild-sections
--rebuild-types
${_srcdirs}
COMMAND ${CMAKE_COMMAND} -E chdir "${CMAKE_CURRENT_BINARY_DIR}/tmp"
${GTKDOC_MKDB}
--module=${_module}
--name-space=${_namespace}
--main-sgml-file="${CMAKE_CURRENT_BINARY_DIR}/tmp/${_module}-docs.sgml"
--sgml-mode
--output-format=xml
${_srcdirs}
COMMAND ${CMAKE_COMMAND} -E rename ${CMAKE_CURRENT_BINARY_DIR}/tmp/${_module}-docs.sgml ${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in
COMMAND ${CMAKE_COMMAND} -E echo "File '${CMAKE_CURRENT_SOURCE_DIR}/${_module}-docs.sgml.in' overwritten, make sure you replace generated strings with proper content before committing."
)
add_dependencies(gtkdoc-rebuild-sgmls gtkdoc-rebuild-${_module}-sgml)
endmacro(add_gtkdoc)