Skip to content

Build LLVM for r28c bolt;clang;clang-tools-extra;lld #39

Build LLVM for r28c bolt;clang;clang-tools-extra;lld

Build LLVM for r28c bolt;clang;clang-tools-extra;lld #39

name: Build LLVM (Windows)
run-name: Build LLVM for r${{inputs.version}}${{inputs.revision}} ${{inputs.projects}}
on:
workflow_dispatch:
inputs:
version:
description: "NDK Release version:"
default: "29"
required: true
revision:
description: "NDK Release revision:"
default: '-beta4'
required: true
type: string
projects:
description: "Projects to build:"
# bolt;clang;clang-tools-extra;compiler-rt;cross-project-tests;libc;libclc;lld;lldb;mlir;openmp;polly;pstl;flang
default: "bolt;clang;clang-tools-extra;lld"
required: true
permissions:
contents: write
actions: write
jobs:
build:
strategy:
fail-fast: false
matrix:
# thumb-windows-gnu
target: [aarch64-w64-mingw32, i686-w64-mingw32, x86_64-w64-mingw32]
runs-on: ubuntu-24.04
env:
ROOTDIR: ${{github.workspace}}
TARGET_BUILD_DIR: ${{github.workspace}}/build/${{matrix.target}}
TARGET_INSTALL_DIR: ${{github.workspace}}/output/${{matrix.target}}
steps:
- name: Maximize build space
uses: easimon/maximize-build-space@v10
with:
root-reserve-mb: 5120
swap-size-mb: 5120
remove-dotnet: true
remove-android: true
remove-haskell: true
remove-codeql: true
remove-docker-images: true
- name: Checkout llvm-custom
uses: actions/checkout@v4
with:
path: ${{github.workspace}}
- name: Checkout llvm-project and apply android patches
run: |
NDK_DIR="$ROOTDIR/android-ndk-r${{inputs.version}}${{inputs.revision}}"
LLVM_BIN="$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/bin"
CLANG_VERSION_CMD="$LLVM_BIN/clang --version"
CLANG_SOURCE_INFO="$NDK_DIR/toolchains/llvm/prebuilt/linux-x86_64/clang_source_info.md"
echo "Downloading NDK r${{inputs.version}}${{inputs.revision}}..."
curl -sSfL -o android-ndk.zip "https://dl.google.com/android/repository/android-ndk-r${{inputs.version}}${{inputs.revision}}-linux.zip"
unzip -qq android-ndk.zip -d $ROOTDIR
LLVM_VERSION=$($CLANG_VERSION_CMD | sed -n 's/.*clang version \([0-9][0-9.]*[a-zA-Z0-9]*\).*/\1/p')
LLVM_REV=$($CLANG_VERSION_CMD | sed -E 's/.*llvm-project ([a-f0-9]{40}).*/\1/' | head -n 1)
ANDROID_REV=$(grep 'llvm_android/+/.*' "$CLANG_SOURCE_INFO" | sed -n 's/.*llvm_android\/\+//; s/\/patches.*//p' | sed 's/\/\+//g; s/^\+//g' | head -n 1)
if [[ -z "$LLVM_VERSION" || -z "$LLVM_REV" || -z "$ANDROID_REV" ]]; then
echo "Error: Failed to extract necessary version/revision info."
exit 1
fi
echo "Downloading LLVM source (revision $LLVM_REV)..."
curl -sSfL -o llvm-project.tar.gz "https://android.googlesource.com/toolchain/llvm-project/+archive/$LLVM_REV.tar.gz"
tar -xf llvm-project.tar.gz
rm llvm-project.tar.gz
echo "Cloning llvm_android at commit $ANDROID_REV..."
git clone --quiet https://android.googlesource.com/toolchain/llvm_android ../llvm_android
cd ../llvm_android
git checkout --quiet $ANDROID_REV
cd $ROOTDIR
echo "Applying patches from llvm_android..."
mapfile -t PATCHES < <(grep -oP 'patches/\S+' "$CLANG_SOURCE_INFO" | sed 's/)$//')
for PATCH in ${PATCHES[@]}; do
echo "Applying $(basename "$PATCH")..."
if [[ -f "$ROOTDIR/../llvm_android/$PATCH" ]]; then
git apply "$ROOTDIR/../llvm_android/$PATCH" || true
elif [[ -f "$ROOTDIR/../llvm_android/cherry/$PATCH" ]]; then
git apply "$ROOTDIR/../llvm_android/cherry/$PATCH" || true
fi
done
rm -rf "$ROOTDIR/../llvm_android"
for PATCH in $ROOTDIR/patches/global/llvm/$LLVM_VERSION/*.patch; do
echo "Applying $(basename "$PATCH")..."
git apply "$PATCH"
done
echo "All patches applied successfully."
- name: Setup llvm-mingw
run: |
curl -LkSs https://github.com/mstorsjo/llvm-mingw/releases/download/20250924/llvm-mingw-20250924-ucrt-ubuntu-22.04-x86_64.tar.xz | xz -d | tar -x
mv llvm-mingw-20250924-ucrt-ubuntu-22.04-x86_64 llvm-mingw
- name: Install dependencies
run: sudo apt install -y ninja-build
- name: Build dependencies
run : |
TOOLCHAIN=${PWD}/llvm-mingw
export CC=${TOOLCHAIN}/bin/${{matrix.target}}-clang
export CXX=${TOOLCHAIN}/bin/${{matrix.target}}-clang++
export LD=${TOOLCHAIN}/bin/${{matrix.target}}-ld
export OBJCOPY=${TOOLCHAIN}/bin/${{matrix.target}}-objcopy
export AR=${TOOLCHAIN}/bin/${{matrix.target}}-ar
export RANLIB=${TOOLCHAIN}/bin/${{matrix.target}}-ranlib
export STRIP=${TOOLCHAIN}/bin/${{matrix.target}}-strip
rm -rf build output/ zlib/
if ! test -f "${TARGET_INSTALL_DIR}"/lib/libz.a; then
if ! test -d zlib; then
curl -LkSs https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.xz | xz -d | tar -x
mv zlib-1.3.1 zlib
fi
mkdir -p "${TARGET_BUILD_DIR}"/zlib
(
cd ${ROOTDIR}/zlib
./configure --prefix="${TARGET_INSTALL_DIR}" --static
make -j"$(nproc --all)" install
)
fi
curl -LkSs https://github.com/facebook/zstd/archive/refs/tags/v1.5.6.tar.gz -O
# we do it twice due to symlink errors
tar -xf v1.5.6.tar.gz || true
tar -xf v1.5.6.tar.gz || true
mv zstd-1.5.6 zstd
cmake -S "zstd/build/cmake" -B "${TARGET_BUILD_DIR}/zstd" -G Ninja \
-DCMAKE_INSTALL_PREFIX="${TARGET_INSTALL_DIR}" \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_C_FLAGS=$CFLAGS \
-DCMAKE_CXX_FLAGS=$CXXFLAGS \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_SYSTEM_NAME=Windows \
-DCMAKE_C_COMPILER=$CC \
-DCMAKE_CXX_COMPILER=$CXX \
-DCMAKE_ASM_COMPILER=$CC \
-DCMAKE_LINKER=$LD \
-DCMAKE_OBJCOPY=$OBJCOPY \
-DCMAKE_AR=$AR \
-DCMAKE_RANLIB=$RANLIB \
-DCMAKE_STRIP=$STRIP \
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
cmake --build "${TARGET_BUILD_DIR}/zstd" --target install
- name: Build LLVM
run: |
TOOLCHAIN=${PWD}/llvm-mingw
cmake -S "$ROOTDIR/llvm" -B "${TARGET_BUILD_DIR}" -G Ninja \
-DCMAKE_INSTALL_PREFIX="${ROOTDIR}/llvm-${{matrix.target}}" \
-DCMAKE_PREFIX_PATH="${TARGET_INSTALL_DIR}" \
-DLLVM_TARGETS_TO_BUILD="X86;AArch64;ARM;RISCV" \
-DCMAKE_BUILD_TYPE=MinSizeRel \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_SYSTEM_NAME=Windows \
-DLLVM_DEFAULT_TARGET_TRIPLE=${{matrix.target}} \
-DCMAKE_C_COMPILER="${TOOLCHAIN}/bin/${{matrix.target}}-clang" \
-DCMAKE_CXX_COMPILER="${TOOLCHAIN}/bin/${{matrix.target}}-clang++" \
-DCMAKE_ASM_COMPILER="${TOOLCHAIN}/bin/${{matrix.target}}-clang" \
-DCMAKE_LINKER="${TOOLCHAIN}/bin/${{matrix.target}}-ld" \
-DCMAKE_OBJCOPY="${TOOLCHAIN}/bin/${{matrix.target}}-objcopy" \
-DCMAKE_AR="${TOOLCHAIN}/bin/${{matrix.target}}-ar" \
-DCMAKE_RANLIB="${TOOLCHAIN}/bin/${{matrix.target}}-ranlib" \
-DCMAKE_STRIP="${TOOLCHAIN}/bin/${{matrix.target}}-strip" \
-DCMAKE_C_FLAGS="-static" \
-DCMAKE_CXX_FLAGS="-static" \
-DCMAKE_EXE_LINKER_FLAGS="-static" \
-DLLVM_ENABLE_PROJECTS="${{inputs.projects}}" \
-DLLVM_ENABLE_ZLIB=FORCE_ON \
-DLLVM_ENABLE_ZSTD=FORCE_ON \
-DLLVM_USE_STATIC_ZSTD=ON \
-DLLVM_BUILD_STATIC=ON \
-DCLANG_ENABLE_ARCMT=OFF \
-DLLVM_LINK_LLVM_DYLIB=OFF \
-DLIBCLANG_BUILD_STATIC=ON \
-DCMAKE_SKIP_INSTALL_RPATH=TRUE \
-DBUILD_SHARED_LIBS=OFF \
-DLLVM_INCLUDE_BENCHMARKS=OFF \
-DLLVM_BUILD_BENCHMARKS=OFF \
-DLLVM_INCLUDE_EXAMPLES=OFF \
-DLLVM_BUILD_EXAMPLES=OFF \
-DLLVM_BUILD_TESTS=OFF \
-DLLVM_BUILD_TOOLS=ON \
-DLLVM_INCLUDE_TESTS=OFF \
-DCLANG_INCLUDE_TESTS=OFF \
-DCLANG_BUILD_TESTS=OFF \
-DLLVM_TOOL_C_TEST_BUILD=OFF \
-DCLANG_TOOL_CLANG_IMPORT_TEST_BUILD=OFF \
-DCLANG_TOOL_APINOTES_TEST_BUILD=OFF \
-DCLANG_TOOL_ARCMT_TEST_BUILD=OFF \
-DCLANG_TOOL_C_ARCMT_TEST_BUILD=OFF \
-DCLANG_TOOL_C_INDEX_TEST_BUILD=OFF \
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DLLVM_ENABLE_PIC=OFF \
-DLLVM_ENABLE_LIBCXX=OFF \
-DLLVM_ENABLE_LLVM_LIBC=OFF \
-DLLVM_ENABLE_UNWIND_TABLES=OFF \
-DLLVM_ENABLE_EH=OFF \
-DLLVM_ENABLE_RTTI=OFF \
-DLLVM_ENABLE_LTO=OFF \
-DLLVM_ENABLE_TERMINFO=OFF \
-DLLVM_ENABLE_MODULES=OFF \
-DLLVM_ENABLE_PEDANTIC=OFF \
-DLLVM_ENABLE_FFI=OFF \
-DLLVM_ENABLE_LIBPFM=OFF \
-DLLVM_ENABLE_LIBEDIT=OFF \
-DLLVM_ENABLE_LIBXML2=OFF \
-DLLVM_ENABLE_CURL=OFF \
-DLLVM_ENABLE_THREADS=ON \
-DLLVM_VERSION_SUFFIX="" \
-DCLANG_VENDOR="Android" \
-DCLANG_REPOSITORY_STRING="https://github.com/${{ github.repository_owner }}/llvm-custom" \
-DPACKAGE_BUGREPORT="https://github.com/${{ github.repository_owner }}/android-ndk-custom/issues/"
cmake --build "${TARGET_BUILD_DIR}" --target install
- name: Check
run: |
file llvm-${{matrix.target}}/bin/*
tree llvm-${{matrix.target}}
- name: Compress
run: |
projects=$(echo "${{inputs.projects}}" | tr ";" "+")
tarball_name=${projects}-r${{inputs.version}}${{inputs.revision}}-${{matrix.target}}
echo tarball_name=${tarball_name} >> ${GITHUB_ENV}
mv llvm-${{matrix.target}} ${tarball_name}
tar -c ${tarball_name} | xz -T0 -v >${tarball_name}.tar.xz
- name: Upload release
uses: ncipollo/release-action@v1.16.0
with:
tag: "llvm-r${{inputs.version}}"
artifacts: ${{env.tarball_name}}.tar.xz
allowUpdates: true
replacesArtifacts: true
body: ''