Travis: Refactor CI files, use container infrastructure.

* Split build steps to utilize the Travis build lifecycle.
 * Move shell code from `.travis.yml` into Bash files in `.ci/`,
   one file for each step of the Travis build lifecycle.
 * Use configuration variables in `.travis.yml` to change
   build behavior (e.g. build 32-bit with `BUILD_32BIT=ON`).
 * Keep all configuration in environment variables in
   `.travis.yml`. In scripts, concatenate environment variables
   according to configuration to change to different behavior.
 * Add GCC 5 builds for Linux.
 * Use Travis's caching feature [1] for third-party dependencies
   and pip packages.
 * Allow failures MSan, as the errors it reports have to be
   fixed first.

Valgrind is still disabled, but can be enabled by setting
`env: VALGRIND=ON` for a job in `.travis.yml`.

[1] http://docs.travis-ci.com/user/caching
This commit is contained in:
Florian Walch 2015-07-05 10:52:36 +03:00 committed by Thiago de Arruda
parent bac2700e2f
commit d2eb4a9346
17 changed files with 423 additions and 307 deletions

10
.ci/after_success.sh Executable file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ -n "${CI_TARGET}" ]]; then
exit
fi
coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'

24
.ci/before_cache.sh Executable file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ "${TRAVIS_OS_NAME}" != linux ]]; then
# Caches are only enabled for Travis's Linux container infrastructure,
# but this script is still executed on OS X.
exit
fi
# Don't cache pip's log and selfcheck.
rm -rf "${HOME}/.cache/pip/log"
rm -f "${HOME}/.cache/pip/selfcheck.json"
# Update the third-party dependency cache only if the build was successful.
if [[ -f "${SUCCESS_MARKER}" ]]; then
if [[ ! -f "${CACHE_MARKER}" ]] || [[ "${BUILD_NVIM_DEPS}" == true ]]; then
echo "Updating third-party dependency cache."
rm -rf "${HOME}/.cache/nvim-deps"
mv -T "${DEPS_INSTALL_PREFIX}" "${HOME}/.cache/nvim-deps"
touch "${CACHE_MARKER}"
fi
fi

13
.ci/before_install.sh Executable file
View File

@ -0,0 +1,13 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ -n "${CI_TARGET}" ]]; then
exit
fi
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
brew update
fi
pip install --user --upgrade pip

24
.ci/before_script.sh Executable file
View File

@ -0,0 +1,24 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ -n "${CI_TARGET}" ]]; then
exit
fi
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh"
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
# Adds user to a dummy group.
# That allows to test changing the group of the file by `os_fchown`.
sudo dscl . -create /Groups/chown_test
sudo dscl . -append /Groups/chown_test GroupMembership "${USER}"
else
# Compile dependencies.
build_deps
fi
rm -rf "${LOG_DIR}"
mkdir -p "${LOG_DIR}"

View File

@ -1,73 +0,0 @@
. "$CI_SCRIPTS/common.sh"
sudo pip install cpp-coveralls
# Use custom Clang and enable sanitizers on Linux.
if [ "$TRAVIS_OS_NAME" = "linux" ]; then
if [ -z "$CLANG_SANITIZER" ]; then
echo "CLANG_SANITIZER not set."
exit 1
fi
clang_version=3.6
echo "Installing Clang $clang_version..."
sudo add-apt-repository "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu precise main"
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA9EF27F
sudo add-apt-repository "deb http://llvm.org/apt/precise/ llvm-toolchain-precise-$clang_version main"
wget -q -O - http://llvm.org/apt/llvm-snapshot.gpg.key | sudo apt-key add -
sudo apt-get update -qq
sudo apt-get install -y -q clang-$clang_version
export CC=/usr/bin/clang-$clang_version
symbolizer=/usr/bin/llvm-symbolizer-$clang_version
export ASAN_SYMBOLIZER_PATH=$symbolizer
export MSAN_SYMBOLIZER_PATH=$symbolizer
export ASAN_OPTIONS="detect_leaks=1:log_path=$tmpdir/asan"
export TSAN_OPTIONS="external_symbolizer_path=$symbolizer log_path=$tmpdir/tsan"
export UBSAN_OPTIONS="log_path=$tmpdir/ubsan" # not sure if this works
CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \
-DUSE_GCOV=ON \
-DBUSTED_OUTPUT_TYPE=plainTerminal \
-DCLANG_${CLANG_SANITIZER}=ON"
else
CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \
-DUSE_GCOV=ON \
-DBUSTED_OUTPUT_TYPE=plainTerminal"
fi
setup_deps x64
# Build and output version info.
$MAKE_CMD CMAKE_EXTRA_FLAGS="$CMAKE_EXTRA_FLAGS" nvim
build/bin/nvim --version
# Run unittests.
make unittest
# Run functional tests.
# FIXME (fwalch): Disabled for MSAN because of SIGPIPE error.
if [ "$TRAVIS_OS_NAME" = linux ] && ! [ "$CLANG_SANITIZER" = MSAN ]; then
if ! $MAKE_CMD test; then
asan_check "$tmpdir"
exit 1
fi
asan_check "$tmpdir"
fi
# Run legacy tests.
if ! $MAKE_CMD oldtest; then
reset
asan_check "$tmpdir"
exit 1
fi
asan_check "$tmpdir"
coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'
# Test if correctly installed.
sudo -E $MAKE_CMD install
/usr/local/bin/nvim --version
/usr/local/bin/nvim -e -c "quit"

