From b6807d91d83e9597ffecec999eb761b8571a1f26 Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Sat, 2 May 2020 21:58:42 +0300 Subject: [PATCH 1/5] Move travis script into a standalone sh file --- .travis.yml | 33 ++++++--------------------- contrib/travis.sh | 58 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 26 deletions(-) create mode 100755 contrib/travis.sh diff --git a/.travis.yml b/.travis.yml index 3d315b1010..16f7593357 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,8 @@ env: - BIGNUM=no ENDOMORPHISM=yes RECOVERY=yes EXPERIMENTAL=yes - BIGNUM=no STATICPRECOMPUTATION=no - BUILD=distcheck CTIMETEST= BENCH= - - EXTRAFLAGS=CPPFLAGS=-DDETERMINISTIC - - EXTRAFLAGS=CFLAGS=-O0 + - CPPFLAGS=-DDETERMINISTIC + - CFLAGS=-O0 CTIMETEST= - ECMULTGENPRECISION=2 - ECMULTGENPRECISION=8 matrix: @@ -74,35 +74,16 @@ matrix: - compiler: gcc env: - BIGNUM=no ENDOMORPHISM=yes ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes - - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests CPPFLAGS=-DVALGRIND" BUILD= + - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= - compiler: gcc env: # The same as above but without endomorphism. - - BIGNUM=no ENDOMORPHISM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes - - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests CPPFLAGS=-DVALGRIND" BUILD= + - BIGNUM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes + - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= before_script: ./autogen.sh -script: - - if [ -n "$HOST" ]; then export USE_HOST="--host=$HOST"; fi - - if [ "x$HOST" = "xi686-linux-gnu" ]; then export CC="$CC -m32"; fi - - ./configure --enable-experimental=$EXPERIMENTAL --enable-endomorphism=$ENDOMORPHISM --with-field=$FIELD --with-bignum=$BIGNUM --with-asm=$ASM --with-scalar=$SCALAR --enable-ecmult-static-precomputation=$STATICPRECOMPUTATION --with-ecmult-gen-precision=$ECMULTGENPRECISION --enable-module-ecdh=$ECDH --enable-module-recovery=$RECOVERY $EXTRAFLAGS $USE_HOST - - if [ -n "$BUILD" ]; then make -j2 $BUILD; fi - - # travis_wait extends the 10 minutes without output allowed (https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received) - - # the `--error-exitcode` is required to make the test fail if valgrind found errors, otherwise it'll return 0 (http://valgrind.org/docs/manual/manual-core.html) - - if [ -n "$VALGRIND" ]; then - make -j2 && - travis_wait 30 valgrind --error-exitcode=42 ./tests 16 && - travis_wait 30 valgrind --error-exitcode=42 ./exhaustive_tests; - fi - - if [ -n "$BENCH" ]; then - if [ -n "$VALGRIND" ]; then EXEC='libtool --mode=execute valgrind --error-exitcode=42'; else EXEC= ; fi && - $EXEC ./bench_ecmult &>> bench.log && $EXEC ./bench_internal &>> bench.log && $EXEC ./bench_sign &>> bench.log && $EXEC ./bench_verify &>> bench.log && - if [ "$RECOVERY" == "yes" ]; then $EXEC ./bench_recover &>> bench.log; fi && - if [ "$ECDH" == "yes" ]; then $EXEC ./bench_ecdh &>> bench.log; fi; - fi - - if [ -n "$CTIMETEST" ]; then - libtool --mode=execute valgrind ./valgrind_ctime_test &> valgrind_ctime_test.log; - fi +# travis_wait extends the 10 minutes without output allowed (https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received) +script: travis_wait 30 ./contrib/travis.sh after_script: - cat ./tests.log diff --git a/contrib/travis.sh b/contrib/travis.sh new file mode 100755 index 0000000000..9276867b00 --- /dev/null +++ b/contrib/travis.sh @@ -0,0 +1,58 @@ +#!/bin/sh + +set -e +set -x + +if [ -n "$HOST" ] +then + export USE_HOST="--host=$HOST" +fi +if [ "$HOST" = "i686-linux-gnu" ] +then + export CC="$CC -m32" +fi + +./configure \ + --enable-experimental="$EXPERIMENTAL" --enable-endomorphism="$ENDOMORPHISM" \ + --with-field="$FIELD" --with-bignum="$BIGNUM" --with-asm="$ASM" --with-scalar="$SCALAR" \ + --enable-ecmult-static-precomputation="$STATICPRECOMPUTATION" --with-ecmult-gen-precision="$ECMULTGENPRECISION" \ + --enable-module-ecdh="$ECDH" --enable-module-recovery="$RECOVERY" "$EXTRAFLAGS" "$USE_HOST" + +if [ -n "$BUILD" ] +then + make -j2 "$BUILD" +fi +if [ -n "$VALGRIND" ] +then + make -j2 + # the `--error-exitcode` is required to make the test fail if valgrind found errors, otherwise it'll return 0 (http://valgrind.org/docs/manual/manual-core.html) + valgrind --error-exitcode=42 ./tests 16 + valgrind --error-exitcode=42 ./exhaustive_tests +fi +if [ -n "$BENCH" ] +then + if [ -n "$VALGRIND" ] + then + EXEC='libtool --mode=execute valgrind --error-exitcode=42' + else + EXEC= + fi + { + $EXEC ./bench_ecmult + $EXEC ./bench_internal + $EXEC ./bench_sign + $EXEC ./bench_verify + } >> bench.log 2>&1 + if [ "$RECOVERY" = "yes" ] + then + $EXEC ./bench_recover >> bench.log 2>&1 + fi + if [ "$ECDH" = "yes" ] + then + $EXEC ./bench_ecdh >> bench.log 2>&1 + fi +fi +if [ -n "$CTIMETEST" ] +then + libtool --mode=execute valgrind --error-exitcode=42 ./valgrind_ctime_test > valgrind_ctime_test.log 2>&1 +fi From 0c5ff9066e6fa41b1fbd5d0b8c2f02e8a04e96ea Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Sat, 2 May 2020 22:06:04 +0300 Subject: [PATCH 2/5] Add macOS support to travis --- .travis.yml | 29 ++++++++++++++++++++--------- contrib/travis.sh | 9 +++++++-- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 16f7593357..ad0eee8aa0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,10 @@ language: c -os: linux +os: + - linux + - osx + +# Valgrind currently supports upto macOS 10.13, the latest xcode of that version is 10.1 +osx_image: xcode10.1 addons: apt: packages: @@ -30,10 +35,13 @@ env: - CFLAGS=-O0 CTIMETEST= - ECMULTGENPRECISION=2 - ECMULTGENPRECISION=8 + - VALGRIND=yes ENDOMORPHISM=yes BIGNUM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= + - VALGRIND=yes BIGNUM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= matrix: fast_finish: true include: - compiler: clang + os: linux env: HOST=i686-linux-gnu ENDOMORPHISM=yes addons: apt: @@ -45,6 +53,7 @@ matrix: - libc6-dbg:i386 - compiler: clang env: HOST=i686-linux-gnu + os: linux addons: apt: packages: @@ -54,6 +63,7 @@ matrix: - libc6-dbg:i386 - compiler: gcc env: HOST=i686-linux-gnu ENDOMORPHISM=yes + os: linux addons: apt: packages: @@ -62,6 +72,7 @@ matrix: - libtool-bin - libc6-dbg:i386 - compiler: gcc + os: linux env: HOST=i686-linux-gnu addons: apt: @@ -71,14 +82,12 @@ matrix: - valgrind - libtool-bin - libc6-dbg:i386 - - compiler: gcc - env: - - BIGNUM=no ENDOMORPHISM=yes ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes - - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= - - compiler: gcc - env: # The same as above but without endomorphism. - - BIGNUM=no ASM=x86_64 EXPERIMENTAL=yes ECDH=yes RECOVERY=yes - - VALGRIND=yes EXTRAFLAGS="--disable-openssl-tests" CPPFLAGS=-DVALGRIND BUILD= + +# We use this to install macOS dependencies instead of the built in `homebrew` plugin, +# because in xcode earlier than 11 they have a bug requiring updating the system which overall takes ~8 minutes. +# https://travis-ci.community/t/macos-build-fails-because-of-homebrew-bundle-unknown-command/7296 +before_install: + - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then HOMEBREW_NO_AUTO_UPDATE=1 brew install gmp valgrind gcc@9; fi before_script: ./autogen.sh @@ -90,3 +99,5 @@ after_script: - cat ./exhaustive_tests.log - cat ./valgrind_ctime_test.log - cat ./bench.log + - $CC --version + - valgrind --version diff --git a/contrib/travis.sh b/contrib/travis.sh index 9276867b00..383ef3fb72 100755 --- a/contrib/travis.sh +++ b/contrib/travis.sh @@ -11,6 +11,10 @@ if [ "$HOST" = "i686-linux-gnu" ] then export CC="$CC -m32" fi +if [ "$TRAVIS_OS_NAME" = "osx" ] && [ "$TRAVIS_COMPILER" = "gcc" ] +then + export CC="gcc-9" +fi ./configure \ --enable-experimental="$EXPERIMENTAL" --enable-endomorphism="$ENDOMORPHISM" \ @@ -33,7 +37,8 @@ if [ -n "$BENCH" ] then if [ -n "$VALGRIND" ] then - EXEC='libtool --mode=execute valgrind --error-exitcode=42' + # Using the local `libtool` because on macOS the system's libtool has nothing to do with GNU libtool + EXEC='./libtool --mode=execute valgrind --error-exitcode=42' else EXEC= fi @@ -54,5 +59,5 @@ then fi if [ -n "$CTIMETEST" ] then - libtool --mode=execute valgrind --error-exitcode=42 ./valgrind_ctime_test > valgrind_ctime_test.log 2>&1 + ./libtool --mode=execute valgrind --error-exitcode=42 ./valgrind_ctime_test > valgrind_ctime_test.log 2>&1 fi From bc818b160cdaaccff2162206cc15915fa5f0cca8 Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Sat, 2 May 2020 22:06:46 +0300 Subject: [PATCH 3/5] Bump travis Ubuntu from xenial(16.04) to bionic(18.04) --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index ad0eee8aa0..8b9d7adea9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,6 +3,7 @@ os: - linux - osx +dist: bionic # Valgrind currently supports upto macOS 10.13, the latest xcode of that version is 10.1 osx_image: xcode10.1 addons: From 99bd661d71fe17be7b3de4707a0264c41a63ebe8 Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Sun, 3 May 2020 18:01:28 +0300 Subject: [PATCH 4/5] Replace travis_wait with a loop printing "\a" to stdout every minute --- .travis.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 8b9d7adea9..d9878cfa34 100644 --- a/.travis.yml +++ b/.travis.yml @@ -92,8 +92,12 @@ before_install: before_script: ./autogen.sh -# travis_wait extends the 10 minutes without output allowed (https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received) -script: travis_wait 30 ./contrib/travis.sh +# travis auto terminates jobs that go for 10 minutes without printing to stdout, but travis_wait doesn't work well with forking programs like valgrind (https://docs.travis-ci.com/user/common-build-problems/#build-times-out-because-no-output-was-received https://github.com/bitcoin-core/secp256k1/pull/750#issuecomment-623476860) +script: + - function keep_alive() { while true; do echo -en "\a"; sleep 60; done } + - keep_alive & + - ./contrib/travis.sh + - kill %keep_alive after_script: - cat ./tests.log From 71757da5ccece100b1eca6c70b4d87e2542cff97 Mon Sep 17 00:00:00 2001 From: Elichai Turkel Date: Thu, 7 May 2020 16:07:37 +0300 Subject: [PATCH 5/5] Explictly pass SECP256K1_BENCH_ITERS to the benchmarks in travis.sh --- .travis.yml | 2 +- contrib/travis.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index d9878cfa34..a6ad6fb27e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,7 +17,7 @@ compiler: - gcc env: global: - - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ECMULTGENPRECISION=auto ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no CTIMETEST=yes BENCH=yes SECP256K1_BENCH_ITERS=2 + - FIELD=auto BIGNUM=auto SCALAR=auto ENDOMORPHISM=no STATICPRECOMPUTATION=yes ECMULTGENPRECISION=auto ASM=no BUILD=check EXTRAFLAGS= HOST= ECDH=no RECOVERY=no EXPERIMENTAL=no CTIMETEST=yes BENCH=yes ITERS=2 matrix: - SCALAR=32bit RECOVERY=yes - SCALAR=32bit FIELD=32bit ECDH=yes EXPERIMENTAL=yes diff --git a/contrib/travis.sh b/contrib/travis.sh index 383ef3fb72..3909d16a27 100755 --- a/contrib/travis.sh +++ b/contrib/travis.sh @@ -42,6 +42,8 @@ then else EXEC= fi + # This limits the iterations in the benchmarks below to ITER(set in .travis.yml) iterations. + export SECP256K1_BENCH_ITERS="$ITERS" { $EXEC ./bench_ecmult $EXEC ./bench_internal