diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85b42a2128..e906677e57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,12 @@ -# Continuous integration workflow for wxWidgets. -name: GitHub CI +# CI workflow for wxWidgets builds using configure+make under Unix. +name: Unix builds on: push: 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..2122000bbd --- /dev/null +++ b/.github/workflows/ci_msw_cross.yml @@ -0,0 +1,247 @@ +# 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" + winerun=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" + winerun=wine + ;; + + *) + echo "Unknown host triplet \"${HOST_TRIPLET}\"." + exit 1 + ;; + esac + + sudo apt-get -qq install $packages + + echo "wxTEST_RUNNER=${winerun}" >> $GITHUB_ENV + + - name: Checkout + uses: actions/checkout@v2 + with: + submodules: 'recursive' + + - name: System and environment setup + run: | + normal_uid=`id --user` + + # The checkout actions runs as root and there doesn't seem to be any + # way to change this, so just adjust the owner after checkout. + sudo chown -R $normal_uid $GITHUB_WORKSPACE + + # Add the directories containing MinGW and wx DLLs to Wine path. + winepath="$(winepath --windows /usr/lib/gcc/${HOST_TRIPLET}/$(${HOST_TRIPLET}-gcc -dumpversion|tr -d '\r'))" + winepath="${winepath};$(winepath --windows $(pwd)/lib)" + echo "WINEPATH=${winepath}" >> $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: Launch Xvfb + 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 'Xvfb is running on display :10' + echo 'DISPLAY=:10' >> $GITHUB_ENV + + - name: Run non-GUI tests + working-directory: tests + run: | + # Some tests are currently failing under Wine while they pass under + # native MSW, just skip running them until they can be dealt with. + + # As soon as we specify the tests to exclude explicitly, we also need + # to exclude the tests that are not run by default, so start with this. + excluded_tests=('~[.]') + + # Only TestSetTimes fails, but only the full test can be excluded. + excluded_tests+=('~FileNameTestCase') + + # Only FileError fails, but the whole test has to be excluded. + excluded_tests+=('~FileFunctionsTestCase') + + # Sporadic failures due to extra events. + excluded_tests+=('~wxFileSystemWatcher::EventCreate') + + # The test fails (even with wxTEST_RUNNER-related changes) and hangs. + excluded_tests+=('~ExecTestCase') + + # Wine WinHTTP implementations seems buggy, there are many errors. + excluded_tests+=('~[webrequest]') + + $wxTEST_RUNNER ./test "${excluded_tests[@]}" + + - name: Run GUI tests + working-directory: tests + run: | + # Same as for the non-GUI test above, except many more GUI tests fail + # under Wine. + excluded_gui_tests=('~[.]') + + excluded_gui_tests+=('~BitmapComboBoxTestCase') # TextChangeEvents + excluded_gui_tests+=('~ClippingBoxTestCase*') + excluded_gui_tests+=('~ComboBoxTestCase') # TextChangeEvents + excluded_gui_tests+=('~DatePickerCtrlTestCase') # Range + excluded_gui_tests+=('~wxDC::GetTextExtent') + excluded_gui_tests+=('~ExecTestCase') + excluded_gui_tests+=('~wxFont::GetSet') + excluded_gui_tests+=('~GraphicsPathTestCaseGDIPlus') + excluded_gui_tests+=('~ImageList*') + excluded_gui_tests+=('~RadioButton::Focus') + excluded_gui_tests+=('~SettingsTestCase') # GetFont fails + excluded_gui_tests+=('~SliderTestCase') # Thumb + excluded_gui_tests+=('~TransformMatrixTestCase*') + excluded_gui_tests+=('~TreeCtrlTestCase') # LabelEdit + excluded_gui_tests+=('~TextCtrlTestCase') # many sub-tests + excluded_gui_tests+=('~wxTextCtrl::InitialCanUndo') + excluded_gui_tests+=('~[wxWebView]') + excluded_gui_tests+=('~Window::PositioningBeyondShortLimit') + excluded_gui_tests+=('~XRC::LoadURL') + + $wxTEST_RUNNER ./test_gui "${excluded_gui_tests[@]}" diff --git a/build/tools/httpbin.sh b/build/tools/httpbin.sh index 4243e8b497..7b9f4df273 100644 --- a/build/tools/httpbin.sh +++ b/build/tools/httpbin.sh @@ -16,7 +16,9 @@ httpbin_launch() { case "$(uname -s)" in Linux) - dist_codename=$(lsb_release --codename --short) + if command -v lsb_release > /dev/null; then + dist_codename=$(lsb_release --codename --short) + fi ;; Darwin) @@ -42,7 +44,7 @@ httpbin_launch() { esac # Ensure that we have at least some version of pip. - if ! python3 -m pip; then + if ! python3 -c 'import pip'; then sudo apt-get -q -o=Dpkg::Use-Pty=0 install python3-pip fi diff --git a/tests/exec/exec.cpp b/tests/exec/exec.cpp index 5afe329d4d..69b7eb3c17 100644 --- a/tests/exec/exec.cpp +++ b/tests/exec/exec.cpp @@ -116,7 +116,13 @@ private: wxProcess* callback_ = NULL) { forceExitLoop = forceExitLoop_; - command = command_; + + // Prepend the command with the value of wxTEST_RUNNER if it's + // defined to make this test work when using Wine too. + if ( wxGetEnv("wxTEST_RUNNER", &command) ) + command += ' '; + command += command_; + flags = flags_; callback = callback_;