| #!/bin/bash | |
| #===-- build-docs.sh - Tag the LLVM release candidates ---------------------===# | |
| # | |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| # See https://llvm.org/LICENSE.txt for license information. | |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| # | |
| #===------------------------------------------------------------------------===# | |
| # | |
| # Build documentation for LLVM releases. | |
| # | |
| # Required Packages: | |
| # * Fedora: | |
| # * dnf install doxygen texlive-epstopdf ghostscript \ | |
| # ninja-build gcc-c++ | |
| # * pip install --user -r ./llvm/docs/requirements.txt | |
| # * Ubuntu: | |
| # * apt-get install doxygen \ | |
| # ninja-build graphviz texlive-font-utils | |
| # * pip install --user -r ./llvm/docs/requirements.txt | |
| #===------------------------------------------------------------------------===# | |
| set -e | |
| builddir=docs-build | |
| srcdir=$(readlink -f $(dirname "$(readlink -f "$0")")/../..) | |
| usage() { | |
| echo "Build the documentation for an LLVM release. This only needs to be " | |
| echo "done for -final releases." | |
| echo "usage: `basename $0`" | |
| echo " " | |
| echo " -release <num> Fetch the tarball for release <num> and build the " | |
| echo " documentation from that source." | |
| echo " -srcdir <dir> Path to llvm source directory with CMakeLists.txt" | |
| echo " (optional) default: $srcdir" | |
| echo " -no-doxygen Don't build Doxygen docs" | |
| echo " -no-sphinx Don't build Spinx docs" | |
| echo " -no-man-pages Don't build man pages" | |
| } | |
| package_doxygen() { | |
| project=$1 | |
| proj_dir=$2 | |
| output=${project}_doxygen-$release | |
| mv $builddir/$proj_dir/docs/doxygen/html $output | |
| tar -cJf $output.tar.xz $output | |
| } | |
| while [ $# -gt 0 ]; do | |
| case $1 in | |
| -release ) | |
| shift | |
| release=$1 | |
| ;; | |
| -srcdir ) | |
| shift | |
| custom_srcdir=$1 | |
| ;; | |
| -no-doxygen ) | |
| no_doxygen="yes" | |
| ;; | |
| -no-sphinx ) | |
| no_sphinx="yes" | |
| ;; | |
| -no-man-pages ) | |
| no_man_pages="yes" | |
| ;; | |
| * ) | |
| echo "unknown option: $1" | |
| usage | |
| exit 1 | |
| ;; | |
| esac | |
| shift | |
| done | |
| if [ -n "$release" -a -n "$custom_srcdir" ]; then | |
| echo "error: Cannot specify both -srcdir and -release options" | |
| exit 1 | |
| fi | |
| if [ -n "$custom_srcdir" ]; then | |
| srcdir="$custom_srcdir" | |
| fi | |
| # Set default source directory if one is not supplied | |
| if [ -n "$release" ]; then | |
| git_ref=llvmorg-$release | |
| if [ -d llvm-project ]; then | |
| echo "error llvm-project directory already exists" | |
| exit 1 | |
| fi | |
| mkdir -p llvm-project | |
| pushd llvm-project | |
| curl -L https://github.com/llvm/llvm-project/archive/$git_ref.tar.gz | tar --strip-components=1 -xzf - | |
| popd | |
| srcdir="./llvm-project/llvm" | |
| fi | |
| if [ "$no_doxygen" == "yes" ] && [ "$no_sphinx" == "yes" ] && [ "$no_man_pages" == "yes" ]; then | |
| echo "You can't specify -no-doxygen, -no-sphinx, and -no-man_pages, we have nothing to build then!" | |
| exit 1 | |
| fi | |
| # Try to determine the release from the current git directory if none is given | |
| # and format it like this: 23.0.0-gc823de88d51f58 | |
| if [ -z "$release" ]; then | |
| release=$(git -C $srcdir show HEAD:cmake/Modules/LLVMVersion.cmake | grep -ioP 'set\(\s*LLVM_VERSION_(MAJOR|MINOR|PATCH)\s\K[0-9]+' | paste -sd '.') | |
| git_rev=$(git rev-parse HEAD) | |
| release="$release-g${git_rev:0:14}" | |
| fi | |
| if [ "$no_sphinx" != "yes" ]; then | |
| echo "Sphinx: enabled" | |
| sphinx_targets="docs-clang-html docs-clang-tools-html docs-flang-html docs-lld-html docs-llvm-html docs-polly-html" | |
| sphinx_flag=" -DLLVM_ENABLE_SPHINX=ON -DSPHINX_WARNINGS_AS_ERRORS=OFF" | |
| else | |
| echo "Sphinx: disabled" | |
| fi | |
| if [ "${no_man_pages}" != "yes" ]; then | |
| echo "Man pages: enabled" | |
| man_page_targets="install-docs-clang-man install-docs-clang-tools-man install-docs-dsymutil-man install-docs-flang-man install-docs-lldb-man install-docs-llvm-dwarfdump-man install-docs-llvm-man install-docs-polly-man" | |
| install_prefix=${builddir}/install | |
| man_page_flag=" -DLLVM_ENABLE_SPHINX=ON -DSPHINX_WARNINGS_AS_ERRORS=OFF -DSPHINX_OUTPUT_MAN:BOOL=ON -DCMAKE_INSTALL_PREFIX=${install_prefix}" | |
| extra_man_page_projects=";lldb;mlir;bolt" | |
| extra_man_page_runtimes=";compiler-rt;openmp;" | |
| else | |
| echo "Man pages: disabled" | |
| fi | |
| if [ "$no_doxygen" != "yes" ]; then | |
| echo "Doxygen: enabled" | |
| doxygen_targets="$docs_target doxygen-clang doxygen-clang-tools doxygen-flang doxygen-llvm doxygen-mlir doxygen-polly" | |
| doxygen_flag=" -DLLVM_ENABLE_DOXYGEN=ON" | |
| else | |
| echo "Doxygen: disabled" | |
| fi | |
| cmake -G Ninja $srcdir -B $builddir \ | |
| -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;polly;flang${extra_man_page_projects}" \ | |
| -DCMAKE_BUILD_TYPE=Release \ | |
| -DLLVM_BUILD_DOCS=ON \ | |
| $sphinx_flag \ | |
| $doxygen_flag \ | |
| $man_page_flag | |
| ninja -C $builddir $sphinx_targets $doxygen_targets $man_page_targets | |
| cmake -G Ninja $srcdir/../runtimes -B $builddir/runtimes-doc \ | |
| -DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;${extra_man_page_runtimes}" \ | |
| -DLLVM_ENABLE_SPHINX=ON \ | |
| -DLLVM_BUILD_DOCS=ON \ | |
| -DSPHINX_WARNINGS_AS_ERRORS=OFF | |
| ninja -C $builddir/runtimes-doc \ | |
| docs-libcxx-html | |
| if [ "${no_man_page}" != "yes" ]; then | |
| output="llvm_man_pages-${release}" | |
| # The LLD man_page is not installed automatically even when running the | |
| # "install-docs-lld-man" target. | |
| cp -v ${srcdir}/../lld/docs/ld.lld.1 ${install_prefix}/share/man/man1 | |
| mv ${install_prefix}/share/man/man1 ${output} | |
| tar -cJf ${output}.tar.xz ${output} | |
| fi | |
| if [ "$no_doxygen" != "yes" ]; then | |
| package_doxygen llvm . | |
| package_doxygen clang tools/clang | |
| package_doxygen clang-tools-extra tools/clang/tools/extra | |
| package_doxygen flang tools/flang | |
| fi | |
| if [ "$no_sphinx" == "yes" ]; then | |
| exit 0 | |
| fi | |
| html_dir=$builddir/html-export/ | |
| for d in docs/ tools/clang/docs/ tools/lld/docs/ tools/clang/tools/extra/docs/ tools/polly/docs/ tools/flang/docs/; do | |
| mkdir -p $html_dir/$d | |
| mv $builddir/$d/html/* $html_dir/$d/ | |
| done | |
| # Keep the documentation for the runtimes under /projects/ to avoid breaking existing links. | |
| for d in libcxx/docs/; do | |
| mkdir -p $html_dir/projects/$d | |
| mv $builddir/runtimes-doc/$d/html/* $html_dir/projects/$d/ | |
| done |