annotate src/capnproto-git-20161025/super-test.sh @ 133:1ac99bfc383d

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