name: 'Build' run-name: 'Configure, Build and Test SDL' on: workflow_call: inputs: platforms: description: 'JSON-encoded test properties' type: string required: true jobs: build: name: ${{ matrix.platform.name }} runs-on: ${{ matrix.platform.os }} container: ${{ matrix.platform.container }} defaults: run: shell: ${{ matrix.platform.shell }} strategy: fail-fast: false matrix: platform: ${{ fromJSON(inputs.platforms) }} steps: - name: 'Set up MSYS2' if: ${{ matrix.platform.platform == 'msys2' }} uses: msys2/setup-msys2@v2 with: msystem: ${{ matrix.platform.msys2-msystem }} install: >- ${{ matrix.platform.msys2-env }}-cc ${{ matrix.platform.msys2-env }}-cmake ${{ matrix.platform.msys2-env }}-ninja ${{ (!matrix.platform.msys2-no-perl && format('{0}-perl', matrix.platform.msys2-env)) || '' }} ${{ matrix.platform.msys2-env }}-pkg-config ${{ matrix.platform.msys2-env }}-clang-tools-extra - name: 'About this job' run: | echo "key=${{ matrix.platform.key }}" echo "name=${{ matrix.platform.name }}" echo "os=${{ matrix.platform.os }}" echo "" echo "Add [sdl-ci-filter ${{ matrix.platform.key }}] to your commit message to reduce the number of jobs." - uses: actions/checkout@v4 - name: 'Set up ninja' if: ${{ matrix.platform.setup-ninja }} uses: ./.github/actions/setup-ninja - uses: mymindstorm/setup-emsdk@v14 if: ${{ matrix.platform.platform == 'emscripten' }} with: version: 3.1.35 - uses: nttld/setup-ndk@v1 if: ${{ matrix.platform.android-ndk }} id: setup-ndk with: local-cache: true ndk-version: r21e - uses: ilammy/msvc-dev-cmd@v1 if: ${{ matrix.platform.platform == 'msvc' }} with: arch: ${{ matrix.platform.msvc-vcvars-arch }} sdk: ${{ matrix.platform.msvc-vcvars-sdk }} - name: 'Set up Windows GDK Desktop' uses: ./.github/actions/setup-gdk-desktop if: ${{ matrix.platform.setup-gdk-folder != '' }} with: folder: '${{ matrix.platform.setup-gdk-folder }}' - name: 'Setup Intel oneAPI toolchain' id: intel if: ${{ matrix.platform.intel }} run: | # Download the key to system keyring wget -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \ | gpg --dearmor | sudo tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null # Add signed entry to apt sources and configure the APT client to use Intel repository: echo "deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main" | sudo tee /etc/apt/sources.list.d/oneAPI.list # Update package list sudo apt-get update -y # Install oneAPI sudo apt-get install -y intel-oneapi-compiler-dpcpp-cpp-and-cpp-classic - name: 'Install apk packages' if: ${{ matrix.platform.apk-packages != '' }} run: | ${{ matrix.platform.sudo }} apk update ${{ matrix.platform.sudo }} apk add ${{ matrix.platform.apk-packages }} - name: 'Install apt packages' if: ${{ matrix.platform.apt-packages != '' }} run: | ${{ matrix.platform.sudo }} apt-get update ${{ matrix.platform.sudo }} apt-get install -y ${{ matrix.platform.apt-packages }} - name: 'Install brew packages' if: ${{ matrix.platform.brew-packages != '' }} run: | export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1 brew update brew install ${{ matrix.platform.brew-packages }} - name: 'Set up GLES for VITA' # Must be after apk if: ${{ matrix.platform.setup-vita-gles-type != '' }} uses: ./.github/actions/setup-vita-gles with: type: ${{ matrix.platform.setup-vita-gles-type }} - name: 'Configure (Autotools)' if: ${{ !matrix.platform.no-autotools }} run: | ${{ matrix.platform.source_cmd }} set -eu rm -rf build-autotools mkdir build-autotools ./autogen.sh ( cd build-autotools ../configure \ --enable-vendor-info="Github Workflow" \ --enable-werror \ --prefix=${{ github.workspace }}/autotools_prefix \ ) if test "x${{ (matrix.platform.build-autotools-tests && 'yes') || 'no' }}" = "xyes" ; then curdir="$(pwd)" multiarch="$(dpkg-architecture -qDEB_HOST_MULTIARCH)" ( mkdir -p build-autotools/test cd build-autotools/test ../../test/configure \ --enable-werror \ --x-includes=/usr/include \ --x-libraries="/usr/lib/${multiarch}" \ --prefix=${{ github.workspace }}/autotools_prefix \ SDL_CFLAGS="-I${curdir}/include" \ SDL_LIBS="-L${curdir}/build-autotools/build/.libs -lSDL2" \ ac_cv_lib_SDL2_ttf_TTF_Init=no \ ${NULL+} ) fi - name: 'Build (Autotools)' if: ${{ !matrix.platform.no-autotools }} run: | ${{ matrix.platform.source_cmd }} set -eu parallel="$(getconf _NPROCESSORS_ONLN)" make -j"${parallel}" -C build-autotools V=1 if test "x${{ (matrix.platform.build-autotools-tests && 'yes') || 'no' }}" = "xyes" ; then make -j"${parallel}" -C build-autotools/test V=1 fi - name: 'Run build-time tests (Autotools)' if: ${{ !matrix.platform.no-autotools && matrix.platform.build-autotools-tests && matrix.platform.run-tests }} run: | ${{ matrix.platform.source_cmd }} set -eu curdir="$(pwd)" parallel="$(getconf _NPROCESSORS_ONLN)" export SDL_TESTS_QUICK=1 make -j"${parallel}" -C build-autotools/test check LD_LIBRARY_PATH="${curdir}/build-autotools/build/.libs" if test "${{ runner.os }}" = "Linux"; then # This should show us the SDL_REVISION strings "${curdir}/build-autotools/build/.libs/libSDL2-2.0.so.0" | grep SDL- fi - name: 'Install (Autotools)' if: ${{ !matrix.platform.no-autotools }} run: | ${{ matrix.platform.source_cmd }} set -eu curdir="$(pwd)" parallel="$(getconf _NPROCESSORS_ONLN)" make -j"${parallel}" -C build-autotools install V=1 if test "x${{ (matrix.platform.build-autotools-tests && 'yes') || 'no' }}" = "xyes" ; then make -j"${parallel}" -C build-autotools/test install V=1 fi ( cd autotools_prefix; find . ) | LC_ALL=C sort -u echo "prefix=$(pwd)/autotools_prefix" >> $GITHUB_OUTPUT - name: 'Configure (CMake)' if: ${{ !matrix.platform.no-cmake }} #shell: ${{ matrix.platform.shell }} run: | ${{ matrix.platform.source-cmd }} ${{ matrix.platform.cmake-config-emulator }} cmake -S . -B build -GNinja \ -Wdeprecated -Wdev -Werror \ ${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \ -DSDL_WERROR=${{ matrix.platform.werror }} \ -DSDL_TESTS=${{ matrix.platform.build-tests }} \ -DSDLTEST_TRACKMEM=OFF \ -DSDL_INSTALL_TESTS=${{ matrix.platform.build-tests }} \ -DSDL_DISABLE_INSTALL_DOCS=OFF \ -DSDL_DISABLE_INSTALL_DOCS=OFF \ ${{ matrix.platform.cmake-arguments }} \ -DSDL_SHARED=${{ matrix.platform.shared }} \ -DSDL_STATIC=${{ matrix.platform.static }} \ -DSDL_TEST=ON \ -DSDL_VENDOR_INFO="Github Workflow" \ -DCMAKE_INSTALL_PREFIX=prefix \ -DCMAKE_INSTALL_LIBDIR=lib \ -DSDL_CMAKE_DEBUG_POSTFIX="" \ -DCMAKE_BUILD_TYPE=${{ matrix.platform.cmake-build-type }} - name: 'Build (CMake)' id: cmake-build if: ${{ !matrix.platform.no-cmake }} # shell: ${{ matrix.platform.shell }} run: | ${{ matrix.platform.source-cmd }} cmake --build build --config ${{ matrix.platform.cmake-build-type }} --verbose -- ${{ matrix.platform.cmake-build-arguments }} - name: 'Verify SDL_REVISION' if: ${{ !matrix.platform.no-cmake }} run: | echo "This should show us the SDL_REVISION" echo "Shared library:" ${{ (matrix.platform.shared-lib && format('strings build/{0} | grep "Github Workflow"', matrix.platform.shared-lib)) || 'echo ""' }} echo "Static library:" ${{ (matrix.platform.static-lib && format('strings build/{0} | grep "Github Workflow"', matrix.platform.static-lib)) || 'echo ""' }} - name: 'Run build-time tests (CMake)' id: cmake-tests if: ${{ !matrix.platform.no-cmake && matrix.platform.run-tests }} # shell: ${{ matrix.platform.shell }} run: | ${{ matrix.platform.source-cmd }} ${{ matrix.platform.pretest-cmd }} set -eu export SDL_TESTS_QUICK=1 ctest -VV --test-dir build/ -j2 - name: 'Install (CMake)' id: cmake-install if: ${{ steps.build.outcome == 'success' }} # shell: ${{ matrix.platform.shell }} run: | ${{ matrix.platform.source-cmd }} cmake --install build --config ${{ matrix.platform.cmake-build-type }} echo "prefix=$(pwd)/prefix" >> $GITHUB_OUTPUT ( cd prefix; find . ) | LC_ALL=C sort -u - name: 'Verify CMake configuration files (CMake)' if: ${{ steps.cmake-install.outcome == 'success' }} # shell: ${{ matrix.platform.shell }} run: | ${{ matrix.platform.source-cmd }} ${{ matrix.platform.cmake-config-emulator }} cmake -S cmake/test -B cmake_test_build -GNinja \ ${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \ -DTEST_SHARED=${{ matrix.platform.shared }} \ -DTEST_STATIC=${{ matrix.platform.static }} \ ${{ matrix.platform.cmake-arguments }} \ -DCMAKE_BUILD_TYPE=${{ matrix.platform.cmake-build-type }} \ -DCMAKE_PREFIX_PATH="${{ steps.cmake-install.outputs.prefix }}" cmake --build cmake_test_build --verbose --config ${{ matrix.platform.cmake-build-type }} -- ${{ matrix.platform.cmake-build-arguments }} - name: 'Extract CC/CXX/CFLAGS/CXXFLAGS from CMake toolchain' if: ${{ steps.cmake-install.outcome == 'success' && matrix.platform.cc-from-cmake }} # shell: ${{ matrix.platform.shell }} run: | cmake -S .github/cmake -B /tmp/cmake_extract \ ${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \ -DCMAKE_BUILD_TYPE=${{ matrix.platform.cmake-build-type }} \ -DVAR_PATH=/tmp/env.txt cat /tmp/env.txt >> $GITHUB_ENV - name: 'Verify sdl2.pc (CMake)' # shell: ${{ matrix.platform.shell }} if: ${{ steps.cmake-install.outcome == 'success' && matrix.platform.test-pkg-config }} run: | ${{ matrix.platform.source-cmd }} ${{ matrix.platform.cc && format('export CC="{0}"', matrix.platform.cc) || '' }} ${{ matrix.platform.cflags && format('export CFLAGS="{0}"', matrix.platform.cflags) || '' }} ${{ matrix.platform.ldflags && format('export LDFLAGS="{0}"', matrix.platform.ldflags) || '' }} export PKG_CONFIG_PATH=${{ steps.cmake-install.outputs.prefix }}/lib/pkgconfig cmake/test/test_pkgconfig.sh - name: 'Build (cross-platform-actions, BSD)' id: cpactions if: ${{ matrix.platform.cpactions }} uses: cross-platform-actions/action@v0.27.0 with: operating_system: '${{ matrix.platform.cpactions-os }}' architecture: '${{ matrix.platform.cpactions-arch }}' version: '${{ matrix.platform.cpactions-version }}' run: | ${{ matrix.platform.cpactions-setup-cmd }} ${{ matrix.platform.cpactions-install-cmd }} cmake -S . -B build -GNinja \ ${{ matrix.platform.cmake-toolchain-file != '' && format('-DCMAKE_TOOLCHAIN_FILE={0}', matrix.platform.cmake-toolchain-file) || '' }} \ -Wdeprecated -Wdev -Werror \ -DSDL_WERROR=${{ matrix.platform.werror }} \ -DSDL_DISABLE_INSTALL_DOCS=OFF \ ${{ matrix.platform.cmake-arguments }} \ -DSDL_SHARED=${{ matrix.platform.shared }} \ -DSDL_STATIC=${{ matrix.platform.static }} \ -DSDL_TEST=ON \ -DSDL_VENDOR_INFO="Github Workflow" \ -DCMAKE_INSTALL_PREFIX=prefix \ -DCMAKE_INSTALL_LIBDIR=lib \ -DCMAKE_BUILD_TYPE=${{ matrix.platform.cmake-build-type }} cmake --build build/ --config ${{ matrix.platform.cmake-build-type }} --verbose cmake --build build/ --config ${{ matrix.platform.cmake-build-type }} --target clean rm -rf build/CMakeFiles rm -rf build/docs - name: 'Set up Watcom' uses: open-watcom/setup-watcom@v0 if: ${{ matrix.platform.watcom-makefile != '' }} - name: 'Build (Watcom)' if: ${{ matrix.platform.watcom-makefile != '' }} run: | wmake -f ${{ matrix.platform.watcom-makefile }} ENABLE_WERROR=1 - name: 'Build tests (Watcom)' if: ${{ matrix.platform.watcom-makefile != '' }} run: | cd test wmake -f ${{ matrix.platform.watcom-makefile }} ENABLE_WERROR=1 - name: 'Run tests (Watcom)' if: ${{ matrix.platform.watcom-makefile != '' && matrix.platform.run-tests }} run: | cd test wmake -f ${{ matrix.platform.watcom-makefile }} check-quick - name: 'Distclean (Watcom)' if: ${{ matrix.platform.watcom-makefile != '' }} run: | wmake -f ${{ matrix.platform.watcom-makefile }} distclean cd test wmake -f ${{ matrix.platform.watcom-makefile }} distclean - name: 'Add msbuild to PATH' id: setup-msbuild if: ${{ matrix.platform.msvc-project != '' }} uses: microsoft/setup-msbuild@v2 - name: Build msbuild if: ${{ matrix.platform.msvc-project != '' }} run: | "$(cygpath -u '${{ steps.setup-msbuild.outputs.msbuildPath }}\msbuild.exe')" ${{ matrix.platform.msvc-project }} -m -p:BuildInParallel=true -p:Configuration=Release ${{ matrix.platform.msvc-project-flags }} - name: 'Build (Android.mk)' if: ${{ matrix.platform.android-mk }} run: | ./build-scripts/androidbuildlibs.sh - name: 'Build (xcode)' if: ${{ matrix.platform.xcode-sdk != '' }} run: | xcodebuild -project Xcode/SDL/SDL.xcodeproj -target "${{ matrix.platform.xcode-target }}" -configuration Release -sdk ${{ matrix.platform.xcode-sdk }} clean build - name: 'Setup Python' uses: 'actions/setup-python@main' if: ${{ matrix.platform.check-sources }} with: python-version: '3.x' - name: 'Check Sources' if: ${{ matrix.platform.check-sources }} run: | set -e build-scripts/test-versioning.sh - name: 'Upload binary package' uses: actions/upload-artifact@v4 if: ${{ always() && steps.cmake-tests.outcome == 'failure' }} with: if-no-files-found: ignore name: '${{ matrix.platform.artifact }}-minidumps' path: | build/**/*.dmp build/**/*.exe build/**/*.dll build/**/*.pdb