Skip to content

Add Submodule Caching to Toolchain Generation #555

Add Submodule Caching to Toolchain Generation

Add Submodule Caching to Toolchain Generation #555

Workflow file for this run

name: Build
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
cache:
name: Update Submodule Cache
runs-on: ubuntu-24.04
outputs:
key: submodules-${{ steps.submodule-hash.outputs.HASH }}
env:
cache-path: |
.git/modules
binutils
gdb
gcc
llvm
newlib
glibc
musl
uclib-ng
dejagnu
pk
qemu
spike
steps:
- uses: actions/checkout@v4
- name: Generate Submodule Hash
id: submodule-hash
run: echo "HASH=$(git submodule | sha1sum | sed 's/.\{3\}$//')" >> $GITHUB_OUTPUT
- name: Check is Cache Exists for Exact Submodule Configuration
id: cache-check
uses: actions/cache@v4
with:
path: ${{ env.cache-path }}
key: submodules-${{ steps.submodule-hash.outputs.HASH }}
lookup-only: true
- name: If no Cache Hit, Update Cache
uses: actions/cache@v4
if: steps.cache-check.outputs.cache-hit != 'true'
with:
path: ${{ env.cache-path }}
key: submodules-${{ steps.submodule-hash.outputs.HASH }}
restore-keys: |
submodules-
- name: Clone submodules
if: steps.cache-check.outputs.cache-hit != 'true'
run: |
git submodule update --init --progress --depth 1 --jobs $(nproc) binutils gdb gcc llvm newlib glibc musl dejagnu pk qemu spike
git submodule update --init --progress uclibc-ng
build:
name: Build Toolchain Variants
runs-on: ${{ matrix.os }}
needs: [cache]
env:
cache-key: ${{ needs.cache.outputs.key }}
strategy:
matrix:
os: [ubuntu-22.04, ubuntu-24.04]
mode: [newlib, linux, musl, uclibc]
target: [rv32gc-ilp32d, rv64gc-lp64d]
compiler: [gcc, llvm]
exclude:
- mode: musl
compiler: llvm
- mode: uclibc
compiler: llvm
steps:
- name: Remove unneeded frameworks to recover disk space
run: |
echo "-- Before --"
df -h
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
echo "-- After --"
df -h
- name: Generate Submodules List
id: cache-path
run: |
submodules="gdb:binutils"
case "${{ matrix.mode }}" in
"linux")
submodules="$submodules:glibc";;
"musl")
submodules="$submodules:musl";;
"uclibc")
submodules="$submodules:uclibc-ng";;
"newlib")
submodules="$submodules:newlib";;
*)
echo "Invalid Mode"; exit 1;;
esac
case "${{ matrix.compiler }}" in
"gcc")
submodules="$submodules:gcc";;
"llvm")
submodules="$submodules:llvm";;
*)
echo "Invalid Compiler"; exit 1;;
esac
submodules=$(echo $submodules | sed 's/:/\n/g')
submodules=$submodules$'\n'$(echo "$submodules" | sed -e 's/^/.git\/modules\//')
echo 'submodules<<EOF' >> $GITHUB_OUTPUT
echo "$submodules" >> $GITHUB_OUTPUT
echo 'EOF' >> $GITHUB_OUTPUT
- uses: actions/checkout@v4
- name: Load Cache
uses: actions/cache/restore@v4
with:
path: |
${{ steps.cache-path.outputs.submodules }}
key: ${{ env.cache-key }}
- name: Install Dependencies
run: sudo ./.github/setup-apt.sh
- name: Build Toolchain
run: |
TARGET_TUPLE=($(echo ${{ matrix.target }} | tr "-" "\n"))
BUILD_TOOLCHAIN="./configure --prefix=/opt/riscv --with-arch=${TARGET_TUPLE[0]} --with-abi=${TARGET_TUPLE[1]}"
if [ "${{ matrix.compiler }}" == "llvm" ]; then # build toolchain with llvm
$BUILD_TOOLCHAIN --enable-llvm
else
$BUILD_TOOLCHAIN
fi
sudo make -j $(nproc) ${{ matrix.mode }}
- name: Generate Report
if: |
matrix.os == 'ubuntu-24.04'
&& (matrix.mode == 'linux' || matrix.mode == 'newlib')
&& matrix.compiler == 'gcc'
run: |
sudo make report-${{ matrix.mode }} -j $(nproc)
- name: Recover Space
run: |
sudo du -hs / 2> /dev/null || true
sudo rm -rf binutils dejagnu gcc gdb glibc llvm musl newlib pk qemu spike uclibc-ng || true
sudo du -hs / 2> /dev/null || true
- name: Tar Toolchain
run: tar czvf riscv.tar.gz -C /opt/ riscv/
- name: Generate Prebuilt Toolchain Name
id: toolchain-name-generator
run: |
if [[ "${{ matrix.target }}" == *"32"* ]]; then BITS=32; else BITS=64; fi
case "${{ matrix.mode }}" in
"linux")
MODE="glibc";;
"musl")
MODE="musl";;
"uclibc")
MODE="uclibc-ng";;
*)
MODE="elf";;
esac
echo "TOOLCHAIN_NAME=riscv$BITS-$MODE-${{ matrix.os }}-${{ matrix.compiler }}-nightly" >> $GITHUB_OUTPUT
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.toolchain-name-generator.outputs.TOOLCHAIN_NAME }}
path: riscv.tar.gz
test-sim:
name: Test Simulation
runs-on: ${{ matrix.os }}
needs: [cache]
env:
cache-key: ${{ needs.cache.outputs.key }}
strategy:
matrix:
os: [ubuntu-24.04]
mode: [newlib]
target: [rv64gc-lp64d]
sim: [spike]
steps:
- name: Remove unneeded frameworks to recover disk space
run: |
echo "-- Before --"
df -h
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
echo "-- After --"
df -h
- uses: actions/checkout@v4
- uses: actions/cache/restore@v4
with:
path: |
.git/modules/gcc
.git/modules/newlib
.git/modules/binutils
.git/modules/gdb
.git/modules/spike
.git/modules/pk
.git/modules/dejagnu
gcc
newlib
binutils
gdb
spike
pk
dejagnu
key: ${{ env.cache-key }}
- name: Install Dependencies
run: sudo ./.github/setup-apt.sh
- name: Build Toolchain
run: |
TARGET_TUPLE=($(echo ${{ matrix.target }} | tr "-" "\n"))
./configure --prefix=/opt/riscv --with-arch=${TARGET_TUPLE[0]} --with-abi=${TARGET_TUPLE[1]} --with-sim=${{ matrix.sim }}
make -j $(nproc) ${{ matrix.mode }}
- name: Generate Report
run: make report-${{ matrix.mode }} -j $(nproc)
build-multilib:
if: ${{ false }} # Disable until multilib errors are triaged
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-24.04]
mode: [newlib, linux]
target: [rv64gc-lp64d]
steps:
- name: Remove unneeded frameworks to recover disk space
run: |
echo "-- Before --"
df -h
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
echo "-- After --"
df -h
- uses: actions/checkout@v4
- name: install dependencies
run: sudo ./.github/setup-apt.sh
- name: build toolchain
run: |
TARGET_TUPLE=($(echo ${{ matrix.target }} | tr "-" "\n"))
./configure --prefix=/opt/riscv --with-arch=${TARGET_TUPLE[0]} --with-abi=${TARGET_TUPLE[1]} --enable-multilib
sudo make -j $(nproc) ${{ matrix.mode }}
- name: make report
run: |
sudo make report-${{ matrix.mode }} -j $(nproc)
- name: tarball build
run: tar czvf riscv.tar.gz -C /opt/ riscv/
- name: generate prebuilt toolchain name
id: toolchain-name-generator
run: |
if [[ "${{ matrix.target }}" == *"32"* ]]; then BITS=32; else BITS=64; fi
case "${{ matrix.mode }}" in
"linux")
MODE="glibc";;
"musl")
MODE="musl";;
"uclibc")
MODE="uclibc-ng";;
*)
MODE="elf";;
esac
echo "TOOLCHAIN_NAME=riscv$BITS-$MODE-${{ matrix.os }}-multilib-nightly" >> $GITHUB_OUTPUT
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.toolchain-name-generator.outputs.TOOLCHAIN_NAME }}
path: riscv.tar.gz