1include(GNUInstallDirs) 2 3# Create sphinx target 4if (LLVM_ENABLE_SPHINX) 5 message(STATUS "Sphinx enabled.") 6 find_package(Sphinx REQUIRED) 7 if (LLVM_BUILD_DOCS AND NOT TARGET sphinx) 8 add_custom_target(sphinx ALL) 9 endif() 10else() 11 message(STATUS "Sphinx disabled.") 12endif() 13 14 15# Handy function for creating the different Sphinx targets. 16# 17# ``builder`` should be one of the supported builders used by 18# the sphinx-build command. 19# 20# ``project`` should be the project name 21# 22# Named arguments: 23# ``ENV_VARS`` should be a list of environment variables that should be set when 24# running Sphinx. Each environment variable should be a string with 25# the form KEY=VALUE. 26function (add_sphinx_target builder project) 27 cmake_parse_arguments(ARG "" "SOURCE_DIR" "ENV_VARS" ${ARGN}) 28 set(SPHINX_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/${builder}") 29 set(SPHINX_DOC_TREE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees-${project}-${builder}") 30 set(SPHINX_TARGET_NAME docs-${project}-${builder}) 31 32 if (SPHINX_WARNINGS_AS_ERRORS) 33 set(SPHINX_WARNINGS_AS_ERRORS_FLAG "-W") 34 else() 35 set(SPHINX_WARNINGS_AS_ERRORS_FLAG "") 36 endif() 37 38 if (NOT ARG_SOURCE_DIR) 39 set(ARG_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") 40 endif() 41 42 if ("${LLVM_VERSION_SUFFIX}" STREQUAL "git") 43 set(PreReleaseTag "-tPreRelease") 44 endif() 45 46 add_custom_target(${SPHINX_TARGET_NAME} 47 COMMAND ${CMAKE_COMMAND} -E env ${ARG_ENV_VARS} 48 ${SPHINX_EXECUTABLE} 49 -b ${builder} 50 -d "${SPHINX_DOC_TREE_DIR}" 51 -q # Quiet: no output other than errors and warnings. 52 -t builder-${builder} # tag for builder 53 -D version=${LLVM_VERSION_MAJOR} 54 -D release=${PACKAGE_VERSION} 55 ${PreReleaseTag} 56 ${SPHINX_WARNINGS_AS_ERRORS_FLAG} # Treat warnings as errors if requested 57 "${ARG_SOURCE_DIR}" # Source 58 "${SPHINX_BUILD_DIR}" # Output 59 COMMENT 60 "Generating ${builder} Sphinx documentation for ${project} into \"${SPHINX_BUILD_DIR}\"") 61 62 # When "clean" target is run, remove the Sphinx build directory 63 set_property(DIRECTORY APPEND PROPERTY 64 ADDITIONAL_MAKE_CLEAN_FILES 65 "${SPHINX_BUILD_DIR}") 66 67 # We need to remove ${SPHINX_DOC_TREE_DIR} when make clean is run 68 # but we should only add this path once 69 get_property(_CURRENT_MAKE_CLEAN_FILES 70 DIRECTORY PROPERTY ADDITIONAL_MAKE_CLEAN_FILES) 71 list(FIND _CURRENT_MAKE_CLEAN_FILES "${SPHINX_DOC_TREE_DIR}" _INDEX) 72 if (_INDEX EQUAL -1) 73 set_property(DIRECTORY APPEND PROPERTY 74 ADDITIONAL_MAKE_CLEAN_FILES 75 "${SPHINX_DOC_TREE_DIR}") 76 endif() 77 78 if (LLVM_BUILD_DOCS) 79 add_dependencies(sphinx ${SPHINX_TARGET_NAME}) 80 81 # Handle installation 82 if (NOT LLVM_INSTALL_TOOLCHAIN_ONLY) 83 if (builder STREQUAL man) 84 # FIXME: We might not ship all the tools that these man pages describe 85 install(DIRECTORY "${SPHINX_BUILD_DIR}/" # Slash indicates contents of 86 COMPONENT "${project}-sphinx-man" 87 DESTINATION "${CMAKE_INSTALL_MANDIR}/man1") 88 89 if(NOT LLVM_ENABLE_IDE) 90 add_llvm_install_targets("install-${SPHINX_TARGET_NAME}" 91 DEPENDS ${SPHINX_TARGET_NAME} 92 COMPONENT "${project}-sphinx-man") 93 endif() 94 elseif (builder STREQUAL html) 95 string(TOUPPER "${project}" project_upper) 96 set(${project_upper}_INSTALL_SPHINX_HTML_DIR "${CMAKE_INSTALL_DOCDIR}/${project}/html" 97 CACHE STRING "HTML documentation install directory for ${project}") 98 99 # '/.' indicates: copy the contents of the directory directly into 100 # the specified destination, without recreating the last component 101 # of ${SPHINX_BUILD_DIR} implicitly. 102 install(DIRECTORY "${SPHINX_BUILD_DIR}/." 103 COMPONENT "${project}-sphinx-html" 104 DESTINATION "${${project_upper}_INSTALL_SPHINX_HTML_DIR}") 105 106 if(NOT LLVM_ENABLE_IDE) 107 add_llvm_install_targets("install-${SPHINX_TARGET_NAME}" 108 DEPENDS ${SPHINX_TARGET_NAME} 109 COMPONENT "${project}-sphinx-html") 110 endif() 111 else() 112 message(WARNING Installation of ${builder} not supported) 113 endif() 114 endif() 115 endif() 116endfunction() 117