diff --git a/.github/workflows/build-and-test.yaml b/.github/workflows/build-and-test.yaml new file mode 100644 index 0000000..87311f4 --- /dev/null +++ b/.github/workflows/build-and-test.yaml @@ -0,0 +1,67 @@ +name: Build and run tests +on: [push, pull_request] + +env: + CI_BUILD_DIR: build + CXX: g++ + CMAKE_PREFIX_PATH: 3rdparty/cxxtest + +jobs: + build_and_test: + name: Build and test. OS=${{ matrix.os }}, math=${{ matrix.use_r && 'RMath' || 'GSL' }}, build=${{ matrix.poor_build && 'poor' || 'rich' }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + include: + - os: ubuntu-latest + - os: ubuntu-latest + poor_build: true + - os: ubuntu-latest + use_r: true + - os: ubuntu-latest + cxx: g++ + - os: macos-latest + CXX: g++ + omp: false + + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - name: Install system dependencies (Linux) + env: + REQUIRED_DEPS: ninja-build + OPTIONAL_DEPS: ${{ ! matrix.poor_build && 'libfftw3-dev opencl-headers' || '' }} + MATH_DEPS: ${{ matrix.use_r && 'r-mathlib' || 'libgsl-dev' }} + if: ${{ matrix.os == 'ubuntu-latest' }} + run: | + sudo apt install $REQUIRED_DEPS $MATH_DEPS $OPTIONAL_DEPS + + - name: Install system dependencies (MacOS) + if: ${{ matrix.os == 'macos-latest' }} + run: | + brew install ninja gsl fftw + + - name: Configure + env: + LIBPROFIT_NO_OPENMP: ${{ matrix.omp && 'OFF' || 'ON' }} + LIBPROFIT_USE_R: ${{ matrix.use_r && 'ON' || 'OFF' }} + CXX: ${{ matrix.cxx || env.CXX }} + CMAKE_EXTRA_FLAGS: ${{ matrix.poor_build && '-DLIBPROFIT_NO_OPENCL=ON -DLIBPROFIT_NO_OPENMP=ON -DLIBPROFIT_NO_FFTW=ON -DLIBPROFIT_NO_SIMD=ON' || '' }} + run: | + cmake -B ${CI_BUILD_DIR} -G Ninja \ + -DLIBPROFIT_NO_OPENMP=$LIBPROFIT_NO_OPENMP \ + -DLIBPROFIT_TEST=ON \ + -DLIBPROFIT_USE_R=$LIBPROFIT_USE_R \ + -DCMAKE_CXX_COMPILER=$CXX \ + $CMAKE_EXTRA_FLAGS + + - name: Build + run: cmake --build ${CI_BUILD_DIR} + + # Let MacOS tests fail until OpenCL issues are identified + - name: Run unit tests + run: | + cd ${CI_BUILD_DIR} + ctest --output-on-failure || ${{ matrix.os == 'macos-latest' && 'true' || 'false' }}