Gettext literal #14
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# CI workflow for wxWidgets builds using configure+make under Unix. | |
name: Unix builds | |
on: | |
push: | |
branches: | |
- master | |
paths-ignore: | |
- '.circleci/**' | |
- '.github/ISSUE_TEMPLATE/**' | |
- '.github/workflows/ci_mac.yml' | |
- '.github/workflows/ci_cmake.yml' | |
- '.github/workflows/ci_msw.yml' | |
- '.github/workflows/ci_msw_cross.yml' | |
- '.github/workflows/docs_update.yml' | |
- 'build/cmake/**' | |
- 'build/tools/appveyor*.bat' | |
- 'distrib/**' | |
- 'docs/**' | |
- 'interface/**' | |
- 'include/msvc/**' | |
- 'include/wx/msw/**' | |
- 'locale/**' | |
- 'src/msw/**' | |
- '*.md' | |
- '*.yml' | |
- 'CMakeLists.txt' | |
- 'wxwidgets.props' | |
pull_request: | |
branches: | |
- master | |
paths-ignore: | |
- '.circleci/**' | |
- '.github/ISSUE_TEMPLATE/**' | |
- '.github/workflows/ci_mac.yml' | |
- '.github/workflows/ci_cmake.yml' | |
- '.github/workflows/ci_msw.yml' | |
- '.github/workflows/ci_msw_cross.yml' | |
- '.github/workflows/docs_update.yml' | |
- 'build/cmake/**' | |
- 'build/tools/appveyor*.bat' | |
- 'distrib/**' | |
- 'docs/**' | |
- 'interface/**' | |
- 'include/msvc/**' | |
- 'include/wx/msw/**' | |
- 'locale/**' | |
- 'src/msw/**' | |
- '*.md' | |
- '*.yml' | |
- 'CMakeLists.txt' | |
- 'wxwidgets.props' | |
workflow_dispatch: | |
inputs: | |
debug_tests: | |
type: boolean | |
description: 'Enable ssh server before running the tests' | |
required: false | |
default: false | |
concurrency: | |
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
jobs: | |
build: | |
runs-on: ${{ matrix.runner }} | |
name: ${{ matrix.name }} | |
container: | |
image: ${{ matrix.container }} | |
# We need to make container privileged just to allow writing to | |
# /proc/sys/kernel/core* files below. | |
options: --privileged | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
- name: Ubuntu 18.04 wxGTK 2 | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
gtk_version: 2 | |
use_xvfb: true | |
- name: Ubuntu 18.04 wxGTK UTF-8 | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
configure_flags: --enable-utf8 --enable-utf8only --enable-monolithic | |
use_xvfb: true | |
- name: Ubuntu 18.04 wxGTK 3 static with gcc 4.8 | |
runner: ubuntu-latest | |
compiler: g++-4.8 | |
container: ubuntu:18.04 | |
configure_flags: --disable-shared | |
allow_extra_warnings: true | |
use_xvfb: true | |
- name: Ubuntu 18.04 wxGTK 3 compatible 3.0 | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
configure_flags: --enable-compat30 | |
use_xvfb: true | |
- name: Ubuntu 20.04 wxGTK 3 with clang | |
runner: ubuntu-20.04 | |
compiler: clang++-10 | |
configure_flags: --disable-sys-libs | |
use_xvfb: true | |
- name: Ubuntu 22.04 wxGTK with wx containers | |
runner: ubuntu-22.04 | |
configure_flags: --enable-compat30 --disable-std_containers | |
use_xvfb: true | |
- name: Ubuntu 22.04 wxGTK with ASAN | |
runner: ubuntu-22.04 | |
configure_flags: --disable-compat32 --disable-sys-libs | |
skip_samples: true | |
use_asan: true | |
use_xvfb: true | |
- name: Ubuntu 22.04 wxGTK with UBSAN | |
runner: ubuntu-22.04 | |
configure_flags: --with-cxx=20 | |
use_ubsan: true | |
use_xvfb: true | |
build_out_of_tree_samples: true | |
- name: Ubuntu 18.04 wxX11 | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
configure_flags: --with-x11 --enable-pch --disable-stc | |
skip_samples: true | |
- name: Ubuntu 18.04 wxDFB | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
configure_flags: --with-directfb --enable-pch --disable-stc | |
skip_samples: true | |
allow_warnings: true | |
- name: Ubuntu 18.04 wxQt | |
runner: ubuntu-latest | |
container: ubuntu:18.04 | |
configure_flags: --with-qt --enable-pch --without-opengl | |
skip_samples: true | |
use_xvfb: true | |
env: | |
wxGTK_VERSION: ${{ matrix.gtk_version && matrix.gtk_version || 3 }} | |
wxCONFIGURE_FLAGS: ${{ matrix.configure_flags }} | |
wxUSE_ASAN: ${{ matrix.use_asan && 1 || 0 }} | |
wxUSE_XVFB: ${{ matrix.use_xvfb && 1 || 0 }} | |
ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true | |
steps: | |
- name: Set up build system | |
run: | | |
case '${{ matrix.container }}' in | |
ubuntu:*) | |
export DEBIAN_FRONTEND=noninteractive | |
if [ '${{ matrix.container }}' = 'ubuntu:18.04' ]; then | |
# First get the package containing /usr/bin/apt-add-repository. | |
apt-get update -qq | |
apt-get install -qq software-properties-common | |
# Git 2.17 in the official repository is too old to checkout | |
# submodules using it, so get a newer version. | |
apt-add-repository ppa:git-core/ppa | |
fi | |
compiler=${{ matrix.compiler }} | |
# Explanation for installing some less obvious packages: | |
# - coreutils contains nproc used in proc_count.sh called below. | |
# - xvfb is used for running the GUI tests. | |
apt-get update -qq | |
apt-get install -qq coreutils ${compiler-g++} git make pkg-config sudo xvfb | |
;; | |
'') | |
;; | |
*) | |
echo '::error ::Unknown container kind.' | |
exit 1 | |
esac | |
- name: Checkout | |
if: matrix.container != 'ubuntu:18.04' | |
uses: actions/checkout@v4 | |
with: | |
submodules: 'recursive' | |
- name: Checkout Ubuntu 18.04 | |
if: matrix.container == 'ubuntu:18.04' | |
uses: actions/checkout@v3 | |
with: | |
submodules: 'recursive' | |
- name: Install CCache | |
if: matrix.container != 'ubuntu:18.04' | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: ${{ matrix.name }} | |
- name: Install CCache Ubuntu 18.04 | |
if: matrix.container == 'ubuntu:18.04' | |
uses: hendrikmuhs/[email protected] | |
with: | |
key: ${{ matrix.name }} | |
- name: Set up build environment | |
run: | | |
wxPROC_COUNT=`./build/tools/proc_count.sh` | |
echo wxBUILD_ARGS=-j$wxPROC_COUNT >> $GITHUB_ENV | |
echo "PATH=/usr/lib/ccache:$PATH" >> $GITHUB_ENV | |
# Setting this variable suppresses "Error retrieving accessibility bus address" | |
# messages from WebKit tests that we're not interested in. | |
echo NO_AT_BRIDGE=1 >> $GITHUB_ENV | |
compiler=${{ matrix.compiler }} | |
case "$compiler" in | |
clang++*) | |
echo CC=`echo $compiler | sed s/++//` >> $GITHUB_ENV | |
echo CXX="$compiler -stdlib=libc++" >> $GITHUB_ENV | |
echo LD=$compiler >> $GITHUB_ENV | |
allow_warn_opt="-Wno-error=#warnings" | |
;; | |
g++*) | |
echo CC=`echo $compiler | sed s/++/cc/` >> $GITHUB_ENV | |
echo CXX=$compiler >> $GITHUB_ENV | |
echo LD=$compiler >> $GITHUB_ENV | |
allow_warn_opt="-Wno-error=cpp" | |
;; | |
'') | |
# Assume gcc. | |
allow_warn_opt="-Wno-error=cpp" | |
;; | |
*) | |
echo "*** Unknown compiler: ${{ matrix.compiler }} ***" | |
;; | |
esac | |
if [ -z ${{ matrix.allow_warnings }} ]; then | |
if [ -z ${{ matrix.allow_extra_warnings }} ]; then | |
error_opts="-Wextra" | |
fi | |
error_opts="$error_opts -Werror $allow_warn_opt" | |
echo "wxMAKEFILE_ERROR_CXXFLAGS=$error_opts" >> $GITHUB_ENV | |
echo "wxMAKEFILE_CXXFLAGS=$wxMAKEFILE_CXXFLAGS $error_opts" >> $GITHUB_ENV | |
fi | |
echo "wxMAKEFILE_CXXFLAGS=$wxMAKEFILE_CXXFLAGS $error_opts" >> $GITHUB_ENV | |
./build/tools/before_install.sh | |
- name: Show build environment | |
run: | | |
echo "Environment:" | |
env | sort | |
echo | |
echo "Compiler version:" | |
${CXX-g++} --version | |
echo | |
echo "ccache version:" | |
ccache --version | |
echo | |
echo "Free space:" | |
df -h / | |
echo | |
- name: Work around Ubuntu 22.04 runner problem | |
if: matrix.runner == 'ubuntu-22.04' | |
# See https://github.com/actions/runner-images/issues/9491#issuecomment-1989718917 | |
run: sudo sysctl vm.mmap_rnd_bits=28 | |
- name: Configuring | |
run: | | |
wxCONFIGURE_OPTIONS="--disable-optimise $wxCONFIGURE_FLAGS" | |
if [ -n "${{ matrix.gtk_version }}" ]; then | |
wxCONFIGURE_OPTIONS="--with-gtk=${{ matrix.gtk_version }} $wxCONFIGURE_OPTIONS" | |
fi | |
if [ ${{ matrix.use_asan }} ]; then | |
wxSANITIZER_FLAGS='-fsanitize=address' | |
echo 'ASAN_OPTIONS=fast_unwind_on_malloc=0' >> $GITHUB_ENV | |
elif [ ${{ matrix.use_ubsan }} ]; then | |
wxSANITIZER_FLAGS='-fsanitize=undefined' | |
fi | |
if [ -n "$wxSANITIZER_FLAGS" ]; then | |
./configure $wxCONFIGURE_OPTIONS --enable-debug \ | |
"CFLAGS=$wxSANITIZER_FLAGS -fno-omit-frame-pointer" \ | |
"CXXFLAGS=$wxSANITIZER_FLAGS -fno-omit-frame-pointer" \ | |
"LDFLAGS=$wxSANITIZER_FLAGS" || rc=$? | |
else | |
./configure $wxCONFIGURE_OPTIONS --disable-debug_info || rc=$? | |
fi | |
if [ -n "$rc" ]; then | |
echo '*** Configuring failed, contents of config.log follows: ***' | |
echo '-----------------------------------------------------------' | |
cat config.log | |
echo '-----------------------------------------------------------' | |
exit $rc | |
fi | |
- name: Building | |
run: | | |
if [ ${{ matrix.use_asan }} ]; then | |
# This is a horrible hack needed to prevent ASAN from being used | |
# for the WebKit extension shared library: this wouldn't work | |
# because this library is loaded in a separate WebKit process not | |
# using ASAN. This should really be fixed at makefile level, but | |
# for now just work around the problem here by manually building | |
# this library without ASAN: get the compile and link commands | |
# (the only ones that should contain ASAN flags) and filter these | |
# flags out from them before running them. | |
/bin/sh -xc "`make -n install_webkit2_ext | sed -n -e 's/-fsanitize=address//gp'`" | |
fi | |
make -k $wxBUILD_ARGS "CXXFLAGS=$wxMAKEFILE_ERROR_CXXFLAGS" | |
- name: Building tests | |
working-directory: tests | |
run: | | |
make $wxBUILD_ARGS failtest | |
make -k $wxBUILD_ARGS "CXXFLAGS=$wxMAKEFILE_CXXFLAGS" "LDFLAGS=$wxMAKEFILE_LDFLAGS" | |
- name: Setup tmate | |
uses: mxschmitt/action-tmate@v3 | |
if: ${{ github.event_name == 'workflow_dispatch' && inputs.debug_tests }} | |
- name: Setup Go | |
if: matrix.container != 'ubuntu:18.04' | |
uses: actions/setup-go@v5 | |
with: | |
go-version: '1' | |
cache: false | |
- name: Setup Go Ubuntu 18.04 | |
if: matrix.container == 'ubuntu:18.04' | |
uses: actions/setup-go@v4 | |
with: | |
go-version: '1' | |
cache: false | |
- name: Testing | |
working-directory: tests | |
run: | | |
. ../build/tools/httpbin.sh | |
httpbin_launch | |
if [ ${{ matrix.use_ubsan }} ]; then | |
# First run wiht UBSAN: halt on first error to make sure we fail if | |
# any UB is detected. | |
export UBSAN_OPTIONS=halt_on_error=1 | |
fi | |
# Explicitly use bash because /bin/sh doesn't have pipefail option | |
/bin/bash -o pipefail -c './test 2>&1 | tee test.out' || rc=$? | |
if [ ${{ matrix.use_asan }} ]; then | |
# Work around spurious crashes by running the test again. | |
# See https://github.com/google/sanitizers/issues/1353 | |
if grep -qF 'LeakSanitizer has encountered a fatal error' test.out; then | |
echo '+++ Rerunning the tests once again after LeakSanitizer crash +++' | |
unset rc | |
./test || rc=$? | |
fi | |
fi | |
if [ ${{ matrix.use_ubsan }} ]; then | |
if grep -qF ': runtime error: ' test.out; then | |
export UBSAN_OPTIONS=print_stacktrace=1 | |
echo '+++ UB detected, rerunning the tests to show all occurrences +++' | |
./test | |
# Leave rc set to non-zero value to indicate failure. | |
fi | |
fi | |
if [ -n "$rc" ]; then | |
httpbin_show_log | |
exit $rc | |
fi | |
- name: Testing launching GUI test | |
working-directory: tests | |
run: | | |
WX_TEST_DISABLE_GUI=1 ./test_gui | |
- name: Testing GUI using Xvfb | |
if: matrix.use_xvfb | |
working-directory: tests | |
run: | | |
if [ ${{ matrix.use_asan }} ]; then | |
# Leak suppression only works if we have debug symbols available, | |
# otherwise we disable it to avoid tons of reports about leaks in | |
# libfontconfig etc. | |
if [ -f wx_dbgsym_available ]; then | |
export LSAN_OPTIONS=suppressions=$(pwd)/misc/suppressions/lsan | |
else | |
ASAN_OPTIONS="$ASAN_OPTIONS detect_leaks=0" | |
fi | |
# Running all tests at once fails, apparently due to running out of | |
# memory when using ASAN, work around this problem by excluding | |
# RichTextCtrlTestCase whose Table sub-test seems to be problematic. | |
wx_tests_selection='~[.] ~RichTextCtrlTestCase' | |
fi | |
if [ ${{ matrix.use_ubsan }} ]; then | |
# First run with UBSAN: halt on first error to make sure we fail if | |
# any UB is detected. | |
export UBSAN_OPTIONS=halt_on_error=1 | |
fi | |
# The tests only work reliably with native windows | |
export QT_USE_NATIVE_WINDOWS=1 | |
# Configure the system to create core files and create them in the | |
# current directory instead of using apport to handle them, as | |
# Ubuntu does by default (even in a container where apport is not | |
# only not running but not even installed). Also turn off appending | |
# PID to the core files names which is on by default. | |
ulimit -c unlimited | |
echo core | sudo tee /proc/sys/kernel/core_pattern | |
echo 0 | sudo tee /proc/sys/kernel/core_uses_pid | |
# This is exceedingly weird, but for some reason the first test using | |
# wxWebView sometimes fails (even if the timeout in the test is | |
# increased), so run it before really running the tests -- then they | |
# will succeed. | |
xvfb-run -a -s '-screen 0 1600x1200x24' ./test_gui -c Title WebView >/dev/null 2>&1 || echo 'First wxWebView test failure ignored.' | |
/bin/bash -o pipefail -c "xvfb-run -a -s '-screen 0 1600x1200x24' ./test_gui -d 1 $wx_tests_selection 2>&1 | tee -a test_gui.out" || rc=$? | |
if [ ${{ matrix.use_ubsan }} ]; then | |
if grep -qF ': runtime error: ' test_gui.out; then | |
echo "\n\n+++ UB detected, rerunning the tests to show all occurrences +++\n" | |
export UBSAN_OPTIONS=print_stacktrace=1 | |
xvfb-run -a -s '-screen 0 1600x1200x24' ./test_gui $wx_tests_selection | |
# rc should be already set to non-zero value, but make sure of it. | |
rc=1 | |
fi | |
fi | |
if [ -n "$rc" ]; then | |
if grep -qF '(core dumped)' test_gui.out; then | |
echo '*** Test crashed, trying to get more information ***' | |
gdb --quiet --core=core -ex 'where' -ex 'thread apply all bt' -ex 'q' ./test_gui | |
fi | |
exit $rc | |
fi | |
- name: Building samples | |
if: matrix.skip_samples != true | |
run: | | |
make -k $wxBUILD_ARGS "CXXFLAGS=$wxMAKEFILE_CXXFLAGS" "LDFLAGS=$wxMAKEFILE_LDFLAGS" samples | |
- name: Installing | |
run: | | |
sudo make install | |
- name: Testing installation | |
run: | | |
make -C samples/minimal -f makefile.unx clean | |
make -C samples/minimal -f makefile.unx $wxBUILD_ARGS "CXXFLAGS=$wxMAKEFILE_CXXFLAGS" "LDFLAGS=$wxMAKEFILE_LDFLAGS" | |
- name: Building samples out of tree | |
if: matrix.build_out_of_tree_samples | |
run: | | |
make -C samples clean | |
for f in $(find samples -name makefile.unx); do | |
mv $f $(dirname $f)/Makefile | |
done | |
make -C samples -k $wxBUILD_ARGS |