Build release binaries for multiple targets (#98431)

This adds release binary builds for the 4 platforms currently supported
by the free GitHub Action runners:

* Linux x86_64
* Windows x86_64
* Mac x86_64
* Mac AArch64

The test stages for these are known to fail, but the creating and
upoading of the release binaries should pass.
This commit is contained in:
Tom Stellard 2024-07-26 11:26:34 -07:00 committed by GitHub
parent f8cd4c505f
commit 247251aee0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 522 additions and 163 deletions

View File

@ -0,0 +1,94 @@
name: Release Binaries All
permissions:
contents: read # Default everything to read-only
on:
workflow_dispatch:
inputs:
release-version:
description: 'Release Version'
required: true
type: string
upload:
description: 'Upload binaries to the release page'
required: true
default: false
type: boolean
workflow_call:
inputs:
release-version:
description: 'Release Version'
required: true
type: string
upload:
description: 'Upload binaries to the release page'
required: true
default: false
type: boolean
pull_request:
types:
- opened
- synchronize
- reopened
# When a PR is closed, we still start this workflow, but then skip
# all the jobs, which makes it effectively a no-op. The reason to
# do this is that it allows us to take advantage of concurrency groups
# to cancel in progress CI jobs whenever the PR is closed.
- closed
paths:
- '.github/workflows/release-binaries-all.yml'
- '.github/workflows/release-binaries.yml'
- '.github/workflows/release-binaries-setup-stage/*'
- '.github/workflows/release-binaries-save-stage/*'
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || 'dispatch' }}
cancel-in-progress: True
jobs:
setup-variables:
if: >-
(github.event_name != 'pull_request' || github.event.action != 'closed')
runs-on: ubuntu-22.04
outputs:
release-version: ${{ steps.vars.outputs.release-version }}
upload: ${{ steps.vars.outputs.upload }}
steps:
- shell: bash
id: vars
run: |
upload="${{ inputs.upload }}"
release_version="${{ inputs.release-version }}"
if [ "${{ github.event_name }}" = "pull_request" ]; then
upload="false"
release_version=""
fi
echo "release-version=$release_version" >> "$GITHUB_OUTPUT"
echo "upload=$upload" >> "$GITHUB_OUTPUT"
release-binaries-all:
name: Build Release Binaries
needs:
- setup-variables
permissions:
contents: write # For release uploads
id-token: write # For artifact attestations
attestations: write # For artifact attestations
strategy:
fail-fast: false
matrix:
runs-on:
- ubuntu-22.04
- windows-2022
- macos-13
- macos-14
uses: ./.github/workflows/release-binaries.yml
with:
release-version: "${{ needs.setup-variables.outputs.release-version }}"
upload: ${{ needs.setup-variables.outputs.upload == 'true'}}
runs-on: "${{ matrix.runs-on }}"

View File

@ -0,0 +1,38 @@
name: Save Stage
description: >-
Upload the source and binary directories from a build stage so that they
can be re-used in the next stage. This action is used to the release
binaries workflow into multiple stages to avoid the 6 hour timeout on
the GitHub hosted runners.
inputs:
build-prefix:
description: "Directory containing the build directory."
required: true
type: 'string'
runs:
using: "composite"
steps:
# We need to create an archive of the build directory, because it has too
# many files to upload.
- name: Package Build and Source Directories
shell: bash
run: |
# Windows does not support symlinks, so we need to dereference them.
tar --exclude build/ ${{ (runner.os == 'Windows' && '-h') || '' }} -c . | zstd -T0 -c > ../llvm-project.tar.zst
mv ../llvm-project.tar.zst .
tar -C ${{ inputs.build-prefix }} -c build/ | zstd -T0 -c > build.tar.zst
- name: Upload Stage 1 Source
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
with:
name: ${{ runner.os }}-${{ runner.arch }}-${{ github.job }}-source
path: llvm-project.tar.zst
retention-days: 2
- name: Upload Stage 1 Build Dir
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
with:
name: ${{ runner.os}}-${{ runner.arch }}-${{ github.job }}-build
path: build.tar.zst
retention-days: 2

