blob: dfacd4f690685eff985a41922fcdd93984642d28 [file] [log] [blame]
Anas Nashif3ae52622019-04-06 09:08:09 -04001# SPDX-License-Identifier: Apache-2.0
2
Anas Nashif5060ca62018-12-11 10:33:23 -05003cmake_minimum_required(VERSION 3.13.1)
Sebastian Bøe5748fe12019-01-04 09:13:07 +01004project(Zephyr-Kernel-Doc LANGUAGES)
Carles Cufiae699342018-07-09 14:12:17 +02005
Torsten Rasmussend7862cf2020-02-12 15:42:09 +01006set(NO_BOILERPLATE TRUE)
Marc Herbert3a045362020-05-28 21:54:50 -07007find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE} ..)
Torsten Rasmussend7862cf2020-02-12 15:42:09 +01008
Torsten Rasmussend7862cf2020-02-12 15:42:09 +01009file(TO_CMAKE_PATH "${ZEPHYR_BASE}" ZEPHYR_BASE)
Carles Cufiae699342018-07-09 14:12:17 +020010message(STATUS "Zephyr base: ${ZEPHYR_BASE}")
11
Gerard Marull-Paretase5b7d3f2021-06-16 21:12:36 +020012#-------------------------------------------------------------------------------
Gerard Marull-Paretase06ebed2021-06-16 21:19:35 +020013# Options
14
15set(SPHINXOPTS "-j auto" CACHE STRING "Default Sphinx Options")
16set(DOC_TAG "development" CACHE STRING "Documentation tag")
17
18separate_arguments(SPHINXOPTS)
19
20#-------------------------------------------------------------------------------
Gerard Marull-Paretase5b7d3f2021-06-16 21:12:36 +020021# Dependencies
22
Carles Cufiae699342018-07-09 14:12:17 +020023set(DOXYGEN_SKIP_DOT True)
24find_package(Doxygen REQUIRED)
25
Gerard Marull-Paretase5b7d3f2021-06-16 21:12:36 +020026find_program(SPHINXBUILD sphinx-build)
27if(NOT SPHINXBUILD)
28 message(FATAL_ERROR "The 'sphinx-build' command was not found")
Carles Cufiae699342018-07-09 14:12:17 +020029endif()
30
Gerard Marull-Paretase5b7d3f2021-06-16 21:12:36 +020031find_package(LATEX COMPONENTS PDFLATEX)
32find_program(LATEXMK latexmk)
33if(NOT LATEX_PDFLATEX_FOUND OR NOT LATEXMK)
34 message(WARNING "LaTeX components not found. PDF build will not be available.")
35endif()
36
37include(${ZEPHYR_BASE}/cmake/python.cmake)
38
Gerard Marull-Paretas3ea64ce2021-06-16 20:21:08 +020039# Find west to (optionally) process modules for Kconfig
40find_program(WEST west)
41
Carles Cufif5f1b222019-05-23 16:37:58 +020042# Include version info
43include(${ZEPHYR_BASE}/cmake/version.cmake)
44# Process modules
Torsten Rasmussen5f7cc8d2020-07-06 12:53:39 +020045set(KCONFIG_BINARY_DIR ${CMAKE_BINARY_DIR}/Kconfig)
Torsten Rasmussen11016412021-01-22 14:08:41 +010046list(INSERT MODULE_EXT_ROOT 0 ${ZEPHYR_BASE})
Torsten Rasmussen5f7cc8d2020-07-06 12:53:39 +020047file(MAKE_DIRECTORY ${KCONFIG_BINARY_DIR})
Torsten Rasmussen11016412021-01-22 14:08:41 +010048include(${ZEPHYR_BASE}/cmake/extensions.cmake)
Carles Cufif5f1b222019-05-23 16:37:58 +020049include(${ZEPHYR_BASE}/cmake/zephyr_module.cmake)
50
Carles Cufi896a6962018-08-16 13:45:59 +020051if(NOT DEFINED SPHINX_OUTPUT_DIR)
Daniel Leung9945e7f2018-08-23 11:11:11 -070052 set(SPHINX_OUTPUT_DIR_LATEX ${CMAKE_CURRENT_BINARY_DIR}/latex)
53 set(SPHINX_OUTPUT_DIR_PDF ${CMAKE_CURRENT_BINARY_DIR}/pdf)
54else()
Marti Bolivar2952bf82018-10-09 13:28:41 -060055 # SPHINX_OUTPUT_DIR is used to specify exactly where HTML (or other
56 # outputs) are placed, so no /html, /latex, /pdf suffixes are needed.
Daniel Leung9945e7f2018-08-23 11:11:11 -070057 set(SPHINX_OUTPUT_DIR_LATEX ${SPHINX_OUTPUT_DIR})
58 set(SPHINX_OUTPUT_DIR_PDF ${SPHINX_OUTPUT_DIR})
Carles Cufi896a6962018-08-16 13:45:59 +020059endif()
60
Carles Cufiae699342018-07-09 14:12:17 +020061# Internal variables.
Carles Cufi2af9a9e2018-07-13 15:32:36 +020062set(ALLSPHINXOPTS -d ${CMAKE_CURRENT_BINARY_DIR}/doctrees ${SPHINXOPTS})
Carles Cufi60c55402018-07-15 18:57:01 +020063
Carles Cufie182dbc2018-07-16 19:05:05 +020064set(DOXYFILE_IN ${CMAKE_CURRENT_LIST_DIR}/zephyr.doxyfile.in)
65set(DOXYFILE_OUT ${CMAKE_CURRENT_BINARY_DIR}/zephyr.doxyfile)
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +020066set(DOXY_OUT ${CMAKE_CURRENT_BINARY_DIR}/doxygen)
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +020067set(RST_OUT ${CMAKE_CURRENT_BINARY_DIR}/src)
Carles Cufiae699342018-07-09 14:12:17 +020068
Carles Cufie182dbc2018-07-16 19:05:05 +020069configure_file(${DOXYFILE_IN} ${DOXYFILE_OUT} @ONLY)
Carles Cufiae699342018-07-09 14:12:17 +020070
Marc Herbert52842312019-02-07 13:39:59 -080071add_custom_target(
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +020072 doxygen
73 COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYFILE_OUT}
Marc Herbert52842312019-02-07 13:39:59 -080074 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +020075 COMMENT "Running ${DOXYGEN_EXECUTABLE}"
Marc Herbert52842312019-02-07 13:39:59 -080076)
77
Carles Cufiae699342018-07-09 14:12:17 +020078add_custom_target(
79 pristine
80 COMMAND ${CMAKE_COMMAND} -P ${ZEPHYR_BASE}/cmake/pristine.cmake
Carles Cufiae699342018-07-09 14:12:17 +020081)
82
Carles Cufiae699342018-07-09 14:12:17 +020083if(WIN32)
Carles Cufi8645cc22019-09-06 15:56:21 +020084 set(SEP $<SEMICOLON>)
Carles Cufiae699342018-07-09 14:12:17 +020085else()
86 set(SEP :)
87endif()
88
Gerard Marull-Paretas3282cf82021-03-29 20:50:01 +020089set(FIX_TEX_SCRIPT ${ZEPHYR_BASE}/doc/_scripts/fix_tex.py)
Martí Bolívar808dd9e2020-10-12 11:02:46 -070090
91#
92# Generated Kconfig .rst documents
93#
94
Torsten Rasmussen11016412021-01-22 14:08:41 +010095foreach(module_name ${ZEPHYR_MODULE_NAMES})
96 zephyr_string(SANITIZE TOUPPER MODULE_NAME_UPPER ${module_name})
97 list(APPEND
98 ZEPHYR_KCONFIG_MODULES
99 "ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR=${ZEPHYR_${MODULE_NAME_UPPER}_MODULE_DIR}"
100 )
101
102 if(ZEPHYR_${MODULE_NAME_UPPER}_KCONFIG)
103 list(APPEND
104 ZEPHYR_KCONFIG_MODULES
105 "ZEPHYR_${MODULE_NAME_UPPER}_KCONFIG=${ZEPHYR_${MODULE_NAME_UPPER}_KCONFIG}"
106 )
107 endif()
108endforeach()
109
Carles Cufiae699342018-07-09 14:12:17 +0200110add_custom_target(
111 kconfig
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200112 COMMAND ${CMAKE_COMMAND} -E make_directory ${RST_OUT}/reference/kconfig
Carles Cufie182dbc2018-07-16 19:05:05 +0200113 COMMAND ${CMAKE_COMMAND} -E env
Ulf Magnussonf570f192019-12-03 17:07:53 +0100114 PYTHONPATH=${ZEPHYR_BASE}/scripts/kconfig${SEP}$ENV{PYTHONPATH}
Marti Bolivarf3d13862019-05-10 04:23:23 -0600115 ZEPHYR_BASE=${ZEPHYR_BASE}
Carles Cufiae699342018-07-09 14:12:17 +0200116 srctree=${ZEPHYR_BASE}
Ulf Magnusson82330172019-10-21 20:20:18 +0200117 BOARD_DIR=boards/*/*
Ulf Magnussond0e87522018-09-05 12:58:05 +0200118 ARCH=*
Ulf Magnusson82330172019-10-21 20:20:18 +0200119 ARCH_DIR=arch
120 SOC_DIR=soc
Torsten Rasmussen5f7cc8d2020-07-06 12:53:39 +0200121 KCONFIG_BINARY_DIR=${KCONFIG_BINARY_DIR}
Carles Cufic6249ac2019-03-28 17:51:39 +0100122 KCONFIG_WARN_UNDEF=y
Anas Nashif940a9312019-01-21 13:58:05 -0500123 KCONFIG_TURBO_MODE=${KCONFIG_TURBO_MODE}
Carles Cufifa26ef02019-01-30 17:54:21 +0100124 KCONFIG_DOC_MODE=1
Torsten Rasmussen11016412021-01-22 14:08:41 +0100125 ${ZEPHYR_KCONFIG_MODULES}
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200126 ${PYTHON_EXECUTABLE} _scripts/gen_kconfig_rest.py ${RST_OUT}/reference/kconfig/
Ulf Magnusson5c28f392019-12-10 15:11:01 +0100127 --separate-all-index
Ulf Magnusson91c8ffa2019-11-21 19:37:58 +0100128 --keep-module-paths
Ulf Magnussonf570f192019-12-03 17:07:53 +0100129 --modules Architecture,arch,${ZEPHYR_BASE}/arch
130 Driver,drivers,${ZEPHYR_BASE}/drivers
131 Kernel,kernel,${ZEPHYR_BASE}/kernel
132 Library,lib,${ZEPHYR_BASE}/lib
133 Subsystem,subsys,${ZEPHYR_BASE}/subsys
134 "External Module,modules,${ZEPHYR_BASE}/modules"
Ulf Magnusson91c8ffa2019-11-21 19:37:58 +0100135
Ulf Magnussonf570f192019-12-03 17:07:53 +0100136 VERBATIM
Carles Cufi2af9a9e2018-07-13 15:32:36 +0200137 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200138 COMMENT "Running gen_kconfig_rest.py ${RST_OUT}/reference/kconfig/"
Carles Cufiae699342018-07-09 14:12:17 +0200139)
140
Martí Bolívar808dd9e2020-10-12 11:02:46 -0700141#
142# Generated devicetree .rst documents
143#
144# The devicetree bindings discovered in ${DTS_ROOTS} are parsed and
145# documentation for them is generated in the directory
146# ${DTS_BINDINGS_RST_OUT}.
147#
148# The CMake variable GEN_DEVICETREE_REST_ZEPHYR_DOCSET will
149# be passed to the script in the environment. This allows separating
150# the bindings documentation into a standalone Sphinx docset that
151# nonetheless can link to Zephyr documentation using intersphinx.
152# If empty, the variable has no effect on the script.
153#
154# If not set, these are the default values for these variables:
155#
156# - DTS_ROOTS: ZEPHYR_BASE
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200157# - DTS_BINDINGS_RST_OUT: ${RST_OUT}/reference/devicetree
Martí Bolívar808dd9e2020-10-12 11:02:46 -0700158#
159
Gerard Marull-Paretas3282cf82021-03-29 20:50:01 +0200160set(GEN_DEVICETREE_REST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/_scripts/gen_devicetree_rest.py)
Martí Bolívar808dd9e2020-10-12 11:02:46 -0700161
162if(NOT DTS_ROOTS)
163 set(DTS_ROOTS ${ZEPHYR_BASE})
164endif()
165
166set(DTS_ROOT_ARGS)
167foreach(root ${DTS_ROOTS})
168 list(APPEND DTS_ROOT_ARGS --dts-root ${root})
169endforeach()
170
171if(NOT DTS_BINDINGS_RST_OUT)
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200172 set(DTS_BINDINGS_RST_OUT ${RST_OUT}/reference/devicetree)
Martí Bolívar808dd9e2020-10-12 11:02:46 -0700173endif()
174
175add_custom_target(
176 devicetree
177 COMMAND ${CMAKE_COMMAND} -E env
Martí Bolívar53328472021-03-26 16:18:58 -0700178 PYTHONPATH=${ZEPHYR_BASE}/scripts/dts/python-devicetree/src${SEP}$ENV{PYTHONPATH}
Martí Bolívar808dd9e2020-10-12 11:02:46 -0700179 ZEPHYR_BASE=${ZEPHYR_BASE}
180 GEN_DEVICETREE_REST_ZEPHYR_DOCSET=${GEN_DEVICETREE_REST_ZEPHYR_DOCSET}
181 ${PYTHON_EXECUTABLE} ${GEN_DEVICETREE_REST_SCRIPT}
182 --vendor-prefixes ${ZEPHYR_BASE}/dts/bindings/vendor-prefixes.txt
183 ${DTS_ROOT_ARGS} ${DTS_BINDINGS_RST_OUT}
184 VERBATIM
185 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
186 COMMENT "Running gen_devicetree_rest.py ${DTS_BINDINGS_RST_OUT}"
187 USES_TERMINAL
188)
189
190set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${GEN_DEVICETREE_REST_SCRIPT})
Carles Cufiae699342018-07-09 14:12:17 +0200191
Gerard Marull-Paretas2f1932c2021-06-16 22:30:23 +0200192#-------------------------------------------------------------------------------
193# Environment & Paths
194
195set(SPHINX_ENV
Marti Bolivarf3d13862019-05-10 04:23:23 -0600196 ZEPHYR_BASE=${ZEPHYR_BASE}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600197 ZEPHYR_BUILD=${CMAKE_CURRENT_BINARY_DIR}
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +0200198 DOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600199)
200
Gerard Marull-Paretas2f1932c2021-06-16 22:30:23 +0200201set(DOCS_CFG_DIR ${CMAKE_CURRENT_LIST_DIR})
202set(DOCS_DOCTREE_DIR ${CMAKE_CURRENT_BINARY_DIR}/doctrees)
203set(DOCS_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
204set(DOCS_SRC_DIR ${CMAKE_CURRENT_BINARY_DIR}/src)
205set(DOCS_HTML_DIR ${CMAKE_CURRENT_BINARY_DIR}/html)
206
207#-------------------------------------------------------------------------------
208# Functions
209
210# Create a custom doc target.
211#
212# This function has the same signature as `add_custom_target()`
213#
214# The function will create two targets for the doc build system.
215# - Target 1 named: `<name>`
216# - Target 2 named: `<name>-nodeps`
217#
218# Both targets will produce same result, but target 2 must have no dependencies.
219# This is useful to, e.g. re-run the Sphinx build without dependencies such as
220# devicetree or Kconfig generators.
221#
222function(add_doc_target name)
223 add_custom_target(${name} ${ARGN})
224 add_custom_target(${name}-nodeps ${ARGN})
225endfunction()
226
227#-------------------------------------------------------------------------------
228# html
229
230add_doc_target(
Carles Cufiae699342018-07-09 14:12:17 +0200231 html
Gerard Marull-Paretas2f1932c2021-06-16 22:30:23 +0200232 COMMAND ${CMAKE_COMMAND} -E env ${SPHINX_ENV}
233 ${SPHINXBUILD}
234 -b html
235 -c ${DOCS_CFG_DIR}
236 -d ${DOCS_DOCTREE_DIR}
237 -w ${DOCS_BUILD_DIR}/html.log
238 -t ${DOC_TAG}
239 ${SPHINXOPTS}
240 ${DOCS_SRC_DIR}
241 ${DOCS_HTML_DIR}
Gerard Marull-Paretasbf5065d2021-05-10 18:29:04 +0200242 USES_TERMINAL
Carles Cufiae699342018-07-09 14:12:17 +0200243)
Carles Cufi78964512018-07-15 18:49:37 +0200244
Gerard Marull-Paretas2f1932c2021-06-16 22:30:23 +0200245add_dependencies(html devicetree kconfig)
246
Daniel Leung9945e7f2018-08-23 11:11:11 -0700247#
248# LaTEX section
249#
Marti Bolivard9f512c2018-10-09 14:24:34 -0600250set(SPHINX_BUILD_LATEX_COMMAND
251 ${CMAKE_COMMAND} -E env
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +0200252 ZEPHYR_BASE=${ZEPHYR_BASE}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600253 ZEPHYR_BUILD=${CMAKE_CURRENT_BINARY_DIR}
Gerard Marull-Paretas457f3a42021-04-16 10:47:43 +0200254 DOXYGEN_EXECUTABLE=${DOXYGEN_EXECUTABLE}
Gerard Marull-Paretasa140a242021-06-08 11:18:27 +0200255 ${SPHINXBUILD} -t ${DOC_TAG} -b latex -c ${CMAKE_CURRENT_LIST_DIR} -t svgconvert ${ALLSPHINXOPTS} ${RST_OUT} ${SPHINX_OUTPUT_DIR_LATEX})
Marti Bolivard9f512c2018-10-09 14:24:34 -0600256
257# The sphinx-latex target works similarly to sphinx-html, and carries
258# the same warnings.
259add_custom_target(
260 sphinx-latex
261 COMMAND ${SPHINX_BUILD_LATEX_COMMAND}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600262 COMMENT "Just re-generating LaTeX (USE WITH CAUTION)"
Marc Herberte3c50af2020-10-07 06:59:33 +0000263 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600264 USES_TERMINAL
265)
Marc Herberte3c50af2020-10-07 06:59:33 +0000266
Marti Bolivard9f512c2018-10-09 14:24:34 -0600267
Daniel Leungc164c8e2018-09-10 17:29:20 -0700268add_custom_command(
269 OUTPUT ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.tex
Marti Bolivard9f512c2018-10-09 14:24:34 -0600270 COMMAND ${SPHINX_BUILD_LATEX_COMMAND}
Daniel Leung9945e7f2018-08-23 11:11:11 -0700271 COMMAND ${PYTHON_EXECUTABLE} ${FIX_TEX_SCRIPT} ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.tex
272 WORKING_DIRECTORY ${CMAKE_CURRENT_LIST_DIR}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600273 COMMENT "Generating LaTeX documentation"
Gerard Marull-Paretasbf5065d2021-05-10 18:29:04 +0200274 USES_TERMINAL
Daniel Leungc164c8e2018-09-10 17:29:20 -0700275)
276
277add_custom_target(
278 latex
279 DEPENDS ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.tex
Daniel Leung9945e7f2018-08-23 11:11:11 -0700280)
281
282#
283# PDF section
284#
285if(NOT ${LATEXMK} STREQUAL LATEXMK-NOTFOUND)
286
287add_custom_command(
288 OUTPUT ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.pdf
289 DEPENDS latexdocs ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.tex
290 COMMAND ${CMAKE_COMMAND} -E env
Carles Cufi0698dba2018-10-02 10:30:39 +0200291 LATEXOPTS="-halt-on-error -no-shell-escape"
Daniel Leung9945e7f2018-08-23 11:11:11 -0700292 ${LATEXMK} -quiet -pdf -dvi- -ps-
293 WORKING_DIRECTORY ${SPHINX_OUTPUT_DIR_LATEX}
Marti Bolivard9f512c2018-10-09 14:24:34 -0600294 COMMENT "Generating PDF documentation"
Daniel Leung9945e7f2018-08-23 11:11:11 -0700295)
296
297if(NOT DEFINED SPHINX_OUTPUT_DIR)
298# Although latexmk allows specifying output directory,
299# makeindex fails if one is specified.
300# Hence the need of this to copy the PDF file over.
301add_custom_command(
302 OUTPUT ${SPHINX_OUTPUT_DIR_PDF}/zephyr.pdf
303 COMMAND ${CMAKE_COMMAND} -E make_directory ${SPHINX_OUTPUT_DIR_PDF}
304 COMMAND ${CMAKE_COMMAND} -E copy ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.pdf ${SPHINX_OUTPUT_DIR_PDF}/zephyr.pdf
305 DEPENDS ${SPHINX_OUTPUT_DIR_LATEX}/zephyr.pdf
306)
307endif()
308
309add_custom_target(
310 pdf
311 DEPENDS ${SPHINX_OUTPUT_DIR_PDF}/zephyr.pdf
Daniel Leung9945e7f2018-08-23 11:11:11 -0700312)
313
314endif()
315
316#
317# Dependencies and final targets
318#
Carles Cufi78964512018-07-15 18:49:37 +0200319
Gerard Marull-Paretas4dd15532021-05-10 19:11:14 +0200320add_dependencies(latex kconfig devicetree)
Daniel Leung9945e7f2018-08-23 11:11:11 -0700321
322add_custom_target(
323 latexdocs
324)
325add_dependencies(latexdocs latex)
326
327if(NOT ${LATEXMK} STREQUAL LATEXMK-NOTFOUND)
328
329add_custom_target(
330 pdfdocs
Daniel Leungc164c8e2018-09-10 17:29:20 -0700331 DEPENDS latexdocs pdf
Daniel Leung9945e7f2018-08-23 11:11:11 -0700332)
333add_dependencies(pdfdocs pdf)
334
335endif()