Skip to content

GitLab pipeline.

GitLab pipeline. #138

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 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 }}