mirror of
https://github.com/SFML/SFML.git
synced 2024-12-01 15:51:04 +08:00
7bb97a85b1
While you can't easily run these unit tests, it's easy enough to still compile them so we don't need to go out of way to prohibit this. CMake has some support for running tests on the target OS so perhaps in the future we find a compelling way to run the test suite on a mobile OS.
351 lines
17 KiB
YAML
351 lines
17 KiB
YAML
name: CI
|
|
|
|
on: [push, pull_request, workflow_dispatch]
|
|
|
|
concurrency:
|
|
group: environment-${{github.ref}}
|
|
cancel-in-progress: true
|
|
|
|
env:
|
|
DISPLAY: ":99" # Display number to use for the X server
|
|
GALLIUM_DRIVER: llvmpipe # Use Mesa 3D software OpenGL renderer
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
jobs:
|
|
build:
|
|
name: ${{ matrix.platform.name }} ${{ matrix.config.name }} ${{ matrix.type.name }}
|
|
runs-on: ${{ matrix.platform.os }}
|
|
|
|
env:
|
|
CMAKE_CXX_COMPILER_LAUNCHER: ccache # Use ccache to cache C++ compiler output
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
platform:
|
|
- { name: Windows VS2019 x86, os: windows-2019, flags: -DSFML_USE_MESA3D=TRUE -GNinja }
|
|
- { name: Windows VS2019 x64, os: windows-2019, flags: -DSFML_USE_MESA3D=TRUE -GNinja }
|
|
- { name: Windows VS2022 x86, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -GNinja }
|
|
- { name: Windows VS2022 x64, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -GNinja }
|
|
- { name: Windows VS2022 ClangCL MSBuild, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -T ClangCL } # ninja doesn't support specifying the toolset, so use the ClangCL toolset to test building with MSBuild as well
|
|
- { name: Windows VS2022 OpenGL ES, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DSFML_OPENGL_ES=ON -GNinja }
|
|
- { name: Windows VS2022 Unity, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_UNITY_BUILD=ON -GNinja }
|
|
- { name: Windows LLVM/Clang, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=clang++ -GNinja }
|
|
- { name: Windows MinGW, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=g++ -GNinja }
|
|
- { name: Linux GCC, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=ON -GNinja }
|
|
- { name: Linux Clang, os: ubuntu-22.04, flags: -DCMAKE_CXX_COMPILER=clang++ -DSFML_RUN_DISPLAY_TESTS=ON -GNinja , gcovr_options: '--gcov-executable="llvm-cov-$CLANG_VERSION gcov"' }
|
|
- { name: Linux GCC DRM, os: ubuntu-22.04, flags: -DSFML_USE_DRM=ON -DSFML_RUN_DISPLAY_TESTS=OFF -GNinja }
|
|
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_OPENGL_ES=ON -DSFML_RUN_DISPLAY_TESTS=OFF -GNinja }
|
|
- { name: macOS x64, os: macos-12, flags: -GNinja }
|
|
- { name: macOS x64 Xcode, os: macos-12, flags: -GXcode }
|
|
- { name: macOS arm64, os: macos-14, flags: -GNinja }
|
|
- { name: iOS, os: macos-12, flags: -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 }
|
|
- { name: iOS Xcode, os: macos-12, flags: -DCMAKE_SYSTEM_NAME=iOS -GXcode -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO }
|
|
config:
|
|
- { name: Shared, flags: -DBUILD_SHARED_LIBS=TRUE }
|
|
- { name: Static, flags: -DBUILD_SHARED_LIBS=FALSE }
|
|
type:
|
|
- { name: Release }
|
|
- { name: Debug, flags: -DCMAKE_BUILD_TYPE=Debug -DSFML_ENABLE_COVERAGE=TRUE }
|
|
|
|
include:
|
|
- platform: { name: Windows VS2022 x64, os: windows-2022 }
|
|
config: { name: Static with PCH (MSVC), flags: -DSFML_USE_MESA3D=TRUE -GNinja -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
|
|
- platform: { name: Linux GCC, os: ubuntu-22.04 }
|
|
config: { name: Static with PCH (GCC), flags: -DSFML_RUN_DISPLAY_TESTS=ON -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
|
|
- platform: { name: Linux Clang, os: ubuntu-22.04 }
|
|
config: { name: Static with PCH (Clang), flags: -DSFML_RUN_DISPLAY_TESTS=ON -GNinja -DCMAKE_CXX_COMPILER=clang++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
|
|
- platform: { name: Windows MinGW, os: windows-2022 }
|
|
config: { name: Static Standard Libraries, flags: -GNinja -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=g++ -DSFML_USE_STATIC_STD_LIBS=TRUE }
|
|
- platform: { name: Windows MinGW, os: windows-2022 }
|
|
config: { name: Static with PCH (GCC), flags: -GNinja -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
|
|
- platform: { name: macOS, os: macos-12 }
|
|
config: { name: Frameworks, flags: -GNinja -DSFML_BUILD_FRAMEWORKS=TRUE -DBUILD_SHARED_LIBS=TRUE }
|
|
- platform: { name: Android, os: ubuntu-22.04 }
|
|
config: { name: x86 (API 21), flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_NDK=$ANDROID_SDK_ROOT/ndk/26.1.10909125 -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared, arch: x86, api: 21 }
|
|
type: { name: Release }
|
|
- platform: { name: Android, os: ubuntu-22.04 }
|
|
config: { name: x86_64 (API 24), flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=24 -DCMAKE_ANDROID_NDK=$ANDROID_SDK_ROOT/ndk/26.1.10909125 -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared, arch: x86_64, api: 24 }
|
|
type: { name: Release }
|
|
- platform: { name: Android, os: ubuntu-22.04 }
|
|
config: { name: armeabi-v7a (API 29), flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=armeabi-v7a -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=29 -DCMAKE_ANDROID_NDK=$ANDROID_SDK_ROOT/ndk/26.1.10909125 -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared, arch: armeabi-v7a, api: 29 }
|
|
type: { name: Debug, flags: -DCMAKE_BUILD_TYPE=Debug }
|
|
- platform: { name: Android, os: ubuntu-22.04 }
|
|
config: { name: arm64-v8a (API 33), flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=33 -DCMAKE_ANDROID_NDK=$ANDROID_SDK_ROOT/ndk/26.1.10909125 -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared, arch: arm64-v8a, api: 33 }
|
|
type: { name: Debug, flags: -DCMAKE_BUILD_TYPE=Debug }
|
|
- platform: { name: macOS , os: macos-12 }
|
|
config: { name: System Deps, flags: -GNinja -DBUILD_SHARED_LIBS=TRUE -DSFML_USE_SYSTEM_DEPS=TRUE }
|
|
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Set Visual Studio Architecture
|
|
if: contains(matrix.platform.name, 'Windows VS') && !contains(matrix.platform.name, 'MSBuild')
|
|
uses: ilammy/msvc-dev-cmd@v1
|
|
with:
|
|
arch: ${{ contains(matrix.platform.name, 'x86') && 'x86' || 'x64' }}
|
|
|
|
# Although the CMake configuration will run with 3.24 on Windows and 3.22
|
|
# elsewhere, we install 3.25 on Windows in order to support specifying
|
|
# CMAKE_MSVC_DEBUG_INFORMATION_FORMAT which allows CCache to cache MSVC object
|
|
# files, see: https://cmake.org/cmake/help/latest/release/3.25.html#variables
|
|
- name: Get CMake and Ninja
|
|
uses: lukka/get-cmake@latest
|
|
with:
|
|
cmakeVersion: ${{ runner.os == 'Windows' && '3.25' || '3.22' }}
|
|
ninjaVersion: latest
|
|
|
|
- name: Install Linux Dependencies and Tools
|
|
if: runner.os == 'Linux'
|
|
run: |
|
|
CLANG_VERSION=$(clang++ --version | sed -n 's/.*version \([0-9]\+\)\..*/\1/p')
|
|
echo "CLANG_VERSION=$CLANG_VERSION" >> $GITHUB_ENV
|
|
sudo apt-get update && sudo apt-get install xorg-dev libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev xvfb fluxbox ccache gcovr ${{ matrix.platform.name == 'Linux Clang' && 'llvm-$CLANG_VERSION' || '' }}
|
|
|
|
- name: Install Android Components
|
|
if: matrix.platform.name == 'Android'
|
|
run: |
|
|
echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --install "build-tools;33.0.2"
|
|
echo "y" | ${ANDROID_SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager --install "ndk;26.1.10909125"
|
|
|
|
- name: Install macOS Tools
|
|
if: runner.os == 'macOS'
|
|
run: |
|
|
brew update
|
|
brew install gcovr ccache || true
|
|
|
|
# In addition to installing a known working version of CCache, this action also takes care of saving and restoring the cache for us
|
|
# Additionally it outputs information at the end of each job that helps us to verify if the cache is working properly
|
|
- name: Setup CCache
|
|
uses: hendrikmuhs/ccache-action@v1.2.12
|
|
with:
|
|
verbose: 2
|
|
key: ${{ matrix.platform.name }}-${{ matrix.config.name }}-${{ matrix.type.name }}
|
|
|
|
- name: Install Gcovr for MinGW
|
|
if: matrix.type.name == 'Debug' && contains(matrix.platform.name, 'MinGW')
|
|
uses: threeal/pipx-install-action@v1.0.0
|
|
with:
|
|
packages: gcovr
|
|
|
|
- name: Cache OpenCppCoverage
|
|
if: matrix.type.name == 'Debug' && runner.os == 'Windows'
|
|
id: opencppcoverage-cache
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: C:\Program Files\OpenCppCoverage
|
|
key: opencppcoverage
|
|
|
|
- name: Install OpenCppCoverage
|
|
uses: nick-fields/retry@v3
|
|
if: matrix.type.name == 'Debug' && runner.os == 'Windows' && steps.opencppcoverage-cache.outputs.cache-hit != 'true'
|
|
with:
|
|
max_attempts: 10
|
|
timeout_minutes: 3
|
|
command: choco install OpenCppCoverage -y
|
|
|
|
- name: Cache MinGW
|
|
if: matrix.platform.name == 'Windows MinGW'
|
|
id: mingw-cache
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: "C:\\Program Files\\mingw64"
|
|
key: winlibs-x86_64-posix-seh-gcc-12.2.0-llvm-16.0.0-mingw-w64msvcrt-10.0.0-r5
|
|
|
|
- name: Install MinGW
|
|
if: matrix.platform.name == 'Windows MinGW' && steps.mingw-cache.outputs.cache-hit != 'true'
|
|
run: |
|
|
curl -Lo mingw64.zip https://github.com/brechtsanders/winlibs_mingw/releases/download/12.2.0-16.0.0-10.0.0-msvcrt-r5/winlibs-x86_64-posix-seh-gcc-12.2.0-llvm-16.0.0-mingw-w64msvcrt-10.0.0-r5.zip
|
|
unzip -qq -d "C:\Program Files" mingw64.zip
|
|
|
|
- name: Add OpenCppCoverage and MinGW to PATH and remove MinGW-supplied CCache
|
|
if: runner.os == 'Windows'
|
|
run: |
|
|
echo "C:\Program Files\OpenCppCoverage" >> $GITHUB_PATH
|
|
echo "C:\Program Files\mingw64\bin" >> $GITHUB_PATH
|
|
rm -f "C:\Program Files\mingw64\bin\ccache.exe"
|
|
echo "Using $(which ccache)"
|
|
ccache --version
|
|
|
|
- name: Configure CMake
|
|
run: cmake --preset dev -DCMAKE_VERBOSE_MAKEFILE=ON ${{matrix.platform.flags}} ${{matrix.config.flags}} ${{matrix.type.flags}}
|
|
|
|
- name: Build
|
|
run: cmake --build build --config ${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }} --target install
|
|
|
|
- name: Build Android example
|
|
if: matrix.platform.name == 'Android'
|
|
run: examples/android/gradlew ${{ matrix.type.name == 'Debug' && 'assembleDebug' || 'assembleRelease' }} -p examples/android -P ARCH_ABI=${{matrix.config.arch}} -P MIN_SDK=${{matrix.config.api}}
|
|
|
|
- name: Prepare Test
|
|
run: |
|
|
set -e
|
|
# Start up Xvfb and fluxbox to host display tests
|
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
|
Xvfb $DISPLAY -screen 0 1920x1080x24 &
|
|
sleep 5
|
|
fluxbox > /dev/null 2>&1 &
|
|
sleep 5
|
|
fi
|
|
# Make sure the build/bin directory exists so that the find command does not fail if no executables are built
|
|
mkdir -p build/bin
|
|
# Make use of a test to print OpenGL vendor/renderer/version info to the console
|
|
find build/bin -name test-sfml-window -or -name test-sfml-window.exe -exec sh -c "{} *sf::Context* --section=\"Version String\" --success | grep OpenGL" \;
|
|
|
|
- name: Test
|
|
if: runner.os == 'Windows' && !contains(matrix.platform.name, 'MinGW')
|
|
run: cmake --build build --target runtests --config ${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }}
|
|
|
|
- name: Test
|
|
if: (runner.os != 'Windows' || contains(matrix.platform.name, 'MinGW')) && !contains(matrix.platform.name, 'iOS') && !contains(matrix.platform.name, 'Android')
|
|
run: |
|
|
ctest --test-dir build --output-on-failure -C ${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }} --repeat until-pass:3
|
|
# Run gcovr to extract coverage information from the test run
|
|
if [ "${{ matrix.type.name }}" == "Debug" ]; then
|
|
gcovr -r $GITHUB_WORKSPACE -x build/coverage.out -s -f 'src/SFML/.*' -f 'include/SFML/.*' ${{ matrix.platform.gcovr_options }} $GITHUB_WORKSPACE
|
|
fi
|
|
|
|
- name: Upload Coverage Report to Coveralls
|
|
if: matrix.type.name == 'Debug' && github.repository == 'SFML/SFML' && !contains(matrix.platform.name, 'iOS') && !contains(matrix.platform.name, 'Android') # Disable upload in forks
|
|
uses: coverallsapp/github-action@v2
|
|
with:
|
|
file: ./build/coverage.out
|
|
flag-name: ${{ matrix.platform.name }} ${{ matrix.config.name }} ${{ matrix.type.name }}
|
|
parallel: true
|
|
allow-empty: true
|
|
base-path: ${{ github.workspace }}
|
|
|
|
- name: Test Install Interface
|
|
if: matrix.platform.name != 'Android'
|
|
run: |
|
|
cmake -S test/install -B test/install/build -DSFML_ROOT=build/install -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }} ${{matrix.platform.flags}} ${{matrix.config.flags}} ${{matrix.type.flags}}
|
|
cmake --build test/install/build --config ${{ matrix.type.name == 'Debug' && 'Debug' || 'Release' }}
|
|
|
|
coverage:
|
|
name: Finalize Coverage Upload
|
|
needs: build
|
|
runs-on: ubuntu-22.04
|
|
if: github.repository == 'SFML/SFML' # Disable upload in forks
|
|
|
|
steps:
|
|
- name: Coveralls Finished
|
|
uses: coverallsapp/github-action@v2
|
|
with:
|
|
parallel-finished: true
|
|
|
|
format:
|
|
name: Formatting
|
|
runs-on: ubuntu-22.04
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Format Code
|
|
run: cmake -DCLANG_FORMAT_EXECUTABLE=clang-format-14 -P cmake/Format.cmake
|
|
|
|
- name: Check Formatting
|
|
run: git diff --exit-code
|
|
|
|
tidy:
|
|
name: Analyzing on ${{ matrix.platform.name }}
|
|
runs-on: ${{ matrix.platform.os }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
platform:
|
|
- { name: Windows, os: windows-2022, flags: -GNinja }
|
|
- { name: Linux, os: ubuntu-22.04 }
|
|
- { name: Linux DRM, os: ubuntu-22.04, flags: -DSFML_USE_DRM=TRUE }
|
|
- { name: Linux OpenGL ES, os: ubuntu-22.04, flags: -DSFML_OPENGL_ES=ON }
|
|
- { name: macOS, os: macos-12 }
|
|
- { name: iOS, os: macos-12, flags: -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 }
|
|
- { name: Android, os: ubuntu-22.04, flags: -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_NDK=$ANDROID_NDK -DCMAKE_ANDROID_STL_TYPE=c++_shared }
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Get CMake and Ninja
|
|
uses: lukka/get-cmake@latest
|
|
with:
|
|
cmakeVersion: latest
|
|
ninjaVersion: latest
|
|
|
|
- name: Install Windows Dependencies
|
|
if: runner.os == 'Windows'
|
|
run: |
|
|
curl.exe -o run-clang-tidy https://raw.githubusercontent.com/llvm/llvm-project/llvmorg-15.0.7/clang-tools-extra/clang-tidy/tool/run-clang-tidy.py
|
|
|
|
- name: Install Linux Dependencies
|
|
if: runner.os == 'Linux'
|
|
run: sudo apt-get update && sudo apt-get install libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev
|
|
|
|
- name: Install macOS Dependencies
|
|
if: runner.os == 'macOS'
|
|
run: |
|
|
brew update
|
|
brew install llvm || true
|
|
echo /usr/local/opt/llvm/bin >> $GITHUB_PATH
|
|
|
|
- name: Configure
|
|
run: cmake --preset dev -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_UNITY_BUILD=ON ${{matrix.platform.flags}}
|
|
|
|
- name: Analyze Code
|
|
run: cmake --build build --target tidy
|
|
|
|
sanitize:
|
|
name: Sanitizing on ${{ matrix.platform.name }}
|
|
runs-on: ${{ matrix.platform.os }}
|
|
|
|
strategy:
|
|
fail-fast: false
|
|
matrix:
|
|
platform:
|
|
- { name: Linux, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=ON }
|
|
- { name: Linux DRM, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_USE_DRM=ON }
|
|
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_OPENGL_ES=ON }
|
|
|
|
steps:
|
|
- name: Checkout Code
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Get CMake and Ninja
|
|
uses: lukka/get-cmake@latest
|
|
with:
|
|
cmakeVersion: latest
|
|
ninjaVersion: latest
|
|
|
|
- name: Install Linux Dependencies
|
|
if: runner.os == 'Linux'
|
|
run: sudo apt-get update && sudo apt-get install xorg-dev libxrandr-dev libxcursor-dev libudev-dev libopenal-dev libflac-dev libvorbis-dev libgl1-mesa-dev libegl1-mesa-dev libdrm-dev libgbm-dev xvfb fluxbox
|
|
|
|
- name: Configure
|
|
run: cmake --preset dev -GNinja -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_COMPILER=clang++ -DSFML_BUILD_EXAMPLES=OFF -DSFML_ENABLE_SANITIZERS=ON ${{matrix.platform.flags}}
|
|
|
|
- name: Build
|
|
run: cmake --build build
|
|
|
|
- name: Prepare Test
|
|
run: |
|
|
set -e
|
|
# Start up Xvfb and fluxbox to host display tests
|
|
if [ "${{ runner.os }}" == "Linux" ]; then
|
|
Xvfb $DISPLAY -screen 0 1920x1080x24 &
|
|
sleep 5
|
|
fluxbox > /dev/null 2>&1 &
|
|
sleep 5
|
|
fi
|
|
|
|
- name: Test
|
|
run: ctest --test-dir build --output-on-failure
|