View File

@ -0,0 +1,59 @@
name: Setup Stage
description: >-
Setup the next stage of the release binaries workflow. This sets up the
environment correctly for a new stage of the release binaries workflow
and also restores the source and build directory from the previous stage.
inputs:
previous-artifact:
description: >-
A unique descriptor for the artifact from the previous stage. This will
be used to construct the final artifact pattern, which is:
$RUNNER_OS-$RUNNER_ARCH-$PREVIOUS_ARTIFACT-*
required: false
type: 'string'
outputs:
build-prefix:
description: "Directory containing the build directory."
value: ${{ steps.build-prefix.outputs.build-prefix }}
runs:
using: "composite"
steps:
- name: Install Ninja
uses: llvm/actions/install-ninja@22e9f909d35b50bd1181709564bfe816eaeaae81 # main
- name: Setup Windows
if: startsWith(runner.os, 'Windows')
uses: llvm/actions/setup-windows@main
with:
arch: amd64
- name: Set Build Prefix
id: build-prefix
shell: bash
run: |
build_prefix=`pwd`
if [ "${{ runner.os }}" = "Linux" ]; then
sudo chown $USER:$USER /mnt/
build_prefix=/mnt/
fi
echo "build-prefix=$build_prefix" >> $GITHUB_OUTPUT
- name: Download Previous Stage Artifact
if: ${{ inputs.previous-artifact }}
id: download
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with:
pattern: ${{ runner.os }}-${{ runner.arch }}-${{ inputs.previous-artifact }}-*
merge-multiple: true
- name: Unpack Artifact
if: ${{ steps.download.outputs.download-path }}
shell: bash
run: |
tar --zstd -xf llvm-project.tar.zst
rm llvm-project.tar.zst
tar --zstd -C ${{ steps.build-prefix.outputs.build-prefix}} -xf build.tar.zst
rm build.tar.zst

View File