View File

@ -1,3 +0,0 @@
#!/bin/sh
make lint

View File

@ -1,74 +0,0 @@
set -eu
valgrind_check() {
check_logs "$1" "valgrind-*"
}
asan_check() {
check_logs "$1" "*san.*"
}
check_logs() {
local err=""
check_core_dumps
# Iterate through each log to remove an useless warning
for log in $(find "$1" -type f -name "$2"); do
sed -i "$log" \
-e '/Warning: noted but unhandled ioctl/d' \
-e '/could cause spurious value errors to appear/d' \
-e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
done
# Now do it again, but only consider files with size > 0
for log in $(find "$1" -type f -name "$2" -size +0); do
cat "$log"
err=1
done
if [ -n "$err" ]; then
echo "Runtime errors detected"
exit 1
fi
}
check_core_dumps() {
sleep 2
if [ "$TRAVIS_OS_NAME" = "osx" ]; then
cores="$(find /cores/ -type f -print)"
dbg="lldb -Q -o bt -f build/bin/nvim -c"
else
# TODO(fwalch): Will trigger if a file named core.* exists outside of .deps.
cores="$(find ./ -type f -not -path '*.deps*' -name 'core.*' -print)"
dbg="gdb -n -batch -ex bt build/bin/nvim"
fi
if [ -z "$cores" ]; then
return
fi
for c in $cores; do
$dbg $c
done
exit 1
}
setup_deps() {
sudo pip install --upgrade pip
sudo pip install neovim
# For pip3
# https://github.com/travis-ci/travis-ci/issues/1528
# sudo apt-get install -q python3.3-dev
# curl -Ss http://python-distribute.org/distribute_setup.py | sudo python3
# curl -Ss https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python3
# sudo pip3.3 install neovim
if [ "$BUILD_NVIM_DEPS" != "true" ]; then
eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) deps-${1}"
elif [ "$TRAVIS_OS_NAME" = "linux" ]; then
sudo apt-get install libtool
fi
}
tmpdir="$(pwd)/tmp"
rm -rf "$tmpdir"
mkdir -p "$tmpdir"
suppressions="$(pwd)/.valgrind.supp"

79
.ci/common/build.sh Normal file
View File

