Build LLVM for r28c bolt;clang;clang-tools-extra;lld #39
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 (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: '' |