name: Examples (toolsets)
on:
push:
pull_request:
schedule:
# Weekly, at 5:30 AM on Saturday (somewhat randomly chosen).
- cron: '30 5 * * 6'
workflow_dispatch:
jobs:
build:
strategy:
matrix:
example: [simple, static, dynamic]
toolset: [auto, clang, clang-cl, gcc, mingw, msvc]
os: [ubuntu-latest, windows-2016, windows-2019, windows-2022]
include:
# Prettier run names.
- {os: windows-2022, name: Windows 2022}
- {os: windows-2019, name: Windows 2019}
- {os: windows-2016, name: Windows 2016}
- {os: ubuntu-latest, name: Ubuntu}
# Target platform.
- {example: simple, platform: x64}
- {example: static, platform: x86}
- {example: dynamic, platform: x64}
# Configuration.
- {example: simple, configuration: Release}
- {example: static, configuration: Debug}
- {example: dynamic, configuration: RelWithDebInfo}
# Expected symbols.
- example: simple
symbols:
- target: foo
type: exe
symbols: []
- example: static
symbols:
- target: foo
type: exe
symbols: [main, bar]
- example: dynamic
symbols:
- target: foo
type: exe
symbols: [main]
- target: baz
type: dll
symbols: [baz]
exclude:
# Ubuntu: no MSVC/clang-cl.
- {os: ubuntu-latest, toolset: msvc}
- {os: ubuntu-latest, toolset: clang-cl}
# Optimization: MinGW-w64 should be the same on different Windows
# versions. Clang on the other hand relies on the Microsoft linker
# (at least it did at some point), so it makes sense to test it
# against different Visual Studio versions.
- {os: windows-2016, toolset: gcc}
- {os: windows-2019, toolset: gcc}
- {os: windows-2016, toolset: mingw}
- {os: windows-2019, toolset: mingw}
runs-on: '${{ matrix.os }}'
name: '${{ matrix.example }} / ${{ matrix.toolset }} / ${{ matrix.name }}'
defaults:
run:
shell: pwsh
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Clean up PATH
uses: egor-tensin/cleanup-path@v3
if: runner.os == 'Windows'
- name: Set common variables
uses: ./.github/actions/common-variables
with:
toolset: '${{ matrix.toolset }}'
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Install GCC
uses: egor-tensin/setup-gcc@v1
with:
platform: '${{ matrix.platform }}'
if: env.CI_HOST_LINUX && (matrix.toolset == 'auto' || matrix.toolset == 'gcc')
- name: Install Clang
uses: egor-tensin/setup-clang@v1
with:
platform: '${{ matrix.platform }}'
if: matrix.toolset == 'clang' || matrix.toolset == 'clang-cl'
- name: Install MinGW
uses: egor-tensin/setup-mingw@v2
with:
platform: '${{ matrix.platform }}'
# toolset == 'clang' needs some kind of make, e.g. mingw32-make:
if: env.CI_MINGW || (matrix.toolset == 'clang' && env.CI_HOST_WINDOWS)
- name: Set up software environment
uses: ./.github/actions/software-environment
with:
toolset: '${{ matrix.toolset }}'
platform: '${{ matrix.platform }}'
- name: Set up Visual Studio
uses: egor-tensin/vs-shell@v2
with:
arch: '${{ matrix.platform }}'
if: matrix.toolset == 'clang-cl' && env.CI_HOST_WINDOWS
- name: Build example project
id: build
uses: ./.github/actions/build-example
with:
src-dir: 'examples/${{ matrix.example }}'
toolset: '${{ matrix.toolset }}'
platform: '${{ matrix.platform }}'
configuration: '${{ matrix.configuration }}'
- name: Verify runtime library linkage
uses: ./.github/actions/check-runtime-library
with:
path: '${{ steps.build.outputs.install-dir }}'
- name: Verify architecture
uses: ./.github/actions/check-arch
with:
path: '${{ steps.build.outputs.install-dir }}'
expected: '${{ matrix.platform }}'
- name: Run example project
uses: ./.github/actions/run-example
with:
path: '${{ steps.build.outputs.install-dir }}'
- name: Check symbols
uses: ./.github/actions/check-symbols
with:
path: '${{ steps.build.outputs.install-dir }}'
expected: '${{ toJson(matrix.symbols) }}'
if: env.CI_TARGET_ELF