Files
composable_kernel/cmake/SetupDocs.cmake
Philip Maybank 69829de237 Improve build infrastructure for generating doc
- Add CMake documentation infrastructure with auto Python venv management
- Enable streamlined docs build: cmake --build . --target docs
2025-11-13 14:28:56 +00:00

109 lines
4.1 KiB
CMake

function(setup_documentation)
# Find Python executable
find_package(Python3 REQUIRED COMPONENTS Interpreter)
# Check for existing virtual environment in ~/python-env
set(HOME_VENV "$ENV{HOME}/python-env/venv-1")
set(BUILD_VENV "${CMAKE_BINARY_DIR}/python-env")
if(EXISTS "${HOME_VENV}/bin/python3")
set(PYTHON_VENV "${HOME_VENV}")
set(PYTHON_EXECUTABLE "${HOME_VENV}/bin/python3")
set(VENV_IS_NEW FALSE)
message(STATUS "Using existing Python virtual environment: ${HOME_VENV}")
else()
set(PYTHON_VENV "${BUILD_VENV}")
set(PYTHON_EXECUTABLE "${BUILD_VENV}/bin/python3")
set(VENV_IS_NEW TRUE)
message(STATUS "Will create Python virtual environment: ${BUILD_VENV}")
endif()
# Create virtual environment if it doesn't exist
if(NOT EXISTS "${PYTHON_EXECUTABLE}")
message(STATUS "Creating Python virtual environment...")
execute_process(
COMMAND ${Python3_EXECUTABLE} -m venv ${PYTHON_VENV}
RESULT_VARIABLE VENV_RESULT
)
if(NOT VENV_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to create Python virtual environment")
endif()
set(VENV_IS_NEW TRUE)
endif()
# Set requirements file path
set(REQUIREMENTS_FILE "${CMAKE_SOURCE_DIR}/docs/sphinx/requirements.txt")
# Only install packages if we created a new virtual environment
if(VENV_IS_NEW)
message(STATUS "Installing Python documentation requirements in new virtual environment...")
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -m pip install --upgrade pip
RESULT_VARIABLE PIP_RESULT
)
if(NOT PIP_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to upgrade pip")
endif()
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -m pip install -r ${REQUIREMENTS_FILE}
RESULT_VARIABLE PIP_RESULT
)
if(NOT PIP_RESULT EQUAL 0)
message(FATAL_ERROR "Failed to install Python documentation requirements")
endif()
message(STATUS "Python documentation requirements installed successfully")
endif()
# Create dummy target (no build-time package installation needed)
add_custom_target(docs_venv
COMMENT "Python virtual environment ready"
)
# Set up Doxygen
find_package(Doxygen REQUIRED)
set(DOXYGEN_OUTPUT_DIR "${CMAKE_BINARY_DIR}/docs/doxygen")
set(DOXYGEN_CONFIG_FILE "${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile")
add_custom_command(
OUTPUT "${DOXYGEN_OUTPUT_DIR}/xml/index.xml"
COMMAND ${CMAKE_COMMAND} -E make_directory ${DOXYGEN_OUTPUT_DIR}
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CONFIG_FILE}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/doxygen
DEPENDS ${DOXYGEN_CONFIG_FILE}
COMMENT "Building Doxygen XML documentation"
)
add_custom_target(docs_doxygen
DEPENDS "${DOXYGEN_OUTPUT_DIR}/xml/index.xml"
)
# Set up Sphinx
set(SPHINX_OUTPUT_DIR "${CMAKE_BINARY_DIR}/docs/html")
set(SPHINX_SOURCE_DIR "${CMAKE_SOURCE_DIR}/docs")
# Set number of parallel jobs for Sphinx (default to 8 if not set)
if(NOT CMAKE_BUILD_PARALLEL_LEVEL)
set(CMAKE_BUILD_PARALLEL_LEVEL 8)
endif()
add_custom_target(docs
COMMAND ${PYTHON_EXECUTABLE} -m sphinx -b html -j ${CMAKE_BUILD_PARALLEL_LEVEL} ${SPHINX_SOURCE_DIR} ${SPHINX_OUTPUT_DIR}
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
DEPENDS docs_venv docs_doxygen
COMMENT "Building HTML documentation with Sphinx"
)
# Add clean target for docs
add_custom_target(docs_clean
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}/docs
COMMENT "Cleaning documentation build files"
)
message(STATUS "Documentation build configured:")
message(STATUS " Build command: cmake --build . --target docs")
message(STATUS " Clean command: cmake --build . --target docs_clean")
message(STATUS " Output directory: ${SPHINX_OUTPUT_DIR}")
endfunction()