annotate src/capnproto-git-20161025/super-test.sh @ 48:9530b331f8c1

Add Cap'n Proto source
author Chris Cannam <cannam@all-day-breakfast.com>
date Tue, 25 Oct 2016 11:17:01 +0100
parents
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"