Skip to content

Introduce sanitizer options and run with sanitizer on Linux/macOS #63

Introduce sanitizer options and run with sanitizer on Linux/macOS

Introduce sanitizer options and run with sanitizer on Linux/macOS #63

Workflow file for this run

---
# GitHub action to compile and test ATF 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
name: build
on: # yamllint disable-line rule:truthy
pull_request:
branches:
- master
push:
workflow_dispatch:
permissions:
contents: read
jobs:
build:
# yamllint disable-line rule:line-length
name: ${{ matrix.build-os }} ${{ matrix.compiler }} ${{ join(matrix.sanitize, '+') }}
env:
AR: ${{ matrix.llvm-bindir }}/llvm-ar
CC: ${{ matrix.llvm-bindir }}/clang
CPP: ${{ matrix.llvm-bindir }}/clang-cpp
CXX: ${{ matrix.llvm-bindir }}/clang++
NM: ${{ matrix.llvm-bindir }}/llvm-nm
RANLIB: ${{ matrix.llvm-bindir }}/llvm-ranlib
OBJDUMP: ${{ matrix.llvm-bindir }}/llvm-objdump
STRIP: ${{ matrix.llvm-bindir }}/llvm-strip
ATF_SRCDIR: ${{ github.workspace }}/src
ATF_OBJDIR: ${{ github.workspace }}/obj
# yamllint disable-line rule:line-length
JOB_NAME: ${{ matrix.build-os }} ${{ matrix.compiler }} ${{ join(matrix.sanitize, '+') }}
runs-on: "${{ matrix.build-os }}"
strategy:
fail-fast: false
matrix:
build-os:
- ubuntu-24.04
- macos-latest
include:
- build-os: macos-latest
compiler: clang-19
pkgs:
- autoconf
- automake
- kyua
- libtool
- llvm@19
- pkgconf
llvm-bindir: /opt/homebrew/opt/llvm@19/bin
- build-os: ubuntu-24.04
compiler: clang-18
pkgs:
- clang-18
- autoconf
- automake
- kyua
- libtool
- pkgconf
llvm-bindir: /usr/lib/llvm-18/bin
sanitize:
- ""
- ["asan", "lsan"]
- ubsan
steps:
- name: Install packages (macOS)
if: runner.os == 'macOS'
run: |
brew update --quiet || true
brew install ${{ join(matrix.pkgs, ' ') }}
- name: Install packages (Ubuntu)
if: runner.os == 'Linux'
run: |
sudo apt-get update --quiet
sudo apt-get --quiet -y --no-install-suggests \
--no-install-recommends install \
${{ join(matrix.pkgs, ' ') }}
- name: Checking out source
uses: actions/checkout@v4
with:
path: src
- name: Sanity checks
run: |
which -a kyua
- name: Build
run: |
cd "${ATF_SRCDIR}"
./admin/ci-build/01_configure.sh
- name: Distcheck (builds and tests)
run: |
CFG_ARGS="--disable-dependency-tracking --enable-developer"
for i in ${{ join(matrix.sanitize, ' ') }}; do
CFG_ARGS="${CFG_OPTS} --enable-${i}"
done
cd "${ATF_SRCDIR}"
env "EXTRA_DISTCHECK_CONFIGURE_ARGS=${CFG_ARGS}" \
./admin/ci-build/02_distcheck.sh
- name: Gather/Archive Logs and Reports
run: |
REPORTS_DIR="${ATF_OBJDIR}/reports"
mkdir -p "${REPORTS_DIR}"
(
cd "${REPORTS_DIR}"
mkdir -p build_logs
# Gather the distcheck failure log if the target failed.
# It's easier to ignore the failure than create yet another
# conditional variable step.
cp -a "${ATF_SRCDIR}"/atf-*/_build/sub/*.log build_logs/ \
2>/dev/null || true
# Include the raw kyua logs.
cp -a ~/.kyua/logs kyua_logs
)
# Create an archive of the reports.
job_name_encoded=$(echo "${JOB_NAME}" | tr ' ' '_')
tar -cvf "atf-test-reports-${job_name_encoded}.tar" \
-C "${REPORTS_DIR}" .
if: ${{ ! cancelled() }}
- name: Archive Build Artifacts
uses: actions/upload-artifact@v4
with:
name: Test Report for ${{ env.JOB_NAME }}
path: atf-test-reports-*.tar
compression-level: 0
retention-days: 10
overwrite: true
if: ${{ ! cancelled() }}