Skip to content

Commit

Permalink
Add build-bpf-gcc action
Browse files Browse the repository at this point in the history
  • Loading branch information
theihor committed Dec 27, 2024
1 parent beb848b commit 1aac896
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .github/workflows/kernel-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,8 @@ jobs:
env:
MAX_MAKE_JOBS: 32
RELEASE: ${{ inputs.release && '1' || '' }}
# GCC for building BPF selftests will be installed into BPF_GCC directory
BPF_GCC: ${{ github.workspace }}/bpf-gcc
with:
arch: ${{ inputs.arch }}
kernel-root: ${{ env.KERNEL_ROOT }}
Expand Down
32 changes: 32 additions & 0 deletions build-bpf-gcc/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
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
env:
LOGFILE: /tmp/build-bpf-gcc.log
shell: bash
run: |
${GITHUB_ACTION_PATH}/build-and-install.sh ${{ inputs.install-dir }} \
|| { cat $LOGFILE; exit 1; }
42 changes: 42 additions & 0 deletions build-bpf-gcc/build-and-install.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
#!/bin/bash
set -euxo pipefail

INSTALLDIR=$(realpath $1)
LOGFILE=${LOGFILE:-build-bpf-gcc.log}

source ${GITHUB_ACTION_PATH}/.env

test -f $BINUTILS_TARBALL || {
echo -n "Fetching $BINUTILS_URL... ";
wget -o /dev/null $BINUTILS_URL || { echo -e "\nerror: could not fetch $BINUTILS_URL"; exit 1; };
echo done;
}

test -f $GCC_TARBALL || {
echo -n "Fetching $GCC_URL... ";
wget -o /dev/null $GCC_URL || { echo -e "\nerror: could not fetch $GCC_URL"; exit 1; };
echo done;
}

if [ ! -f "${INSTALLDIR}/${BINUTILS_BASENAME}.built" ]; then
echo -n "Building and installing $BINUTILS_BASENAME... ";
(tar xJf $BINUTILS_TARBALL;
cd ${BINUTILS_BASENAME};
mkdir build-bpf;
cd build-bpf && ../configure --target=bpf-unknown-none --prefix=$INSTALLDIR && make -j $(nproc) && make install && touch ${INSTALLDIR}/${BINUTILS_BASENAME}.built;
) >> $LOGFILE 2>&1 || { echo -e "\nerror: building $BINUTILS_TARBALL"; exit 1; }
echo done
fi

if [ ! -f "${INSTALLDIR}/${GCC_BASENAME}.built" ]; then
echo -n "Building and installing $GCC_BASENAME... ";
(tar xJf $GCC_TARBALL;
cd ${GCC_BASENAME};
./contrib/download_prerequisites
mkdir build-bpf;
cd build-bpf && ../configure --target=bpf-unknown-none --prefix=$INSTALLDIR && make -j $(nproc) && make install && touch ${INSTALLDIR}/${GCC_BASENAME}.built;
) >> $LOGFILE 2>&1 || { echo -e "\nerror: building $GCC_TARBALL"; exit 1; }
echo done
fi

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
6 changes: 6 additions & 0 deletions build-selftests/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,12 @@ inputs:
runs:
using: "composite"
steps:

- if: ${{ env.BPF_GCC }}
uses: ./build-bpf-gcc
with:
install-dir: ${{ env.BPF_GCC }}

- name: build selftests
shell: bash
env:
Expand Down
1 change: 1 addition & 0 deletions build-selftests/build_selftests.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ foldable start build_selftests "Building selftests with $TOOLCHAIN"

MAKE_OPTS=$(cat <<EOF
ARCH=${ARCH}
BPF_GCC=${BPF_GCC:-}
CROSS_COMPILE=${CROSS_COMPILE}
CLANG=clang-${LLVM_VERSION}
LLC=llc-${LLVM_VERSION}
Expand Down

0 comments on commit 1aac896

Please sign in to comment.