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:
parent
bac2700e2f
commit
d2eb4a9346
|
@ -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.'
|
|
@ -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
|
|
@ -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
|
|
@ -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}"
|
73
.ci/clang.sh
73
.ci/clang.sh
|
@ -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"
|
|
|
@ -1,3 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
make lint
|
|
|
@ -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"
|
|
|
@ -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}"
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
|
@ -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"
|
|
42
.ci/gcc.sh
42
.ci/gcc.sh
|
@ -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.'
|
|
|
@ -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
|
18
.ci/mingw.sh
18
.ci/mingw.sh
|
@ -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 ..
|
|
|
@ -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}"
|
|
@ -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
|
177
.travis.yml
177
.travis.yml
|
@ -1,80 +1,139 @@
|
||||||
sudo: required
|
sudo: false
|
||||||
language: c
|
language: c
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
branches:
|
|
||||||
except:
|
|
||||||
- nightly
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- CI_SCRIPTS=$TRAVIS_BUILD_DIR/.ci
|
|
||||||
# To build third-party dependencies, set this to 'true'.
|
# 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
|
- BUILD_NVIM_DEPS=false
|
||||||
# Travis reports back that it has 32-cores via /proc/cpuinfo, but it's not
|
# Travis has 1.5 virtual cores according to
|
||||||
# what we really have available. According to their documentation, it only has
|
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
|
||||||
# 1.5 virtual cores.
|
|
||||||
# See
|
|
||||||
# http://docs.travis-ci.com/user/speeding-up-the-build/#Paralellizing-your-build-on-one-VM
|
|
||||||
# for more information.
|
|
||||||
- MAKE_CMD="make -j2"
|
- 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.
|
# Force verification of DLOG macros.
|
||||||
- CFLAGS='-DMIN_LOG_LEVEL=0'
|
- CFLAGS="-DMIN_LOG_LEVEL=0"
|
||||||
matrix:
|
# Build directory for Neovim.
|
||||||
- CI_TARGET=gcc
|
- BUILD_DIR="$TRAVIS_BUILD_DIR/build"
|
||||||
- CI_TARGET=gcc-32
|
# Build directory for third-party dependencies.
|
||||||
- CI_TARGET=clint
|
- DEPS_BUILD_DIR="$TRAVIS_BUILD_DIR/deps-build"
|
||||||
- CI_TARGET=mingw
|
# 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:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CI_TARGET=clang CLANG_SANITIZER=ASAN_UBSAN
|
env: CI_TARGET=clint
|
||||||
- os: linux
|
- os: linux
|
||||||
env: CI_TARGET=clang CLANG_SANITIZER=MSAN
|
compiler: gcc-5
|
||||||
# FIXME: Re-enable TSan when tests run successfully.
|
- 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
|
#- os: linux
|
||||||
# env: CI_TARGET=clang CLANG_SANITIZER=TSAN
|
# env: CLANG_SANITIZER=TSAN
|
||||||
|
# compiler: clang-3.6
|
||||||
- os: osx
|
- os: osx
|
||||||
env: CI_TARGET=clang
|
|
||||||
compiler: clang
|
compiler: clang
|
||||||
- os: osx
|
- os: osx
|
||||||
env: CI_TARGET=gcc
|
|
||||||
compiler: gcc-4.9
|
compiler: gcc-4.9
|
||||||
|
- os: linux
|
||||||
|
env: BUILD_MINGW=ON
|
||||||
fast_finish: true
|
fast_finish: true
|
||||||
allow_failures:
|
allow_failures:
|
||||||
- env: CI_TARGET=clang CLANG_SANITIZER=MSAN
|
# TODO: Remove when all MSan errors have been fixed.
|
||||||
before_install:
|
- env: GCOV=llvm-cov-3.6 CLANG_SANITIZER=MSAN
|
||||||
# Pins the version of the java package installed on the Travis VMs
|
|
||||||
# and avoids a lengthy upgrade process for them.
|
before_install: .ci/before_install.sh
|
||||||
- if [ $TRAVIS_OS_NAME = linux ]; then
|
install: .ci/install.sh
|
||||||
sudo apt-mark hold oracle-java7-installer oracle-java8-installer;
|
before_script: .ci/before_script.sh
|
||||||
sudo apt-get update;
|
script: .ci/script.sh
|
||||||
elif [ $TRAVIS_OS_NAME = osx ]; then
|
before_cache: .ci/before_cache.sh
|
||||||
brew update;
|
after_success: .ci/after_success.sh
|
||||||
fi
|
|
||||||
install:
|
addons:
|
||||||
- if [ $TRAVIS_OS_NAME = linux ]; then
|
apt:
|
||||||
sudo apt-get install xclip gdb;
|
sources:
|
||||||
elif [ $TRAVIS_OS_NAME = osx ]; then
|
- llvm-toolchain-precise-3.6
|
||||||
brew install gettext;
|
- ubuntu-toolchain-r-test
|
||||||
fi
|
packages:
|
||||||
before_script:
|
# Basic Neovim/test dependencies.
|
||||||
# Adds user to a dummy group.
|
- autoconf
|
||||||
# That allows to test changing the group of the file by `os_fchown`.
|
- automake
|
||||||
# Need xvfb for running some tests with xclip
|
- build-essential
|
||||||
- if [ $TRAVIS_OS_NAME = linux ]; then
|
- cmake
|
||||||
sudo groupadd chown_test;
|
- gdb
|
||||||
sudo usermod -a -G chown_test $USER;
|
- libtool
|
||||||
export DISPLAY=:99.0;
|
- pkg-config
|
||||||
sh -e /etc/init.d/xvfb start;
|
- unzip
|
||||||
elif [ $TRAVIS_OS_NAME = osx ]; then
|
- xclip
|
||||||
sudo dscl . -create /Groups/chown_test;
|
# Additional compilers/tools.
|
||||||
sudo dscl . -append /Groups/chown_test GroupMembership $USER;
|
- clang-3.6
|
||||||
fi
|
- g++-5-multilib
|
||||||
script:
|
- g++-multilib
|
||||||
# This will pass the environment variables down to a bash process which runs
|
- gcc-5-multilib
|
||||||
# as $USER, while retaining the environment variables defined and belonging
|
- gcc-multilib
|
||||||
# to secondary groups given above in usermod.
|
- libc6-dev-i386
|
||||||
- sudo -E su $USER -c "sh -e \"$CI_SCRIPTS/$CI_TARGET.sh\""
|
- llvm-3.6-dev
|
||||||
|
- valgrind
|
||||||
|
|
||||||
|
branches:
|
||||||
|
except:
|
||||||
|
- nightly
|
||||||
|
|
||||||
|
cache:
|
||||||
|
apt: true
|
||||||
|
directories:
|
||||||
|
- "$HOME/.cache/pip"
|
||||||
|
- "$HOME/.cache/nvim-deps"
|
||||||
|
|
||||||
notifications:
|
notifications:
|
||||||
webhooks:
|
webhooks:
|
||||||
urls:
|
urls:
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
set(CMAKE_SYSTEM_PROCESSOR i386)
|
set(CMAKE_SYSTEM_PROCESSOR i386)
|
||||||
set(CMAKE_SYSTEM_NAME Linux)
|
set(CMAKE_SYSTEM_NAME Linux)
|
||||||
set(CMAKE_SYSTEM_VERSION gnu)
|
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")
|
set(CMAKE_C_COMPILER_ARG1 "-m32")
|
||||||
|
|
Loading…
Reference in New Issue