@ -5,28 +5,38 @@ on:
inputs: inputs:
release-version: release-version:
description: 'Release Version' description: 'Release Version'
required: true required: false
type: string type: string
upload: upload:
description: 'Upload binaries to the release page' description: 'Upload binaries to the release page'
required: true required: true
default: false default: false
type: boolean type: boolean
runs-on:
description: "Runner to use for the build"
required: true
type: choice
options:
- ubuntu-22.04
- windows-2022
- macos-13
- macos-14
workflow_call: workflow_call:
inputs: inputs:
release-version: release-version:
description: 'Release Version' description: 'Release Version'
required: true required: false
type: string type: string
upload: upload:
description: 'Upload binaries to the release page' description: 'Upload binaries to the release page'
required: true required: true
default: false default: false
type: boolean type: boolean
schedule: runs-on:
# * is a special character in YAML so you have to quote this string description: "Runner to use for the build"
- cron: '0 8 1 * *' required: true
type: string
permissions: permissions:
contents: read # Default everything to read-only contents: read # Default everything to read-only
@ -34,30 +44,39 @@ permissions:
jobs: jobs:
prepare: prepare:
name: Prepare to build binaries name: Prepare to build binaries
runs-on: ubuntu-22.04 runs-on: ${{ inputs.runs-on }}
if: github.repository == 'llvm/llvm-project' if: github.repository == 'llvm/llvm-project'
outputs: outputs:
release-version: ${{ steps.vars.outputs.release-version }} release-version: ${{ steps.vars.outputs.release-version }}
ref: ${{ steps.vars.outputs.ref }} ref: ${{ steps.vars.outputs.ref }}
upload: ${{ steps.vars.outputs.upload }} upload: ${{ steps.vars.outputs.upload }}
target-cmake-flags: ${{ steps.vars.outputs.target-cmake-flags }}
build-flang: ${{ steps.vars.outputs.build-flang }}
enable-pgo: ${{ steps.vars.outputs.enable-pgo }}
release-binary-basename: ${{ steps.vars.outputs.release-binary-basename }}
release-binary-filename: ${{ steps.vars.outputs.release-binary-filename }}
steps: steps:
- name: Checkout LLVM - name: Checkout LLVM
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Install Dependencies - name: Install Dependencies
shell: bash
run: | run: |
pip install --require-hashes -r ./llvm/utils/git/requirements.txt pip install --require-hashes -r ./llvm/utils/git/requirements.txt
- name: Check Permissions - name: Check Permissions
if: github.event_name != 'pull_request'
env: env:
GITHUB_TOKEN: ${{ github.token }} GITHUB_TOKEN: ${{ github.token }}
USER_TOKEN: ${{ secrets.RELEASE_TASKS_USER_TOKEN }} USER_TOKEN: ${{ secrets.RELEASE_TASKS_USER_TOKEN }}
shell: bash
run: | run: |
./llvm/utils/release/./github-upload-release.py --token "$GITHUB_TOKEN" --user ${{ github.actor }} --user-token "$USER_TOKEN" check-permissions ./llvm/utils/release/./github-upload-release.py --token "$GITHUB_TOKEN" --user ${{ github.actor }} --user-token "$USER_TOKEN" check-permissions
- name: Collect Variables - name: Collect Variables
id: vars id: vars
shell: bash
# In order for the test-release.sh script to run correctly, the LLVM # In order for the test-release.sh script to run correctly, the LLVM
# source needs to be at the following location relative to the build dir: # source needs to be at the following location relative to the build dir:
# | X.Y.Z-rcN | ./rcN/llvm-project # | X.Y.Z-rcN | ./rcN/llvm-project
@ -67,242 +86,377 @@ jobs:
# | X.Y.Z-rcN | -rc N -test-asserts # | X.Y.Z-rcN | -rc N -test-asserts
# | X.Y.Z | -final # | X.Y.Z | -final
run: | run: |
tag="${{ github.ref_name }}"
trimmed=$(echo ${{ inputs.release-version }} | xargs) trimmed=$(echo ${{ inputs.release-version }} | xargs)
[[ "$trimmed" != "" ]] && tag="llvmorg-$trimmed" if [ -n "$trimmed" ]; then
if [ "$tag" = "main" ]; then release_version="$trimmed"
# If tag is main, then we've been triggered by a scheduled so pass so ref="llvmorg-$release_version"
# use the head commit as the tag. else
tag=`git rev-parse HEAD` release_version="${{ (github.event_name == 'pull_request' && format('PR{0}', github.event.pull_request.number)) || 'CI'}}-${{ github.sha }}"
ref=${{ github.sha }}
fi fi
if [ -n "${{ inputs.upload }}" ]; then if [ -n "${{ inputs.upload }}" ]; then
upload="${{ inputs.upload }}" upload="${{ inputs.upload }}"
else else
upload="false" upload="false"
fi fi
bash .github/workflows/set-release-binary-outputs.sh "$tag" "$upload" echo "release-version=$release_version">> $GITHUB_OUTPUT
echo "ref=$ref" >> $GITHUB_OUTPUT
echo "upload=$upload" >> $GITHUB_OUTPUT
build-stage1-linux: release_binary_basename="LLVM-$release_version-${{ runner.os }}-${{ runner.arch }}"
name: "Build Stage 1 Linux" echo "release-binary-basename=$release_binary_basename" >> $GITHUB_OUTPUT
echo "release-binary-filename=$release_binary_basename.tar.xz" >> $GITHUB_OUTPUT
# Detect necessary CMake flags
target="${{ runner.os }}-${{ runner.arch }}"
echo "enable-pgo=false" >> $GITHUB_OUTPUT
target_cmake_flags="-DLLVM_RELEASE_ENABLE_PGO=OFF"
# The macOS builds try to cross compile some libraries so we need to
# add extra CMake args to disable them.
# See https://github.com/llvm/llvm-project/issues/99767
if [ "${{ runner.os }}" = "macOS" ]; then
target_cmake_flags="$target_cmake_flags -DBOOTSTRAP_COMPILER_RT_ENABLE_IOS=OFF"
if [ "${{ runner.arch }}" = "ARM64" ]; then
arches=arm64
else
arches=x86_64
fi
target_cmake_flags="$target_cmake_flags -DBOOTSTRAP_DARWIN_osx_ARCHS=$arches -DBOOTSTRAP_DARWIN_osx_BUILTIN_ARCHS=$arches"
fi
# x86 macOS and x86 Windows have trouble building flang, so disable it.
# Windows: https://github.com/llvm/llvm-project/issues/100202
# macOS: 'rebase opcodes terminated early at offset 1 of 80016' when building __fortran_builtins.mod
build_flang="true"
if [ "$target" = "Windows-X64" ]; then
target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_PROJECTS=\"clang;lld;lldb;clang-tools-extra;bolt;polly;mlir\""
build_flang="false"
fi
if [ "${{ runner.os }}" = "Windows" ]; then
# The build times out on Windows, so we need to disable LTO.
target_cmake_flags="$target_cmake_flags -DLLVM_RELEASE_ENABLE_LTO=OFF"
fi
echo "target-cmake-flags=$target_cmake_flags" >> $GITHUB_OUTPUT
echo "build-flang=$build_flang" >> $GITHUB_OUTPUT
build-stage1:
name: "Build Stage 1"
needs: prepare needs: prepare
runs-on: ubuntu-22.04
if: github.repository == 'llvm/llvm-project' if: github.repository == 'llvm/llvm-project'
runs-on: ${{ inputs.runs-on }}
steps: steps:
- name: Checkout LLVM - name: Checkout LLVM
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
with: with:
ref: ${{ needs.prepare.outputs.ref }} ref: ${{ needs.prepare.outputs.ref }}
- name: Debug - Move actions
- name: Install Ninja if: github.event_name != 'pull_request'
uses: llvm/actions/install-ninja@22e9f909d35b50bd1181709564bfe816eaeaae81 # main shell: bash
run: |
cd .github/workflows
for d in release-binaries-setup-stage release-binaries-save-stage; do
mkdir $d
pushd $d
curl -O -L https://raw.githubusercontent.com/tstellar/llvm-project/main/.github/workflows/$d/action.yml
popd
done
- name: Setup sccache - name: Setup sccache
uses: hendrikmuhs/ccache-action@ca3acd2731eef11f1572ccb126356c2f9298d35e # v1.2.9 uses: hendrikmuhs/ccache-action@ca3acd2731eef11f1572ccb126356c2f9298d35e # v1.2.9
with: with:
max-size: 250M # Default to 2G to workaround: https://github.com/hendrikmuhs/ccache-action/issues/174
key: sccache-${{ runner.os }}-release max-size: 2G
key: sccache-${{ runner.os }}-${{ runner.arch }}-release
variant: sccache variant: sccache
- name: Setup Stage
id: setup-stage
uses: ./.github/workflows/release-binaries-setup-stage
- name: Build Stage 1 Clang - name: Build Stage 1 Clang
id: build
shell: bash
run: | run: |
sudo chown $USER:$USER /mnt/ # There were some issues on the ARM64 MacOS runners with trying to build x86 object,
cmake -G Ninja -C clang/cmake/caches/Release.cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -S llvm -B /mnt/build # so we need to set some extra cmake flags to disable this.
ninja -v -C /mnt/build cmake -G Ninja -S llvm -B ${{ steps.setup-stage.outputs.build-prefix }}/build \
${{ needs.prepare.outputs.target-cmake-flags }} \
-C clang/cmake/caches/Release.cmake \
-DBOOTSTRAP_LLVM_PARALLEL_LINK_JOBS=1 \
-DBOOTSTRAP_CPACK_PACKAGE_FILE_NAME="${{ needs.prepare.outputs.release-binary-basename }}" \
-DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache
ninja -v -C ${{ steps.setup-stage.outputs.build-prefix }}/build
# There is a race condition on the MacOS builders and this command is here
# to help debug that when it happens.
ls -ltr ${{ steps.setup-stage.outputs.build-prefix }}/build
# We need to create an archive of the build directory, because it has too - name: Save Stage
# many files to upload. uses: ./.github/workflows/release-binaries-save-stage
- name: Package Build and Source Directories
run: |
tar -c . | zstd -T0 -c > llvm-project.tar.zst
tar -C /mnt/ -c build/ | zstd -T0 -c > build.tar.zst
- name: Upload Stage 1 Source
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
with: with:
name: stage1-source build-prefix: ${{ steps.setup-stage.outputs.build-prefix }}
path: llvm-project.tar.zst
retention-days: 2
- name: Upload Stage 1 Build Dir build-stage2:
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0 name: "Build Stage 2"
with:
name: stage1-build
path: build.tar.zst
retention-days: 2
build-stage2-linux:
name: "Build Stage 2 Linux"
needs: needs:
- prepare - prepare
- build-stage1-linux - build-stage1
runs-on: ubuntu-22.04
if: github.repository == 'llvm/llvm-project' if: github.repository == 'llvm/llvm-project'
runs-on: ${{ inputs.runs-on }}
steps: steps:
- name: Install Ninja - name: Checkout Actions
uses: llvm/actions/install-ninja@22e9f909d35b50bd1181709564bfe816eaeaae81 # main uses: actions/checkout@v4
- name: Download Stage 1 Artifacts
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with: with:
pattern: stage1-* ref: ${{ (github.event_name == 'pull_request' && github.sha) || 'main' }}
merge-multiple: true sparse-checkout: |
.github/workflows/
- name: Unpack Artifacts sparse-checkout-cone-mode: false
run: | path: workflows
tar --zstd -xf llvm-project.tar.zst - name: Setup Stage
rm llvm-project.tar.zst id: setup-stage
sudo chown $USER:$USER /mnt/ uses: ./workflows/.github/workflows/release-binaries-setup-stage
tar --zstd -C /mnt -xf build.tar.zst with:
rm build.tar.zst previous-artifact: build-stage1
- name: Build Stage 2 - name: Build Stage 2
# Re-enable once PGO builds are supported. # Re-enable once PGO builds are supported.
if: false if: needs.prepare.outputs.enable-pgo == 'true'
shell: bash
run: | run: |
ninja -C /mnt/build stage2-instrumented ninja -C ${{ steps.setup-stage.outputs.build-prefix}}/build stage2-instrumented
# We need to create an archive of the build directory, because it has too - name: Save Stage
# many files to upload. uses: ./workflows/.github/workflows/release-binaries-save-stage
- name: Save Build and Source Directories
run: |
tar -c . | zstd -T0 -c > llvm-project.tar.zst
tar -C /mnt/ -c build/ | zstd -T0 -c > build.tar.zst
- name: Upload Stage 2 Source
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
with: with:
name: stage2-source build-prefix: ${{ steps.setup-stage.outputs.build-prefix }}
path: ${{ github.workspace }}/llvm-project.tar.zst
retention-days: 2
- name: Upload Stage 2 Build Dir build-stage3-clang:
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0 name: "Build Stage 3 LLVM/Clang"
with:
name: stage2-build
path: ${{ github.workspace }}/build.tar.zst
retention-days: 2
build-stage3-linux:
name: "Build Stage 3 Linux"
needs: needs:
- prepare - prepare
- build-stage2-linux - build-stage2
outputs:
filename: ${{ steps.package-info.outputs.release-filename }}
runs-on: ubuntu-22.04-16x64
if: github.repository == 'llvm/llvm-project' if: github.repository == 'llvm/llvm-project'
runs-on: ${{ inputs.runs-on }}
steps: steps:
- name: Install Ninja - name: Checkout Actions
uses: llvm/actions/install-ninja@22e9f909d35b50bd1181709564bfe816eaeaae81 # main uses: actions/checkout@v4
- name: 'Download artifact'
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with: with:
pattern: stage2-* ref: ${{ (github.event_name == 'pull_request' && github.sha) || 'main' }}
merge-multiple: true sparse-checkout: |
.github/workflows/
sparse-checkout-cone-mode: false
path: workflows
- name: Setup Stage
id: setup-stage
uses: ./workflows/.github/workflows/release-binaries-setup-stage
with:
previous-artifact: build-stage2
- name: Unpack Artifact - name: Build LLVM/Clang
shell: bash
run: | run: |
tar --zstd -xf llvm-project.tar.zst # There is a race condition on the MacOS builders and this command is here
rm llvm-project.tar.zst # to help debug that when it happens.
sudo chown $USER:$USER /mnt/ ls -ltr ${{ steps.setup-stage.outputs.build-prefix }}/build
tar --zstd -C /mnt -xf build.tar.zst ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build stage2-clang
rm build.tar.zst # Build some of the larger binaries here too.
ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build/tools/clang/stage2-bins/ \
clang-scan-deps \
modularize clangd \
clangd-indexer \
clang-check \
${{ (runner.os == 'Linux' && 'clangd-fuzzer') || '' }} \
clang-tidy \
llc \
lli \
llvm-exegesis \
llvm-opt-fuzzer \
llvm-reduce \
llvm-lto \
dsymutil
- name: Save Stage
uses: ./workflows/.github/workflows/release-binaries-save-stage
with:
build-prefix: ${{ steps.setup-stage.outputs.build-prefix }}
build-stage3-flang:
name: "Build Stage 3 Flang/MLIR/Bolt"
needs:
- prepare
- build-stage3-clang
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout Actions
uses: actions/checkout@v4
with:
ref: ${{ (github.event_name == 'pull_request' && github.sha) || 'main' }}
sparse-checkout: |
.github/workflows/
sparse-checkout-cone-mode: false
path: workflows
- name: Setup Stage
id: setup-stage
uses: ./workflows/.github/workflows/release-binaries-setup-stage
with:
previous-artifact: build-stage3-clang
- name: Build Flang / MLIR / Bolt
shell: bash
run: |
# Build some of the mlir tools that take a long time to link
if [ "${{ needs.prepare.outputs.build-flang }}" = "true" ]; then
ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build/tools/clang/stage2-bins/ -j2 flang-new bbc
fi
ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build/tools/clang/stage2-bins/ \
mlir-bytecode-parser-fuzzer \
mlir-cpu-runner \
mlir-lsp-server \
mlir-opt \
mlir-query \
mlir-reduce \
mlir-text-parser-fuzzer \
mlir-translate \
mlir-transform-opt \
mlir-cat \
mlir-minimal-opt \
mlir-minimal-opt-canonicalize \
mlir-pdll-lsp-server \
llvm-bolt \
llvm-bolt-heatmap
- name: Save Stage
uses: ./workflows/.github/workflows/release-binaries-save-stage
with:
build-prefix: ${{ steps.setup-stage.outputs.build-prefix }}
build-stage3-all:
name: "Build Stage 3"
needs:
- prepare
- build-stage3-flang
runs-on: ${{ inputs.runs-on }}
steps:
- name: Checkout Actions
uses: actions/checkout@v4
with:
ref: ${{ (github.event_name == 'pull_request' && github.sha) || 'main' }}
sparse-checkout: |
.github/workflows/
sparse-checkout-cone-mode: false
path: workflows
- name: Setup Stage
id: setup-stage
uses: ./workflows/.github/workflows/release-binaries-setup-stage
with:
previous-artifact: build-stage3-flang
- name: Build Release Package - name: Build Release Package
shell: bash
run: | run: |
ninja -C /mnt/build stage2-package which cmake
ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build stage2-package
- id: package-info # Copy Release artifact to the workspace so it is easier to upload.
run: | # This is necessary, because on Windows, the build-prefix path can
filename="LLVM-${{ needs.prepare.outputs.release-version }}-Linux.tar.xz" # only be used on bash steps, because it uses the form of /d/files/
echo "filename=$filename" >> $GITHUB_OUTPUT # and other steps expect D:\files.
echo "path=/mnt/build/tools/clang/stage2-bins/$filename" >> $GITHUB_OUTPUT mv ${{ steps.setup-stage.outputs.build-prefix }}/build/tools/clang/stage2-bins/${{ needs.prepare.outputs.release-binary-filename }} .
- uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0 - uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
if: always()
with: with:
name: release-binary name: ${{ runner.os }}-${{ runner.arch }}-release-binary
path: ${{ steps.package-info.outputs.path }} # Due to path differences on Windows when running in bash vs running on node,
# we need to search for files in the current workspace.
path: |
${{ needs.prepare.outputs.release-binary-filename }}
# Clean up some build files to reduce size of artifact. # Clean up some build files to reduce size of artifact.
- name: Clean Up Build Directory - name: Clean Up Build Directory
shell: bash
run: | run: |
find /mnt/build -iname ${{ steps.package-info.outputs.filename }} -delete find ${{ steps.setup-stage.outputs.build-prefix }}/build -iname ${{ needs.prepare.outputs.release-binary-filename }} -delete
rm -Rf ${{ steps.setup-stage.outputs.build-prefix }}/build/tools/clang/stage2-bins/_CPack_Packages
# We need to create an archive of the build directory, because it has too - name: Save Stage
# many files to upload. uses: ./workflows/.github/workflows/release-binaries-save-stage
- name: Save Build and Source Directories
run: |
tar -c . | zstd -T0 -c > llvm-project.tar.zst
tar -C /mnt/ -c build/ | zstd -T0 -c > build.tar.zst
- name: Upload Stage 3 Source
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0
with: with:
name: stage3-source build-prefix: ${{ steps.setup-stage.outputs.build-prefix }}
path: llvm-project.tar.zst
retention-days: 2
- name: Upload Stage 3 Build Dir upload-release-binaries:
uses: actions/upload-artifact@26f96dfa697d77e81fd5907df203aa23a56210a8 #v4.3.0 name: "Upload Release Binaries"
with:
name: stage3-build
path: build.tar.zst
retention-days: 2
upload-release-binaries-linux:
name: "Upload Linux Release Binaries"
needs: needs:
- prepare - prepare
- build-stage3-linux - build-stage3-all
if : ${{ needs.prepare.outputs.upload == 'true' }} if: >-
always() &&
github.event_name != 'pull_request' &&
needs.prepare.outputs.upload == 'true'
runs-on: ubuntu-22.04 runs-on: ubuntu-22.04
permissions: permissions:
contents: write # For release uploads contents: write # For release uploads
id-token: write # For artifact attestations
attestations: write # For artifact attestations
steps: steps:
- name: 'Download artifact' - name: 'Download artifact'
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1 uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with: with:
name: release-binary pattern: '*-release-binary'
merge-multiple: true
- name: Attest Build Provenance
id: provenance
uses: actions/attest-build-provenance@897ed5eab6ed058a474202017ada7f40bfa52940 # v1.0.0
with:
subject-path: ${{ needs.prepare.outputs.release-binary-filename }}
- name: Rename attestation file
run:
mv ${{ steps.provenance.outputs.bundle-path }} ${{ needs.prepare.outputs.release-binary-filename }}.jsonl
- name: Upload Build Provenance
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808 #v4.3.3
with:
name: ${{ runner.os }}-${{ runner.arch }}-release-binary-attestation
path: ${{ needs.prepare.outputs.release-binary-filename }}.jsonl
- name: Upload Release - name: Upload Release
shell: bash
run: | run: |
sudo apt install python3-github sudo apt install python3-github
./llvm-project/llvm/utils/release/github-upload-release.py \ ./llvm-project/llvm/utils/release/github-upload-release.py \
--token ${{ github.token }} \ --token ${{ github.token }} \
--release ${{ needs.prepare.outputs.release-version }} \ --release ${{ needs.prepare.outputs.release-version }} \
upload \ upload \
--files ${{ needs.build-stage3-linux.outputs.release-filename }} --files ${{ needs.prepare.outputs.release-binary-filename }}*
test-stage3:
test-stage3-linux: name: "Test Stage 3"
name: "Test Stage 3 Linux"
needs: needs:
- prepare - prepare
- build-stage3-linux - build-stage3-all
runs-on: ubuntu-22.04 if: >-
if: github.repository == 'llvm/llvm-project' github.repository == 'llvm/llvm-project'
runs-on: ${{ inputs.runs-on }}
steps: steps:
- name: Install Ninja - name: Checkout Actions
uses: llvm/actions/install-ninja@22e9f909d35b50bd1181709564bfe816eaeaae81 # main uses: actions/checkout@v4
- name: 'Download artifact'
uses: actions/download-artifact@6b208ae046db98c579e8a3aa621ab581ff575935 # v4.1.1
with: with:
pattern: stage3-* ref: ${{ (github.event_name == 'pull_request' && github.sha) || 'main' }}
merge-multiple: true sparse-checkout: |
.github/workflows/
- name: Unpack Artifact sparse-checkout-cone-mode: false
run: | path: workflows
tar --zstd -xf llvm-project.tar.zst - name: Setup Stage
rm llvm-project.tar.zst id: setup-stage
sudo chown $USER:$USER /mnt/ uses: ./workflows/.github/workflows/release-binaries-setup-stage
tar --zstd -C /mnt -xf build.tar.zst with:
rm build.tar.zst previous-artifact: build-stage3-all
- name: Run Tests - name: Run Tests
shell: bash
run: | run: |
ninja -C /mnt/build stage2-check-all ninja -C ${{ steps.setup-stage.outputs.build-prefix }}/build stage2-check-all

