Skip to content

Build LLVM for r26d bolt;clang;clang-tools-extra;lld #24

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

Build LLVM for r26d bolt;clang;clang-tools-extra;lld #24

name: Build LLVM (musl libc)
run-name: Build LLVM for r${{inputs.version}} ${{inputs.projects}}
on:
workflow_dispatch:
inputs:
version:
description: "NDK Release version:"
default: "29-beta4"
required: true
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:
# thumbeb-linux-musleabi, thumbeb-linux-musleabihf
target: [arm-linux-musleabi, arm-linux-musleabihf, armeb-linux-musleabi, armeb-linux-musleabihf, thumb-linux-musleabi, thumb-linux-musleabihf, aarch64-linux-musl, aarch64_be-linux-musl, loongarch64-linux-musl, mips-linux-musleabi, mips-linux-musleabihf, mipsel-linux-musleabi, mipsel-linux-musleabihf, mips64-linux-muslabin32, mips64el-linux-muslabin32, powerpc-linux-musleabi, powerpc-linux-musleabihf, powerpc64-linux-musl, powerpc64le-linux-musl, riscv32-linux-musl, riscv64-linux-musl, s390x-linux-musl, x86-linux-musl, x86_64-linux-musl]
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}}
ZIG_TARGET: ${{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}}"
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}}..."
curl -sSfL -o android-ndk.zip "https://dl.google.com/android/repository/android-ndk-r${{inputs.version}}-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"
if [ -d "$ROOTDIR/patches/musl/llvm/$LLVM_VERSION" ]; then
for PATCH in $ROOTDIR/patches/musl/llvm/$LLVM_VERSION/*.patch; do
echo "Applying $(basename "$PATCH")..."
git apply "$PATCH"
done
fi
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 Zig
uses: mlugg/setup-zig@v2
with:
version: "0.16.0-dev.164+bc7955306"
use-cache: false
- name: Setup Zig toolchain
run: |
git clone https://github.com/${{ github.repository_owner }}/zig-as-llvm
cp -R $ROOTDIR/patches/musl/zig/* $(whereis zig | awk '{print $2}' | xargs dirname)
- name: Install dependencies
run: sudo apt install -y ninja-build
- name: Build dependencies
run : |
TOOLCHAIN=${PWD}/zig-as-llvm
export CC=${TOOLCHAIN}/bin/cc
export CXX=${TOOLCHAIN}/bin/c++
export CFLAGS="-fstack-protector-strong -fsanitize=undefined"
export CXXFLAGS="-fstack-protector-strong -fsanitize=undefined"
export LD=${TOOLCHAIN}/bin/ld
export OBJCOPY=${TOOLCHAIN}/bin/objcopy
export AR=${TOOLCHAIN}/bin/ar
export RANLIB=${TOOLCHAIN}/bin/ranlib
export STRIP=${TOOLCHAIN}/bin/strip
rm -rf build output/ zlib/ zstd/
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
if ! test -f "${TARGET_INSTALL_DIR}"/lib/libzstd.a; then
if ! test -d zstd; then
curl https://github.com/facebook/zstd/archive/refs/tags/v1.5.6.tar.gz -LkSs | gzip -d | tar -x
mv zstd-1.5.6 zstd
fi
mkdir -p "${TARGET_INSTALL_DIR}/include"
mkdir -p "${TARGET_INSTALL_DIR}/lib"
mkdir -p "${TARGET_BUILD_DIR}/zstd"
cp "${ROOTDIR}/zstd/lib/zstd.h" "$TARGET_INSTALL_DIR/include/zstd.h"
(
cd "${TARGET_BUILD_DIR}/zstd"
$CC $CFLAGS -c \
"${ROOTDIR}/zstd/lib/decompress/zstd_ddict.c" \
"${ROOTDIR}/zstd/lib/decompress/zstd_decompress.c" \
"${ROOTDIR}/zstd/lib/decompress/huf_decompress.c" \
"${ROOTDIR}/zstd/lib/decompress/huf_decompress_amd64.S" \
"${ROOTDIR}/zstd/lib/decompress/zstd_decompress_block.c" \
"${ROOTDIR}/zstd/lib/compress/zstdmt_compress.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_opt.c" \
"${ROOTDIR}/zstd/lib/compress/hist.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_ldm.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_fast.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_compress_literals.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_double_fast.c" \
"${ROOTDIR}/zstd/lib/compress/huf_compress.c" \
"${ROOTDIR}/zstd/lib/compress/fse_compress.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_lazy.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_compress.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_compress_sequences.c" \
"${ROOTDIR}/zstd/lib/compress/zstd_compress_superblock.c" \
"${ROOTDIR}/zstd/lib/deprecated/zbuff_compress.c" \
"${ROOTDIR}/zstd/lib/deprecated/zbuff_decompress.c" \
"${ROOTDIR}/zstd/lib/deprecated/zbuff_common.c" \
"${ROOTDIR}/zstd/lib/common/entropy_common.c" \
"${ROOTDIR}/zstd/lib/common/pool.c" \
"${ROOTDIR}/zstd/lib/common/threading.c" \
"${ROOTDIR}/zstd/lib/common/zstd_common.c" \
"${ROOTDIR}/zstd/lib/common/xxhash.c" \
"${ROOTDIR}/zstd/lib/common/debug.c" \
"${ROOTDIR}/zstd/lib/common/fse_decompress.c" \
"${ROOTDIR}/zstd/lib/common/error_private.c" \
"${ROOTDIR}/zstd/lib/dictBuilder/zdict.c" \
"${ROOTDIR}/zstd/lib/dictBuilder/divsufsort.c" \
"${ROOTDIR}/zstd/lib/dictBuilder/fastcover.c" \
"${ROOTDIR}/zstd/lib/dictBuilder/cover.c"
$AR rcs "${TARGET_INSTALL_DIR}/lib/libzstd.a" "${TARGET_BUILD_DIR}"/zstd/*.o
)
fi
- name: Build LLVM
run: |
TOOLCHAIN=${PWD}/zig-as-llvm
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=Linux \
-DLLVM_DEFAULT_TARGET_TRIPLE=${{matrix.target}} \
-DCMAKE_C_COMPILER="${TOOLCHAIN}/bin/cc" \
-DCMAKE_CXX_COMPILER="${TOOLCHAIN}/bin/c++" \
-DCMAKE_ASM_COMPILER="${TOOLCHAIN}/bin/cc" \
-DCMAKE_LINKER="${TOOLCHAIN}/bin/ld" \
-DCMAKE_OBJCOPY="${TOOLCHAIN}/bin/objcopy" \
-DCMAKE_AR="${TOOLCHAIN}/bin/ar" \
-DCMAKE_RANLIB="${TOOLCHAIN}/bin/ranlib" \
-DCMAKE_STRIP="${TOOLCHAIN}/bin/strip" \
-DCMAKE_C_FLAGS="-fstack-protector-strong -fsanitize=undefined -static" \
-DCMAKE_CXX_FLAGS="-fstack-protector-strong -fsanitize=undefined -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}}-${{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: ''