@ -0,0 +1,79 @@
build_deps() {
if [[ "${BUILD_32BIT}" == ON ]]; then
if [[ "${BUILD_MINGW}" == ON ]]; then
>&2 echo "32-bit MinGW builds not supported."
exit 1
fi
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
fi
if [[ "${BUILD_MINGW}" == ON ]]; then
DEPS_CMAKE_FLAGS="${DEPS_CMAKE_FLAGS} ${CMAKE_FLAGS_MINGW}"
fi
rm -rf "${DEPS_INSTALL_PREFIX}"
# If there is a valid cache and we're not forced to recompile,
# use cached third-party dependencies.
if [[ -f "${CACHE_MARKER}" ]] && [[ "${BUILD_NVIM_DEPS}" != true ]]; then
echo "Using third-party dependencies from Travis's cache (last updated: $(stat -c '%y' "${CACHE_MARKER}"))."
mkdir -p "$(dirname "${DEPS_INSTALL_PREFIX}")"
ln -Ts "${HOME}/.cache/nvim-deps" "${DEPS_INSTALL_PREFIX}"
return
fi
mkdir -p "${DEPS_BUILD_DIR}"
cd "${DEPS_BUILD_DIR}"
echo "Configuring with '${DEPS_CMAKE_FLAGS}'."
cmake ${DEPS_CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}/third-party/"
if ! ${MAKE_CMD}; then
exit 1
fi
cd "${TRAVIS_BUILD_DIR}"
}
build_nvim() {
if [[ -n "${CLANG_SANITIZER}" ]]; then
CMAKE_FLAGS="${CMAKE_FLAGS} -DCLANG_${CLANG_SANITIZER}=ON"
fi
if [[ "${BUILD_32BIT}" == ON ]]; then
if [[ "${BUILD_MINGW}" == ON ]]; then
>&2 echo "32-bit MinGW builds not supported."
exit 1
fi
CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_32BIT}"
fi
if [[ "${BUILD_MINGW}" == ON ]]; then
CMAKE_FLAGS="${CMAKE_FLAGS} ${CMAKE_FLAGS_MINGW}"
fi
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
echo "Configuring with '${CMAKE_FLAGS}'."
cmake ${CMAKE_FLAGS} "${TRAVIS_BUILD_DIR}"
echo "Building nvim."
if ! ${MAKE_CMD} nvim; then
exit 1
fi
echo "Building libnvim."
if ! ${MAKE_CMD} libnvim; then
exit 1
fi
echo "Building nvim-test."
if ! ${MAKE_CMD} nvim-test; then
exit 1
fi
# Invoke nvim to trigger *San early.
bin/nvim --version
bin/nvim -u NONE -e -c ':qall'
cd "${TRAVIS_BUILD_DIR}"
}

85
.ci/common/test.sh Normal file
View File

@ -0,0 +1,85 @@
check_core_dumps() {
sleep 2
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
local cores="$(find /cores/ -type f -print)"
local dbg_cmd="lldb -Q -o bt -f ${BUILD_DIR}/bin/nvim -c"
else
# FIXME (fwalch): Will trigger if a file named core.* exists outside of $DEPS_BUILD_DIR.
local cores="$(find ./ -type f -not -path "*${DEPS_BUILD_DIR}*" -name 'core.*' -print)"
local dbg_cmd="gdb -n -batch -ex bt ${BUILD_DIR}/bin/nvim"
fi
if [ -z "${cores}" ]; then
return
fi
for core in $cores; do
${dbg_cmd} "${core}"
done
exit 1
}
check_logs() {
# Iterate through each log to remove an useless warning.
for log in $(find "${1}" -type f -name "${2}"); do
sed -i "${log}" \
-e '/Warning: noted but unhandled ioctl/d' \
-e '/could cause spurious value errors to appear/d' \
-e '/See README_MISSING_SYSCALL_OR_IOCTL for guidance/d'
done
# Now do it again, but only consider files with size > 0.
local err=""
for log in $(find "${1}" -type f -name "${2}" -size +0); do
cat "${log}"
err=1
done
if [[ -n "${err}" ]]; then
echo "Runtime errors detected."
exit 1
fi
}
valgrind_check() {
check_logs "${1}" "valgrind-*"
}
asan_check() {
check_logs "${1}" "*san.*"
}
run_unittests() {
${MAKE_CMD} -C "${BUILD_DIR}" unittest
}
run_functionaltests() {
if ! ${MAKE_CMD} -C "${BUILD_DIR}" functionaltest; then
asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}"
exit 1
fi
asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}"
}
run_oldtests() {
if ! make -C "${TRAVIS_BUILD_DIR}/src/nvim/testdir"; then
reset
asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}"
exit 1
fi
asan_check "${LOG_DIR}"
valgrind_check "${LOG_DIR}"
}
install_nvim() {
${MAKE_CMD} -C "${BUILD_DIR}" install
"${INSTALL_PREFIX}/bin/nvim" --version
"${INSTALL_PREFIX}/bin/nvim" -u NONE -e -c ':help' -c ':qall' || {
echo "Running ':help' in the installed nvim failed."
echo "Maybe the helptags have not been generated properly."
exit 1
}
}

View File

