Skip to content

Instantly share code, notes, and snippets.

@ekpyron
Created August 17, 2024 19:38
Show Gist options
  • Save ekpyron/acec5b073eae21bdde426427664ada9b to your computer and use it in GitHub Desktop.
Save ekpyron/acec5b073eae21bdde426427664ada9b to your computer and use it in GitHub Desktop.
#!/bin/bash -e
LLVM_VERSION=18.1.8
MAKEFLAGS=-j16
if [ $# -ne 1 ]; then
echo "Usage: $0 /path/to/output/clang-format"
exit 1
fi
OUTPUT="$1"
if [ -e "$OUTPUT" ]; then
echo "$OUTPUT already exists."
exit 1
fi
if touch "$OUTPUT"; then
OUTPUT="$(realpath "$OUTPUT")"
rm "$OUTPUT"
else
echo "Cannot write to $OUTPUT."
exit 1
fi
echo "Output will be written to: $OUTPUT"
WORKDIR=$(mktemp -d)
function cleanup()
{
if [ -d $WORKDIR ]; then
echo "Leaving partial build behind in $WORKDIR."
fi
}
trap cleanup EXIT
pushd $WORKDIR
wget -q --show-progress https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/cmake-${LLVM_VERSION}.src.tar.xz -O cmake.tar.xz
wget -q --show-progress https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz -O llvm.tar.xz
wget -q --show-progress https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/clang-${LLVM_VERSION}.src.tar.xz -O clang.tar.xz
wget -q --show-progress https://gist.githubusercontent.com/ekpyron/07d3796f27527b41784546df20200fda/raw/c02b9495bd12c8f3ff9df8604508dce6a4cef574/clang-format.patch
sha256sum -c - << EOF
5724fe0a13087d5579104cedd2f8b3bc10a212fb79a0fcdac98f4880e19f4519 clang.tar.xz
b3e9ac13fa34c0502fce4f171d2d354a5c2bdfc305f9d4817c338c35cec5d873 clang-format.patch
59badef592dd34893cd319d42b323aaa990b452d05c7180ff20f23ab1b41e837 cmake.tar.xz
f68cf90f369bc7d0158ba70d860b0cb34dbc163d6ff0ebc6cfa5e515b9b2e28d llvm.tar.xz
EOF
tar -xf clang.tar.xz
tar -xf cmake.tar.xz
tar -xf llvm.tar.xz
rename -v -- "-${LLVM_VERSION}.src" '' cmake-${LLVM_VERSION}.src
pushd llvm-${LLVM_VERSION}.src
mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$WORKDIR \
-DCMAKE_PREFIX_PATH=$WORKDIR \
-DLLVM_BUILD_STATIC=ON \
-DLLVM_BUILD_TOOLS=OFF \
-DLLVM_ENABLE_LIBEDIT=OFF \
-DLLVM_ENABLE_LIBPFM=OFF \
-DLLVM_ENABLE_LIBXML2=OFF \
-DLLVM_ENABLE_OCAMLDOC=OFF \
-DLLVM_ENABLE_PLUGINS=OFF \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_ZLIB=OFF \
-DLLVM_ENABLE_ZSTD=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_INCLUDE_DOCS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_INCLUDE_TESTS=OFF \
-DLLVM_INCLUDE_TOOLS=OFF \
-DLLVM_INCLUDE_UTILS=OFF \
..
ninja
sed -i -e 's/EXISTS "\$ENV{DESTDIR}\${CMAKE_INSTALL_PREFIX}\/bin\/llvm-tblgen"/FALSE/' utils/TableGen/cmake_install.cmake
ninja install
popd
pushd clang-${LLVM_VERSION}.src
# clang builds have issues with some locale settings
export LC_ALL=C
export LC_ADDRESS=C
export LC_MEASUREMENT=C
export LC_MONETARY=C
export LC_NAME=C
export LC_NUMERIC=C
export LC_PAPER=C
export LC_TELEPHONE=C
export LC_TIME=C
patch -Np1 -i ../clang-format.patch
mkdir build
cd build
cmake \
-G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=$WORKDIR \
-DCMAKE_PREFIX_PATH=$WORKDIR \
-DCLANG_LINK_CLANG_DYLIB=OFF \
-DLLVM_BUILD_STATIC=ON \
-DENABLE_LINKER_BUILD_ID=ON \
-DLLVM_BUILD_DOCS=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_ENABLE_RTTI=OFF \
-DLLVM_ENABLE_SPHINX=OFF \
-DLIBCLANG_BUILD_STATIC=ON \
-DLLVM_ENABLE_LIBXML2=OFF \
-DCLANG_ENABLE_LIBXML2=OFF \
-DCLANG_INCLUDE_TESTS=OFF \
-DCLANG_PLUGIN_SUPPORT=OFF \
-DLLVM_EXTERNAL_LIT=/usr/bin/lit \
-DLLVM_INCLUDE_DOCS=OFF \
-DLLVM_LINK_LLVM_DYLIB=OFF \
-DBUILD_SHARED_LIBS=OFF \
-DCLANG_ENABLE_ARCMT=OFF \
-DLLVM_LIBRARY_DIR="${WORKDIR}"/lib \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \
-DLLVM_MAIN_SRC_DIR="${WORKDIR}/llvm-${LLVM_VERSION}.src" \
-DCMAKE_CXX_FLAGS="-s -flto" \
-DSPHINX_WARNINGS_AS_ERRORS=OFF \
-DCMAKE_EXE_LINKER_FLAGS=-static \
-DLLVM_INCLUDE_TESTS=OFF \
..
ninja clang-format
install -m755 bin/clang-format "$OUTPUT"
popd
popd
rm -rf $WORKDIR
echo
echo "Successfully built patched static clang-format at $OUTPUT."
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment