libgd/travis/main.sh

169 lines
4.4 KiB
Bash
Executable File

#!/bin/bash -e
# The main script for building/testing while under travis ci.
# https://travis-ci.org/libgd/libgd
# TODO: Add support for building/testing w/ASAN/etc... enabled.
# shellcheck source=travis/lib.sh
. "${0%/*}"/lib.sh
# We have to do this by hand rather than use the coverity addon because of
# matrix explosion: https://github.com/travis-ci/travis-ci/issues/1975
# We also do it by hand because when we're throttled, the addon will exit
# the build immediately and skip the main script!
coverity_scan() {
local reason
[[ ${TRAVIS_JOB_NUMBER} != *.1 ]] && reason="not first build job"
[[ -n ${TRAVIS_TAG} ]] && reason="git tag"
[[ ${TRAVIS_PULL_REQUEST} == "true" ]] && reason="pull request"
if [[ -n ${reason} ]] ; then
echo "Skipping coverity scan due to: ${reason}"
return
fi
export COVERITY_SCAN_PROJECT_NAME="${TRAVIS_REPO_SLUG}"
export COVERITY_SCAN_NOTIFICATION_EMAIL="pierre.php@gmail.com"
export COVERITY_SCAN_BUILD_COMMAND="make -j${ncpus}"
export COVERITY_SCAN_BUILD_COMMAND_PREPEND="git clean -q -x -d -f; git checkout -f; ./bootstrap.sh && ./configure"
export COVERITY_SCAN_BRANCH_PATTERN="GD-2.2"
curl -s "https://scan.coverity.com/scripts/travisci_build_coverity_scan.sh" | bash || :
}
check_git_status() {
local status
# Make sure our gitignore files are up-to-date, and we aren't
# forgetting to commit the few generated (e.g. cmake.in) files.
# Note: We ignore config.h.cmake changes since it indirectly
# depends on the format of the output of autoheader :/.
status=$(git status --porcelain | grep -v '^ M src/config\.h\.cmake' | grep -v '^ M docs/naturaldocs/project/Menu\.txt') || :
if [[ -n ${status} ]]; then
echo "Missing git repo updates (gitignore/etc...):"
echo "$ git status"
echo "${status}"
echo "$ git diff"
git diff
exit 1
fi
}
build_autotools() {
v --fold="bootstrap" ./bootstrap.sh
v --fold="configure" ./configure \
--prefix=/usr/local \
--libdir=/usr/local/lib \
--enable-werror \
--enable-gd-formats \
--with-fontconfig \
--with-freetype \
--with-jpeg \
--with-png \
--with-tiff \
--with-webp \
--with-xpm \
--with-zlib
m
# Make sure failures are shown in the log.
m check VERBOSE=1
check_git_status
# Verify building a release works (also does things like read-only
# out of tree builds for use).
m distcheck VERBOSE=1
# Clean things up for cmake.
m distclean
}
# TODO: When we switch to Ubuntu 21+ (Hirsute), we can reenable libavif coverage,
# as Ubuntu 21+ supports libavif 0.8.2+.
# "-DENABLE_AVIF=1"
cmake_args=(
"-DBUILD_SHARED_LIBS=1"
"-DBUILD_STATIC_LIBS=1"
"-DBUILD_TEST=1"
"-DCMAKE_INSTALL_PREFIX=/usr/local"
"-DCMAKE_INSTALL_LIBDIR=/usr/local/lib"
"-DENABLE_GD_FORMATS=1"
"-DENABLE_FONTCONFIG=1"
"-DENABLE_FREETYPE=1"
"-DENABLE_JPEG=1"
"-DENABLE_PNG=1"
"-DENABLE_TIFF=1"
"-DENABLE_WEBP=1"
)
# libxpm-dev is unavaible in brew repo
# Once it gets available, please modify this code block.
if [[ ${TRAVIS_OS_NAME} == "linux" ]]; then
cmake_args+=("-DENABLE_XPM=1")
fi
build_cmake() {
# First try building out of tree.
mkdir build
cd build
v cmake "${cmake_args[@]}" ..
m
v ctest -j"${ncpus}"
cd ..
rm -rf build
# Then build in-tree.
v cmake "${cmake_args[@]}" .
m
v ctest -j"${ncpus}"
m install DESTDIR="${PWD}/install-cmake"
}
compare_builds() {
# Make sure the two install the same set of files.
# TODO: cmake is not yet on-par with autotools.
# TODO: Should verify symbol export list in libgd too.
diff -ur install-autotools install-cmake || true
}
source_tests() {
# Run lint/source tests against the codebase.
# Reset any files in case the build modified them.
git checkout -f
./tests/source/run.sh
}
build_codecov() {
# Only genenrate code coverage report in Linux with gcc
if [[ ${TRAVIS_OS_NAME} != "linux" || ${TRAVIS_COMPILER} != "gcc" ]]; then
exit 0
fi
# Delete these two files so that we can build out of tree again
rm -f CMakeCache.txt
rm -rf CMakeFiles
# Delete test run time limit. Or tests/gdimageline/gdimgaeline_bug5 will run timeout
sed -i '/TIMEOUT/d' tests/CMakeLists.txt
# Build out of tree
mkdir build
cd build
export CFLAGS="-fprofile-arcs -ftest-coverage"
v cmake "${cmake_args[@]}" ..
m
v ctest -j"${ncpus}"
bash <(curl -s https://codecov.io/bash)
}
main() {
build_autotools
build_cmake
compare_builds
v --fold="coverity_scan" coverity_scan
# Run the source tests last.
v --fold="source_tests" source_tests
build_codecov
}
main "$@"