@ -1,37 +0,0 @@
. "$CI_SCRIPTS/common.sh"
sudo apt-get install gcc-multilib g++-multilib
setup_deps x86
CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \
-DCMAKE_SYSTEM_PROCESSOR=i386 \
-DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32 \
-DFIND_LIBRARY_USE_LIB64_PATHS=OFF \
-DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib \
-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake \
-DBUSTED_OUTPUT_TYPE=plainTerminal"
# Build and output version info.
$MAKE_CMD DEPS_CMAKE_FLAGS="$CMAKE_EXTRA_FLAGS" \
CMAKE_EXTRA_FLAGS="$CMAKE_EXTRA_FLAGS" nvim
build/bin/nvim --version
# Build library.
$MAKE_CMD CMAKE_EXTRA_FLAGS="$CMAKE_EXTRA_FLAGS" libnvim
# Run unittests.
$MAKE_CMD unittest
# Run functional tests.
$MAKE_CMD test
check_core_dumps
# Run legacy tests.
$MAKE_CMD oldtest
check_core_dumps
# Test if correctly installed.
sudo -E $MAKE_CMD install
/usr/local/bin/nvim --version
/usr/local/bin/nvim -e -c "quit"

View File

@ -1,42 +0,0 @@
. "$CI_SCRIPTS/common.sh"
sudo pip install cpp-coveralls
# FIXME: Valgrind temporarily disabled (Timeouts on Travis).
# if [ "$TRAVIS_OS_NAME" = "linux" ]; then
# sudo apt-get install valgrind
# export VALGRIND=1
# export VALGRIND_LOG="$tmpdir/valgrind-%p.log"
# fi
setup_deps x64
CMAKE_EXTRA_FLAGS="-DTRAVIS_CI_BUILD=ON \
-DUSE_GCOV=ON \
-DBUSTED_OUTPUT_TYPE=plainTerminal"
# Build and output version info.
$MAKE_CMD CMAKE_EXTRA_FLAGS="$CMAKE_EXTRA_FLAGS" nvim
build/bin/nvim --version
# Build library.
$MAKE_CMD CMAKE_EXTRA_FLAGS="$CMAKE_EXTRA_FLAGS" libnvim
# Run unittests.
make unittest
# Run functional tests.
if ! $MAKE_CMD test; then
valgrind_check "$tmpdir"
exit 1
fi
valgrind_check "$tmpdir"
# Run legacy tests.
if ! $MAKE_CMD oldtest; then
valgrind_check "$tmpdir"
exit 1
fi
valgrind_check "$tmpdir"
coveralls --encoding iso-8859-1 || echo 'coveralls upload failed.'

20
.ci/install.sh Executable file
View File

@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ -n "${CI_TARGET}" ]]; then
exit
fi
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
brew install gettext
elif [[ "${BUILD_MINGW}" == ON ]]; then
# TODO: When Travis gets a recent version of Mingw-w64 use packages:
# binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-dev mingw-w64-tools
echo "Downloading MinGW..."
wget -q -O - "http://downloads.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/rubenvb/gcc-4.8-release/i686-w64-mingw32-gcc-4.8.0-linux64_rubenvb.tar.xz" | tar xJf - -C "${HOME}/.local"
fi
pip install --user --upgrade cpp-coveralls neovim

View File

@ -1,18 +0,0 @@
. "$CI_SCRIPTS/common.sh"
# FIXME: When Travis gets a recent version of Mingw-w64 use this
#sudo apt-get install binutils-mingw-w64-i686 gcc-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64-dev mingw-w64-tools
#sudo apt-get install wine
sudo apt-get install libc6-dev-i386
# mingw-w64 build from http://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/rubenvb/gcc-4.8-release/
wget "http://downloads.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/rubenvb/gcc-4.8-release/i686-w64-mingw32-gcc-4.8.0-linux64_rubenvb.tar.xz" -O mingw.tar.xz
sudo tar -axf mingw.tar.xz -C /opt
export PATH=$PATH:/opt/mingw32/bin
# Build third-party
mkdir .deps
cd .deps
cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/mingw32-w64-cross-travis.toolchain.cmake ../third-party/
cmake --build .
cd ..

26
.ci/run_tests.sh Executable file
View File

@ -0,0 +1,26 @@
#!/usr/bin/env bash
set -e
set -o pipefail
# TODO: Stop here for MinGW builds,
# building Neovim doesn't work yet.
if [[ "${BUILD_MINGW}" == ON ]]; then
echo "Neovim doesn't build on MinGW yet; stopping build."
touch "${SUCCESS_MARKER}"
exit
fi
CI_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "${CI_DIR}/common/build.sh"
source "${CI_DIR}/common/test.sh"
build_nvim
run_unittests
run_functionaltests
run_oldtests
install_nvim
touch "${SUCCESS_MARKER}"

21
.ci/script.sh Executable file
View File

