1find_package(Doxygen QUIET)
2if (PICO_SDK_TOP_LEVEL_PROJECT AND ${DOXYGEN_FOUND})
3    set(PICO_BUILD_DOCS_DEFAULT 1)
4endif()
5option(PICO_BUILD_DOCS "Build HTML Doxygen docs" ${PICO_BUILD_DOCS_DEFAULT})
6
7if (DEFINED ENV{PICO_EXAMPLES_PATH} AND NOT PICO_EXAMPLES_PATH)
8    set(PICO_EXAMPLES_PATH $ENV{PICO_EXAMPLES_PATH})
9    message("Using PICO_EXAMPLES_PATH from environment ('${PICO_EXAMPLES_PATH}')")
10endif()
11
12if(PICO_BUILD_DOCS)
13    if(NOT DOXYGEN_FOUND)
14        message(FATAL_ERROR "Doxygen is needed to build the documentation.")
15    endif()
16
17    include(ExternalProject)
18
19    if(PICO_EXAMPLES_PATH)
20        get_filename_component(PICO_EXAMPLES_PATH "${PICO_EXAMPLES_PATH}" REALPATH BASE_DIR "${CMAKE_BINARY_DIR}")
21        if (EXISTS ${PICO_EXAMPLES_PATH})
22            message("Documentation example code will come from ${PICO_EXAMPLES_PATH}")
23        else()
24            message(WARNING "Documentation example code configured to come from ${PICO_EXAMPLES_PATH}, but that path does not exist")
25        endif()
26        add_custom_target(doc-pico-examples)
27    else()
28        ExternalProject_Add(doc-pico-examples
29                GIT_REPOSITORY    https://github.com/raspberrypi/pico-examples
30                GIT_TAG           master
31                CONFIGURE_COMMAND ""
32                BUILD_COMMAND ""
33                INSTALL_COMMAND ""
34                )
35        ExternalProject_Get_property(doc-pico-examples SOURCE_DIR)
36        ExternalProject_Get_property(doc-pico-examples GIT_REPOSITORY)
37        ExternalProject_Get_property(doc-pico-examples GIT_TAG)
38        set(PICO_EXAMPLES_PATH ${SOURCE_DIR})
39        message("Documentation example code will come from git repo ${GIT_REPOSITORY}, branch ${GIT_TAG}")
40    endif()
41
42    set(DOXY_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doxygen")
43    string(REPLACE ";" " " DOXY_INPUT_DIRS "${PICO_DOXYGEN_PATHS}")
44    string(REPLACE ";" " " DOXY_EXCLUDE_DIRS "${PICO_DOXYGEN_EXCLUDE_PATHS}")
45    string(REPLACE ";" " " DOXY_PREDEFINED "${PICO_DOXYGEN_PRE_DEFINES}")
46    string(REPLACE ";" " " DOXY_ENABLED_SECTIONS "${PICO_DOXYGEN_ENABLED_SECTIONS}")
47    set(DOXY_EXAMPLE_DIR "${PICO_EXAMPLES_PATH}")
48    # auto genereate additional section enables from library paths
49    foreach (DIR IN LISTS PICO_DOXYGEN_PATHS)
50        get_filename_component(NAME "${DIR}" NAME)
51        if (NOT DIR STREQUAL "src")
52            set(DOXY_ENABLED_SECTIONS "${DOXY_ENABLED_SECTIONS} ${NAME}")
53        endif()
54    endforeach ()
55    set(doxyfile_in ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in)
56    set(doxyfile ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
57
58    if (PICO_PLATFORM STREQUAL "rp2040")
59        set(PICO_DOXYGEN_TAG "(RP2040)")
60    elseif (PICO_PLATFORM STREQUAL "rp2350-arm-s" OR PICO_PLATFORM STREQUAL "rp2350-riscv")
61        set(PICO_DOXYGEN_TAG "(RP2350)")
62    endif()
63    configure_file(${doxyfile_in} ${doxyfile} @ONLY)
64
65    add_custom_target(docs
66            COMMAND ${DOXYGEN_EXECUTABLE} ${doxyfile}
67            WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
68            COMMENT "Generating API documentation with Doxygen"
69            VERBATIM)
70
71    add_dependencies(docs doc-pico-examples)
72endif()
73