annotate src/capnproto-git-20161025/super-test.sh @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 9530b331f8c1
children
rev   line source
cannam@48 1 #! /usr/bin/env bash
cannam@48 2
cannam@48 3 set -euo pipefail
cannam@48 4
cannam@48 5 doit() {
cannam@48 6 echo "@@@@ $@"
cannam@48 7 "$@"
cannam@48 8 }
cannam@48 9
cannam@48 10 QUICK=
cannam@48 11
cannam@48 12 while [ $# -gt 0 ]; do
cannam@48 13 case "$1" in
cannam@48 14 test )
cannam@48 15 ;; # nothing
cannam@48 16 quick )
cannam@48 17 QUICK=quick
cannam@48 18 ;;
cannam@48 19 caffeinate )
cannam@48 20 # Re-run preventing sleep.
cannam@48 21 shift
cannam@48 22 exec caffeinate -ims $0 $@
cannam@48 23 ;;
cannam@48 24 tmpdir )
cannam@48 25 # Clone to a temp directory.
cannam@48 26 if [ "$#" -lt 2 ]; then
cannam@48 27 echo "usage: $0 tmpdir NAME [COMMAND]" >&2
cannam@48 28 exit 1
cannam@48 29 fi
cannam@48 30 DIR=/tmp/$2
cannam@48 31 shift 2
cannam@48 32 if [ -e $DIR ]; then
cannam@48 33 if [ "${DIR/*..*}" = "" ]; then
cannam@48 34 echo "NO DO NOT PUT .. IN THERE IT'S GOING TO GO IN /tmp AND I'M GONNA DELETE IT" >&2
cannam@48 35 exit 1
cannam@48 36 fi
cannam@48 37 if [ ! -e "$DIR/super-test.sh" ]; then
cannam@48 38 echo "$DIR exists and it doesn't look like one of mine." >&2
cannam@48 39 exit 1
cannam@48 40 fi
cannam@48 41 # make distcheck leaves non-writable files when it fails, so we need to chmod to be safe.
cannam@48 42 chmod -R +w $DIR
cannam@48 43 rm -rf $DIR
cannam@48 44 fi
cannam@48 45 git clone . $DIR
cannam@48 46 cd $DIR
cannam@48 47 exec ./super-test.sh "$@"
cannam@48 48 ;;
cannam@48 49 remote )
cannam@48 50 if [ "$#" -lt 2 ]; then
cannam@48 51 echo "usage: $0 remote HOST [COMMAND]" >&2
cannam@48 52 exit 1
cannam@48 53 fi
cannam@48 54 HOST=$2
cannam@48 55 shift 2
cannam@48 56 echo "========================================================================="
cannam@48 57 echo "Pushing code to $HOST..."
cannam@48 58 echo "========================================================================="
cannam@48 59 BRANCH=$(git rev-parse --abbrev-ref HEAD)
cannam@48 60 ssh $HOST '(chmod -fR +w tmp-test-capnp || true) && rm -rf tmp-test-capnp && mkdir tmp-test-capnp && git init tmp-test-capnp'
cannam@48 61 git push ssh://$HOST/~/tmp-test-capnp "$BRANCH:test"
cannam@48 62 ssh $HOST "cd tmp-test-capnp && git checkout test"
cannam@48 63 exec ssh $HOST "cd tmp-test-capnp && ./super-test.sh $@ && cd .. && rm -rf tmp-test-capnp"
cannam@48 64 ;;
cannam@48 65 clang )
cannam@48 66 export CXX=clang++
cannam@48 67 ;;
cannam@48 68 gcc-4.9 )
cannam@48 69 export CXX=g++-4.9
cannam@48 70 ;;
cannam@48 71 gcc-4.8 )
cannam@48 72 export CXX=g++-4.8
cannam@48 73 ;;
cannam@48 74 gcc-4.7 )
cannam@48 75 export CXX=g++-4.7
cannam@48 76 ;;
cannam@48 77 mingw )
cannam@48 78 if [ "$#" -ne 2 ]; then
cannam@48 79 echo "usage: $0 mingw CROSS_HOST" >&2
cannam@48 80 exit 1
cannam@48 81 fi
cannam@48 82 CROSS_HOST=$2
cannam@48 83
cannam@48 84 cd c++
cannam@48 85 test -e configure || doit autoreconf -i
cannam@48 86 test ! -e Makefile || (echo "ERROR: Directory unclean!" >&2 && false)
cannam@48 87 doit ./configure --host="$CROSS_HOST" --disable-shared CXXFLAGS='-static-libgcc -static-libstdc++'
cannam@48 88 doit make -j6 capnp.exe capnpc-c++.exe
cannam@48 89
cannam@48 90 cp capnp.exe capnp-mingw.exe
cannam@48 91 cp capnpc-c++.exe capnpc-c++-mingw.exe
cannam@48 92
cannam@48 93 doit make distclean
cannam@48 94 doit ./configure --host="$CROSS_HOST" --with-external-capnp --disable-shared --disable-reflection CXXFLAGS='-static-libgcc -static-libstdc++' CAPNP=./capnp-mingw.exe CAPNPC_CXX=./capnpc-c++-mingw.exe
cannam@48 95
cannam@48 96 doit make -j6 check
cannam@48 97 doit make distclean
cannam@48 98 rm -f *-mingw.exe
cannam@48 99 exit 0
cannam@48 100 ;;
cannam@48 101 android )
cannam@48 102 if [ "$#" -ne 4 ]; then
cannam@48 103 echo "usage: $0 android SDK_HOME TOOLCHAIN_HOME CROSS_HOST" >&2
cannam@48 104 exit 1
cannam@48 105 fi
cannam@48 106 SDK_HOME=$2
cannam@48 107 TOOLCHAIN_HOME=$3
cannam@48 108 CROSS_HOST=$4
cannam@48 109
cannam@48 110 cd c++
cannam@48 111 test -e configure || doit autoreconf -i
cannam@48 112 test ! -e Makefile || (echo "ERROR: Directory unclean!" >&2 && false)
cannam@48 113 doit ./configure --disable-shared
cannam@48 114 doit make -j6 capnp capnpc-c++
cannam@48 115
cannam@48 116 cp capnp capnp-host
cannam@48 117 cp capnpc-c++ capnpc-c++-host
cannam@48 118
cannam@48 119 export PATH="$TOOLCHAIN_HOME/bin:$PATH"
cannam@48 120 doit make distclean
cannam@48 121 doit ./configure --host="$CROSS_HOST" --with-external-capnp --disable-shared CXXFLAGS='-pie -fPIE' CAPNP=./capnp-host CAPNPC_CXX=./capnpc-c++-host
cannam@48 122
cannam@48 123 doit make -j6
cannam@48 124 doit make -j6 capnp-test
cannam@48 125
cannam@48 126 echo "Starting emulator..."
cannam@48 127 trap 'kill $(jobs -p)' EXIT
cannam@48 128 $SDK_HOME/tools/emulator -avd n6 -no-window &
cannam@48 129 $SDK_HOME/platform-tools/adb wait-for-device
cannam@48 130 echo "Waiting for localhost to be resolvable..."
cannam@48 131 $SDK_HOME/platform-tools/adb shell 'while ! ping -c 1 localhost > /dev/null 2>&1; do sleep 1; done'
cannam@48 132 doit $SDK_HOME/platform-tools/adb push capnp-test /data/capnp-test
cannam@48 133 doit $SDK_HOME/platform-tools/adb shell 'cd /data && /data/capnp-test && echo ANDROID_""TESTS_PASSED' | tee android-test.log
cannam@48 134 grep -q ANDROID_TESTS_PASSED android-test.log
cannam@48 135
cannam@48 136 doit make distclean
cannam@48 137 rm -f capnp-host capnpc-c++-host
cannam@48 138 exit 0
cannam@48 139 ;;
cannam@48 140 cmake )
cannam@48 141 cd c++
cannam@48 142 rm -rf cmake-build
cannam@48 143 mkdir cmake-build
cannam@48 144 cd cmake-build
cannam@48 145 doit cmake -G "Unix Makefiles" ..
cannam@48 146 doit make -j6 check
cannam@48 147 exit 0
cannam@48 148 ;;
cannam@48 149 exotic )
cannam@48 150 echo "========================================================================="
cannam@48 151 echo "MinGW 64-bit"
cannam@48 152 echo "========================================================================="
cannam@48 153 "$0" mingw x86_64-w64-mingw32
cannam@48 154 echo "========================================================================="
cannam@48 155 echo "MinGW 32-bit"
cannam@48 156 echo "========================================================================="
cannam@48 157 "$0" mingw i686-w64-mingw32
cannam@48 158 echo "========================================================================="
cannam@48 159 echo "Android"
cannam@48 160 echo "========================================================================="
cannam@48 161 "$0" android /home/kenton/android/android-sdk-linux /home/kenton/android/android-16 arm-linux-androideabi
cannam@48 162 echo "========================================================================="
cannam@48 163 echo "CMake"
cannam@48 164 echo "========================================================================="
cannam@48 165 "$0" cmake
cannam@48 166 exit 0
cannam@48 167 ;;
cannam@48 168 clean )
cannam@48 169 rm -rf tmp-staging
cannam@48 170 cd c++
cannam@48 171 if [ -e Makefile ]; then
cannam@48 172 doit make maintainer-clean
cannam@48 173 fi
cannam@48 174 rm -f capnproto-*.tar.gz samples/addressbook samples/addressbook.capnp.c++ \
cannam@48 175 samples/addressbook.capnp.h
cannam@48 176 exit 0
cannam@48 177 ;;
cannam@48 178 help )
cannam@48 179 echo "usage: $0 [COMMAND]"
cannam@48 180 echo "commands:"
cannam@48 181 echo " test Runs tests (the default)."
cannam@48 182 echo " clang Runs tests using Clang compiler."
cannam@48 183 echo " gcc-4.7 Runs tests using gcc-4.7."
cannam@48 184 echo " gcc-4.8 Runs tests using gcc-4.8."
cannam@48 185 echo " gcc-4.9 Runs tests using gcc-4.9."
cannam@48 186 echo " remote HOST Runs tests on HOST via SSH."
cannam@48 187 echo " mingw Cross-compiles to MinGW and runs tests using WINE."
cannam@48 188 echo " android Cross-compiles to Android and runs tests using emulator."
cannam@48 189 echo " clean Delete temporary files that may be left after failure."
cannam@48 190 echo " help Prints this help text."
cannam@48 191 exit 0
cannam@48 192 ;;
cannam@48 193 * )
cannam@48 194 echo "unknown command: $1" >&2
cannam@48 195 echo "try: $0 help" >&2
cannam@48 196 exit 1
cannam@48 197 ;;
cannam@48 198 esac
cannam@48 199 shift
cannam@48 200 done
cannam@48 201
cannam@48 202 # Build optimized builds because they catch more problems, but also enable debugging macros.
cannam@48 203 # Enable lots of warnings and make sure the build breaks if they fire. Disable strict-aliasing
cannam@48 204 # because GCC warns about code that I know is OK. Disable sign-compare because I've fixed more
cannam@48 205 # sign-compare warnings than probably all other warnings combined and I've never seen it flag a
cannam@48 206 # real problem. Disable unused parameters because it's stupidly noisy and never a real problem.
cannam@48 207 export CXXFLAGS="-O2 -DDEBUG -Wall -Wextra -Werror -Wno-strict-aliasing -Wno-sign-compare -Wno-unused-parameter"
cannam@48 208
cannam@48 209 STAGING=$PWD/tmp-staging
cannam@48 210
cannam@48 211 rm -rf "$STAGING"
cannam@48 212 mkdir "$STAGING"
cannam@48 213 mkdir "$STAGING/bin"
cannam@48 214 mkdir "$STAGING/lib"
cannam@48 215 export PATH=$STAGING/bin:$PATH
cannam@48 216 export LD_LIBRARY_PATH=$STAGING/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
cannam@48 217 export PKG_CONFIG_PATH=$STAGING/lib/pkgconfig
cannam@48 218
cannam@48 219 if [ "$QUICK" = quick ]; then
cannam@48 220 echo "************************** QUICK TEST ***********************************"
cannam@48 221 fi
cannam@48 222
cannam@48 223 echo "========================================================================="
cannam@48 224 echo "Building c++"
cannam@48 225 echo "========================================================================="
cannam@48 226
cannam@48 227 # Apple now aliases gcc to clang, so probe to find out what compiler we're really using.
cannam@48 228 if (${CXX:-g++} -dM -E -x c++ /dev/null 2>&1 | grep -q '__clang__'); then
cannam@48 229 IS_CLANG=yes
cannam@48 230 else
cannam@48 231 IS_CLANG=no
cannam@48 232 fi
cannam@48 233
cannam@48 234 if [ $IS_CLANG = yes ]; then
cannam@48 235 # Don't fail out on this ridiculous "argument unused during compilation" warning.
cannam@48 236 export CXXFLAGS="$CXXFLAGS -Wno-error=unused-command-line-argument"
cannam@48 237 else
cannam@48 238 # GCC emits uninitialized warnings all over and they seem bogus. We use valgrind to test for
cannam@48 239 # uninitialized memory usage later on.
cannam@48 240 CXXFLAGS="$CXXFLAGS -Wno-maybe-uninitialized"
cannam@48 241 fi
cannam@48 242
cannam@48 243 cd c++
cannam@48 244 doit autoreconf -i
cannam@48 245 doit ./configure --prefix="$STAGING"
cannam@48 246 doit make -j6 check
cannam@48 247
cannam@48 248 if [ $IS_CLANG = no ]; then
cannam@48 249 # Verify that generated code compiles with pedantic warnings. Make sure to treat capnp headers
cannam@48 250 # as system headers so warnings in them are ignored.
cannam@48 251 doit ${CXX:-g++} -isystem src -std=c++11 -fno-permissive -pedantic -Wall -Wextra -Werror \
cannam@48 252 -c src/capnp/test.capnp.c++ -o /dev/null
cannam@48 253 fi
cannam@48 254
cannam@48 255 echo "========================================================================="
cannam@48 256 echo "Testing c++ install"
cannam@48 257 echo "========================================================================="
cannam@48 258
cannam@48 259 doit make install
cannam@48 260
cannam@48 261 test "x$(which capnp)" = "x$STAGING/bin/capnp"
cannam@48 262 test "x$(which capnpc-c++)" = "x$STAGING/bin/capnpc-c++"
cannam@48 263
cannam@48 264 cd samples
cannam@48 265
cannam@48 266 doit capnp compile -oc++ addressbook.capnp -I"$STAGING"/include --no-standard-import
cannam@48 267 doit ${CXX:-g++} -std=c++11 addressbook.c++ addressbook.capnp.c++ -o addressbook \
cannam@48 268 $CXXFLAGS $(pkg-config --cflags --libs capnp)
cannam@48 269 echo "@@@@ ./addressbook (in various configurations)"
cannam@48 270 ./addressbook write | ./addressbook read
cannam@48 271 ./addressbook dwrite | ./addressbook dread
cannam@48 272 rm addressbook addressbook.capnp.c++ addressbook.capnp.h
cannam@48 273
cannam@48 274 doit capnp compile -oc++ calculator.capnp -I"$STAGING"/include --no-standard-import
cannam@48 275 doit ${CXX:-g++} -std=c++11 calculator-client.c++ calculator.capnp.c++ -o calculator-client \
cannam@48 276 $CXXFLAGS $(pkg-config --cflags --libs capnp-rpc)
cannam@48 277 doit ${CXX:-g++} -std=c++11 calculator-server.c++ calculator.capnp.c++ -o calculator-server \
cannam@48 278 $CXXFLAGS $(pkg-config --cflags --libs capnp-rpc)
cannam@48 279 rm -f /tmp/capnp-calculator-example-$$
cannam@48 280 ./calculator-server unix:/tmp/capnp-calculator-example-$$ &
cannam@48 281 sleep 0.1
cannam@48 282 ./calculator-client unix:/tmp/capnp-calculator-example-$$
cannam@48 283 kill %+
cannam@48 284 wait %+ || true
cannam@48 285 rm calculator-client calculator-server calculator.capnp.c++ calculator.capnp.h /tmp/capnp-calculator-example-$$
cannam@48 286
cannam@48 287 cd ..
cannam@48 288
cannam@48 289 if [ "$QUICK" = quick ]; then
cannam@48 290 doit make maintainer-clean
cannam@48 291 rm -rf "$STAGING"
cannam@48 292 exit 0
cannam@48 293 fi
cannam@48 294
cannam@48 295 echo "========================================================================="
cannam@48 296 echo "Testing --with-external-capnp"
cannam@48 297 echo "========================================================================="
cannam@48 298
cannam@48 299 doit make distclean
cannam@48 300 doit ./configure --prefix="$STAGING" --disable-shared \
cannam@48 301 --with-external-capnp CAPNP=$STAGING/bin/capnp
cannam@48 302 doit make -j6 check
cannam@48 303
cannam@48 304 echo "========================================================================="
cannam@48 305 echo "Testing --disable-reflection"
cannam@48 306 echo "========================================================================="
cannam@48 307
cannam@48 308 doit make distclean
cannam@48 309 doit ./configure --prefix="$STAGING" --disable-shared --disable-reflection \
cannam@48 310 --with-external-capnp CAPNP=$STAGING/bin/capnp
cannam@48 311 doit make -j6 check
cannam@48 312 doit make distclean
cannam@48 313
cannam@48 314 # Test 32-bit build now while we have $STAGING available for cross-compiling.
cannam@48 315 if [ "x`uname -m`" = "xx86_64" ]; then
cannam@48 316 echo "========================================================================="
cannam@48 317 echo "Testing 32-bit build"
cannam@48 318 echo "========================================================================="
cannam@48 319
cannam@48 320 if [[ "`uname`" =~ CYGWIN ]]; then
cannam@48 321 # It's just not possible to run cygwin32 binaries from within cygwin64.
cannam@48 322
cannam@48 323 # Build as if we are cross-compiling, using the capnp we installed to $STAGING.
cannam@48 324 doit ./configure --prefix="$STAGING" --disable-shared --host=i686-pc-cygwin \
cannam@48 325 --with-external-capnp CAPNP=$STAGING/bin/capnp
cannam@48 326 doit make -j6
cannam@48 327 doit make -j6 capnp-test.exe
cannam@48 328
cannam@48 329 # Expect a cygwin32 sshd to be listening at localhost port 2222, and use it
cannam@48 330 # to run the tests.
cannam@48 331 doit scp -P 2222 capnp-test.exe localhost:~/tmp-capnp-test.exe
cannam@48 332 doit ssh -p 2222 localhost './tmp-capnp-test.exe && rm tmp-capnp-test.exe'
cannam@48 333
cannam@48 334 doit make distclean
cannam@48 335
cannam@48 336 elif [ "x${CXX:-g++}" != "xg++-4.8" ]; then
cannam@48 337 doit ./configure CXX="${CXX:-g++} -m32" --disable-shared
cannam@48 338 doit make -j6 check
cannam@48 339 doit make distclean
cannam@48 340 fi
cannam@48 341 fi
cannam@48 342
cannam@48 343 echo "========================================================================="
cannam@48 344 echo "Testing c++ uninstall"
cannam@48 345 echo "========================================================================="
cannam@48 346
cannam@48 347 doit ./configure --prefix="$STAGING"
cannam@48 348 doit make uninstall
cannam@48 349
cannam@48 350 echo "========================================================================="
cannam@48 351 echo "Testing c++ dist"
cannam@48 352 echo "========================================================================="
cannam@48 353
cannam@48 354 doit make -j6 distcheck
cannam@48 355 doit make distclean
cannam@48 356 rm capnproto-*.tar.gz
cannam@48 357
cannam@48 358 if [ "x`uname`" = xLinux ]; then
cannam@48 359 echo "========================================================================="
cannam@48 360 echo "Testing generic Unix (no Linux-specific features)"
cannam@48 361 echo "========================================================================="
cannam@48 362
cannam@48 363 doit ./configure --disable-shared CXXFLAGS="$CXXFLAGS -DKJ_USE_FUTEX=0 -DKJ_USE_EPOLL=0"
cannam@48 364 doit make -j6 check
cannam@48 365 doit make distclean
cannam@48 366 fi
cannam@48 367
cannam@48 368 echo "========================================================================="
cannam@48 369 echo "Testing with -fno-rtti and -fno-exceptions"
cannam@48 370 echo "========================================================================="
cannam@48 371
cannam@48 372 doit ./configure --disable-shared CXXFLAGS="$CXXFLAGS -fno-rtti"
cannam@48 373 doit make -j6 check
cannam@48 374 doit make distclean
cannam@48 375 doit ./configure --disable-shared CXXFLAGS="$CXXFLAGS -fno-exceptions"
cannam@48 376 doit make -j6 check
cannam@48 377 doit make distclean
cannam@48 378 doit ./configure --disable-shared CXXFLAGS="$CXXFLAGS -fno-rtti -fno-exceptions"
cannam@48 379 doit make -j6 check
cannam@48 380
cannam@48 381 # Valgrind is currently "experimental and mostly broken" on OSX and fails to run the full test
cannam@48 382 # suite, but I have it installed because it did manage to help me track down a bug or two. Anyway,
cannam@48 383 # skip it on OSX for now.
cannam@48 384 if [ "x`uname`" != xDarwin ] && which valgrind > /dev/null; then
cannam@48 385 doit make distclean
cannam@48 386
cannam@48 387 echo "========================================================================="
cannam@48 388 echo "Testing with valgrind"
cannam@48 389 echo "========================================================================="
cannam@48 390
cannam@48 391 doit ./configure --disable-shared CXXFLAGS="-g"
cannam@48 392 doit make -j6
cannam@48 393 doit make -j6 capnp-test
cannam@48 394 doit valgrind --leak-check=full --track-fds=yes --error-exitcode=1 ./capnp-test
cannam@48 395 fi
cannam@48 396
cannam@48 397 doit make maintainer-clean
cannam@48 398
cannam@48 399 rm -rf "$STAGING"