@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e
set -o pipefail
if [[ -n "${CI_TARGET}" ]]; then
make lint
exit 0
fi
# This will pass the environment variables down to a bash process which runs
# as $USER, while retaining the environment variables defined and belonging
# to secondary groups given above in usermod.
if [[ "${TRAVIS_OS_NAME}" == osx ]]; then
# Set up precompiled third-party dependencies.
eval "$(curl -Ss https://raw.githubusercontent.com/neovim/bot-ci/master/scripts/travis-setup.sh) deps-x64"
sudo -E su "${USER}" -c ".ci/run_tests.sh"
else
.ci/run_tests.sh
fi

View File

@ -1,80 +1,139 @@
sudo: required
sudo: false
language: c
os:
- linux
branches:
except:
- nightly
env:
global:
- CI_SCRIPTS=$TRAVIS_BUILD_DIR/.ci
# To build third-party dependencies, set this to 'true'.
# TODO: Change deps caching to detect updated dependencies automatically, but
# still don't rebuild deps every time.
- BUILD_NVIM_DEPS=false
# Travis reports back that it has 32-cores via /proc/cpuinfo, but it's not
# what we really have available. According to their documentation, it only has
# 1.5 virtual cores.
# See
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
# for more information.
# Travis has 1.5 virtual cores according to
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
- MAKE_CMD="make -j2"
# Update PATH for pip and MinGW.
- PATH="$(python -c 'import site; print(site.getuserbase())')/bin:$HOME/.local/mingw32/bin:$PATH"
# LLVM symbolizer path.
- LLVM_SYMBOLIZER="$(which llvm-symbolizer-3.6)"
# Force verification of DLOG macros.
- CFLAGS='-DMIN_LOG_LEVEL=0'
matrix:
- CI_TARGET=gcc
- CI_TARGET=gcc-32
- CI_TARGET=clint
- CI_TARGET=mingw
- CFLAGS="-DMIN_LOG_LEVEL=0"
# Build directory for Neovim.
- BUILD_DIR="$TRAVIS_BUILD_DIR/build"
# Build directory for third-party dependencies.
- DEPS_BUILD_DIR="$TRAVIS_BUILD_DIR/deps-build"
# Directory where compiled third-party dependencies are stored.
- DEPS_INSTALL_PREFIX="$HOME/nvim-deps-install"
# Install directory for Neovim.
- INSTALL_PREFIX="$HOME/nvim-install"
# Log directory for Clang sanitizers and Valgrind.
- LOG_DIR="$BUILD_DIR/log"
# Default CMake flags.
- CMAKE_FLAGS="-DTRAVIS_CI_BUILD=ON
-DCMAKE_BUILD_TYPE=Debug
-DCMAKE_INSTALL_PREFIX:PATH=$INSTALL_PREFIX
-DUSE_GCOV=ON
-DBUSTED_OUTPUT_TYPE=plainTerminal
-DDEPS_PREFIX=$DEPS_INSTALL_PREFIX"
- DEPS_CMAKE_FLAGS="-DDEPS_INSTALL_DIR:PATH=$DEPS_INSTALL_PREFIX"
# Additional CMake flags for 32-bit builds.
- CMAKE_FLAGS_32BIT="-DCMAKE_SYSTEM_LIBRARY_PATH=/lib32:/usr/lib32:/usr/local/lib32
-DCMAKE_IGNORE_PATH=/lib:/usr/lib:/usr/local/lib
-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/i386-linux-gnu.toolchain.cmake"
# Additional CMake flags for MinGW builds.
- CMAKE_FLAGS_MINGW="-DCMAKE_TOOLCHAIN_FILE=$TRAVIS_BUILD_DIR/cmake/mingw32-w64-cross-travis.toolchain.cmake"
# Environment variables for Clang sanitizers.
- ASAN_OPTIONS="detect_leaks=1:check_initialization_order=1:log_path=$LOG_DIR/asan"
- ASAN_SYMBOLIZER_PATH="$LLVM_SYMBOLIZER"
- MSAN_SYMBOLIZER_PATH="$LLVM_SYMBOLIZER"
- TSAN_OPTIONS="external_symbolizer_path=$LLVM_SYMBOLIZER log_path=$LOG_DIR/tsan"
- UBSAN_OPTIONS="log_path=$LOG_DIR/ubsan"
# Environment variables for Valgrind.
- VALGRIND_LOG="$LOG_DIR/valgrind-%p.log"
# Cache marker for third-party dependencies cache.
# If this file exists, we know that the cache contains compiled
# dependencies and we can use it.
- CACHE_MARKER="$HOME/.cache/nvim-deps/.travis_cache_marker"
# Test success marker. If this file exists, we know that all tests
# were successful. Required because we only want to update the cache
# if the tests were successful, but don't have this information
# available in before_cache (which is run before after_success).
- SUCCESS_MARKER="$BUILD_DIR/.tests_successful"
matrix:
include:
- os: linux
env: CI_TARGET=clang CLANG_SANITIZER=ASAN_UBSAN
env: CI_TARGET=clint
- os: linux
env: CI_TARGET=clang CLANG_SANITIZER=MSAN
# FIXME: Re-enable TSan when tests run successfully.
compiler: gcc-5
- os: linux
env: BUILD_32BIT=ON
# Travis creates a cache per compiler.
# Set a different value here to store 32-bit
# dependencies in a separate cache.
compiler: gcc-5 -m32
- os: linux
env: CLANG_SANITIZER=ASAN_UBSAN
compiler: clang-3.6
- os: linux
env: CLANG_SANITIZER=MSAN
compiler: clang-3.6
# FIXME (tarruda): Uncomment when TSan tests don't hang anymore.
#- os: linux
# env: CI_TARGET=clang CLANG_SANITIZER=TSAN
# env: CLANG_SANITIZER=TSAN
# compiler: clang-3.6
- os: osx
env: CI_TARGET=clang
compiler: clang
- os: osx
env: CI_TARGET=gcc
compiler: gcc-4.9
- os: linux
env: BUILD_MINGW=ON
fast_finish: true
allow_failures:
- env: CI_TARGET=clang CLANG_SANITIZER=MSAN
before_install:
# Pins the version of the java package installed on the Travis VMs
# and avoids a lengthy upgrade process for them.
- if [ $TRAVIS_OS_NAME = linux ]; then
sudo apt-mark hold oracle-java7-installer oracle-java8-installer;
sudo apt-get update;
elif [ $TRAVIS_OS_NAME = osx ]; then
brew update;
fi
install:
- if [ $TRAVIS_OS_NAME = linux ]; then
sudo apt-get install xclip gdb;
elif [ $TRAVIS_OS_NAME = osx ]; then
brew install gettext;
fi
before_script:
# Adds user to a dummy group.
# That allows to test changing the group of the file by `os_fchown`.
# Need xvfb for running some tests with xclip
- if [ $TRAVIS_OS_NAME = linux ]; then
sudo groupadd chown_test;
sudo usermod -a -G chown_test $USER;
export DISPLAY=:99.0;
sh -e /etc/init.d/xvfb start;
elif [ $TRAVIS_OS_NAME = osx ]; then
sudo dscl . -create /Groups/chown_test;
sudo dscl . -append /Groups/chown_test GroupMembership $USER;
fi
script:
# This will pass the environment variables down to a bash process which runs
# as $USER, while retaining the environment variables defined and belonging
# to secondary groups given above in usermod.
- sudo -E su $USER -c "sh -e \"$CI_SCRIPTS/$CI_TARGET.sh\""
# TODO: Remove when all MSan errors have been fixed.
- env: GCOV=llvm-cov-3.6 CLANG_SANITIZER=MSAN
before_install: .ci/before_install.sh
install: .ci/install.sh
before_script: .ci/before_script.sh
script: .ci/script.sh
before_cache: .ci/before_cache.sh
after_success: .ci/after_success.sh
addons:
apt:
sources:
- llvm-toolchain-precise-3.6
- ubuntu-toolchain-r-test
packages:
# Basic Neovim/test dependencies.
- autoconf
- automake
- build-essential
- cmake
- gdb
- libtool
- pkg-config
- unzip
- xclip
# Additional compilers/tools.
- clang-3.6
- g++-5-multilib
- g++-multilib
- gcc-5-multilib
- gcc-multilib
- libc6-dev-i386
- llvm-3.6-dev
- valgrind
branches:
except:
- nightly
cache:
apt: true
directories:
- "$HOME/.cache/pip"
- "$HOME/.cache/nvim-deps"
notifications:
webhooks:
urls:

View File

@ -1,5 +1,7 @@
set(CMAKE_SYSTEM_PROCESSOR i386)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_VERSION gnu)
set(CMAKE_C_COMPILER gcc)
if(NOT ${CMAKE_C_COMPILER})
set(CMAKE_C_COMPILER gcc)
endif()
set(CMAKE_C_COMPILER_ARG1 "-m32")