74f1a27f2f
0c78e49be3
tests: Switch one of the Travis jobs to an unsigned char environment (-funsigned-char) (practicalswift) Pull request description: Switch one of the Travis jobs to an unsigned char environment (`-funsigned-char`). This will help us catch errors due to code written under the assumption that `char` has the same value range as `signed char`. The signedness of `char` is implementation-defined. Example: ``` $ uname -a Linux […] x86_64 x86_64 x86_64 GNU/Linux $ cat foo.cpp #include <iostream> int main() { char c; std::cin >> c; int i = (unsigned char)c; std::cout << i << "\n"; } $ clang++ -o foo foo.cpp $ echo -e "\xff" | ./foo 255 $ clang++ -fsigned-char -o foo foo.cpp $ echo -e "\xff" | ./foo 255 $ clang++ -funsigned-char -o foo foo.cpp $ echo -e "\xff" | ./foo 255 $ cat bar.cpp #include <iostream> int main() { char c; std::cin >> c; int i = c; std::cout << i << "\n"; } $ clang++ -o bar bar.cpp $ echo -e "\xff" | ./bar -1 $ clang++ -fsigned-char -o bar bar.cpp $ echo -e "\xff" | ./bar -1 $ clang++ -funsigned-char -o bar bar.cpp $ echo -e "\xff" | ./bar 255 ``` `gcc` chars: * signed: alpha, hppa, ia64, m68k, mips, sh, sparc, x86 * unsigned: arm, powerpc, s390 About `-funsigned-char`: > Let the type "char" be unsigned, like "unsigned char". > > Each kind of machine has a default for what "char" should be. It is either like "unsigned char" by default or like "signed char" by default. > > Ideally, a portable program should always use "signed char" or "unsigned char" when it depends on the signedness of an object. But many programs have been written to use plain "char" and expect it to be signed, or expect it to be unsigned, depending on the machines they were written for. > > This option, and its inverse, let you make such a program work with the opposite default. The type "char" is always a distinct type from each of "signed char" or "unsigned char", even though its behavior is always just like one of those two. ACKs for top commit: laanwj: ACK0c78e49be3
Tree-SHA512: ba04590415c0bb9a0bbd348623e57068f75274f53da7247d5c5ecad82e365a5b45893a4a491d318e82a8feb6a25f019d46e01990afb33162e2c9740d33a343d7
202 lines
9.6 KiB
YAML
202 lines
9.6 KiB
YAML
# The test build matrix (stage: test) is constructed to test a wide range of
|
|
# configurations, rather than a single pass/fail. This helps to catch build
|
|
# failures and logic errors that present on platforms other than the ones the
|
|
# author has tested.
|
|
#
|
|
# Some builders use the dependency-generator in `./depends`, rather than using
|
|
# apt-get to install build dependencies. This guarantees that the tester is
|
|
# using the same versions as Gitian, so the build results are nearly identical
|
|
# to what would be found in a final release.
|
|
#
|
|
# In order to avoid rebuilding all dependencies for each build, the binaries
|
|
# are cached and re-used when possible. Changes in the dependency-generator
|
|
# will trigger cache-invalidation and rebuilds as necessary.
|
|
#
|
|
# These caches can be manually removed if necessary. This is one of the very
|
|
# few manual operations that is possible with Travis, and it can be done by a
|
|
# Bitcoin Core GitHub member via the Travis web interface [0].
|
|
#
|
|
# Travis CI uploads the cache after the script phase of the build [1].
|
|
# However, the build is terminated without saving the chache if it takes over
|
|
# 50 minutes [2]. Thus, if we spent too much time in early build stages, fail
|
|
# with an error and save the cache.
|
|
#
|
|
# [0] https://travis-ci.org/bitcoin/bitcoin/caches
|
|
# [1] https://docs.travis-ci.com/user/caching/#build-phases
|
|
# [2] https://docs.travis-ci.com/user/customizing-the-build#build-timeouts
|
|
|
|
dist: xenial
|
|
os: linux
|
|
language: minimal
|
|
cache:
|
|
ccache: true
|
|
directories:
|
|
- $TRAVIS_BUILD_DIR/depends/built
|
|
- $TRAVIS_BUILD_DIR/depends/sdk-sources
|
|
- $HOME/.ccache
|
|
stages:
|
|
- lint
|
|
- test
|
|
- extended-lint
|
|
env:
|
|
global:
|
|
- MAKEJOBS=-j3
|
|
- RUN_UNIT_TESTS=true
|
|
- RUN_FUNCTIONAL_TESTS=true
|
|
- RUN_FUZZ_TESTS=false
|
|
- DOCKER_NAME_TAG=ubuntu:18.04
|
|
- BOOST_TEST_RANDOM=1$TRAVIS_BUILD_ID
|
|
- CCACHE_SIZE=100M
|
|
- CCACHE_TEMPDIR=/tmp/.ccache-temp
|
|
- CCACHE_COMPRESS=1
|
|
- CCACHE_DIR=$HOME/.ccache
|
|
- BASE_OUTDIR=$TRAVIS_BUILD_DIR/out
|
|
- SDK_URL=https://bitcoincore.org/depends-sources/sdks
|
|
- WINEDEBUG=fixme-all
|
|
- DOCKER_PACKAGES="build-essential libtool autotools-dev automake pkg-config bsdmainutils curl git ca-certificates ccache"
|
|
- CACHE_ERR_MSG="Error! Initial build successful, but not enough time remains to run later build stages and tests. Please manually re-run this job by using the travis restart button or asking a bitcoin maintainer to restart. The next run should not time out because the build cache has been saved."
|
|
before_install:
|
|
- set -o errexit; source .travis/test_03_before_install.sh
|
|
install:
|
|
- set -o errexit; source .travis/test_04_install.sh
|
|
before_script:
|
|
- set -o errexit; source .travis/test_05_before_script.sh
|
|
script:
|
|
- export CONTINUE=1
|
|
- if [ $SECONDS -gt 1200 ]; then export CONTINUE=0; fi # Likely the depends build took very long
|
|
- if [ $CONTINUE = "1" ]; then set -o errexit; source .travis/test_06_script_a.sh; else set +o errexit; echo "$CACHE_ERR_MSG"; false; fi
|
|
- if [ $SECONDS -gt 2000 ]; then export CONTINUE=0; fi # Likely the build took very long; The tests take about 1000s, so we should abort if we have less than 50*60-1000=2000s left
|
|
- if [ $CONTINUE = "1" ]; then set -o errexit; source .travis/test_06_script_b.sh; else set +o errexit; echo "$CACHE_ERR_MSG"; false; fi
|
|
after_script:
|
|
- echo $TRAVIS_COMMIT_RANGE
|
|
- echo $TRAVIS_COMMIT_LOG
|
|
jobs:
|
|
include:
|
|
|
|
- stage: lint
|
|
name: 'lint'
|
|
env:
|
|
cache: false
|
|
language: python
|
|
python: '3.5' # Oldest supported version according to doc/dependencies.md
|
|
install:
|
|
- set -o errexit; source .travis/lint_04_install.sh
|
|
before_script:
|
|
- set -o errexit; source .travis/lint_05_before_script.sh
|
|
script:
|
|
- set -o errexit; source .travis/lint_06_script.sh
|
|
|
|
- stage: extended-lint
|
|
name: 'extended lint [runtime >= 60 seconds]'
|
|
env:
|
|
cache: false
|
|
language: python
|
|
python: '3.5'
|
|
install:
|
|
- set -o errexit; source .travis/extended_lint_04_install.sh
|
|
before_script:
|
|
- set -o errexit; source .travis/lint_05_before_script.sh
|
|
script:
|
|
- set -o errexit; source .travis/extended_lint_06_script.sh
|
|
|
|
- stage: test
|
|
name: 'ARM [GOAL: install] [no unit or functional tests]'
|
|
env: >-
|
|
HOST=arm-linux-gnueabihf
|
|
PACKAGES="python3 g++-arm-linux-gnueabihf"
|
|
RUN_UNIT_TESTS=false
|
|
RUN_FUNCTIONAL_TESTS=false
|
|
GOAL="install"
|
|
# -Wno-psabi is to disable ABI warnings: "note: parameter passing for argument of type ... changed in GCC 7.1"
|
|
# This could be removed once the ABI change warning does not show up by default
|
|
BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports CXXFLAGS=-Wno-psabi"
|
|
|
|
- stage: test
|
|
name: 'Win64 [GOAL: deploy] [no gui or functional tests]'
|
|
env: >-
|
|
HOST=x86_64-w64-mingw32
|
|
PACKAGES="python3 nsis g++-mingw-w64-x86-64 wine-binfmt wine64"
|
|
RUN_FUNCTIONAL_TESTS=false
|
|
GOAL="deploy"
|
|
BITCOIN_CONFIG="--enable-reduce-exports --disable-gui-tests"
|
|
|
|
- stage: test
|
|
name: '32-bit + dash [GOAL: install] [GUI: no BIP70]'
|
|
env: >-
|
|
HOST=i686-pc-linux-gnu
|
|
PACKAGES="g++-multilib python3-zmq"
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-zmq --with-gui=qt5 --disable-bip70 --enable-glibc-back-compat --enable-reduce-exports LDFLAGS=-static-libstdc++"
|
|
CONFIG_SHELL="/bin/dash"
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [bionic] [uses qt5 dev package instead of depends Qt to speed up build and avoid timeout] [unsigned char]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
PACKAGES="python3-zmq qtbase5-dev qttools5-dev-tools protobuf-compiler libdbus-1-dev libharfbuzz-dev libprotobuf-dev"
|
|
DEP_OPTS="NO_QT=1 NO_UPNP=1 DEBUG=1 ALLOW_HOST_PACKAGES=1"
|
|
TEST_RUNNER_EXTRA="--coverage --extended --exclude feature_dbcrash" # Run extended tests so that coverage does not fail, but exclude the very slow dbcrash
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-zmq --with-gui=qt5 --enable-glibc-back-compat --enable-reduce-exports --enable-debug CFLAGS=\"-g0 -O2 -funsigned-char\" CXXFLAGS=\"-g0 -O2 -funsigned-char\""
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [trusty] [no functional tests, no depends, only system libs]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
DOCKER_NAME_TAG=ubuntu:14.04
|
|
PACKAGES="python3-zmq qtbase5-dev qttools5-dev-tools libicu-dev libpng-dev libssl-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libdb5.1++-dev libzmq3-dev libprotobuf-dev protobuf-compiler libqrencode-dev"
|
|
NO_DEPENDS=1
|
|
RUN_FUNCTIONAL_TESTS=false
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-zmq --with-incompatible-bdb --with-gui=no"
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [xenial] [no depends, only system libs, sanitizers: thread (TSan), no wallet]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
DOCKER_NAME_TAG=ubuntu:16.04
|
|
PACKAGES="clang llvm python3-zmq qtbase5-dev qttools5-dev-tools libssl-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libzmq3-dev libprotobuf-dev protobuf-compiler libqrencode-dev"
|
|
NO_DEPENDS=1
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-zmq --disable-wallet --with-gui=qt5 CPPFLAGS=-DDEBUG_LOCKORDER --with-sanitizers=thread --disable-hardening --disable-asm CC=clang CXX=clang++"
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [bionic] [no depends, only system libs, sanitizers: address/leak (ASan + LSan) + undefined (UBSan) + integer]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
PACKAGES="clang llvm python3-zmq qtbase5-dev qttools5-dev-tools libssl1.0-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev libdb5.3++-dev libminiupnpc-dev libzmq3-dev libprotobuf-dev protobuf-compiler libqrencode-dev"
|
|
NO_DEPENDS=1
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-zmq --with-incompatible-bdb --with-gui=qt5 CPPFLAGS=-DDEBUG_LOCKORDER --with-sanitizers=address,integer,undefined CC=clang CXX=clang++"
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [bionic] [no depends, only system libs, sanitizers: fuzzer,address]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
PACKAGES="clang llvm python3 libssl1.0-dev libevent-dev bsdmainutils libboost-system-dev libboost-filesystem-dev libboost-chrono-dev libboost-test-dev libboost-thread-dev"
|
|
NO_DEPENDS=1
|
|
RUN_UNIT_TESTS=false
|
|
RUN_FUNCTIONAL_TESTS=false
|
|
RUN_FUZZ_TESTS=true
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer,address CC=clang CXX=clang++"
|
|
|
|
- stage: test
|
|
name: 'x86_64 Linux [GOAL: install] [bionic] [no wallet]'
|
|
env: >-
|
|
HOST=x86_64-unknown-linux-gnu
|
|
PACKAGES="python3-zmq"
|
|
DEP_OPTS="NO_WALLET=1"
|
|
GOAL="install"
|
|
BITCOIN_CONFIG="--enable-glibc-back-compat --enable-reduce-exports"
|
|
|
|
- stage: test
|
|
name: 'macOS 10.10 [GOAL: deploy] [no functional tests]'
|
|
env: >-
|
|
HOST=x86_64-apple-darwin14
|
|
PACKAGES="cmake imagemagick libcap-dev librsvg2-bin libz-dev libbz2-dev libtiff-tools python3-dev python3-setuptools"
|
|
OSX_SDK=10.11
|
|
RUN_UNIT_TESTS=false
|
|
RUN_FUNCTIONAL_TESTS=false
|
|
GOAL="deploy"
|
|
BITCOIN_CONFIG="--enable-gui --enable-reduce-exports --enable-werror"
|