diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 00000000..bb19147e --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,214 @@ +--- +# GitHub action to compile and test kyua on supported platforms. +# +# Steps executed: +# * Handle prerequisites +# * Install binary packages +# * Build packages from source (if needed). +# * Build +# * Install +# * Run tests +# +# On MacOS we build with: +# * latest clang from brew (system provided clang lacks sanitizers). +# * ld from system +# +env: + ATF_REPO: freebsd/atf + ATF_REF: atf-0.22 + #LUTOK_REPO: freebsd/lutok + #LUTOK_REF: lutok-0.6 + LUTOK_REPO: ngie-eign/lutok + LUTOK_REF: build-cleanup + +name: build +on: + pull_request: + branches: + - master + push: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build: + name: Build ${{ matrix.build-os }} ${{ matrix.compiler }} ${{ matrix.enable-atf }} + runs-on: "${{ matrix.build-os }}" + strategy: + fail-fast: false + matrix: + build-os: + - ubuntu-24.04 + - macos-latest + #enable-atf: [--disable-atf, --enable-atf] + enable-atf: [--enable-atf] + include: + - build-os: macos-latest + compiler: clang-19 + pkgs: + - llvm@19 + - autoconf + - automake + - libtool + - pkgconf + - lua@5.4 + - sqlite + enable-atf-pkgs: + # gdb is not built for ARM64 yet :(. + # - gdb + llvm-bindir: /opt/homebrew/opt/llvm/bin + - build-os: ubuntu-24.04 + compiler: clang-18 + pkgs: + - clang-18 + - autoconf + - automake + - libtool + - pkgconf + - liblua5.4-dev + - lua5.4 + - libsqlite3-dev + enable-atf-pkgs: + - gdb + llvm-bindir: /usr/lib/llvm-18/bin + steps: + - name: Install base dependencies (macOS) + if: runner.os == 'macOS' + run: | + brew update -q || true + brew install -q \ + ${{ join(matrix.pkgs, ' ') }} \ + ${{ join(matrix.enable-atf-pkgs, ' ') }} + - name: Install base dependencies (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt -Uqy --no-install-suggests \ + --no-install-recommends install \ + ${{ join(matrix.pkgs, ' ') }} \ + ${{ join(matrix.enable-atf-pkgs, ' ') }} + - name: Checking out source (ATF) + uses: actions/checkout@v4 + with: + repository: "${{ env.ATF_REPO }}" + ref: "${{ env.ATF_REF }}" + # Same as `ATF_SRCDIR`. + path: "${{ github.workspace }}/atf-src" + - name: Checking out source (Lutok) + uses: actions/checkout@v4 + with: + repository: "${{ env.LUTOK_REPO }}" + ref: "${{ env.LUTOK_REF }}" + # Same as `LUTOK_SRCDIR`. + path: "${{ github.workspace }}/lutok-src" + - name: Clone Kyua source + if: matrix.enable-atf == '--enable-atf' + uses: actions/checkout@v4 + with: + # Same as `KYUA_SRCDIR`. + path: "${{ github.workspace }}/kyua-src" + - name: Setup Environment + run: | + echo "AR=${{ matrix.llvm-bindir }}/llvm-ar" >> "${GITHUB_ENV}" + echo "CC=${{ matrix.llvm-bindir }}/clang" >> "${GITHUB_ENV}" + echo "CPP=${{ matrix.llvm-bindir }}/clang-cpp" >> "${GITHUB_ENV}" + echo "CXX=${{ matrix.llvm-bindir }}/clang++" >> "${GITHUB_ENV}" + echo "NM=${{ matrix.llvm-bindir }}/llvm-nm" >> "${GITHUB_ENV}" + echo "PKG_CONFIG_PATH='$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig'" >> "${GITHUB_ENV}" + echo "RANLIB=${{ matrix.llvm-bindir }}/llvm-ranlib" >> "${GITHUB_ENV}" + echo "OBJDUMP=${{ matrix.llvm-bindir }}/llvm-objdump" >> "${GITHUB_ENV}" + echo "STRIP=${{ matrix.llvm-bindir }}/llvm-strip" >> "${GITHUB_ENV}" + echo "ATF_SRCDIR=${GITHUB_WORKSPACE}/atf-src" >> "${GITHUB_ENV}" + echo "ATF_OBJDIR=${GITHUB_WORKSPACE}/atf-obj" >> "${GITHUB_ENV}" + echo "KYUA_SRCDIR=${GITHUB_WORKSPACE}/kyua-src" >> "${GITHUB_ENV}" + echo "KYUA_OBJDIR=${GITHUB_WORKSPACE}/kyua-obj" >> "${GITHUB_ENV}" + echo "KYUA_PREFIX=/usr/local" >> "${GITHUB_ENV}" + echo "KYUA_STOREDIR=${GITHUB_WORKSPACE}/kyua-obj/store" >> "${GITHUB_ENV}" + echo "KYUA_STORETESTDATADIR=${GITHUB_WORKSPACE}/kyua-obj/store" >> "${GITHUB_ENV}" + echo "LUTOK_SRCDIR=${GITHUB_WORKSPACE}/lutok-src" >> "${GITHUB_ENV}" + echo "LUTOK_OBJDIR=${GITHUB_WORKSPACE}/lutok-obj" >> "${GITHUB_ENV}" + echo "NPROC=`getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null || echo 1`" >> "${GITHUB_ENV}" + - name: Build Environment Dump + run: | + echo "ATF flag: ${{ matrix.enable-atf }}" + echo "uname -a: $(uname -a)" + echo "uname -m: $(uname -m)" + echo "uname -p: $(uname -p)" + echo "Build environment:" + cat "${GITHUB_ENV}" + - name: Build and install ATF + if: matrix.enable-atf == '--enable-atf' + run: | + set -x + CFG_OPTS="--disable-dependency-tracking" + CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}" + echo "Building lutok with ${CFG_OPTS}..." + cd "${ATF_SRCDIR}" + autoreconf -isv + mkdir -p "${ATF_OBJDIR}" + cd "${ATF_OBJDIR}" + "${ATF_SRCDIR}/configure" ${CFG_OPTS} + make -j${NPROC} all | tee atf-make-all.log + sudo make install + - name: Build and Install Lutok + run: | + set -x + CFG_OPTS="--disable-dependency-tracking" + CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}" + echo "Building lutok with ${CFG_OPTS}..." + cd "${LUTOK_SRCDIR}" + autoreconf -isv -I/usr/local/share/aclocal + mkdir -p "${LUTOK_OBJDIR}" + cd "${LUTOK_OBJDIR}" + "${LUTOK_SRCDIR}/configure" ${CFG_OPTS} + make -j${NPROC} all | tee lutok-make-all.log + cd "${LUTOK_OBJDIR}" + sudo make install + - name: Build and Install Kyua + run: | + set -x + CFG_OPTS="--disable-dependency-tracking" + CFG_OPTS="${CFG_OPTS} ${{ matrix.enable-atf }}" + CFG_OPTS="${CFG_OPTS} --prefix=${KYUA_PREFIX}" + if [ "x${{ matrix.enable-atf }}" = "x--enable-atf" ]; then + CXXFLAGS="$CXXFLAGS $(pkgconf --cflags atf-c++)" + LDFLAGS="$LDFLAGS $(pkgconf --libs-only-L atf-c++)" + fi + CXXFLAGS="${CXXFLAGS} $(pkgconf --cflags lutok)"; + LDFLAGS="${LDFLAGS} $(pkgconf --libs-only-L lutok)"; + cd "${KYUA_SRCDIR}" + autoreconf -isv -I/usr/local/share/aclocal + mkdir -p "${KYUA_OBJDIR}" + cd "${KYUA_OBJDIR}" + echo "syntax(2)" > kyua.conf + echo "unprivileged_user = 'nobody'" >> kyua.conf + env CXXFLAGS="${CXXFLAGS}" \ + KYUA_CONFIG_FILE_FOR_CHECK="$(pwd)/kyua.conf" \ + LDFLAGS="${LDFLAGS}" \ + "${KYUA_SRCDIR}/configure" ${CFG_OPTS} + make -j${NPROC} all | tee kyua-make-all.log + sudo make install + - name: Test Kyua Setup (Ubuntu) + if: runner.os == 'Linux' && matrix.enable-atf == '--enable-atf' + run: | + sudo sysctl kernel.core_pattern="/cores/core.%p.%e" + sudo ldconfig + - name: Test Kyua + if: matrix.enable-atf == '--enable-atf' + run: | + cd "${KYUA_OBJDIR}" + sudo sh -c 'ulimit -c unlimited; make installcheck' + check_exit=$? + if [ $check_exit -eq 0 ]; then + echo "# ✅ All mandatory checks passed" >> $GITHUB_STEP_SUMMARY + else + echo "# ❌ Some checks failed" >> $GITHUB_STEP_SUMMARY + echo "::error file=.github/workflows/build.yaml,line=173,endLine=173,title=Checks failed!::checks failed" + fi + cd "${KYUA_PREFIX}/tests/kyua" + chown -R a+rx "${KYUA_STOREDIR}" + kyua report-html \ + --results-file ${KYUA_STOREDIR}/*.db \ + --output ${KYUA_OBJDIR}/html + exit $check_exit