blob: ab08319c3c926d3253f1dfe4d17c60e83bd288f0 [file] [log] [blame]
Gyorgy Szing74dae3c2018-09-27 17:00:46 +02001#-------------------------------------------------------------------------------
Minos Galanakis07689822020-03-10 15:37:20 +00002# Copyright (c) 2019-2020, Arm Limited. All rights reserved.
Gyorgy Szing74dae3c2018-09-27 17:00:46 +02003#
4# SPDX-License-Identifier: BSD-3-Clause
5#
6#-------------------------------------------------------------------------------
7
8#This file adds build and install targets to build the Sphinx documentation
9#for TF-M. This currently means the "User Guide". Further documentation
10#builds may be added in the future.
11
12Include(CMakeParseArguments)
13
14#This function will find the location of tools needed to build the
15#documentation. These are:
16# - Mandatory:
17# - Sphinx 1.9.0 or higher
18# - PlantUML and it's dependencies
19# - Optional
20# - LateX/PDFLateX
21#
22#Inputs:
23# none (some global variables might be used by FindXXX modules used. For
24# details please check the modules used.)
25#Outputs:
26# SPHINX_NODOC - will be defined and set to true is any mandatory tool is
27# missing.
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +020028# LATEX_PDFLATEX_FOUND - true if pdflatex executable found
29# SPHINX_EXECUTABLE - path to sphinx-build
30# PLANTUML_JAR_PATH - path to PlantUML
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020031
32#Examples
33# SphinxFindTools()
34#
35function(SphinxFindTools)
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020036 #Find Sphinx
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020037 find_package(Sphinx)
38
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020039 #Find additional needed Sphinx dependencies.
40 find_package(PythonModules COMPONENTS m2r sphinx-rtd-theme sphinxcontrib.plantuml)
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020041
42 #Find plantUML
43 find_package(PlantUML)
44
45 #Find tools needed for PDF generation.
46 find_package(LATEX COMPONENTS PDFLATEX)
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +020047 set (LATEX_PDFLATEX_FOUND "${LATEX_PDFLATEX_FOUND}" PARENT_SCOPE)
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020048
49 if (SPHINX_FOUND AND PLANTUML_FOUND AND PY_M2R_FOUND
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020050 AND PY_SPHINX-RTD-THEME_FOUND AND PY_SPHINXCONTRIB.PLANTUML)
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020051 #Export executable locations to global scope.
52 set(SPHINX_EXECUTABLE "${SPHINX_EXECUTABLE}" PARENT_SCOPE)
53 set(PLANTUML_JAR_PATH "${PLANTUML_JAR_PATH}" PARENT_SCOPE)
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020054 set(Java_JAVA_EXECUTABLE "${Java_JAVA_EXECUTABLE}" PARENT_SCOPE)
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020055 set(SPHINX_NODOC False PARENT_SCOPE)
56 else()
57 message(WARNING "Some tools are missing for Sphinx document generation. Document generation target is not created.")
58 set(SPHINX_NODOC True PARENT_SCOPE)
59 endif()
60endfunction()
61
62#Find the needed tools.
63SphinxFindTools()
64
65#If mandatory tools are missing, skip creating document generation targets.
66#This means missing documentation tools is not a critical error, and building
67#TF-M is still possible.
68if (NOT SPHINX_NODOC)
69 #The Sphinx configuration file needs some project specific configuration.
70 #Variables with SPHINXCFG_ prefix are setting values related to that.
71 #This is where Sphinx output will be written
72 set(SPHINXCFG_OUTPUT_PATH "${CMAKE_CURRENT_BINARY_DIR}/doc_sphinx")
73
74 set(SPHINX_TMP_DOC_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc_sphinx_in")
75
Gyorgy Szingdb9783c2019-04-17 21:08:48 +020076 set(SPHINXCFG_TEMPLATE_FILE "${TFM_ROOT_DIR}/docs/conf.py.in")
77 set(SPHINXCFG_CONFIGURED_FILE "${SPHINXCFG_OUTPUT_PATH}/conf.py")
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020078
Gyorgy Szing5c873232019-05-10 23:28:14 +020079 set(SPHINX_DESIGN_DOC_ROOT "${TFM_ROOT_DIR}/docs/design_documents")
Galanakis, Minos0c1ad782019-11-08 11:28:40 +000080 set(SPHINX_TEMPLATE_INDEX_FILE "${SPHINX_DESIGN_DOC_ROOT}/index.rst.in")
81 set(SPHINX_CONFIGURED_INDEX_FILE "${SPHINX_TMP_DOC_DIR}/docs/design_documents/index.rst")
82 set(SPHINX_MAIN_INDEX_FILE "docs/index.rst")
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020083
84 #Version ID of TF-M.
85 #TODO: this shall not be hard-coded here. We need a process to define the
86 # version number of the document (and TF-M).
Mate Toth-Pal955235a2020-06-15 13:48:34 +020087 set(SPHINXCFG_TFM_VERSION "v1.1")
88 set(SPHINXCFG_TFM_VERSION_FULL "Version 1.1")
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020089
Gyorgy Szing5c873232019-05-10 23:28:14 +020090 get_filename_component(_NDX_FILE_DIR ${SPHINX_CONFIGURED_INDEX_FILE} DIRECTORY )
91
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +020092 #This command does not generates the specified output file and thus it will
93 #always be run. Any other command or target depending on the "run-allways"
94 #output will be always executed too.
Gyorgy Szing5c873232019-05-10 23:28:14 +020095 add_custom_command(OUTPUT run-allways
96 COMMAND "${CMAKE_COMMAND}" -E echo)
97
Gyorgy Szing74dae3c2018-09-27 17:00:46 +020098 #Using add_custom_command allows CMake to generate proper clean commands
99 #for document generation.
100 add_custom_command(OUTPUT "${SPHINX_TMP_DOC_DIR}"
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200101 "${SPHINX_CONFIGURED_INDEX_FILE}"
Gyorgy Szing5c873232019-05-10 23:28:14 +0200102 #Create target directory for SPHINX_CONFIGURED_INDEX_FILE. Needed
103 #by the next command.
104 COMMAND "${CMAKE_COMMAND}" -E make_directory "${_NDX_FILE_DIR}"
105 #Fill out index.rst template
106 COMMAND "${CMAKE_COMMAND}" -D TFM_ROOT_DIR=${TFM_ROOT_DIR}
107 -D SPHINX_TEMPLATE_INDEX_FILE=${SPHINX_TEMPLATE_INDEX_FILE}
108 -D SPHINX_CONFIGURED_INDEX_FILE=${SPHINX_CONFIGURED_INDEX_FILE}
109 -D SPHINX_DESIGN_DOC_ROOT=${SPHINX_DESIGN_DOC_ROOT}
110 -P "${TFM_ROOT_DIR}/cmake/SphinxDesignDocStatus.cmake"
111 #Copy document files to temp direcotry
112 COMMAND "${CMAKE_COMMAND}" -D TFM_ROOT_DIR=${TFM_ROOT_DIR}
113 -D DST_DIR=${SPHINX_TMP_DOC_DIR}
114 -D BINARY_DIR=${CMAKE_BINARY_DIR}
Galanakis, Minos0c1ad782019-11-08 11:28:40 +0000115 -D MASTER_IDX=${SPHINX_MAIN_INDEX_FILE}
Gyorgy Szing5c873232019-05-10 23:28:14 +0200116 -P "${TFM_ROOT_DIR}/cmake/SphinxCopyDoc.cmake"
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200117 WORKING_DIRECTORY "${TFM_ROOT_DIR}"
Gyorgy Szing5c873232019-05-10 23:28:14 +0200118 DEPENDS run-allways
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200119 VERBATIM
120 )
121
Gyorgy Szingdb9783c2019-04-17 21:08:48 +0200122 add_custom_target(create_sphinx_input
123 SOURCES "${SPHINX_TMP_DOC_DIR}"
124 )
125
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200126 add_custom_command(OUTPUT "${SPHINXCFG_OUTPUT_PATH}/html"
127 COMMAND "${SPHINX_EXECUTABLE}" -c "${SPHINXCFG_OUTPUT_PATH}" -b html "${SPHINX_TMP_DOC_DIR}" "${SPHINXCFG_OUTPUT_PATH}/html"
128 WORKING_DIRECTORY "${TFM_ROOT_DIR}"
Gyorgy Szing5c873232019-05-10 23:28:14 +0200129 DEPENDS create_sphinx_input run-allways
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200130 COMMENT "Running Sphinx to generate user guide (HTML)."
131 VERBATIM
132 )
133
134 #Create build target to generate HTML documentation.
135 add_custom_target(doc_userguide
136 COMMENT "Generating User Guide with Sphinx..."
137 #Copy document files from the top level dir to docs
138 SOURCES "${SPHINXCFG_OUTPUT_PATH}/html"
139 )
140
141 #Add the HTML documentation to install content
142 install(DIRECTORY ${SPHINXCFG_OUTPUT_PATH}/html DESTINATION doc/user_guide
143 EXCLUDE_FROM_ALL
144 COMPONENT user_guide
145 PATTERN .buildinfo EXCLUDE
146 )
147
148 #If PDF documentation is being made.
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200149 if (LATEX_PDFLATEX_FOUND)
150 if (NOT CMAKE_GENERATOR MATCHES "Makefiles")
151 message(WARNING "Generator is not make based. PDF document generation target is not created.")
152 else()
153 #This file shall not be included before cmake did finish finding the make tool and thus
154 #setting CMAKE_MAKE_PROGRAM. Currently the search is triggered by the project() command.
155 if(NOT CMAKE_MAKE_PROGRAM)
156 message(FATAL_ERROR "CMAKE_MAKE_PROGRAM is not set. This file must be included after the project command is run.")
157 endif()
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200158
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200159 set(_PDF_FILE "${SPHINXCFG_OUTPUT_PATH}/latex/TF-M.pdf")
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200160
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200161 add_custom_command(OUTPUT "${SPHINXCFG_OUTPUT_PATH}/latex"
162 COMMAND "${SPHINX_EXECUTABLE}" -c "${SPHINXCFG_OUTPUT_PATH}" -b latex "${SPHINX_TMP_DOC_DIR}" "${SPHINXCFG_OUTPUT_PATH}/latex"
163 WORKING_DIRECTORY "${TFM_ROOT_DIR}"
164 DEPENDS create_sphinx_input
165 COMMENT "Running Sphinx to generate user guide (LaTeX)."
166 VERBATIM
167 )
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200168
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200169 add_custom_command(OUTPUT "${_PDF_FILE}"
170 COMMAND "${CMAKE_MAKE_PROGRAM}" all-pdf
171 WORKING_DIRECTORY ${SPHINXCFG_OUTPUT_PATH}/latex
172 DEPENDS "${SPHINXCFG_OUTPUT_PATH}/latex"
173 COMMENT "Generating PDF version of User Guide..."
174 VERBATIM
175 )
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200176
Gyorgy Szingd9c57fb2019-09-02 17:08:18 +0200177 #We do not use the add_custom_command trick here to get proper clean
178 #command since the clean rules "added" above will remove the entire
179 #doc directory, and thus clean the PDF output too.
180 add_custom_target(doc_userguide_pdf
181 COMMENT "Generating PDF version of TF-M User Guide..."
182 SOURCES "${_PDF_FILE}"
183 VERBATIM)
184
185 #Add the pdf documentation to install content
186 install(FILES "${_PDF_FILE}" DESTINATION "doc/user_guide"
187 RENAME "tf-m_user_guide.pdf"
188 COMPONENT user_guide
189 EXCLUDE_FROM_ALL)
190 endif()
Gyorgy Szing74dae3c2018-09-27 17:00:46 +0200191 else()
192 message(WARNING "PDF generation tools are missing. PDF document generation target is not created.")
193 endif()
194
195 #Generate build target which installs the documentation.
196 if (TARGET doc_userguide_pdf)
197 add_custom_target(install_userguide
198 DEPENDS doc_userguide doc_userguide_pdf
199 COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=user_guide
200 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
201 else()
202 add_custom_target(install_userguide
203 DEPENDS doc_userguide
204 COMMAND "${CMAKE_COMMAND}" -DCMAKE_INSTALL_COMPONENT=user_guide
205 -P "${CMAKE_BINARY_DIR}/cmake_install.cmake")
206 endif()
207
208 #Now instantiate a Sphinx configuration file from the template.
209 message(STATUS "Writing Sphinx configuration...")
210 configure_file(${SPHINXCFG_TEMPLATE_FILE} ${SPHINXCFG_CONFIGURED_FILE} @ONLY)
211endif()