1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435
|
#!/bin/bash
# This script executes the script step when running under travis-ci
#if cygwin, check path
case ${MACHTYPE} in
*cygwin*) OPJ_CI_IS_CYGWIN=1;;
*) ;;
esac
# Hack for appveyor to get GNU find in path before windows one.
export PATH=$(dirname ${BASH}):$PATH
# Set-up some bash options
set -o nounset ## set -u : exit the script if you try to use an uninitialised variable
set -o errexit ## set -e : exit the script if any statement returns a non-true return value
set -o pipefail ## Fail on error in pipe
function opjpath ()
{
if [ "${OPJ_CI_IS_CYGWIN:-}" == "1" ]; then
cygpath $1 "$2"
else
echo "$2"
fi
}
# ABI check is done by abi-check.sh
if [ "${OPJ_CI_ABI_CHECK:-}" == "1" ]; then
exit 0
fi
if [ "${OPJ_CI_CC:-}" != "" ]; then
export CC=${OPJ_CI_CC}
echo "Using ${CC}"
fi
if [ "${OPJ_CI_CXX:-}" != "" ]; then
export CXX=${OPJ_CI_CXX}
echo "Using ${CXX}"
fi
# Set-up some variables
if [ "${OPJ_CI_BUILD_CONFIGURATION:-}" == "" ]; then
export OPJ_CI_BUILD_CONFIGURATION=Release #default
fi
OPJ_SOURCE_DIR=$(cd $(dirname $0)/../.. && pwd)
if [ "${OPJ_DO_SUBMIT:-}" == "" ]; then
OPJ_DO_SUBMIT=0 # Do not flood cdash by default
fi
if [ "${GITHUB_REPOSITORY:-}" != "" ]; then
OPJ_OWNER=$(echo "${GITHUB_REPOSITORY}" | sed 's/\(^.*\)\/.*/\1/')
OPJ_SITE="${OPJ_OWNER}.gha"
elif [ "${TRAVIS_REPO_SLUG:-}" != "" ]; then
OPJ_OWNER=$(echo "${TRAVIS_REPO_SLUG}" | sed 's/\(^.*\)\/.*/\1/')
OPJ_SITE="${OPJ_OWNER}.travis-ci.org"
elif [ "${APPVEYOR_REPO_NAME:-}" != "" ]; then
OPJ_OWNER=$(echo "${APPVEYOR_REPO_NAME}" | sed 's/\(^.*\)\/.*/\1/')
OPJ_SITE="${OPJ_OWNER}.appveyor.com"
else
OPJ_SITE="$(hostname)"
fi
if [ "${OPJ_OWNER:-}" == "uclouvain" ]; then
OPJ_DO_SUBMIT=1
fi
if [ "${RUNNER_OS:-}" != "" ]; then
if [ "${RUNNER_OS:-}" == "Linux" ]; then
OPJ_SHORT_OS_NAME=linux
elif [ "${RUNNER_OS:-}" == "Windows" ]; then
OPJ_SHORT_OS_NAME=windows
elif [ "${RUNNER_OS:-}" == "macOS" ]; then
OPJ_SHORT_OS_NAME=osx
else
echo "Unhandled RUNNER_OS = ${RUNNER_OS:-}"; exit 1
fi
elif [ "${TRAVIS_OS_NAME:-}" != "" ]; then
OPJ_SHORT_OS_NAME="${${TRAVIS_OS_NAME:-}}"
else
# Let's guess OS for testing purposes
echo "Guessing OS"
if uname -s | grep -i Darwin &> /dev/null; then
OPJ_SHORT_OS_NAME=osx
elif uname -s | grep -i Linux &> /dev/null; then
OPJ_SHORT_OS_NAME=linux
elif uname -s | grep -i CYGWIN &> /dev/null; then
OPJ_SHORT_OS_NAME=windows
elif uname -s | grep -i MINGW &> /dev/null; then
OPJ_SHORT_OS_NAME=windows
elif [ "${APPVEYOR:-}" == "True" ]; then
OPJ_SHORT_OS_NAME=windows
else
echo "Failed to guess OS"; exit 1
fi
echo "${OPJ_SHORT_OS_NAME}"
fi
if [ "${OPJ_SHORT_OS_NAME}" == "osx" ]; then
OPJ_OS_NAME=$(sw_vers -productName | tr -d ' ')$(sw_vers -productVersion | sed 's/\([^0-9]*\.[0-9]*\).*/\1/')
OPJ_CC_VERSION=$(xcodebuild -version | grep -i xcode)
OPJ_CC_VERSION=xcode${OPJ_CC_VERSION:6}
elif [ "${OPJ_SHORT_OS_NAME}" == "linux" ]; then
OPJ_OS_NAME=linux
if which lsb_release > /dev/null; then
OPJ_OS_NAME=$(lsb_release -si)$(lsb_release -sr | sed 's/\([^0-9]*\.[0-9]*\).*/\1/')
fi
if [ "${CC:-}" == "" ]; then
# default to gcc
export CC=gcc
echo "Defaulting to CC=gcc"
fi
if [ -z "${CC##*gcc*}" ]; then
OPJ_CC_VERSION=$(${CC} --version | head -1 | sed 's/.*\ \([0-9.]*[0-9]\)/\1/')
if [ -z "${CC##*mingw*}" ]; then
OPJ_CC_VERSION=mingw${OPJ_CC_VERSION}
# disable testing for now
export OPJ_CI_SKIP_TESTS=1
else
OPJ_CC_VERSION=gcc${OPJ_CC_VERSION}
fi
elif [ -z "${CC##*clang*}" ]; then
OPJ_CC_VERSION=clang$(${CC} --version | grep version | sed 's/.*version \([^0-9.]*[0-9.]*\).*/\1/')
else
echo "Compiler not supported: ${CC}"; exit 1
fi
if [ "${OPJ_CI_INSTRUCTION_SETS-:}" == "-mavx2" ]; then
AVX2_AVAIL=1
cat /proc/cpuinfo | grep avx2 >/dev/null || AVX2_AVAIL=0
if [[ "${AVX2_AVAIL}" == "1" ]]; then
echo "AVX2 available on CPU"
else
echo "AVX2 not available on CPU. Disabling tests"
cat /proc/cpuinfo | grep flags | head -n 1
export OPJ_CI_SKIP_TESTS=1
fi
fi
elif [ "${OPJ_SHORT_OS_NAME}" == "windows" ]; then
OPJ_OS_NAME=windows
if which cl > /dev/null; then
OPJ_CL_VERSION=$(cl 2>&1 | grep Version | sed 's/.*Version \([0-9]*\).*/\1/')
if [ ${OPJ_CL_VERSION} -eq 19 ]; then
OPJ_CC_VERSION=vs2015
elif [ ${OPJ_CL_VERSION} -eq 18 ]; then
OPJ_CC_VERSION=vs2013
elif [ ${OPJ_CL_VERSION} -eq 17 ]; then
OPJ_CC_VERSION=vs2012
elif [ ${OPJ_CL_VERSION} -eq 16 ]; then
OPJ_CC_VERSION=vs2010
elif [ ${OPJ_CL_VERSION} -eq 15 ]; then
OPJ_CC_VERSION=vs2008
elif [ ${OPJ_CL_VERSION} -eq 14 ]; then
OPJ_CC_VERSION=vs2005
else
OPJ_CC_VERSION=vs????
fi
fi
if [ "${OPJ_CI_INSTRUCTION_SETS-:}" == "/arch:AVX2" ]; then
cl $PWD/tools/travis-ci/detect-avx2.c
if ./detect-avx2.exe; then
echo "AVX2 available on CPU"
else
echo "AVX2 not available on CPU. Disabling tests"
export OPJ_CI_SKIP_TESTS=1
fi
fi
else
echo "OS not supported: ${OPJ_SHORT_OS_NAME}"; exit 1
fi
if [ "${OPJ_CI_ARCH:-}" == "" ]; then
echo "Guessing build architecture"
MACHINE_ARCH=$(uname -m)
if [ "${MACHINE_ARCH}" == "x86_64" ]; then
export OPJ_CI_ARCH=x86_64
fi
echo "${OPJ_CI_ARCH}"
fi
if [ "${GITHUB_HEAD_REF:-}" != "" ]; then
OPJ_BRANCH=${GITHUB_HEAD_REF}
elif [ "${TRAVIS_BRANCH:-}" != "" ]; then
OPJ_BRANCH=${TRAVIS_BRANCH}
elif [ "${APPVEYOR_REPO_BRANCH:-}" != "" ]; then
OPJ_BRANCH=${APPVEYOR_REPO_BRANCH}
else
echo "Guessing branch"
OPJ_BRANCH=$(git -C ${OPJ_SOURCE_DIR} branch | grep '*' | tr -d '*[[:blank:]]')
fi
OPJ_BUILDNAME=${OPJ_OS_NAME}-${OPJ_CC_VERSION}-${OPJ_CI_ARCH}-${OPJ_BRANCH}
OPJ_BUILDNAME_TEST=${OPJ_OS_NAME}-${OPJ_CC_VERSION}-${OPJ_CI_ARCH}
if [ "${OPJ_CI_INSTRUCTION_SETS-:}" == "/arch:AVX2" ]; then
OPJ_BUILDNAME=${OPJ_BUILDNAME}-avx2
OPJ_BUILDNAME_TEST=${OPJ_BUILDNAME_TEST}-avx2
fi
if [ "${GITHUB_EVENT_NAME:-}" = "pull_request" ]; then
PULL_REQUEST_NUMBER=$(echo $GITHUB_REF | awk 'BEGIN { FS = "/" } ; { print $3 }')
OPJ_BUILDNAME=${OPJ_BUILDNAME}-${PULL_REQUEST_NUMBER}
elif [ "${TRAVIS_PULL_REQUEST:-}" != "false" ] && [ "${TRAVIS_PULL_REQUEST:-}" != "" ]; then
OPJ_BUILDNAME=${OPJ_BUILDNAME}-pr${TRAVIS_PULL_REQUEST}
elif [ "${APPVEYOR_PULL_REQUEST_NUMBER:-}" != "" ]; then
OPJ_BUILDNAME=${OPJ_BUILDNAME}-pr${APPVEYOR_PULL_REQUEST_NUMBER}
fi
OPJ_BUILDNAME=${OPJ_BUILDNAME}-${OPJ_CI_BUILD_CONFIGURATION}-3rdP
OPJ_BUILDNAME_TEST=${OPJ_BUILDNAME_TEST}-${OPJ_CI_BUILD_CONFIGURATION}-3rdP
if [ "${OPJ_CI_ASAN:-}" == "1" ]; then
OPJ_BUILDNAME=${OPJ_BUILDNAME}-ASan
OPJ_BUILDNAME_TEST=${OPJ_BUILDNAME_TEST}-ASan
fi
if [ "${OPJ_NONCOMMERCIAL:-}" == "1" ] && [ "${OPJ_CI_SKIP_TESTS:-}" != "1" ] && [ -d kdu ]; then
echo "
Testing will use Kakadu trial binaries. Here's the copyright notice from kakadu:
Copyright is owned by NewSouth Innovations Pty Limited, commercial arm of the UNSW Australia in Sydney.
You are free to trial these executables and even to re-distribute them,
so long as such use or re-distribution is accompanied with this copyright notice and is not for commercial gain.
Note: Binaries can only be used for non-commercial purposes.
"
fi
set -x
# This will print configuration
# travis-ci doesn't dump cmake version in system info, let's print it
cmake --version
export OPJ_SHORT_OS_NAME=${OPJ_SHORT_OS_NAME}
export OPJ_SITE=${OPJ_SITE}
export OPJ_BUILDNAME=${OPJ_BUILDNAME}
export OPJ_SOURCE_DIR=$(opjpath -m ${OPJ_SOURCE_DIR})
export OPJ_BINARY_DIR=$(opjpath -m ${PWD}/build)
export OPJ_BUILD_CONFIGURATION=${OPJ_CI_BUILD_CONFIGURATION}
export OPJ_DO_SUBMIT=${OPJ_DO_SUBMIT}
if [ "${OPJ_SKIP_REBUILD:-}" != "1" ]; then
ctest -S ${OPJ_SOURCE_DIR}/tools/ctest_scripts/travis-ci.cmake -V || true
fi
# ctest will exit with various error codes depending on version.
# ignore ctest exit code & parse this ourselves
set +x
if [ "${OPJ_CI_CHECK_STYLE:-}" == "1" ]; then
export OPJSTYLE=${PWD}/scripts/opjstyle
export PATH=${HOME}/.local/bin:${PATH}
scripts/verify-indentation.sh
fi
# Deployment if needed
#---------------------
if [ "${TRAVIS_TAG:-}" != "" ]; then
OPJ_TAG_NAME=${TRAVIS_TAG}
elif [ "${APPVEYOR_REPO_TAG:-}" == "true" ]; then
OPJ_TAG_NAME=${APPVEYOR_REPO_TAG_NAME}
elif test $(git describe --exact-match --tags 2>/dev/null); then
OPJ_TAG_NAME="$(git describe --exact-match --tags)"
else
OPJ_TAG_NAME=""
fi
if [ "${OPJ_CI_INCLUDE_IF_DEPLOY:-}" == "1" ] && [ "${OPJ_TAG_NAME:-}" != "" ]; then
#if [ "${OPJ_CI_INCLUDE_IF_DEPLOY:-}" == "1" ]; then
OPJ_CI_DEPLOY=1 # unused for now
OPJ_CUR_DIR=${PWD}
if [ "${OPJ_SHORT_OS_NAME:-}" == "linux" ]; then
OPJ_PACK_GENERATOR="TGZ" # ZIP generator currently segfaults on linux
else
OPJ_PACK_GENERATOR="ZIP"
fi
OPJ_PACK_NAME="openjpeg-${OPJ_TAG_NAME}-${OPJ_SHORT_OS_NAME}-${OPJ_CI_ARCH}"
cd ${OPJ_BINARY_DIR}
cmake -D CPACK_GENERATOR:STRING=${OPJ_PACK_GENERATOR} -D CPACK_PACKAGE_FILE_NAME:STRING=${OPJ_PACK_NAME} ${OPJ_SOURCE_DIR}
cd ${OPJ_CUR_DIR}
cmake --build ${OPJ_BINARY_DIR} --target package
echo "ready to deploy $(ls ${OPJ_BINARY_DIR}/${OPJ_PACK_NAME}*) to GitHub releases"
if [ "${APPVEYOR_REPO_TAG:-}" == "true" ]; then
appveyor PushArtifact "${OPJ_BINARY_DIR}/${OPJ_PACK_NAME}.zip"
fi
else
OPJ_CI_DEPLOY=0
fi
# let's parse configure/build/tests for failure
echo "
Parsing logs for failures
"
OPJ_CI_RESULT=0
# 1st configure step
OPJ_CONFIGURE_XML=$(find build -path 'build/Testing/*' -name 'Configure.xml')
if [ ! -f "${OPJ_CONFIGURE_XML}" ]; then
echo "No configure log found"
OPJ_CI_RESULT=1
else
if ! grep '<ConfigureStatus>0</ConfigureStatus>' ${OPJ_CONFIGURE_XML} &> /dev/null; then
echo "Errors were found in configure log"
OPJ_CI_RESULT=1
fi
fi
# 2nd build step
# We must have one Build.xml file
OPJ_BUILD_XML=$(find build -path 'build/Testing/*' -name 'Build.xml')
if [ ! -f "${OPJ_BUILD_XML}" ]; then
echo "No build log found"
OPJ_CI_RESULT=1
else
if grep '<Error>' ${OPJ_BUILD_XML} &> /dev/null; then
echo "Errors were found in build log"
OPJ_CI_RESULT=1
fi
fi
if [ ${OPJ_CI_RESULT} -ne 0 ]; then
# Don't trash output with failing tests when there are configure/build errors
exit ${OPJ_CI_RESULT}
fi
if [ "${OPJ_CI_SKIP_TESTS:-}" != "1" ]; then
OPJ_TEST_XML=$(find build -path 'build/Testing/*' -name 'Test.xml')
if [ ! -f "${OPJ_TEST_XML}" ]; then
echo "No test log found"
OPJ_CI_RESULT=1
else
echo "Parsing tests for new/unknown failures"
# 3rd test step
OPJ_FAILEDTEST_LOG=$(find build -path 'build/Testing/Temporary/*' -name 'LastTestsFailed_*.log')
if [ -f "${OPJ_FAILEDTEST_LOG}" ]; then
awk -F: '{ print $2 }' ${OPJ_FAILEDTEST_LOG} > failures.txt
while read FAILEDTEST; do
# Start with common errors
if grep -x "${FAILEDTEST}" $(opjpath -u ${OPJ_SOURCE_DIR})/tools/travis-ci/knownfailures-all.txt > /dev/null; then
continue
fi
if [ -f $(opjpath -u ${OPJ_SOURCE_DIR})/tools/travis-ci/knownfailures-${OPJ_BUILDNAME_TEST}.txt ]; then
if grep -x "${FAILEDTEST}" $(opjpath -u ${OPJ_SOURCE_DIR})/tools/travis-ci/knownfailures-${OPJ_BUILDNAME_TEST}.txt > /dev/null; then
continue
fi
fi
echo "${FAILEDTEST}"
OPJ_CI_RESULT=1
done < failures.txt
fi
fi
if [ ${OPJ_CI_RESULT} -eq 0 ]; then
echo "No new/unknown test failure found
"
else
echo "
New/unknown test failure found!!! You may need to update/create tools/travis-ci/knownfailures-${OPJ_BUILDNAME_TEST}.txt
"
fi
# 4th memcheck step
OPJ_MEMCHECK_XML=$(find build -path 'build/Testing/*' -name 'DynamicAnalysis.xml')
if [ -f "${OPJ_MEMCHECK_XML}" ]; then
if grep '<Defect Type' ${OPJ_MEMCHECK_XML} 2> /dev/null; then
echo "Errors were found in dynamic analysis log"
OPJ_CI_RESULT=1
fi
fi
fi
if [ "${OPJ_CI_BUILD_FUZZERS:-}" == "1" ]; then
cd tests/fuzzers
make
cd ../..
fi
if [ "${OPJ_CI_PERF_TESTS:-}" == "1" ]; then
cd tests/performance
echo "Running performance tests on current version (dry-run)"
PATH=../../build/bin:$PATH python ./perf_test.py
echo "Running performance tests on current version"
PATH=../../build/bin:$PATH python ./perf_test.py -o /tmp/new.csv
if [ "${OPJ_NONCOMMERCIAL:-}" == "1" ] && [ -d ../../kdu ]; then
echo "Running performances tests with Kakadu"
LD_LIBRARY_PATH=../../kdu PATH=../../kdu::$PATH python ./perf_test.py -kakadu -o /tmp/kakadu.csv
echo "Comparing current version with Kakadu"
python compare_perfs.py /tmp/kakadu.csv /tmp/new.csv || true
fi
cd ../..
REF_VERSION=master
if [ "${TRAVIS_PULL_REQUEST:-false}" == "false" -a "${GITHUB_EVENT_NAME:-}" != "pull_request" ]; then
REF_VERSION=v2.1.2
fi
if [ ! -d ref_opj ]; then
git clone https://github.com/uclouvain/openjpeg ref_opj
fi
echo "Building reference version (${REF_VERSION})"
cd ref_opj
git checkout ${REF_VERSION}
mkdir -p build
cd build
cmake .. -DCMAKE_BUILD_TYPE=${OPJ_BUILD_CONFIGURATION}
make -j3
cd ../..
cd tests/performance
echo "Running performance tests on ${REF_VERSION} version (dry-run)"
PATH=../../ref_opj/build/bin:$PATH python ./perf_test.py
echo "Running performance tests on ${REF_VERSION} version"
PATH=../../ref_opj/build/bin:$PATH python ./perf_test.py -o /tmp/ref.csv
echo "Comparing current version with ${REF_VERSION} version"
# we should normally set OPJ_CI_RESULT=1 in case of failure, but
# this is too unreliable
python compare_perfs.py /tmp/ref.csv /tmp/new.csv || true
cd ../..
fi
if [ "${OPJ_CI_PROFILE:-}" == "1" ]; then
rm -rf build_gprof
mkdir build_gprof
cd build_gprof
# We need static linking for gprof
cmake "-DCMAKE_C_FLAGS=-pg -O3" -DCMAKE_EXE_LINKER_FLAGS=-pg -DCMAKE_SHARED_LINKER_FLAGS=-pg -DBUILD_SHARED_LIBS=OFF ..
make -j3
cd ..
build_gprof/bin/opj_decompress -i data/input/nonregression/kodak_2layers_lrcp.j2c -o out.tif > /dev/null
echo "Most CPU consuming functions:"
gprof build_gprof/bin/opj_decompress gmon.out | head || true
rm -f massif.out.*
valgrind --tool=massif build/bin/opj_decompress -i data/input/nonregression/kodak_2layers_lrcp.j2c -o out.tif >/dev/null 2>/dev/null
echo ""
echo "Memory consumption profile:"
python tests/profiling/filter_massif_output.py massif.out.*
fi
exit ${OPJ_CI_RESULT}
|