Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add cryptest-symbols.sh to test for symbol changes in shared object a…
…cross version
- Loading branch information
Showing
1 changed file
with
248 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |