GitLab pipeline. #137
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |