#!/bin/sh -e

python -m venv venv
. venv/bin/activate
pip install sphinx recommonmark

sed -i 's/!defined(_GCC_MAX_ALIGN_T)/& \&\& !defined(__DEFINED_max_align_t)/' libcxx/include/stddef.h
sed -i 's/set(COMPILER_RT_HAS_SANITIZER_COMMON TRUE)/set(COMPILER_RT_HAS_SANITIZER_COMMON FALSE)/' compiler-rt/cmake/config-ix.cmake
sed -i 's|\.lldb|.local/state/lldb|g' lldb/source/Host/common/Editline.cpp

export DESTDIR="$1"
cmake \
    -G "Ninja" \
    -B build \
    -DCLANG_DEFAULT_CXX_STDLIB=libc++ \
    -DCLANG_DEFAULT_RTLIB=compiler-rt \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_C_COMPILER=clang \
    -DCMAKE_INSTALL_PREFIX=/usr \
    -DCOMPILER_RT_EXCLUDE_ATOMIC_BUILTIN=OFF \
    -DCOMPILER_RT_USE_BUILTINS_LIBRARY=ON \
    -DLIBCXXABI_USE_COMPILER_RT=ON \
    -DLIBCXXABI_USE_LLVM_UNWINDER=ON \
    -DLIBCXX_CXX_ABI=libcxxabi \
    -DLIBCXX_HAS_ATOMIC_LIB=OFF \
    -DLIBCXX_HAS_MUSL_LIBC=ON \
    -DLIBCXX_USE_COMPILER_RT=ON \
    -DLIBUNWIND_USE_COMPILER_RT=ON \
    -DLLDB_ENABLE_CURSES=ON \
    -DLLDB_ENABLE_LIBEDIT=ON \
    -DLLVM_BUILD_DOCS=ON \
    -DLLVM_BUILD_EXAMPLES=OFF \
    -DLLVM_BUILD_LLVM_DYLIB=ON \
    -DLLVM_BUILD_TESTS=OFF \
    -DLLVM_ENABLE_EH=ON \
    -DLLVM_ENABLE_LIBCXX=ON \
    -DLLVM_ENABLE_LIBEDIT=ON \
    -DLLVM_ENABLE_LIBXML2=OFF \
    -DLLVM_ENABLE_PROJECTS="clang;compiler-rt;libunwind;libcxxabi;libcxx;lld;lldb" \
    -DLLVM_ENABLE_RTTI=ON \
    -DLLVM_ENABLE_SPHINX=ON \
    -DLLVM_ENABLE_TERMINFO=OFF \
    -DLLVM_HOST_TRIPLE="$(clang -dumpmachine)" \
    -DLLVM_INCLUDE_DOCS=ON \
    -DLLVM_INSTALL_BINUTILS_SYMLINKS=ON \
    -DLLVM_LINK_LLVM_DYLIB=ON \
    -DLLVM_TARGETS_TO_BUILD="host;AMDGPU" \
    -DSPHINX_OUTPUT_MAN=ON \
    -DSPHINX_WARNINGS_AS_ERRORS=OFF \
    -Wno-dev \
    llvm

cmake --build build
cmake --install build

# libc++abi header files
mkdir -p "$1/usr"
cp -r libcxxabi/include "$1/usr"

ln -s ld.lld "$1/usr/bin/ld"
ln -s clang "$1/usr/bin/cc"
ln -s clang++ "$1/usr/bin/c++"
ln -s clang++ "$1/usr/bin/cpp"

for i in \
    llvm-addr2line \
    llvm-ar \
    llvm-as \
    llvm-dlltool \
    llvm-nm \
    llvm-objdump \
    llvm-ranlib \
    llvm-readelf \
    llvm-size \
    llvm-strings \
    llvm-strip
    do
        to="$1/usr/bin/$(printf %s "$i" | cut -d "-" -f 2)"
        ln -sf "/usr/bin/$i" "$to"
done

install -m755 c99 "$1/usr/bin/c99"

# Clang: Override libexec, the path is hardcoded, unfortunately.
mv -f "$1/usr/libexec/ccc-analyzer" "$1/usr/lib/clang"
mv -f "$1/usr/libexec/c++-analyzer" "$1/usr/lib/clang"
rmdir "$1/usr/libexec"
sed -i "s|libexec|lib/clang|" "$1/usr/bin/scan-build"

rm -rf \
    "$1/usr/share/opt-viewer" \
    "$1/usr/share/scan-view" \
    "$1/usr/share/scan-build" \
