if (LLVM_ENABLE_SPHINX) include(AddSphinxTarget) if (SPHINX_FOUND) if (${SPHINX_OUTPUT_HTML}) # Similar to clang, we copy our static .rst files from libc/docs/ to the # $build_dir/libc/docs/. That way, we can have a mix of both static # (committed) .rst files, and dynamically generated .rst files. We don't # want the dynamically generated .rst files to pollute the source tree. add_custom_target(copy-libc-rst-docs COMMAND "${CMAKE_COMMAND}" -E copy_directory "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}" COMMAND "${CMAKE_COMMAND}" -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/../Maintainers.rst" "${CMAKE_CURRENT_BINARY_DIR}" ) # For headers that are nested in directories, we need to # `mkdir $build_dir/libc/docs/headers/$dir` since the above copy_directory # command does not create such copies. Otherwise, the invocation of docgen # below will fail since the output file would be placed in a directory that # does not exist, leading to a `No such file or directory` error from the # shell. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/headers/arpa/" "${CMAKE_CURRENT_BINARY_DIR}/headers/net/" "${CMAKE_CURRENT_BINARY_DIR}/headers/netinet/" "${CMAKE_CURRENT_BINARY_DIR}/headers/sys/" ) # Change sphinx to build from $build_dir/libc/docs/ rather than # llvm-project/libc/docs/. add_sphinx_target(html libc SOURCE_DIR "${CMAKE_CURRENT_BINARY_DIR}") # Depend on the copy target. add_dependencies(docs-libc-html copy-libc-rst-docs) # Maintain a list of headers for which we dynamically generate html docs # for via docgen. For more complex docs (such as per arch support, a la # math.h), those should be omitted and exist statically in # libc/docs/headers/. list(APPEND docgen_list aio arpa/inet assert cpio ctype dirent endian errno fenv float glob inttypes locale net/if netinet/in # TODO: https://github.com/llvm/llvm-project/issues/123821 # pthread setjmp signal stdbit stdio stdlib string strings sys/mman sys/resource sys/stat sys/statvfs sys/time sys/utsname sys/wait termios threads uchar unistd wchar wctype ) foreach(stem IN LISTS docgen_list) # It is an error in cmake to have a target name that contains a "/", but # docgen relies on the "/" to find headers nested under directories. # Replace with underscore. string(REPLACE "/" "_" stem_rst ${stem}) # docgen invocation. add_custom_target(${stem_rst} COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../utils/docgen/docgen.py ${stem}.h > ${CMAKE_CURRENT_BINARY_DIR}/headers/${stem}.rst) # depend on the docgen invocation. add_dependencies(docs-libc-html ${stem_rst}) endforeach() endif() endif() endif()