Skip to content

Add NDEBUG for coverage build #35

Add NDEBUG for coverage build

Add NDEBUG for coverage build #35

# This starter workflow is for a CMake project running on multiple platforms. There is a different starter workflow if you just want a single platform.
# See: https://github.com/actions/starter-workflows/blob/main/ci/cmake-single-platform.yml
name: CMake on multiple platforms
on:
push:
branches: [ "master", "dev" ]
pull_request:
branches: [ "master" ]
jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
# Set fail-fast to false to ensure that feedback is delivered for all matrix combinations. Consider changing this to true when your workflow is stable.
fail-fast: false
# Set up a matrix to run the following 3 configurations:
# 1. <Windows, Release, latest MSVC compiler toolchain on the default runner image, default generator>
# 2. <Linux, Debug, latest GCC compiler toolchain on the default runner image, default generator>
# 3. <Linux, Coverage, latest Clang compiler toolchain on the default runner image, default generator>
#
# To add more build types (Release, Debug, RelWithDebInfo, etc.) customize the build_type list.
matrix:
os: [ubuntu-latest, windows-latest]
build_type: [Debug, Coverage, Release]
c_compiler: [gcc, clang-15, cl]
include:
- os: windows-latest
c_compiler: cl
cpp_compiler: cl
- os: ubuntu-latest
c_compiler: gcc
cpp_compiler: g++
- os: ubuntu-latest
c_compiler: clang-15
cpp_compiler: clang++-15
exclude:
- os: windows-latest
build_type: Debug
- os: windows-latest
build_type: Coverage
- os: windows-latest
c_compiler: gcc
- os: windows-latest
c_compiler: clang-15
- os: ubuntu-latest
c_compiler: cl
- os: ubuntu-latest
build_type: Release
- c_compiler: gcc
build_type: Coverage
- c_compiler: clang-15
build_type: Debug
steps:
- uses: actions/checkout@v3
- name: Set reusable strings
# Turn repeated input strings (such as the build output directory) into step outputs. These step outputs can be used throughout the workflow file.
id: strings
shell: bash
run: |
echo "build-output-dir=${{ github.workspace }}/build" >> "$GITHUB_OUTPUT"
- name: Setup Environment
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
sudo apt-get update -qq
sudo apt-get install -y --no-install-recommends libglfw3 libglfw3-dev libx11-dev libxcursor-dev libxrandr-dev libxinerama-dev libxi-dev libxext-dev libxfixes-dev
# install xvfb for testing
sudo apt-get install -y xvfb
# install llvm for coverage
sudo apt-get install -y llvm-15
- name: early check if required binaries are present
if: ${{ matrix.os == 'ubuntu-latest' }}
run: |
which g++ clang++-15 llvm-cov-15 llvm-profdata-15 xvfb-run
llvm-cov-15 --version
# It's nice to have cache, but it seems that it doesn't support updating yet.
# we could do "save cache" "build" "delete cache and re-upload cache"
# but let's postpone it to the future.
# https://github.com/actions/toolkit/issues/505
# - name: Restore Cache
# uses: actions/cache/restore@v3
# with:
# # A list of files, directories, and wildcard patterns to cache and restore
# path: ${{ steps.strings.outputs.build-output-dir }}
# # An explicit key for restoring and saving the cache
# key: "cache_of_${{ matrix.os }}_${{ matrix.c_compiler }}_${{ matrix.build_type }}"
- name: Configure CMake
# Configure CMake in a 'build' subdirectory. `CMAKE_BUILD_TYPE` is only required if you are using a single-configuration generator such as make.
# See https://cmake.org/cmake/help/latest/variable/CMAKE_BUILD_TYPE.html?highlight=cmake_build_type
run: >
cmake -B ${{ steps.strings.outputs.build-output-dir }}
-DCMAKE_CXX_COMPILER=${{ matrix.cpp_compiler }}
-DCMAKE_C_COMPILER=${{ matrix.c_compiler }}
-DCMAKE_BUILD_TYPE=${{ matrix.build_type }}
-S ${{ github.workspace }}
- name: Build
# Build your program with the given configuration. Note that --config is needed because the default Windows generator is a multi-config generator (Visual Studio generator).
run: cmake --build ${{ steps.strings.outputs.build-output-dir }} --config ${{ matrix.build_type }}
# - name: Save Cache
# uses: actions/cache/save@v3
# with:
# # A list of files, directories, and wildcard patterns to cache and restore
# path: ${{ steps.strings.outputs.build-output-dir }}
# # An explicit key for restoring and saving the cache
# key: "cache_of_${{ matrix.os }}_${{ matrix.c_compiler }}_${{ matrix.build_type }}"
- uses: actions/upload-artifact@v4
if: ${{ matrix.os == 'windows-latest' }}
with:
# Name of the artifact to upload.
# Optional. Default is 'artifact'
name: windows_build
# A file, directory or wildcard pattern that describes what to upload
# Required.
path: |
${{ github.workspace }}/build/${{ matrix.build_type }}/sokoban.exe
${{ github.workspace }}/build/${{ matrix.build_type }}/assets
# The desired behavior if no files are found using the provided path.
# Available Options:
# warn: Output a warning but do not fail the action
# error: Fail the action with an error message
# ignore: Do not output any warnings or errors, the action does not fail
# Optional. Default is 'warn'
if-no-files-found: error
# Duration after which artifact will expire in days. 0 means using default retention.
# Minimum 1 day.
# Maximum 90 days unless changed from the repository settings page.
# Optional. Defaults to repository settings.
retention-days: 30
# The level of compression for Zlib to be applied to the artifact archive.
# The value can range from 0 to 9.
# For large files that are not easily compressed, a value of 0 is recommended for significantly faster uploads.
# Optional. Default is '6'
compression-level: 6
- name: Coverage
if: ${{ matrix.os == 'ubuntu-latest' && matrix.c_compiler == 'clang-15' }}
working-directory: ${{ github.workspace }}
run: |
export LLVM_PROFILE_FILE=/tmp/llvm_profile/profile-%p.profraw
ctest --build-config ${{ matrix.build_type }} --test-dir ${{ steps.strings.outputs.build-output-dir }}
llvm-profdata-15 merge -sparse /tmp/llvm_profile/profile-*.profraw -o /tmp/coverage.profdata
llvm-cov-15 show ${{ steps.strings.outputs.build-output-dir }}/sokoban -instr-profile=/tmp/coverage.profdata ${{ github.workspace }}/src > /tmp/coverage.txt
- name: Upload Coverage
if: ${{ matrix.os == 'ubuntu-latest' && matrix.c_compiler == 'clang-15' }}
uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
files: /tmp/coverage.txt
fail_ci_if_error: true # optional (default = false)
verbose: true # optional (default = false)