blob: 272948fdba22551f132abdc8478330dde16c2f1f [file] [log] [blame]
#-------------------------------------------------------------------------------
# Copyright (c) 2018-2019, Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#-------------------------------------------------------------------------------
#This file adds build and install targets to build the Doxygen documentation
#for TF-M. This currently means the "Reference Manual". Further documentation
#builds may be added in the future.
Include(CMakeParseArguments)
#This function will find the location of tools needed to build the
#documentation. These are:
# - Mandatory:
# - Doxygen v1.8.0 or higher
# - dot
# - PlantUML and it's dependencies
# - Optional
# - LateX/PDFLateX
#
#Inputs:
# none (some global variables might be used by FindXXX modules used. For
# details please check the used modules.)
#
#Outputs:
# NODOC - will be defined and set to true is any mandatory
# tool is missing.
# LATEX_PDFLATEX_FOUND - defined if PDFLateX is available.
# DOXYGEN_EXECUTABLE - path to doxygen
# DOXYGEN_DOT_EXECUTABLE - path to dot
# PLANTUML_JAR_PATH - path to PlantUML
#Examples
# DoxyFindTools()
#
function(DoxyFindTools)
#Find doxygen and dot.
find_package(Doxygen 1.8.0)
#find_package(Doxygen) will not print an error if dot is not available,
#emit a message here to help users.
if (NOT DOXYGEN_DOT_FOUND)
message(STATUS "Could NOT find Graphviz (missing: DOXYGEN_DOT_EXECUTABLE).")
endif()
#Find plantUML
find_package(PlantUML)
#Find tools needed for PDF generation.
find_package(LATEX COMPONENTS PDFLATEX)
set (LATEX_PDFLATEX_FOUND ${LATEX_PDFLATEX_FOUND} PARENT_SCOPE)
if (DOXYGEN_FOUND AND DOXYGEN_DOT_FOUND AND PLANTUML_FOUND)
#Export executable locations to global scope.
set(DOXYGEN_EXECUTABLE "${DOXYGEN_EXECUTABLE}" PARENT_SCOPE)
set(DOXYGEN_DOT_EXECUTABLE "${DOXYGEN_DOT_EXECUTABLE}" PARENT_SCOPE)
set(PLANTUML_JAR_PATH "${PLANTUML_JAR_PATH}" PARENT_SCOPE)
set(NODOC False PARENT_SCOPE)
else()
message(WARNING "Some tools are missing for document generation. Document generation target is not created.")
set(NODOC True PARENT_SCOPE)
endif()
endfunction()
#Find the needed tools.
DoxyFindTools()
#If mandatory tools are missing, skip creating document generation targets.
#This means missing documentation tools is not a crytical error, and building
#TF-M is still possible.
if (NOT NODOC)
#The doxygen configuration file needs some project specific configuration.
#Variables with DOXYCFG_ prefix are settings related to that.
set(DOXYCFG_TEMPLATE_FILE ${TFM_ROOT_DIR}/doxygen/Doxyfile.in)
set(DOXYCFG_CONFIGURED_FILE ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
#This is where doxygen output will be written
set(DOXYCFG_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/doc")
#Eclipse help ID. The help files shall be installed under the plugin
#directory into a directory with a name matching this ID.
set(DOXYCFG_ECLIPSE_DOCID "org.arm.tf-m-refman")
#Version ID of TF-M.
#TODO: this shall not be hard-coded here. A process need to defined for
# versioning the document (and TF-M).
set(DOXYCFG_TFM_VERSION "v1.0-RC1")
#Using add_custom_command allows CMake to generate proper clean commands
#for document generation.
add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/doc"
COMMAND "${DOXYGEN_EXECUTABLE}" "${DOXYCFG_CONFIGURED_FILE}"
WORKING_DIRECTORY "${TFM_ROOT_DIR}"
COMMENT "Running doxygen.")
#Create build target to generate HTML documentation.
add_custom_target(doc_refman
WORKING_DIRECTORY ${TFM_ROOT_DIR}
COMMENT "Generating TF-M Reference Manual..."
DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/doc"
VERBATIM)
#Add the HTML documentation to install content
install(DIRECTORY ${DOXYCFG_OUTPUT_PATH}/html DESTINATION doc/reference_manual
COMPONENT refman EXCLUDE_FROM_ALL)
#Add the HTML documentation to install content. This time to be copied to
#eclipse plugin directory.
#TODO: I could not find a working description how the doxygen output
#can be installed to eclipse. Re-enable eclipse help generation after
#this is investigated. (See Doxyfile.in::GENERATE_ECLIPSEHELP)
#install(DIRECTORY "${DOXYCFG_OUTPUT_PATH}/html/"
# DESTINATION "doc/reference_manual/${DOXYCFG_ECLIPSE_DOCID}"
# COMPONENT refman
# EXCLUDE_FROM_ALL)
#If PDF documentation is being made.
if (LATEX_PDFLATEX_FOUND)
if (NOT CMAKE_GENERATOR MATCHES "Makefiles")
message(WARNING "Generator is not make based. PDF document generation target is not created.")
else()
#This file shall not be included before cmake did finish finding the make tool and thus
#setting CMAKE_MAKE_PROGRAM. Currently the search is triggered by the project() command.
if(NOT CMAKE_MAKE_PROGRAM)
message(FATAL_ERROR "CMAKE_MAKE_PROGRAM is not set. This file must be included after the project command is run.")
endif()
#The add_custom_command is not used here to get proper clean
#command since the clean rules "added" above will remove the entire
#doc directory, and thus clean the PDF output too.
add_custom_target(doc_refman_pdf
COMMAND "${CMAKE_MAKE_PROGRAM}" pdf
WORKING_DIRECTORY ${DOXYCFG_OUTPUT_PATH}/latex
COMMENT "Generating PDF version of TF-M reference manual..."
DEPENDS doc_refman
VERBATIM)
#Add the pdf documentation to install content
install(FILES "${DOXYCFG_OUTPUT_PATH}/latex/refman.pdf" DESTINATION "doc/reference_manual"
RENAME "tf-m_reference_manual.pdf"
COMPONENT refman EXCLUDE_FROM_ALL)
set(DOXYCFG_TFM_GENERATE_PDF $(DOXYCFG_TFM_VERSION))
endif()
else()
message(WARNING "PDF generation tools are missing. PDF document generation target is not created.")
endif()
#Generate build target which installs the documentation.
if (TARGET doc_refman_pdf)
add_custom_target(install_doc
DEPENDS doc_refman doc_refman_pdf
COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=refman
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
else()
add_custom_target(install_doc
DEPENDS doc_refman
COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=refman
-P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
endif()
#Now instantiate a doxygen configuration file from the template.
message(STATUS "Writing doxygen configuration...")
configure_file(${DOXYCFG_TEMPLATE_FILE} ${DOXYCFG_CONFIGURED_FILE} @ONLY)
endif()