Skip to content

Commit

Permalink
Add build-bpf-gcc action
Browse files Browse the repository at this point in the history
A prerequisite for running selftests/bpf is a recent version of GCC
compiled for BPF backend.

Signed-off-by: Ihor Solodrai <[email protected]>
  • Loading branch information
theihor committed Jan 14, 2025
1 parent 05b25cd commit 5455cb7
Show file tree
Hide file tree
Showing 5 changed files with 122 additions and 1 deletion.
15 changes: 15 additions & 0 deletions build-bpf-gcc/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# Build BPF GCC

This action grabs latest GCC 15 source code snapshot from
https://gcc.gnu.org/pub/gcc/snapshots, as well as most recent
binutils, and builds GCC for BPF backend and installs it into a
specified directory.

Resulting artifacts are cached with
[actions/cache](https://github.com/actions/cache), using snapshot
names as a key.

## Required inputs

* `install-dir` - Path to the directory where built binaries are going to be installed, or restored from cache.

28 changes: 28 additions & 0 deletions build-bpf-gcc/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: 'Build BPF GCC'
description: 'Fetch latest GCC and binutils snapshots, bulid GCC and install into the target directory'
inputs:
install-dir:
description: "Path to the GCC installation directory"
required: true

runs:
using: "composite"
steps:

- name: Determine latest snapshots
id: latest-snapshots
shell: bash
run: ${GITHUB_ACTION_PATH}/latest-snapshots.sh

- uses: actions/cache@v4
id: cache
with:
path: ${{ inputs.install-dir }}
key: BPF-GCC-${{ steps.latest-snapshots.outputs.GCC_BASENAME }}-${{ steps.latest-snapshots.outputs.BINUTILS_BASENAME }}

- if: steps.cache.outputs.cache-hit != 'true'
name: Build BPF GCC
shell: bash
run: |
${GITHUB_ACTION_PATH}/build-and-install.sh ${{ inputs.install-dir }}
53 changes: 53 additions & 0 deletions build-bpf-gcc/build-and-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/bin/bash
set -euo pipefail

source ${GITHUB_ACTION_PATH}/../helpers.sh

INSTALLDIR=$(realpath $1)

if [ -f ${GITHUB_ACTION_PATH}/.env ]; then
source ${GITHUB_ACTION_PATH}/.env
else
echo "${GITHUB_ACTION_PATH}/.env is not found, supposed to be produced by latest-snapshots.sh"
exit 1
fi

foldable start download_tarballs "Downloading $BINUTILS_URL and $GCC_URL"

test -f $BINUTILS_TARBALL || wget -q $BINUTILS_URL
test -f $GCC_TARBALL || wget -q $GCC_URL

foldable end download_tarballs

foldable start build_binutils "Building $BINUTILS_BASENAME"

if [ ! -f "${INSTALLDIR}/${BINUTILS_BASENAME}.built" ]; then
tar xJf $BINUTILS_TARBALL
mkdir -p ${BINUTILS_BASENAME}/build-bpf
cd ${BINUTILS_BASENAME}/build-bpf
../configure --target=bpf-unknown-none --prefix=$INSTALLDIR
make -j$(nproc) && make install
touch ${INSTALLDIR}/${BINUTILS_BASENAME}.built
cd -
fi

foldable end build_binutils

foldable start build_gcc "Building $GCC_BASENAME"

if [ ! -f "${INSTALLDIR}/${GCC_BASENAME}.built" ]; then
tar xJf $GCC_TARBALL
cd ${GCC_BASENAME}
./contrib/download_prerequisites
cd -
mkdir -p ${GCC_BASENAME}/build-bpf
cd ${GCC_BASENAME}/build-bpf
../configure --target=bpf-unknown-none --prefix=$INSTALLDIR
make -j$(nproc) && make install
touch ${INSTALLDIR}/${GCC_BASENAME}.built
cd -
fi

foldable end build_gcc

exit 0
25 changes: 25 additions & 0 deletions build-bpf-gcc/latest-snapshots.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
#!/bin/bash
set -euo pipefail

BINUTILS_TARBALL=`wget https://snapshots.sourceware.org/binutils/trunk/latest/src/sha512.sum -O - -o /dev/null | grep -E 'binutils-[0-9a-f.-]+.tar.xz' | sed -e 's/.*\(binutils-[^<]*\).*/\1/'`
GCC_TARBALL=`wget https://gcc.gnu.org/pub/gcc/snapshots/LATEST-15 -O - -o /dev/null | grep -E 'gcc-15-[0-9]+.tar.xz' | sed -e 's/.*\(gcc-15-[^<]*\).*/\1/'`

BINUTILS_URL="https://snapshots.sourceware.org/binutils/trunk/latest/src/$BINUTILS_TARBALL"
GCC_URL="https://gcc.gnu.org/pub/gcc/snapshots/LATEST-15/$GCC_TARBALL"

BINUTILS_BASENAME=$(basename $BINUTILS_TARBALL .tar.xz)
GCC_BASENAME=$(basename $GCC_TARBALL .tar.xz)

cat > ${GITHUB_ACTION_PATH}/.env <<EOF
BINUTILS_TARBALL=$BINUTILS_TARBALL
GCC_TARBALL=$GCC_TARBALL
BINUTILS_URL=$BINUTILS_URL
GCC_URL=$GCC_URL
BINUTILS_BASENAME=$BINUTILS_BASENAME
GCC_BASENAME=$GCC_BASENAME
EOF

echo "BINUTILS_BASENAME=${BINUTILS_BASENAME}" >> "$GITHUB_OUTPUT"
echo "GCC_BASENAME=${GCC_BASENAME}" >> "$GITHUB_OUTPUT"

exit 0
2 changes: 1 addition & 1 deletion setup-build-env/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ runs:
run: |
echo "::group::Setup"
sudo apt-get update
sudo apt-get install -y cmake flex bison build-essential libssl-dev ncurses-dev xz-utils bc rsync libguestfs-tools qemu-kvm qemu-utils zstd libzstd-dev binutils-dev elfutils libcap-dev libelf-dev libdw-dev python3-docutils
sudo apt-get install -y cmake flex bison build-essential libssl-dev ncurses-dev xz-utils bc rsync libguestfs-tools qemu-kvm qemu-utils zstd libzstd-dev binutils-dev elfutils libcap-dev libelf-dev libdw-dev python3-docutils texinfo
echo "::endgroup::"
- name: Install clang
shell: bash
Expand Down

0 comments on commit 5455cb7

Please sign in to comment.