Some checks failed
Release Docker Image / define-variables (push) Successful in 3s
Documentation / Build and Deploy Documentation (pull_request) Successful in 42s
Checks / Prek / Pre-commit & Formatting (push) Successful in 1m19s
Release Docker Image / build-image (linux/amd64, release, linux-amd64, base) (push) Successful in 16m26s
Release Docker Image / build-image (linux/arm64, release, linux-arm64, base) (push) Successful in 18m53s
Release Docker Image / merge (push) Successful in 27s
Checks / Prek / Clippy and Cargo Tests (push) Failing after 2m10s
Merge rust-checks.yml into prek-checks.yml for a unified workflow that runs formatting and clippy/test checks in parallel jobs. Add reusable composite actions: - setup-rust: Smart Rust toolchain management with caching * Uses cargo-binstall for pre-built binary downloads * Integrates Mozilla sccache-action for compilation caching * Workspace-relative paths for better cache control * GitHub token support for improved rate limits - setup-llvm-with-apt: LLVM installation with native dependencies - detect-runner-os: Consistent OS detection for cache keys Key improvements: - Install prek via cargo-binstall --git (crates.io outdated at v0.0.1) - Download timelord-cli from cargo-quickinstall - Set BINSTALL_MAXIMUM_RESOLUTION_TIMEOUT=10 to avoid rate limit delays - Default Rust version 1.87.0 with override support - Remove redundant sccache stats (handled by Mozilla action) Significantly reduces CI runtime through binary downloads instead of compilation while maintaining all existing quality checks.
167 lines
6.4 KiB
YAML
167 lines
6.4 KiB
YAML
name: setup-llvm-with-apt
|
|
description: |
|
|
Set up LLVM toolchain with APT package management and smart caching.
|
|
Supports cross-compilation architectures and additional package installation.
|
|
|
|
Creates symlinks in /usr/bin: clang, clang++, lld, llvm-ar, llvm-ranlib
|
|
|
|
inputs:
|
|
dpkg-arch:
|
|
description: 'Debian architecture for cross-compilation (e.g. arm64)'
|
|
required: false
|
|
default: ''
|
|
extra-packages:
|
|
description: 'Additional APT packages to install (space-separated)'
|
|
required: false
|
|
default: ''
|
|
llvm-version:
|
|
description: 'LLVM version to install'
|
|
required: false
|
|
default: '20'
|
|
|
|
outputs:
|
|
llvm-version:
|
|
description: 'Installed LLVM version'
|
|
value: ${{ steps.configure.outputs.version }}
|
|
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Detect runner OS
|
|
id: runner-os
|
|
uses: ./.forgejo/actions/detect-runner-os
|
|
|
|
- name: Configure cross-compilation architecture
|
|
if: inputs.dpkg-arch != ''
|
|
shell: bash
|
|
run: |
|
|
echo "🏗️ Adding ${{ inputs.dpkg-arch }} architecture"
|
|
sudo dpkg --add-architecture ${{ inputs.dpkg-arch }}
|
|
|
|
# Restrict default sources to amd64
|
|
sudo sed -i 's/^deb http/deb [arch=amd64] http/g' /etc/apt/sources.list
|
|
sudo sed -i 's/^deb https/deb [arch=amd64] https/g' /etc/apt/sources.list
|
|
|
|
# Add ports sources for foreign architecture
|
|
sudo tee /etc/apt/sources.list.d/${{ inputs.dpkg-arch }}.list > /dev/null <<EOF
|
|
deb [arch=${{ inputs.dpkg-arch }}] http://ports.ubuntu.com/ubuntu-ports/ jammy main restricted universe multiverse
|
|
deb [arch=${{ inputs.dpkg-arch }}] http://ports.ubuntu.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
|
|
deb [arch=${{ inputs.dpkg-arch }}] http://ports.ubuntu.com/ubuntu-ports/ jammy-security main restricted universe multiverse
|
|
EOF
|
|
|
|
echo "✅ Architecture ${{ inputs.dpkg-arch }} configured"
|
|
|
|
- name: Start LLVM cache group
|
|
shell: bash
|
|
run: echo "::group::📦 Restoring LLVM cache"
|
|
|
|
- name: Check for LLVM cache
|
|
id: cache
|
|
uses: https://github.com/actions/cache@v4
|
|
with:
|
|
path: |
|
|
/usr/bin/clang-*
|
|
/usr/bin/clang++-*
|
|
/usr/bin/lld-*
|
|
/usr/bin/llvm-*
|
|
/usr/lib/llvm-*/
|
|
/usr/lib/x86_64-linux-gnu/libLLVM*.so*
|
|
/usr/lib/x86_64-linux-gnu/libclang*.so*
|
|
/etc/apt/sources.list.d/archive_uri-*
|
|
/etc/apt/trusted.gpg.d/apt.llvm.org.asc
|
|
key: llvm-${{ steps.runner-os.outputs.slug }}-v${{ inputs.llvm-version }}-v3-${{ hashFiles('**/Cargo.lock', 'rust-toolchain.toml') }}
|
|
|
|
- name: End LLVM cache group
|
|
shell: bash
|
|
run: echo "::endgroup::"
|
|
|
|
- name: Check and install LLVM if needed
|
|
id: llvm-setup
|
|
shell: bash
|
|
run: |
|
|
echo "🔍 Checking for LLVM ${{ inputs.llvm-version }}..."
|
|
|
|
# Check both binaries and libraries exist
|
|
if [ -f "/usr/bin/clang-${{ inputs.llvm-version }}" ] && \
|
|
[ -f "/usr/bin/clang++-${{ inputs.llvm-version }}" ] && \
|
|
[ -f "/usr/bin/lld-${{ inputs.llvm-version }}" ] && \
|
|
([ -f "/usr/lib/x86_64-linux-gnu/libLLVM.so.${{ inputs.llvm-version }}.1" ] || \
|
|
[ -f "/usr/lib/x86_64-linux-gnu/libLLVM-${{ inputs.llvm-version }}.so.1" ] || \
|
|
[ -f "/usr/lib/llvm-${{ inputs.llvm-version }}/lib/libLLVM.so" ]); then
|
|
echo "✅ LLVM ${{ inputs.llvm-version }} found and verified"
|
|
echo "needs-install=false" >> $GITHUB_OUTPUT
|
|
else
|
|
echo "📦 LLVM ${{ inputs.llvm-version }} not found or incomplete - installing..."
|
|
|
|
echo "::group::🔧 Installing LLVM ${{ inputs.llvm-version }}"
|
|
wget -O - https://apt.llvm.org/llvm.sh | bash -s -- ${{ inputs.llvm-version }}
|
|
echo "::endgroup::"
|
|
|
|
if [ ! -f "/usr/bin/clang-${{ inputs.llvm-version }}" ]; then
|
|
echo "❌ Failed to install LLVM ${{ inputs.llvm-version }}"
|
|
exit 1
|
|
fi
|
|
|
|
echo "✅ Installed LLVM ${{ inputs.llvm-version }}"
|
|
echo "needs-install=true" >> $GITHUB_OUTPUT
|
|
fi
|
|
|
|
- name: Prepare for additional packages
|
|
if: inputs.extra-packages != ''
|
|
shell: bash
|
|
run: |
|
|
# Update APT if LLVM was cached (installer script already does apt-get update)
|
|
if [[ "${{ steps.llvm-setup.outputs.needs-install }}" != "true" ]]; then
|
|
echo "::group::📦 Running apt-get update (LLVM cached, extra packages needed)"
|
|
sudo apt-get update
|
|
echo "::endgroup::"
|
|
fi
|
|
echo "::group::📦 Installing additional packages"
|
|
|
|
- name: Install additional packages
|
|
if: inputs.extra-packages != ''
|
|
uses: https://github.com/awalsh128/cache-apt-pkgs-action@latest
|
|
with:
|
|
packages: ${{ inputs.extra-packages }}
|
|
version: 1.0
|
|
|
|
- name: End package installation group
|
|
if: inputs.extra-packages != ''
|
|
shell: bash
|
|
run: echo "::endgroup::"
|
|
|
|
- name: Configure LLVM environment
|
|
id: configure
|
|
shell: bash
|
|
run: |
|
|
echo "::group::🔧 Configuring LLVM ${{ inputs.llvm-version }} environment"
|
|
|
|
# Create symlinks
|
|
sudo ln -sf "/usr/bin/clang-${{ inputs.llvm-version }}" /usr/bin/clang
|
|
sudo ln -sf "/usr/bin/clang++-${{ inputs.llvm-version }}" /usr/bin/clang++
|
|
sudo ln -sf "/usr/bin/lld-${{ inputs.llvm-version }}" /usr/bin/lld
|
|
sudo ln -sf "/usr/bin/llvm-ar-${{ inputs.llvm-version }}" /usr/bin/llvm-ar
|
|
sudo ln -sf "/usr/bin/llvm-ranlib-${{ inputs.llvm-version }}" /usr/bin/llvm-ranlib
|
|
echo " ✓ Created symlinks"
|
|
|
|
# Setup library paths
|
|
LLVM_LIB_PATH="/usr/lib/llvm-${{ inputs.llvm-version }}/lib"
|
|
if [ -d "$LLVM_LIB_PATH" ]; then
|
|
echo "LD_LIBRARY_PATH=${LLVM_LIB_PATH}:${LD_LIBRARY_PATH:-}" >> $GITHUB_ENV
|
|
echo "LIBCLANG_PATH=${LLVM_LIB_PATH}" >> $GITHUB_ENV
|
|
|
|
echo "$LLVM_LIB_PATH" | sudo tee "/etc/ld.so.conf.d/llvm-${{ inputs.llvm-version }}.conf" > /dev/null
|
|
sudo ldconfig
|
|
echo " ✓ Configured library paths"
|
|
else
|
|
# Fallback to standard library location
|
|
if [ -d "/usr/lib/x86_64-linux-gnu" ]; then
|
|
echo "LIBCLANG_PATH=/usr/lib/x86_64-linux-gnu" >> $GITHUB_ENV
|
|
echo " ✓ Using fallback library path"
|
|
fi
|
|
fi
|
|
|
|
# Set output
|
|
echo "version=${{ inputs.llvm-version }}" >> $GITHUB_OUTPUT
|
|
echo "::endgroup::"
|
|
echo "✅ LLVM ready: $(clang --version | head -1)"
|