summaryrefslogtreecommitdiff
path: root/TestScripts/cryptest-symbols.sh
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2016-11-07 02:52:34 -0500
committerJeffrey Walton <noloader@gmail.com>2016-11-07 02:52:34 -0500
commit385a3914d6cfdc88002f113bd4955f7b7ae2266a (patch)
tree203965ddc16e4540a36e4ad145fb0ed2c88a56ff /TestScripts/cryptest-symbols.sh
parent7e9a60da47d2e6f3db5984aa52357a4bcc8aa845 (diff)
downloadcryptopp-git-385a3914d6cfdc88002f113bd4955f7b7ae2266a.tar.gz
Add cryptest-symbols.sh to test for symbol changes in shared object across version
Diffstat (limited to 'TestScripts/cryptest-symbols.sh')
-rwxr-xr-xTestScripts/cryptest-symbols.sh248
1 files changed, 248 insertions, 0 deletions
diff --git a/TestScripts/cryptest-symbols.sh b/TestScripts/cryptest-symbols.sh
new file mode 100755
index 00000000..d8072797
--- /dev/null
+++ b/TestScripts/cryptest-symbols.sh
@@ -0,0 +1,248 @@
+#!/usr/bin/env bash
+
+# cryptest.sh - written and placed in public domain by Jeffrey Walton and Uri Blumenthal.
+# Copyright assigned to Crypto++ project.
+
+# This is a test script that can be used on some Linux/Unix/Apple machines to automate testing
+# of the shared object to ensure linking and symbols don't go missing from release to release.
+
+############################################
+# Tags to test
+
+OLD_VERSION_TAG=CRYPTOPP_5_6_4
+NEW_VERSION_TAG=CRYPTOPP_5_6_5
+
+############################################
+# Setup tools and platforms
+
+GREP=grep
+EGREP=egrep
+SED=sed
+AWK=awk
+
+# Code generation tests
+DISASS=objdump
+DISASSARGS=("--disassemble")
+
+THIS_SYSTEM=$(uname -s 2>&1)
+IS_DARWIN=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c darwin)
+IS_LINUX=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c linux)
+IS_CYGWIN=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c cygwin)
+IS_MINGW=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c mingw)
+IS_OPENBSD=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c openbsd)
+IS_FREEBSD=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c freebsd)
+IS_NETBSD=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c netbsd)
+IS_SOLARIS=$(echo -n "$THIS_SYSTEM" | "$GREP" -i -c sunos)
+
+THIS_MACHINE=$(uname -m 2>&1)
+IS_X86=$(echo -n "$THIS_MACHINE" | "$EGREP" -i -c "(i386|i486|i586|i686)")
+IS_X64=$(echo -n "$THIS_MACHINE" | "$EGREP" -i -c "(amd64|x86_64)")
+IS_PPC=$(echo -n "$THIS_MACHINE" | "$EGREP" -i -c "(Power|PPC)")
+IS_ARM32=$(echo -n "$THIS_MACHINE" | "$GREP" -v "64" | "$EGREP" -i -c "(arm|aarch32)")
+IS_ARM64=$(echo -n "$THIS_MACHINE" | "$EGREP" -i -c "(arm64|aarch64)")
+IS_S390=$(echo -n "$THIS_MACHINE" | "$EGREP" -i -c "s390")
+IS_X32=0
+
+# Fixup
+if [[ "$IS_SOLARIS" -ne "0" ]]; then
+ IS_X64=$(isainfo 2>/dev/null | "$GREP" -i -c "amd64")
+ if [[ "$IS_X64" -ne "0" ]]; then
+ IS_X86=0
+ fi
+
+ # Need something more powerful than the Posix versions
+ if [[ (-e "/usr/gnu/bin/grep") ]]; then
+ GREP=/usr/gnu/bin/grep;
+ fi
+ if [[ (-e "/usr/gnu/bin/egrep") ]]; then
+ EGREP=/usr/gnu/bin/egrep;
+ fi
+ if [[ (-e "/usr/gnu/bin/sed") ]]; then
+ SED=/usr/gnu/bin/sed;
+ fi
+ if [[ (-e "/usr/gnu/bin/awk") ]]; then
+ AWK=/usr/gnu/bin/awk;
+ else
+ AWK=nawk;
+ fi
+fi
+
+if [[ "$IS_DARWIN" -ne "0" ]]; then
+ SED_OPTS=(-i '')
+else
+ SED_OPTS=(-i)
+fi
+
+# Fixup
+if [[ ("$IS_FREEBSD" -ne "0" || "$IS_OPENBSD" -ne "0" || "$IS_NETBSD" -ne "0") ]]; then
+ MAKE=gmake
+elif [[ ("$IS_SOLARIS" -ne "0") ]]; then
+ MAKE=$(which gmake 2>/dev/null | "$GREP" -v "no gmake" | head -1)
+ if [[ (-z "$MAKE") && (-e "/usr/sfw/bin/gmake") ]]; then
+ MAKE=/usr/sfw/bin/gmake
+ fi
+else
+ MAKE=make
+fi
+
+# We need to use the C++ compiler to determine feature availablility. Otherwise
+# mis-detections occur on a number of platforms.
+if [[ ((-z "$CXX") || ("$CXX" == "gcc")) ]]; then
+ if [[ ("$CXX" == "gcc") ]]; then
+ CXX=g++
+ elif [[ "$IS_DARWIN" -ne "0" ]]; then
+ CXX=c++
+ elif [[ "$IS_SOLARIS" -ne "0" ]]; then
+ if [[ (-e "/opt/developerstudio12.5/bin/CC") ]]; then
+ CXX=/opt/developerstudio12.5/bin/CC
+ elif [[ (-e "/opt/solarisstudio12.4/bin/CC") ]]; then
+ CXX=/opt/solarisstudio12.4/bin/CC
+ elif [[ (-e "/opt/solarisstudio12.3/bin/CC") ]]; then
+ CXX=/opt/solarisstudio12.3/bin/CC
+ elif [[ (-e "/opt/solstudio12.2/bin/CC") ]]; then
+ CXX=/opt/solstudio12.2/bin/CC
+ elif [[ (-e "/opt/solstudio12.1/bin/CC") ]]; then
+ CXX=/opt/solstudio12.1/bin/CC
+ elif [[ (-e "/opt/solstudio12.0/bin/CC") ]]; then
+ CXX=/opt/solstudio12.0/bin/CC
+ elif [[ (! -z $(which CC 2>/dev/null | "$GREP" -v "no CC" | head -1)) ]]; then
+ CXX=$(which CC | head -1)
+ elif [[ (! -z $(which g++ 2>/dev/null | "$GREP" -v "no g++" | head -1)) ]]; then
+ CXX=$(which g++ | head -1)
+ else
+ CXX=CC
+ fi
+ elif [[ ($(which g++ 2>&1 | "$GREP" -v "no g++" | "$GREP" -i -c g++) -ne "0") ]]; then
+ CXX=g++
+ else
+ CXX=c++
+ fi
+fi
+
+SUN_COMPILER=$("$CXX" -V 2>&1 | "$EGREP" -i -c "CC: (Sun|Studio)")
+GCC_COMPILER=$("$CXX" --version 2>&1 | "$GREP" -i -v "clang" | "$EGREP" -i -c "(gcc|g\+\+)")
+INTEL_COMPILER=$("$CXX" --version 2>&1 | "$EGREP" -i -c "\(icc\)")
+MACPORTS_COMPILER=$("$CXX" --version 2>&1 | "$EGREP" -i -c "MacPorts")
+CLANG_COMPILER=$("$CXX" --version 2>&1 | "$EGREP" -i -c "clang")
+
+if [[ ("$SUN_COMPILER" -eq "0") ]]; then
+ AMD64=$("$CXX" -dM -E - </dev/null 2>/dev/null | "$EGREP" -c "(__x64_64__|__amd64__)")
+ ILP32=$("$CXX" -dM -E - </dev/null 2>/dev/null | "$EGREP" -c "(__ILP32__|__ILP32)")
+ if [[ ("$AMD64" -ne "0") && ("$ILP32" -ne "0") ]]; then
+ IS_X32=1
+ fi
+fi
+
+############################################
+
+# CPU is logical count, memory is in MiB. Low resource boards have
+# fewer than 4 cores and 1GB or less memory. We use this to
+# determine if we can build in parallel without an OOM kill.
+CPU_COUNT=1
+MEM_SIZE=512
+
+if [[ (-e "/proc/cpuinfo") && (-e "/proc/meminfo") ]]; then
+ CPU_COUNT=$(cat /proc/cpuinfo | "$GREP" -c '^processor')
+ MEM_SIZE=$(cat /proc/meminfo | "$GREP" "MemTotal" | "$AWK" '{print $2}')
+ MEM_SIZE=$(($MEM_SIZE/1024))
+elif [[ "$IS_DARWIN" -ne "0" ]]; then
+ CPU_COUNT=$(sysctl -a 2>&1 | "$GREP" 'hw.availcpu' | "$AWK" '{print $3; exit}')
+ MEM_SIZE=$(sysctl -a 2>&1 | "$GREP" 'hw.memsize' | "$AWK" '{print $3; exit;}')
+ MEM_SIZE=$(($MEM_SIZE/1024/1024))
+elif [[ "$IS_SOLARIS" -ne "0" ]]; then
+ CPU_COUNT=$(psrinfo 2>/dev/null | wc -l | "$AWK" '{print $1}')
+ MEM_SIZE=$(prtconf 2>/dev/null | "$GREP" Memory | "$AWK" '{print $3}')
+fi
+
+# Some ARM devboards cannot use 'make -j N', even with multiple cores and RAM
+# An 8-core Cubietruck Plus with 2GB RAM experiences OOM kills with '-j 2'.
+HAVE_SWAP=1
+if [[ "$IS_LINUX" -ne "0" ]]; then
+ if [[ (-e "/proc/meminfo") ]]; then
+ SWAP_SIZE=$(cat /proc/meminfo | "$GREP" "SwapTotal" | "$AWK" '{print $2}')
+ if [[ "$SWAP_SIZE" -eq "0" ]]; then
+ HAVE_SWAP=0
+ fi
+ else
+ HAVE_SWAP=0
+ fi
+fi
+
+if [[ ("$CPU_COUNT" -ge "2" && "$MEM_SIZE" -ge "1280" && "$HAVE_SWAP" -ne "0") ]]; then
+ if [[ ("$WANT_NICE" -eq "1") ]]; then
+ CPU_COUNT=$(echo -n "$CPU_COUNT 2" | "$AWK" '{print int($1/$2)}')
+ fi
+ MAKEARGS=(-j "$CPU_COUNT")
+ echo "Using $MAKE -j $CPU_COUNT"
+fi
+
+###############################################################################
+###############################################################################
+
+"$MAKE" distclean &>/dev/null
+
+git checkout "$OLD_VERSION_TAG" -f &>/dev/null
+
+rm -f GNUmakefile-symbols
+cp GNUmakefile GNUmakefile-symbols
+
+if [[ "$IS_DARWIN" -ne "0" ]]; then
+ "$SED" "$SED_OPTS" -e 's|libcryptopp.a $(TESTOBJS)|libcryptopp.dylib $(TESTOBJS)|g' GNUmakefile-symbols
+ "$SED" "$SED_OPTS" -e 's|$(TESTOBJS) ./libcryptopp.a |$(TESTOBJS) ./libcryptopp.dylib |g' GNUmakefile-symbols
+else
+ "$SED" "$SED_OPTS" -e 's|libcryptopp.a $(TESTOBJS)|libcryptopp.so $(TESTOBJS)|g' GNUmakefile-symbols
+ "$SED" "$SED_OPTS" -e 's|$(TESTOBJS) ./libcryptopp.a |$(TESTOBJS) ./libcryptopp.so |g' GNUmakefile-symbols
+fi
+
+git diff --exit-code
+
+echo "******************************************************"
+echo "Building library and cryptest.exe for $OLD_VERSION_TAG"
+echo "******************************************************"
+
+"$MAKE" "${MAKEARGS[@]}" -f GNUmakefile-symbols dynamic
+"$MAKE" "${MAKEARGS[@]}" -f GNUmakefile-symbols cryptest.exe
+
+if [[ -f "cryptest.exe" ]]; then
+ if [[ "$IS_DARWIN" -ne "0" ]]; then
+ DYLD_LIBRARY_PATH=".:$DYLD_LIBRARY_PATH" ./cryptest.exe v 2>&1 | c++filt
+ DYLD_LIBRARY_PATH=".:$DYLD_LIBRARY_PATH" ./cryptest.exe tv all 2>&1 | c++filt
+ else
+ LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" ./cryptest.exe v 2>&1 | c++filt
+ LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" ./cryptest.exe tv all 2>&1 | c++filt
+ fi
+else
+ echo "Failed to make cryptest.exe"
+fi
+
+echo "******************************************************"
+echo "Removing the dynamic library for $OLD_VERSION_TAG"
+echo "******************************************************"
+
+rm -f *.o *.so *.dylib
+
+git checkout "$NEW_VERSION_TAG" -f &>/dev/null
+
+echo "******************************************************"
+echo "Building dynamic library for $NEW_VERSION_TAG and linking into $OLD_VERSION_TAG cryptest.exe"
+echo "******************************************************"
+
+"$MAKE" "${MAKEARGS[@]}" -f GNUmakefile-symbols dynamic
+
+echo "******************************************************"
+echo "Linking $OLD_VERSION_TAG cryptest.exe to $NEW_VERSION_TAG dynamic library"
+echo "******************************************************"
+
+if [[ -f "cryptest.exe" ]]; then
+ if [[ "$IS_DARWIN" -ne "0" ]]; then
+ DYLD_LIBRARY_PATH=".:$DYLD_LIBRARY_PATH" ./cryptest.exe v 2>&1 | c++filt
+ DYLD_LIBRARY_PATH=".:$DYLD_LIBRARY_PATH" ./cryptest.exe tv all 2>&1 | c++filt
+ else
+ LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" ./cryptest.exe v 2>&1 | c++filt
+ LD_LIBRARY_PATH=".:$LD_LIBRARY_PATH" ./cryptest.exe tv all 2>&1 | c++filt
+ fi
+else
+ echo "Failed to make cryptest.exe"
+fi
+
+git checkout master -f