Skip to content

Instantly share code, notes, and snippets.

@jszakmeister
Last active August 29, 2015 14:02
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jszakmeister/af8cd3773942e256be56 to your computer and use it in GitHub Desktop.
Save jszakmeister/af8cd3773942e256be56 to your computer and use it in GitHub Desktop.
Script to help build multiple configurations of Neovim
#!/bin/bash
set -e
set +o pipefail
BASE_DIR="$(dirname "$0")"
cd "$BASE_DIR"
if test -t 1; then
COLOR_FAIL="\e[31;1m"
COLOR_SUCCESS="\e[32;1m"
COLOR_BUILD_HEADING="\e[34;1m"
COLOR_OTHER_HEADING="\e[35m"
COLOR_RESET="\e[0m"
fi
say_fail() {
printf "${COLOR_FAIL}$1${COLOR_RESET}\n"
}
say_success() {
printf "${COLOR_SUCCESS}$1${COLOR_RESET}\n"
}
say_build_heading() {
printf "${COLOR_BUILD_HEADING}$1\n$(echo -n "$1" | tr 'a-zA-Z_' '=')${COLOR_RESET}\n"
}
say_other_heading() {
printf "${COLOR_OTHER_HEADING}$1\n$(echo -n "$1" | tr 'a-zA-Z_' '=')${COLOR_RESET}\n"
}
die() {
printf 1>&2 "${COLOR_FAIL}$1${COLOR_RESET}\n"
exit 1
}
CN=cninja
if hash gmake > /dev/null 2>&1
then
MAKE_PRG=gmake
else
MAKE_PRG=make
fi
if ! hash ninja > /dev/null 2>&1
then
USE_MAKE="true"
fi
if ! hash cninja > /dev/null 2>&1
then
CN=ninja
fi
EXTRA_TARGETS=all
TIME_CMD=
INSTALL_PREFIX=$HOME/.local/neovim-latest
DEPS_INSTALL_DIR=$(pwd)/.deps/usr
DO_BUILD=true
USE_BUNDLED=true
if [ "$(uname)" = "Darwin" ]
then
[ -z "$CLANG_PATH" ] && CLANG_PATH=/usr
fi
while [[ $# > 0 ]]
do
key="$1"
shift
case $key in
debug)
BUILD_TYPES="${BUILD_TYPES} Debug"
;;
rdebug)
BUILD_TYPES="${BUILD_TYPES} RelWithDebInfo"
;;
release)
BUILD_TYPES="${BUILD_TYPES} Release"
;;
custom)
BUILD_TYPES="${BUILD_TYPES} Custom"
;;
deps)
DEPS_ONLY=true
;;
-c|--clean)
CLEAN="true"
;;
--cov)
EXTRA_CONFIG_ARGS="$EXTRA_CONFIG_ARGS -DUSE_GCOV=ON"
;;
-v|--verbose)
VERBOSE=true
CN="${CN} -v"
MAKE_PRG="${MAKE_PRG} VERBOSE=1"
;;
-u|--unittest)
EXTRA_TARGETS="$EXTRA_TARGETS unittest"
;;
--mu|--mu=*)
UNITTEST_TARGET="${key/#--mu/}"
UNITTEST_TARGET="${UNITTEST_TARGET/#=/}"
if test -z "$UNITTEST_TARGET"
then
UNITTEST_TARGET=test/unit
fi
;;
-f|--functional-test)
EXTRA_TARGETS="$EXTRA_TARGETS functionaltest"
;;
--mf|--mf=*)
FUNCTIONALTEST_TARGET="${key/#--mf/}"
FUNCTIONALTEST_TARGET="${FUNCTIONALTEST_TARGET/#=/}"
if test -z "$FUNCTIONALTEST_TARGET"
then
FUNCTIONALTEST_TARGET=test/functional
fi
;;
-t|--time)
TIME_CMD=time
;;
-s|--no-parallel)
CN="${CN} -j1"
MAKE_PRG="${MAKE_PRG} -j1"
;;
--no-ccache)
export CCACHE_DISABLE=1
;;
--prefix=*)
INSTALL_PREFIX="${key/#--prefix=/}"
;;
--deps-prefix=*)
DEPS_INSTALL_DIR="${key/#--deps-prefix=/}"
;;
--no-bundled)
USE_BUNDLED=
;;
--use-make)
USE_MAKE="true"
;;
-d|--cmake-debug)
EXTRA_CONFIG_ARGS="--debug-trycompile"
DO_BUILD=
;;
--config)
DO_BUILD=
;;
--error)
EXTRA_CONFIG_ARGS="${EXTRA_CONFIG_ARGS} -DTRAVIS_CI_BUILD=ON"
;;
--tap)
EXTRA_CONFIG_ARGS="${EXTRA_CONFIG_ARGS} -DBUSTED_OUTPUT_TYPE=tap"
;;
--junit)
EXTRA_CONFIG_ARGS="${EXTRA_CONFIG_ARGS} -DBUSTED_OUTPUT_TYPE=junit"
;;
--clang=*)
CLANG_PATH="${key/#--clang=/}"
;;
--clang-suffix=*)
CLANG_SUFFIX="${key/#--clang-suffix=/}"
;;
--sanitize)
EXTRA_CONFIG_ARGS="${EXTRA_CONFIG_ARGS} -DSANITIZE=ON"
export ASAN_SYMBOLIZER_PATH="${CLANG_PATH}/bin/llvm-symbolizer${CLANG_SUFFIX}"
if [ ! -e "$ASAN_SYMBOLIZER_PATH" ]
then
die "Cannot find '$ASAN_SYMBOLIZER_PATH'"
fi
export ASAN_OPTIONS="detect_leaks=1:log_path=$(pwd)/tmp/asan"
export TSAN_OPTIONS="external_symbolizer_path=$ASAN_SYMBOLIZER_PATH:log_path=$(pwd)/tmp/tsan"
export UBSAN_OPTIONS="log_path=$(pwd)/tmp/ubsan"
mkdir -p $(pwd)/tmp
;;
*)
if [[ "$key" == -* ]]
then
# unknown option
die "Unknown option '$key'"
else
EXTRA_TARGETS="$EXTRA_TARGETS $key"
fi
;;
esac
done
BUILD_TYPES="${BUILD_TYPES:-Debug RelWithDebInfo Release}"
# Ensure deps is built
if [ -n "$USE_BUNDLED" ]; then
say_other_heading "Deps"
if [ -n "${VERBOSE}" ]; then
${MAKE_PRG} deps "DEPS_INSTALL_DIR=${DEPS_INSTALL_DIR}" || exit 1
else
${MAKE_PRG} deps "DEPS_INSTALL_DIR=${DEPS_INSTALL_DIR}" > /dev/null || exit 1
fi
echo
fi
if [ -n "$DEPS_ONLY" ]; then
exit 0
fi
failed=
for build in ${BUILD_TYPES}
do
say_build_heading "${build}"
build_dir="build/$(echo "${build}" | perl -pe 's/([A-Z])/-\l\1/g' | cut -c 2-)"
if [ -n "${CLEAN}" ]; then
rm -rf "${build_dir}"
fi
mkdir -p "${build_dir}"
pushd "${build_dir}" > /dev/null 2>&1
if [ -n "${USE_MAKE}" ]; then
generator="Unix Makefiles"
buildtool="${MAKE_PRG}"
else
generator="Ninja"
buildtool="${CN}"
fi
generate="cmake -G '${generator}' '-DCMAKE_BUILD_TYPE=${build}' '-DCMAKE_INSTALL_PREFIX=${INSTALL_PREFIX}' '-DDEPS_PREFIX=${DEPS_INSTALL_DIR}' ${EXTRA_CONFIG_ARGS} ../.."
if [ -n "${CLANG_PATH}" ]; then
generate="CC=\"${CLANG_PATH}/bin/clang${CLANG_SUFFIX}\" CXX=\"${CLANG_PATH}/bin/clang++${CLANG_SUFFIX}\" $generate"
fi
if [ -z "${VERBOSE}" ]; then
generate="${generate} > gen.log"
fi
(test -e Makefile || test -e build.ninja) || {
eval "${generate}" || failed=true
}
if [ -n "$DO_BUILD" ]
then
test -e CMakeCache.txt && ${TIME_CMD} ${buildtool} ${EXTRA_TARGETS} || failed=true
fi
popd > /dev/null 2>&1
if test -n "$UNITTEST_TARGET"
then
echo "PATH=\"$BASE_DIR/.deps/usr/bin:$PATH\"
NVIM_PROG=\"$BASE_DIR/$build_dir/bin/nvim\"
VIMRUNTIME=\"$BASE_DIR/runtime\"
\"$BASE_DIR/.deps/usr/bin/luajit\" --
\"$BASE_DIR/.deps/usr/lib/luarocks/rocks/busted/\"*/bin/busted
-v -o utfTerminal --helper=test/unit/preload.lua
\"--lpath=./build/release/?.lua\" \"$UNITTEST_TARGET\""
PATH="$BASE_DIR/.deps/usr/bin:$PATH" \
NVIM_PROG="$BASE_DIR/$build_dir/bin/nvim" \
VIMRUNTIME="$BASE_DIR/runtime" \
"$BASE_DIR/.deps/usr/bin/luajit" -- \
"$BASE_DIR/.deps/usr/lib/luarocks/rocks/busted/"*/bin/busted \
-v -o utfTerminal --helper=test/unit/preload.lua \
"--lpath=./build/release/?.lua" "$UNITTEST_TARGET"
fi
echo
done
if [ -n "$DO_BUILD" ]
then
if [ -n "${failed}" ]; then
say_fail "BUILD FAILED"
exit 1
else
say_success "Build succeeded"
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment