26bb137257
Multi instruction set XXhash build with runtime selection. Extend CPUID code to detect more instruction sets. Add options for BLAKE2 hash. Move GCC builtins into utils header. Bump file format version number due to extended digest flags. Add descriptions to digest list.
555 lines
12 KiB
Bash
Executable file
555 lines
12 KiB
Bash
Executable file
#!/bin/sh
|
|
|
|
usage() {
|
|
prog=$1
|
|
cat << _EOF
|
|
${prog} [<options>]
|
|
|
|
<options> can be one of the following:
|
|
|
|
--prefix=<val> The installation prefix (default: /usr).
|
|
--enable-debug Enable debug mode compilation (default: disabled).
|
|
--disable-allocator Disable use of internal memory allocator mechanism (default: enabled).
|
|
--enable-debug-stats Enable printing of some verbose debug info (default: disabled).
|
|
--with-libbsc=<path to libbsc source>
|
|
Enable support for libbsc (See: libbsc.com). Full path to the libbsc
|
|
source tree must be provided. It links the library statically.
|
|
--with-openssl=<path to OpenSSL installation tree> (Default: System)
|
|
This defaults to the system's OpenSSL library. You can use this option
|
|
if you want to use an alternate OpenSSL installation.
|
|
--with-zlib=<path to zlib installation tree> (Default: System)
|
|
Enable building against an alternate Zlib installation.
|
|
--with-bzlib=<path to Bzip2 library installation tree> (Default: System)
|
|
Enable building against an alternate Bzip2 and library installation.
|
|
--no-sse-detect Do NOT attempt to probe the system's SSE/AVX capability for build flags.
|
|
--use-key256 Use 256-bit encryption keys. Default key length is 128-bit.
|
|
--help Display this help message.
|
|
|
|
_EOF
|
|
}
|
|
|
|
arg1=$1
|
|
debug=0
|
|
allocator=1
|
|
debug_stats=0
|
|
prefix=/usr
|
|
libbsc_dir=
|
|
libbsc_lib=
|
|
libbsclflags=
|
|
libbscwrapobj=
|
|
libbscgenopt=
|
|
libbsccppflags=
|
|
openssl_prefix=
|
|
openssl_libdir=
|
|
openssl_incdir=
|
|
libbz2_libdir=
|
|
libz_libdir=
|
|
sha256asmobjs=
|
|
sha256objs=
|
|
keylen=
|
|
yasm=yasm
|
|
keccak_srcs=
|
|
keccak_hdrs=
|
|
keccak_srcs_asm=
|
|
extra_opt_flags=
|
|
zlib_prefix=
|
|
bzlib_prefix=
|
|
sse_detect=1
|
|
sse_opt_flags="-msse2"
|
|
|
|
rm -rf ./buildtmp
|
|
mkdir ./buildtmp
|
|
|
|
# Try a simple compilation
|
|
cat << _EOF > tst.c
|
|
#include <stdio.h>
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
long l;
|
|
printf("%lu\n", sizeof (l));
|
|
return (0);
|
|
}
|
|
_EOF
|
|
|
|
gcc tst.c -o tst
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "ERROR:"
|
|
echo "Cannot compile a simple program. GCC 4.4 and above is required"
|
|
echo "to build this program. Please include installation bindir of GCC in the PATH."
|
|
echo ""
|
|
rm -f tst.c
|
|
exit 1
|
|
fi
|
|
|
|
# Check bitness of system/toolchain
|
|
bitness=`./tst`
|
|
if [ $bitness -lt 8 ]
|
|
then
|
|
# Hmmm maybe default compilation is 32-bit. Re-try with m64 flag.
|
|
gcc -m64 tst.c -o tst
|
|
if [ $? -ne 0 ]
|
|
then
|
|
rm -f tst tst.c
|
|
echo "ERROR:"
|
|
echo "Only 64-bit platforms are supported."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
# If m64 compilation succeeds we assume platform to be 64-bit capable but
|
|
# explicit flag is reqd.
|
|
extra_opt_flags="-m64"
|
|
fi
|
|
rm -f tst tst.c
|
|
|
|
while [ "${arg1}" != "" ]
|
|
do
|
|
case "$arg1" in
|
|
--enable-debug) debug=1;;
|
|
--disable-allocator) allocator=0;;
|
|
--enable-debug-stats) debug_stats=1;;
|
|
--prefix=*)
|
|
pval=`echo ${arg1} | cut -f2 -d"="`
|
|
prefix=$pval
|
|
;;
|
|
--with-libbsc=*)
|
|
path=`echo ${arg1} | cut -f2 -d"="`
|
|
if [ -f ${path}/bsc.cpp -a -f ${path}/libbsc/libbsc.h ]
|
|
then
|
|
libbsc_dir="${path}"
|
|
libbsc_lib="${path}/libbsc.a"
|
|
libbsclflags='\$\(LIBBSCLFLAGS\)'
|
|
libbscwrapobj='\$\(LIBBSCWRAPOBJ\)'
|
|
libbscgenopt='\$\(LIBBSCGEN_OPT\)'
|
|
libbsccppflags='\$\(LIBBSCCPPFLAGS\)'
|
|
else
|
|
echo "Libbsc not found in ${path}, not enabling libbsc support.\n"
|
|
fi
|
|
;;
|
|
--with-openssl=*)
|
|
openssl_prefix=`echo ${arg1} | cut -f2 -d"="`
|
|
;;
|
|
--with-zlib=*)
|
|
zlib_prefix=`echo ${arg1} | cut -f2 -d"="`
|
|
;;
|
|
--with-bzlib=*)
|
|
bzlib_prefix=`echo ${arg1} | cut -f2 -d"="`
|
|
;;
|
|
--use-key256)
|
|
keylen='-DKEYLEN=32'
|
|
;;
|
|
--no-sse-detect)
|
|
sse_detect=0
|
|
;;
|
|
--help) usage $0;;
|
|
*)
|
|
echo "Unrecognized option: ${arg1}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
shift
|
|
arg1=$1
|
|
done
|
|
|
|
if [ $debug -eq 1 ]
|
|
then
|
|
typ="DEBUG"
|
|
else
|
|
typ="RELEASE"
|
|
fi
|
|
|
|
OS=$(uname)
|
|
skeinblock='\$\(SKEIN_BLOCK_C\)'
|
|
if [ "$OS" = "Linux" ]
|
|
then
|
|
plat=$(uname -m)
|
|
elif [ "$OS" = "SunOS" ]
|
|
then
|
|
plat=$(isainfo -v)
|
|
else
|
|
echo "Unsupported OS: $OS"
|
|
exit 1
|
|
fi
|
|
|
|
# Check GCC version
|
|
vers=`gcc -dumpversion`
|
|
OIFS="$IFS"
|
|
IFS=.
|
|
set -- ${vers}
|
|
IFS="$OIFS"
|
|
|
|
if [ $1 -lt 4 -o $2 -lt 4 ]
|
|
then
|
|
echo "ERROR:"
|
|
echo "GCC version 4.4 or above is required."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
|
|
# SSE Detection
|
|
if [ $sse_detect -eq 1 ]
|
|
then
|
|
gcc -o sse_level ./utils/sse_level.c ./utils/cpuid.c -I./utils
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "ERROR:"
|
|
echo "Failed to build SSE detection utility."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
sse_ver=`./sse_level`
|
|
if [ $? -ne 0 ]
|
|
then
|
|
rm -f sse_level
|
|
echo "ERROR:"
|
|
echo "SSE version detection utility. Try configuring with --no-sse-check option."
|
|
echo ""
|
|
exit 1
|
|
fi
|
|
rm -f sse_level
|
|
sse_opt_flags="-m${sse_ver}"
|
|
fi
|
|
|
|
|
|
echo $plat | egrep 'x86_64|amd64' > /dev/null
|
|
if [ $? -eq 0 ]
|
|
then
|
|
skeinblock='\$\(SKEIN_BLOCK_ASM\)'
|
|
yasm=
|
|
|
|
#
|
|
# Detect Yasm
|
|
#
|
|
for bindir in /bin /usr/bin /usr/local/bin
|
|
do
|
|
if [ -x ${bindir}/yasm ]
|
|
then
|
|
# Get yasm version
|
|
yver=`${bindir}/yasm --version | head -1 | awk '{print $2}'`
|
|
_OIFS=$IFS; IFS="."; set -- ${yver}; IFS="$_OIFS"
|
|
major=$1
|
|
minor=$2
|
|
|
|
# Minimum yasm version 1.1
|
|
[ $major -lt 1 -o $minor -lt 1 ] && continue
|
|
yasm=${bindir}/yasm
|
|
sha256asmobjs='\$\(SHA256ASM_OBJS\)'
|
|
sha256objs='\$\(SHA256_OBJS\)'
|
|
fi
|
|
done
|
|
if [ "x${yasm}" = "x" ]
|
|
then
|
|
echo "Yasm version 1.1 or later is required to build on x64 platforms"
|
|
exit 1
|
|
fi
|
|
|
|
if [ $debug -eq 1 ]
|
|
then
|
|
keccak_srcs='\$\(KECCAK_SRC_OPT64\)'
|
|
keccak_hdrs='\$\(KECCAK_HDRS_OPT64\)'
|
|
else
|
|
keccak_srcs='\$\(KECCAK_SRC_OPT64_ASM1\)'
|
|
keccak_srcs_asm='\$\(KECCAK_SRC_OPT64_ASM2\)'
|
|
keccak_hdrs='\$\(KECCAK_HDRS_OPT64_ASM\)'
|
|
fi
|
|
else
|
|
keccak_srcs='\$\(KECCAK_SRC_OPT64\)'
|
|
fi
|
|
|
|
# Detect OpenSSL library
|
|
for lib in "${openssl_prefix}/lib64" "${openssl_prefix}/usr/lib64" \
|
|
"${openssl_prefix}/lib" "${openssl_prefix}/usr/lib" \
|
|
"${openssl_prefix}/ssl/lib64" "${openssl_prefix}/ssl/lib" \
|
|
"${openssl_prefix}/lib/x86_64-linux-gnu" \
|
|
"${openssl_prefix}/usr/lib/x86_64-linux-gnu"
|
|
do
|
|
if [ -d ${lib} ]
|
|
then
|
|
if [ -f "${lib}/libcrypto.so" -o -h "${lib}/libcrypto.so" ]
|
|
then
|
|
openssl_libdir="${lib}"
|
|
(cd ./buildtmp; ln -s ${openssl_libdir}/libcrypto.so)
|
|
break
|
|
else
|
|
if [ -f "${lib}/libcrypto.a" ]
|
|
then
|
|
openssl_libdir="${lib}"
|
|
(cd ./buildtmp; ln -s ${openssl_libdir}/libcrypto.a)
|
|
break
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ "x${openssl_libdir}" = "x" ]
|
|
then
|
|
echo "ERROR: OpenSSL libraries not detected."
|
|
exit 1
|
|
fi
|
|
|
|
# Detect OpenSSL headers
|
|
for inc in "${openssl_prefix}/include" \
|
|
"${openssl_prefix}/usr/include" \
|
|
"${openssl_prefix}/ssl/include"
|
|
do
|
|
if [ -d ${inc} ]
|
|
then
|
|
if [ -f "${inc}/openssl/sha.h" ]
|
|
then
|
|
openssl_incdir=${inc}
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
|
|
if [ "x${openssl_incdir}" = "x" ]
|
|
then
|
|
echo "ERROR: OpenSSL header files not detected."
|
|
if [ "x${openssl_prefix}" = "x" ]
|
|
then
|
|
echo "Depending on your system you may need to install the openssl-devel or openssl-dev package."
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
|
|
# Check for OpenSSL version
|
|
cat << __EOF > tst.c
|
|
#include <stdlib.h>
|
|
#include <openssl/opensslv.h>
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
if (OPENSSL_VERSION_NUMBER < 0x0090805fL)
|
|
exit (1);
|
|
return (0);
|
|
}
|
|
__EOF
|
|
|
|
gcc ${extra_opt_flags} -I${openssl_incdir} -L${openssl_libdir} tst.c -o tst
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "Unable to compile OpenSSL test program please check OpenSSL installation."
|
|
exit 1
|
|
fi
|
|
./tst
|
|
if [ $? -ne 0 ]
|
|
then
|
|
echo "OpenSSL version too old. At least version 0.9.8e is required.\n"
|
|
exit 1
|
|
fi
|
|
|
|
# Check for HMAC_CTX_copy function
|
|
cat << __EOF > tst.c
|
|
#include <stdlib.h>
|
|
#include <openssl/sha.h>
|
|
#include <openssl/rand.h>
|
|
#include <openssl/evp.h>
|
|
#include <openssl/hmac.h>
|
|
|
|
int
|
|
main(void)
|
|
{
|
|
unsigned char key[16];
|
|
HMAC_CTX *ctx = (HMAC_CTX *)malloc(sizeof (HMAC_CTX));
|
|
HMAC_CTX *ctx1 = (HMAC_CTX *)malloc(sizeof (HMAC_CTX));
|
|
|
|
HMAC_CTX_init(ctx);
|
|
HMAC_Init_ex(ctx, key, 16, EVP_sha256(), NULL);
|
|
HMAC_CTX_copy(ctx1, ctx);
|
|
|
|
return (0);
|
|
}
|
|
__EOF
|
|
|
|
gcc ${extra_opt_flags} -I${openssl_incdir} -L${openssl_libdir} -O0 -g tst.c -o tst -lcrypto >/dev/null 2>&1
|
|
if [ $? -ne 0 ]
|
|
then
|
|
openssl_incdir="${openssl_incdir} -D__OSSL_OLD__"
|
|
fi
|
|
|
|
rm -f tst*
|
|
openssl_libdir="${openssl_libdir},--enable-new-dtags"
|
|
|
|
# Detect other library packages
|
|
for libspec in "libbz2:${bzlib_prefix}" "libz:${zlib_prefix}"
|
|
do
|
|
_OIFS="$IFS"
|
|
IFS=":"
|
|
set -- ${libspec}
|
|
libname=$1
|
|
pref=$2
|
|
IFS="$_OIFS"
|
|
|
|
use_prefix="${pref}"
|
|
if [ "x${pref}" = "x" ]
|
|
then
|
|
use_prefix="$prefix"
|
|
fi
|
|
for lib in "${pref}/lib64" "${pref}/usr/lib64" "${pref}/lib" "${pref}/usr/lib" \
|
|
"${pref}/lib/x86_64-linux-gnu" "${pref}/usr/lib/x86_64-linux-gnu" \
|
|
"${pref}/local/lib64" "${pref}/usr/local/lib64" "${pref}/local/lib" "${pref}/usr/local/lib" \
|
|
"${pref}/local/lib/x86_64-linux-gnu" "${pref}/usr/local/lib/x86_64-linux-gnu" \
|
|
"${use_prefix}/lib64" "${use_prefix}/lib" "${use_prefix}/lib/x86_64-linux-gnu" \
|
|
"${use_prefix}/usr/lib/x86_64-linux-gnu"
|
|
do
|
|
if [ -d ${lib} ]
|
|
then
|
|
if [ -f "${lib}/${libname}.so" -o -h "${lib}/${libname}.so" ]
|
|
then
|
|
eval "${libname}_libdir=${lib},--enable-new-dtags"
|
|
(cd ./buildtmp; ln -s ${lib}/${libname}.so)
|
|
break
|
|
else
|
|
if [ -f "${lib}/${libname}.a" ]
|
|
then
|
|
eval "${libname}_libdir=${lib},--enable-new-dtags"
|
|
(cd ./buildtmp; ln -s ${lib}/${libname}.a)
|
|
break
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
|
|
if [ "x${libbz2_libdir}" = "x" ]
|
|
then
|
|
if [ "x$bzlib_prefix" = "x" ]
|
|
then
|
|
echo "ERROR: Libbz2 not detected."
|
|
echo " You may have to install libbz2-devel or libbz2-dev"
|
|
else
|
|
echo "ERROR: Bzip2 library not detected in given prefix."
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
if [ "x${libz_libdir}" = "x" ]
|
|
then
|
|
if [ "x$zlib_prefix" = "x" ]
|
|
then
|
|
echo "ERROR: Zlib not detected."
|
|
echo " You may have to install libz-devel or libz-dev"
|
|
else
|
|
echo "ERROR: Zlib not detected in given prefix."
|
|
fi
|
|
exit 1
|
|
fi
|
|
|
|
libbz2_inc=
|
|
libz_inc=
|
|
# Detect other library headers
|
|
for hdr in "libbz2_inc:bzlib.h:${bzlib_prefix}" "libz_inc:zlib.h:${zlib_prefix}"
|
|
do
|
|
_OIFS="$IFS"
|
|
IFS=":"
|
|
set -- ${hdr}
|
|
var=$1
|
|
hdrf=$2
|
|
pref=$3
|
|
IFS="$_OIFS"
|
|
|
|
use_prefix="${pref}"
|
|
if [ "x${pref}" = "x" ]
|
|
then
|
|
use_prefix="$prefix"
|
|
fi
|
|
for inc in "${pref}/include" "${pref}/usr/include" \
|
|
"${pref}/local/include" "${pref}/usr/local/include" \
|
|
"${use_prefix}/include" "${use_prefix}/usr/include"
|
|
do
|
|
if [ -d ${inc} ]
|
|
then
|
|
if [ -f "${inc}/${hdrf}" ]
|
|
then
|
|
eval "${var}=\"-I${inc}\""
|
|
break
|
|
fi
|
|
fi
|
|
done
|
|
done
|
|
|
|
linkvar="LINK"
|
|
compilevar="COMPILE"
|
|
compilecppvar="COMPILE_cpp"
|
|
vecflagsvar="VEC_FLAGS"
|
|
loopoptflagsvar="LOOP_OPTFLAGS"
|
|
cppflagsvar="CPPFLAGS"
|
|
genoptvar="GEN_OPT"
|
|
noslabcppflagsvar="NO_SLAB_CPPFLAGS"
|
|
debugstatscppflagsvar="DEBUG_STATS_CPPFLAGS"
|
|
prefixvar="PREFIX"
|
|
skeinblockvar="SKEIN_BLOCK"
|
|
keylenvar="KEYLEN"
|
|
|
|
libbscdirvar="LIBBSCDIR"
|
|
libbsclibvar="LIBBSCLIB"
|
|
libbsclflagsvar="LIBBSCLFLAGS"
|
|
libbscwrapobjvar="LIBBSCWRAPOBJ"
|
|
libbscgenoptvar="LIBBSCGEN_OPT"
|
|
libbsccppflagsvar="LIBBSCCPPFLAGS"
|
|
sha256asmobjsvar="SHA256ASM_OBJS"
|
|
sha256objsvar="SHA256_OBJS"
|
|
yasmvar="YASM"
|
|
fptr_flag_var="FPTR_FLAG"
|
|
extra_opt_flags_var="EXTRA_OPT_FLAGS"
|
|
sse_opt_flags_var="SSE_OPT_FLAGS"
|
|
|
|
openssllibdirvar="OPENSSL_LIBDIR"
|
|
opensslincdirvar="OPENSSL_INCDIR"
|
|
libbz2libdirvar="LIBBZ2_DIR"
|
|
libzlibdirvar="LIBZ_DIR"
|
|
libbz2incvar="LIBBZ2_INC"
|
|
libzincvar="LIBZ_INC"
|
|
|
|
keccak_srcs_var="KECCAK_SRCS"
|
|
keccak_hdrs_var="KECCAK_HDRS"
|
|
keccak_srcs_asm_var="KECCAK_SRCS_ASM"
|
|
|
|
noslabcppflagsval=
|
|
debugstatscppflagsval=
|
|
|
|
[ $allocator -eq 0 ] && noslabcppflagsval='\$\(NO_SLAB_CPPFLAGS\)'
|
|
[ $debug_stats -eq 1 ] && debugstatscppflagsval='\$\(DEBUG_STATS_CPPFLAGS\)'
|
|
|
|
cat Makefile.in | sed "
|
|
s#@${linkvar}@#\\\$\\(${typ}_${linkvar}\\)#g
|
|
s#@${compilevar}@#\\\$\\(${typ}_${compilevar}\\)#g
|
|
s#@${compilecppvar}@#\\\$\\(${typ}_${compilecppvar}\\)#g
|
|
s#@${vecflagsvar}@#\\\$\\(${typ}_${vecflagsvar}\\)#g
|
|
s#@${loopoptflagsvar}@#\\\$\\(${typ}_${loopoptflagsvar}\\)#g
|
|
s#@${cppflagsvar}@#\\\$\\(${typ}_${cppflagsvar}\\)#g
|
|
s#@${genoptvar}@#\\\$\\(${typ}_${genoptvar}\\)#g
|
|
s#@${fptr_flag_var}@#\\\$\\(${typ}_${fptr_flag_var}\\)#g
|
|
s#@${noslabcppflagsvar}@#${noslabcppflagsval}#g
|
|
s#@${debugstatscppflagsvar}@#${debugstatscppflagsval}#g
|
|
s#@${prefixvar}@#${prefix}#g
|
|
s#@${libbscdirvar}@#${libbsc_dir}#g
|
|
s#@${libbsclibvar}@#${libbsc_lib}#g
|
|
s#@${libbsclflagsvar}@#${libbsclflags}#g
|
|
s#@${libbscwrapobjvar}@#${libbscwrapobj}#g
|
|
s#@${libbscgenoptvar}@#${libbscgenopt}#g
|
|
s#@${libbsccppflagsvar}@#${libbsccppflags}#g
|
|
s#@${skeinblockvar}@#${skeinblock}#g
|
|
s#@${openssllibdirvar}@#${openssl_libdir}#g
|
|
s#@${opensslincdirvar}@#${openssl_incdir}#g
|
|
s#@${sha256asmobjsvar}@#${sha256asmobjs}#g
|
|
s#@${sha256objsvar}@#${sha256objs}#g
|
|
s#@${yasmvar}@#${yasm}#g
|
|
s#@${keylenvar}@#${keylen}#g
|
|
s#@${libbz2libdirvar}@#${libbz2_libdir}#g
|
|
s#@${libzlibdirvar}@#${libz_libdir}#g
|
|
s#@${libbz2incvar}@#${libbz2_inc}#g
|
|
s#@${libzincvar}@#${libz_inc}#g
|
|
s#@${keccak_srcs_var}@#${keccak_srcs}#g
|
|
s#@${keccak_hdrs_var}@#${keccak_hdrs}#g
|
|
s#@${keccak_srcs_var}@#${keccak_srcs}#g
|
|
s#@${keccak_srcs_asm_var}@#${keccak_srcs_asm}#g
|
|
s#@${extra_opt_flags_var}@#${extra_opt_flags}#g
|
|
s#@${sse_opt_flags_var}@#${sse_opt_flags}#g
|
|
" > Makefile
|
|
|