Skip to content

GitLab pipeline.

GitLab pipeline. #137

Workflow file for this run

# Inspiration from:
# - https://cristianadam.eu/20191222/using-github-actions-with-c-plus-plus-and-cmake/
# - https://github.com/cristianadam/HelloWorld/blob/master/.github/workflows/build_cmake.yml
# - https://github.com/marketplace/actions/vcpkg-action
name: GH Debug
on:
workflow_dispatch: {} # allow running it manually
push:
branches:
- main
tags:
- v**
pull_request:
branches:
- main
tags:
- v**
env:
BUILD_TYPE: Coverage
jobs:
build:
name: ${{ matrix.config.name }}
runs-on: ${{ matrix.config.os }}
strategy:
fail-fast: false
matrix:
config:
- {
name: "Windows Latest MSVC i686", ext: "windows-msvc-i686",
os: windows-latest,
cc: "cl", cxx: "cl",
# https://learn.microsoft.com/en-us/cpp/build/building-on-the-command-line?view=msvc-170
environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars32.bat",
vcpkg_triplet: x86-windows
}
- {
name: "Windows Latest MSVC x86_64", ext: "windows-msvc-x86_64",
os: windows-latest,
cc: "cl", cxx: "cl",
environment_script: "C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Auxiliary/Build/vcvars64.bat",
vcpkg_triplet: x64-windows
}
# - {
# name: "Windows Latest LLVM i686", ext: "windows-llvm-i686",
# os: windows-latest,
# cc: "clang", cxx: "clang++",
# vcpkg_triplet: x86-win-llvm
# }
- {
name: "Windows Latest LLVM x86_64", ext: "windows-llvm-x86_64",
os: windows-latest,
cc: "clang", cxx: "clang++",
vcpkg_triplet: x64-win-llvm
}
- {
name: "Windows Latest MinGW i686", ext: "windows-mingw-i686",
os: windows-latest,
cc: "gcc", cxx: "g++",
vcpkg_triplet: x86-mingw-dynamic,
mingw_url: "https://github.com/niXman/mingw-builds-binaries/releases/download/12.2.0-rt_v10-rev2/i686-12.2.0-release-posix-dwarf-msvcrt-rt_v10-rev2.7z",
mingw_dir: "./mingw/mingw32/bin",
mingw_chocolatey_dir: "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw32/bin"
}
- {
name: "Windows Latest MinGW x86_64", ext: "windows-mingw-x86_64",
os: windows-latest,
cc: "gcc", cxx: "g++",
vcpkg_triplet: x64-mingw-dynamic,
mingw_url: "https://github.com/niXman/mingw-builds-binaries/releases/download/12.2.0-rt_v10-rev2/x86_64-12.2.0-release-posix-seh-msvcrt-rt_v10-rev2.7z",
mingw_dir: "./mingw/mingw64/bin",
mingw_chocolatey_dir: "C:/ProgramData/chocolatey/lib/mingw/tools/install/mingw64/bin"
}
- {
name: "Ubuntu Latest GCC", ext: "linux",
os: ubuntu-latest,
cc: "gcc", cxx: "g++",
vcpkg_triplet: x64-linux
}
- {
name: "macOS Latest Clang", ext: "macos",
os: macos-latest,
cc: "clang", cxx: "clang++",
vcpkg_triplet: x64-osx
}
defaults:
run:
# Run scripts with project directory as working directory
working-directory: ./
# Use bash as default shell
shell: bash
steps:
- uses: actions/checkout@v3
with:
submodules: "true"
# Use path because of issue: https://github.com/johnwason/vcpkg-action/issues/14#issuecomment-1558312751
# where vcpkg searches the parent directory tree for vcpkg.json, even if we do not want to use it
path: project
- name: Update Ubuntu package list
if: runner.os == 'Linux'
run: sudo apt-get update
- name: Prepare cache timestamp
id: cache_timestamp
shell: cmake -P {0}
run: |
string(TIMESTAMP current_date "%Y-%m-%d-%H;%M;%S" UTC)
file(APPEND "$ENV{GITHUB_OUTPUT}" "timestamp=${current_date}")
# # Chocolatey's MinGW does not work with vcpkg for some reason
# - name: Set MinGW path
# if: contains(matrix.config.ext, 'windows-mingw')
# run: echo "${{ matrix.config.mingw_chocolatey_dir }}" >> $GITHUB_PATH
- name: Cache MinGW
id: cache-mingw
if: contains(matrix.config.ext, 'windows-mingw')
uses: actions/[email protected]
with:
path: ./mingw
key: ${{ runner.os }}-${{ matrix.config.ext }}-cache-${{ steps.cache_timestamp.outputs.timestamp }}
restore-keys: |
${{ runner.os }}-${{ matrix.config.ext }}-cache-
# vcpkg wxwidgets build fails with Chocolatey's packaging of MinGW.
# https://github.com/microsoft/vcpkg/issues/31496
# https://stackoverflow.com/a/59361133/3049315
# - name: Remove Chocolatey's MinGW
# if: contains(matrix.config.ext, 'windows-mingw')
# run: choco uninstall mingw
- name: Install MinGW
if: ${{ contains(matrix.config.ext, 'windows-mingw') && steps.cache-mingw.outputs.cache-hit != 'true' }}
shell: cmake -P {0}
run: |
file(DOWNLOAD "${{ matrix.config.mingw_url }}" ./mingw.7z SHOW_PROGRESS)
file(ARCHIVE_EXTRACT INPUT ./mingw.7z DESTINATION mingw)
- name: Add MinGW to PATH
shell: cmake -P {0}
if: contains(matrix.config.ext, 'windows-mingw')
run: |
# Add to PATH environment variable
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}/${{ matrix.config.mingw_dir }}" mingw_dir)
file(APPEND "$ENV{GITHUB_PATH}" "$ENV{GITHUB_WORKSPACE};${mingw_dir}")
- name: Install Ninja
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y ninja-build
elif [ "$RUNNER_OS" == "Windows" ]; then
choco install ninja
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install ninja
fi
- name: Install ccache
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y ccache
elif [ "$RUNNER_OS" == "Windows" ]; then
choco install ccache
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install ccache
fi
- name: Install code coverage tool
if: matrix.config.ext == 'windows-msvc'
run: choco install opencppcoverage
# vcpkg is too slow and it's giving problems on Linux, so we use it
# only for Windows
- name: Install dependencies
if: runner.os != 'Windows'
run: |
if [ "$RUNNER_OS" == "Linux" ]; then
sudo apt-get install -y lcov valgrind libwxgtk3.0-gtk3-dev libgtest-dev
elif [ "$RUNNER_OS" == "macOS" ]; then
brew install wxwidgets googletest
fi
# - name: Install Ubuntu dependencies for vcpkg packages
# if: runner.os == 'Linux'
# run: |
# sudo apt-get install -y libx11-dev libxft-dev libxext-dev libwayland-dev \
# libxkbcommon-dev libegl1-mesa-dev libibus-1.0-dev \
# libdbus-1-dev libxi-dev libxtst-dev
- name: Get LLVM vcpkg triplets
if: runner.os == 'Windows'
uses: actions/checkout@v3
with:
repository: 'Neumann-A/my-vcpkg-triplets'
path: './my-vcpkg-triplets'
- name: vcpkg
id: vcpkg
if: runner.os == 'Windows'
uses: johnwason/vcpkg-action@master
env:
# Because we have the vcpkg.json file but don't use it, we must turn manifest mode off
VCPKG_MANIFEST_MODE: OFF
with:
# Manifest builds on every CMake configure, which is not acceptable
#manifest-dir: ${{ github.workspace }}
pkgs: wxwidgets gtest
triplet: ${{ matrix.config.vcpkg_triplet }}
extra-args: --overlay-triplets=${{ github.workspace }}/my-vcpkg-triplets
cache-key: ${{ matrix.config.ext }}
revision: master
token: ${{ github.token }}
# vcpkg wxwidgets build failts with Chocolatey's packaging of MinGW. This step is
# used for retrieving the error log.
# https://stackoverflow.com/a/59361133/3049315
# - name: Get error log
# if: always()
# uses: actions/upload-artifact@v1
# with:
# name: install-x64-mingw-static-dbg-out.log
# path: ./vcpkg/buildtrees/wxwidgets/install-x64-mingw-dynamic-dbg-out.log
- name: ccache cache files
uses: actions/[email protected]
with:
path: .ccache
key: ${{ matrix.config.name }}-ccache-${{ steps.cache_timestamp.outputs.timestamp }}
restore-keys: |
${{ matrix.config.name }}-ccache-
- name: Configure
env:
CC: ${{ matrix.config.cc }}
CXX: ${{ matrix.config.cxx }}
ENVIRONMENT_SCRIPT: ${{ matrix.config.environment_script }}
RUNNER_OS: ${{ runner.os }}
VCPKG_TRIPLET: ${{ matrix.config.vcpkg_triplet }}
working-directory: project
run: |
chmod a+x ./.github/scripts/*.cmake
cmake -P ./.github/scripts/configure.cmake
- name: Build
env:
CXX: ${{ matrix.config.cxx }}
ENVIRONMENT_SCRIPT: ${{ matrix.config.environment_script }}
RUNNER_OS: ${{ runner.os }}
working-directory: project
run: |
cmake -P ./.github/scripts/build.cmake
- name: ccache statistics
shell: cmake -P {0}
run: |
file(TO_CMAKE_PATH "$ENV{GITHUB_WORKSPACE}" ccache_basedir)
set(ENV{CCACHE_BASEDIR} "${ccache_basedir}")
set(ENV{CCACHE_DIR} "${ccache_basedir}/.ccache")
execute_process(COMMAND ccache -s)
- name: Run tests
env:
CC: ${{ matrix.config.cc }}
CXX: ${{ matrix.config.cxx }}
RUNNER_OS: ${{ runner.os }}
working-directory: project
run: cmake -P ./.github/scripts/test.cmake
- name: Upload coverage reports to Codecov
uses: codecov/codecov-action@v3
if: runner.os == 'Linux'
with:
token: ${{ secrets.CODECOV_TOKEN }}
# - name: Generate lcov.info for coveralls
# if: runner.os == 'Linux'
# working-directory: project
# run: cmake --build build --config $BUILD_TYPE --target lcov
# - name: Coveralls GitHub Action
# uses: coverallsapp/github-action@v1
# if: runner.os == 'Linux'
# with:
# base-path: project
# path-to-lcov: ./build/coverage/lcov.info
# debug: true
- name: Coveralls GitHub Action
uses: threeal/gcovr-action@latest
if: runner.os == 'Linux'
with:
root: project
coveralls-send: true
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Clean build directory for Coverity scan
if: runner.os == 'Linux'
working-directory: project/build
run: |
cmake --build . --target clean
find . -name "*.gcda" -type f -delete
find . -name "*.gcno" -type f -delete
find . -name "*.o" -type f -delete
- name: Coverity scan
uses: vapier/coverity-scan-action@v1
if: runner.os == 'Linux'
with:
email: ${{ secrets.COVERITY_SCAN_EMAIL }}
token: ${{ secrets.COVERITY_SCAN_TOKEN }}
working-directory: project/build
command: 'ninja'
- name: Install Strip
working-directory: project
run: cmake --install build --prefix instdir --strip --config $BUILD_TYPE