From 769cb2e205eb7a6b777867530c5dd9412d72e5d4 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sun, 27 Jun 2021 13:16:08 +0200 Subject: [PATCH] Add workflow for cross-building wxMSW on GitHub Actions Use MinGW to build and Wine to run the GUI tests. --- .github/workflows/ci.yml | 2 + .github/workflows/ci_msw_cross.yml | 193 +++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 .github/workflows/ci_msw_cross.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85b42a2128..cab1461ca1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: branches: - master paths-ignore: + - '.github/workflows/ci_msw_cross.yml' - 'build/tools/appveyor*.bat' - 'build/tools/travis-ci.sh' - 'distrib/**' @@ -22,6 +23,7 @@ on: branches: - master paths-ignore: + - '.github/workflows/ci_msw_cross.yml' - 'build/tools/appveyor*.bat' - 'build/tools/travis-ci.sh' - 'distrib/**' diff --git a/.github/workflows/ci_msw_cross.yml b/.github/workflows/ci_msw_cross.yml new file mode 100644 index 0000000000..55c404229a --- /dev/null +++ b/.github/workflows/ci_msw_cross.yml @@ -0,0 +1,193 @@ +# CI workflow cross-building wxMSW under Linux. +name: wxMSW cross-build + +on: + push: + branches: + - master + paths-ignore: + - '.github/workflows/ci.yml' + - 'build/tools/appveyor*.bat' + - 'build/tools/travis-ci.sh' + - 'distrib/**' + - 'docs/**' + - 'interface/**' + - 'include/msvc/**' + - 'include/wx/gtk/**' + - 'include/wx/osx/**' + - 'locale/**' + - 'src/msw/**' + - 'src/osx/**' + - '*.md' + - '*.yml' + - 'wxwidgets.props' + pull_request: + branches: + - master + paths-ignore: + - '.github/workflows/ci.yml' + - 'build/tools/appveyor*.bat' + - 'build/tools/travis-ci.sh' + - 'distrib/**' + - 'docs/**' + - 'interface/**' + - 'include/msvc/**' + - 'include/wx/gtk/**' + - 'include/wx/osx/**' + - 'locale/**' + - 'src/msw/**' + - 'src/osx/**' + - '*.md' + - '*.yml' + - 'wxwidgets.props' + +jobs: + msw-cross-build: + # Set up this job to run in a Debian Sid container because it has recent + # versions of MinGW and Wine and is simpler to test with locally than the + # bespoke container used by GitHub Actions by default. + runs-on: ubuntu-latest + container: debian:sid-slim + name: ${{ matrix.name }} + strategy: + fail-fast: false + matrix: + include: + - name: wxMSW 64 bits + - name: wxMSW 32 bits + triplet: i686-w64-mingw32 + env: + # Default to 64-bit build. + HOST_TRIPLET: ${{ matrix.triplet || 'x86_64-w64-mingw32' }} + + # Run all commands as the normal user, created by the first step below. + # + # Note that the Bash options used here are the same as for the default + # shell used by GitHub Actions to minimize any surprises. + defaults: + run: + shell: /usr/bin/setpriv --reuid=runner --regid=adm --clear-groups --inh-caps=-all bash --noprofile --norc -eo pipefail {0} + + steps: + - name: Set up container user + # Specify the default shell explicitly to override the default value above. + shell: bash + run: | + apt-get -q -o=Dpkg::Use-Pty=0 update + apt-get -qq install sudo + + # Create a user with the same UID/GID and name as the existing user + # outside of the container and allow it using sudo without password. + useradd --home-dir $HOME --no-create-home --gid adm --uid 1001 runner + + echo 'runner ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/runner + + - name: Install prerequisites + run: | + export DEBIAN_FRONTEND=noninteractive + + packages="git make wine x11-xserver-utils xvfb" + + case "${HOST_TRIPLET}" in + x86_64-w64-mingw32) + packages="$packages g++-mingw-w64-x86-64 wine64" + ;; + + i686-w64-mingw32) + sudo dpkg --add-architecture i386 + sudo apt-get -q -o=Dpkg::Use-Pty=0 update + packages="$packages g++-mingw-w64-i686 wine32" + ;; + + *) + echo "Unknown host triplet \"${HOST_TRIPLET}\"." + exit 1 + ;; + esac + + sudo apt-get -qq install $packages + + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: Set environment variables + run: | + echo "WINEPATH=$(winepath --windows $(pwd)/lib)" >> $GITHUB_ENV + + cpu_count=`nproc` + ((cpu_count++)) + echo "wxMAKE_ARGS=-k -j$cpu_count" >> $GITHUB_ENV + + echo "wxMAKEFILE_ERROR_CXXFLAGS=-Werror -Wno-error=cpp" >> $GITHUB_ENV + + - name: Configure + run: | + ./configure --host=${HOST_TRIPLET} --disable-sys-libs --disable-optimise --disable-debug_info || rc=$? + + if [ -n "$rc" ]; then + echo '*** Configuring failed, contents of config.log follows: ***' + echo '-----------------------------------------------------------' + cat config.log + echo '-----------------------------------------------------------' + exit $rc + fi + + - name: Build + run: | + make $wxMAKE_ARGS "CXXFLAGS=$wxMAKEFILE_ERROR_CXXFLAGS" + + - name: Build samples + run: | + make $wxMAKE_ARGS "CXXFLAGS=$wxMAKEFILE_ERROR_CXXFLAGS" samples + + - name: Build tests + working-directory: tests + run: | + make $wxMAKE_ARGS failtest + make $wxMAKE_ARGS "CXXFLAGS=$wxMAKEFILE_ERROR_CXXFLAGS" + + - name: Run non-GUI tests + working-directory: tests + run: | + . ../build/tools/httpbin.sh + + httpbin_launch + + wine ./test || rc=$? + + if [ -n "$rc" ]; then + httpbin_show_log + exit $rc + fi + + - name: Run GUI tests + working-directory: tests + run: | + echo 'Launching Xvfb...' + sudo mkdir /tmp/.X11-unix + sudo chmod 1777 /tmp/.X11-unix + Xvfb :10 -screen 0 1600x1200x24 & + num_tries=1 + while true; do + if xset -d :10 -q >/dev/null 2>&1; then + echo 'Xvfb has become available.' + # Trying to use it immediately can still result in errors + # when creating the windows, somehow, so give it some time + # to settle. + sleep 3 + break + fi + + if [[ $num_tries -gt 10 ]]; then + echo 'Timed out waiting for Xvfb' + exit 1 + fi + + ((num_tries++)) + echo "Still waiting for Xvfb (attempt #$num_tries)" + sleep 3 + done + echo 'Launching the GUI test:' + DISPLAY=:10 wine ./test_gui