Skip to content

Instantly share code, notes, and snippets.

@ekpyron
Created August 17, 2024 20:11
Show Gist options
  • Save ekpyron/36d56b02f15892c5d6db92a3e44aae52 to your computer and use it in GitHub Desktop.
Save ekpyron/36d56b02f15892c5d6db92a3e44aae52 to your computer and use it in GitHub Desktop.
#!/bin/bash -e
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
git clone --depth 1 https://github.com/llvm/llvm-project.git
wget -q --show-progress https://gist.githubusercontent.com/ekpyron/07d3796f27527b41784546df20200fda/raw/c02b9495bd12c8f3ff9df8604508dce6a4cef574/clang-format.patch
sha256sum -c - << EOF
b3e9ac13fa34c0502fce4f171d2d354a5c2bdfc305f9d4817c338c35cec5d873 clang-format.patch
EOF
cd llvm-project
pushd llvm
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
# 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