Build LLVM for r27d bolt;clang;clang-tools-extra;lld #1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build LLVM (BSD) | |
| 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: | |
| # arm-freebsd-eabihf | |
| target: [aarch64-freebsd-none, powerpc64-freebsd-none, powerpc64le-freebsd-none, riscv64-freebsd-none, x86_64-freebsd-none, aarch64-netbsd-none, aarch64_be-netbsd-none, 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-netbsd-eabi, powerpc-netbsd-eabihf, x86-netbsd-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@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=$( \ | |
| 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" \ | |
| -DCMAKE_C_FLAGS="-fstack-protector-strong -fsanitize=undefined" \ | |
| -DCMAKE_CXX_FLAGS="-fstack-protector-strong -fsanitize=undefined" \ | |
| -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}}-${{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: '' |