Skip to content

Build LLVM for r30-beta1 bolt;clang;clang-tools-extra;lld #20

Build LLVM for r30-beta1 bolt;clang;clang-tools-extra;lld

Build LLVM for r30-beta1 bolt;clang;clang-tools-extra;lld #20

name: Build LLVM (BSD)
run-name: Build LLVM for r${{inputs.version}}${{inputs.revision}} ${{inputs.projects}}
on:
workflow_dispatch:
inputs:
version:
description: "NDK Release version:"
default: "30"
required: true
revision:
description: "NDK Release revision:"
default: '-beta1'
required: false
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:
# riscv32-netbsd-none
target: [aarch64-freebsd-none, aarch64-netbsd-none, aarch64_be-netbsd-none, arm-freebsd-eabihf, arm-netbsd-eabi, arm-netbsd-eabihf, armeb-netbsd-eabi, armeb-netbsd-eabihf, mips-netbsd-eabi, mips-netbsd-eabihf, mipsel-netbsd-eabi, mipsel-netbsd-eabihf, powerpc-freebsd-eabihf, powerpc-netbsd-eabi, powerpc-netbsd-eabihf, powerpc64-freebsd-none, powerpc64le-freebsd-none, riscv64-freebsd-none, x86-freebsd-none, x86-netbsd-none, x86_64-freebsd-none, x86_64-netbsd-none]
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@v5
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"
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.0.5
with:
version: "0.16.0-dev.577+c50aa2b95"
use-cache: false
- name: Setup Zig toolchain
run: git clone https://github.com/${{ github.repository_owner }}/zig-as-llvm
- 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 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 -fno-sanitize=undefined $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=$( \
field=$(echo "$ZIG_TARGET" | cut -d- -f2); \
first=${field:0:1}; \
middle=${field:1:${#field}-4}; \
last=${field: -3}; \
echo "$(tr '[:lower:]' '[:upper:]' <<<"$first")$middle$(tr '[:lower:]' '[:upper:]' <<<"$last")" \
) \
-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" \
-DLLVM_ENABLE_PROJECTS="${{inputs.projects}}" \
-DLLVM_ENABLE_ZLIB=FORCE_ON \
-DLLVM_ENABLE_ZSTD=FORCE_ON \
-DLLVM_USE_STATIC_ZSTD=ON \
-DLLVM_BUILD_STATIC=OFF \
-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.20.0
with:
tag: "llvm-r${{inputs.version}}"
artifacts: ${{env.tarball_name}}.tar.xz
allowUpdates: true
replacesArtifacts: true
body: ''