| 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() |