View File

@ -81,10 +81,20 @@ jobs:
needs: needs:
- validate-tag - validate-tag
- release-create - release-create
strategy:
fail-fast: false
matrix:
runs-on:
- ubuntu-22.04
- windows-2022
- macos-13
- macos-14
uses: ./.github/workflows/release-binaries.yml uses: ./.github/workflows/release-binaries.yml
with: with:
release-version: ${{ needs.validate-tag.outputs.release-version }} release-version: ${{ needs.validate-tag.outputs.release-version }}
upload: true upload: true
runs-on: ${{ matrix.runs-on }}
release-sources: release-sources:
name: Package Release Sources name: Package Release Sources

View File

@ -29,9 +29,13 @@ endfunction()
# cache file to CMake via -C. e.g. # cache file to CMake via -C. e.g.
# #
# cmake -D LLVM_RELEASE_ENABLE_PGO=ON -C Release.cmake # cmake -D LLVM_RELEASE_ENABLE_PGO=ON -C Release.cmake
set (DEFAULT_RUNTIMES "compiler-rt;libcxx")
if (NOT WIN32)
list(APPEND DEFAULT_RUNTIMES "libcxxabi" "libunwind")
endif()
set(LLVM_RELEASE_ENABLE_LTO THIN CACHE STRING "") set(LLVM_RELEASE_ENABLE_LTO THIN CACHE STRING "")
set(LLVM_RELEASE_ENABLE_PGO ON CACHE BOOL "") set(LLVM_RELEASE_ENABLE_PGO ON CACHE BOOL "")
set(LLVM_RELEASE_ENABLE_RUNTIMES "compiler-rt;libcxx;libcxxabi;libunwind" CACHE STRING "") set(LLVM_RELEASE_ENABLE_RUNTIMES ${DEFAULT_RUNTIMES} CACHE STRING "")
set(LLVM_RELEASE_ENABLE_PROJECTS "clang;lld;lldb;clang-tools-extra;bolt;polly;mlir;flang" CACHE STRING "") set(LLVM_RELEASE_ENABLE_PROJECTS "clang;lld;lldb;clang-tools-extra;bolt;polly;mlir;flang" CACHE STRING "")
# Note we don't need to add install here, since it is one of the pre-defined # Note we don't need to add install here, since it is one of the pre-defined
# steps. # steps.