GitLab pipeline. #138
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 Release | |
on: | |
workflow_dispatch: {} # allow running it manually | |
push: | |
branches: | |
- main | |
tags: | |
- v** | |
pull_request: | |
branches: | |
- main | |
tags: | |
- v** | |
env: | |
BUILD_TYPE: Release | |
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-static | |
} | |
- { | |
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-static | |
} | |
# - { | |
# name: "Windows Latest LLVM i686", ext: "windows-llvm-i686", | |
# os: windows-latest, | |
# cc: "clang", cxx: "clang++", | |
# vcpkg_triplet: x86-win-llvm-static-md-release | |
# } | |
- { | |
name: "Windows Latest LLVM x86_64", ext: "windows-llvm-x86_64", | |
os: windows-latest, | |
cc: "clang", cxx: "clang++", | |
vcpkg_triplet: x64-win-llvm-static-md-release | |
} | |
- { | |
name: "Windows Latest MinGW i686", ext: "windows-mingw-i686", | |
os: windows-latest, | |
cc: "gcc", cxx: "g++", | |
vcpkg_triplet: x86-mingw-static, | |
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-static, | |
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-release | |
} | |
- { | |
name: "macOS Latest Clang", ext: "macos", | |
os: macos-latest, | |
cc: "clang", cxx: "clang++", | |
vcpkg_triplet: x64-osx-release | |
} | |
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 | |
# 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 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 }}_release | |
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-static-dbg-out.log | |
- name: Prepare ccache timestamp | |
id: ccache_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}") | |
- 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: Install Strip | |
working-directory: project | |
run: cmake --install build --prefix instdir --strip --config $BUILD_TYPE | |
- name: Generate artifact name | |
id: generate-name | |
shell: cmake -P {0} | |
working-directory: project | |
run: | | |
execute_process( | |
COMMAND cmake --system-information | |
WORKING_DIRECTORY build | |
OUTPUT_VARIABLE sysInfo | |
) | |
string(REGEX MATCH "CMAKE_PROJECT_NAME:STATIC=([^\n]*)" projectName ${sysInfo}) | |
set(projectName ${CMAKE_MATCH_1}) | |
string(REGEX MATCH "CMAKE_PROJECT_VERSION:STATIC=([^\n]*)" projectVersion ${sysInfo}) | |
set(projectVersion ${CMAKE_MATCH_1}) | |
# Save artifact name to GitHub environment variable | |
set(finalName "${projectName}_${projectVersion}") | |
set(archiveName "${finalName}_${{ matrix.config.ext }}.7z") | |
set(debName "${finalName}_${{ matrix.config.ext }}.deb") | |
set(rpmName "${finalName}_${{ matrix.config.ext }}.rpm") | |
set(dmgName "${finalName}_${{ matrix.config.ext }}.dmg") | |
set(nsisName "${finalName}_${{ matrix.config.ext }}_nsis.exe") | |
set(wixName "${finalName}_${{ matrix.config.ext }}_wix.msi") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "finalName=${finalName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "archiveName=${archiveName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "debName=${debName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "rpmName=${rpmName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "dmgName=${dmgName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "nsisName=${nsisName}\n") | |
file(APPEND "$ENV{GITHUB_OUTPUT}" "wixName=${wixName}") | |
# https://github.com/NSIS-Dev/ci-examples/tree/main | |
- name: Install NSIS & WiX Toolset | |
if: runner.os == 'Windows' && startsWith(github.ref, 'refs/tags/') | |
shell: pwsh | |
run: | | |
iwr -useb get.scoop.sh -outfile 'install.ps1' | |
.\install.ps1 -RunAsAdmin | |
scoop update | |
scoop bucket add extras | |
scoop install nsis | |
scoop install wixtoolset | |
- name: Pack Archive | |
working-directory: project/instdir | |
run: cmake -E tar cfv ../${{ steps.generate-name.outputs.archiveName }} --format=7zip . | |
- name: Pack Windows Installer | |
if: runner.os == 'Windows' && startsWith(github.ref, 'refs/tags/') | |
working-directory: project/build | |
run: | | |
if [[ ${{ matrix.config.ext }} =~ "i686" ]]; then | |
cpack -C Release -G NSIS | |
else | |
cpack -C Release -G NSIS64 | |
fi | |
cpack -C Release -G WIX | |
mv package/${{ steps.generate-name.outputs.finalName }}.exe ../${{ steps.generate-name.outputs.nsisName }} | |
mv package/${{ steps.generate-name.outputs.finalName }}.msi ../${{ steps.generate-name.outputs.wixName }} | |
- name: Install RPM in Ubuntu | |
if: runner.os == 'Linux' | |
run: sudo apt-get install -y rpm | |
- name: Pack Linux DEB & RPM | |
if: matrix.config.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/tags/') | |
working-directory: project/build | |
run: | | |
cpack -C Release -G DEB | |
cpack -C Release -G RPM | |
mv package/${{ steps.generate-name.outputs.finalName }}.deb ../${{ steps.generate-name.outputs.debName }} | |
mv package/${{ steps.generate-name.outputs.finalName }}.rpm ../${{ steps.generate-name.outputs.rpmName }} | |
- name: Pack MacOS DMG | |
if: runner.os == 'macOS' && startsWith(github.ref, 'refs/tags/') | |
working-directory: project/build | |
run: | | |
cpack -C Release -G DragNDrop | |
mv package/${{ steps.generate-name.outputs.finalName }}.dmg ../${{ steps.generate-name.outputs.dmgName }} | |
- name: Upload Archive | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.archiveName }} | |
path: ./project/${{ steps.generate-name.outputs.archiveName }} | |
- name: Upload Installer NSIS | |
if: runner.os == 'Windows' && startsWith(github.ref, 'refs/tags/') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.nsisName }} | |
path: ./project/${{ steps.generate-name.outputs.nsisName }} | |
- name: Upload Installer WIX | |
if: runner.os == 'Windows' && startsWith(github.ref, 'refs/tags/') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.wixName }} | |
path: ./project/${{ steps.generate-name.outputs.wixName }} | |
- name: Upload Linux DEB | |
if: matrix.config.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/tags/') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.debName }} | |
path: ./project/${{ steps.generate-name.outputs.debName }} | |
- name: Upload Linux RPM | |
if: matrix.config.os == 'ubuntu-latest' && startsWith(github.ref, 'refs/tags/') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.rpmName }} | |
path: ./project/${{ steps.generate-name.outputs.rpmName }} | |
- name: Upload MacOS DMG | |
if: runner.os == 'macOS' && startsWith(github.ref, 'refs/tags/') | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ steps.generate-name.outputs.dmgName }} | |
path: ./project/${{ steps.generate-name.outputs.dmgName }} | |
- name: Release Archive | |
uses: softprops/[email protected] | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
name: Release ${{ github.ref_name }} | |
draft: false | |
prerelease: false | |
files: | | |
./project/${{ steps.generate-name.outputs.archiveName }} | |
./project/${{ steps.generate-name.outputs.nsisName }} | |
./project/${{ steps.generate-name.outputs.wixName }} | |
./project/${{ steps.generate-name.outputs.debName }} | |
./project/${{ steps.generate-name.outputs.rpmName }} | |
./project/${{ steps.generate-name.outputs.dmgName }} | |