You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ck/configure

657 lines
16 KiB

#!/bin/sh
#
# Copyright © 2009-2013 Samy Al Bahra.
# Copyright © 2011 Devon H. O'Dell <devon.odell@gmail.com>
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
#
REQUIRE_HEADER="stdbool.h stddef.h stdint.h string.h"
EXIT_SUCCESS=0
EXIT_FAILURE=1
P_PWD=`pwd`
MAINTAINER='sbahra@repnop.org'
VERSION=${VERSION:-'0.3.2'}
VERSION_MAJOR='0'
BUILD="$PWD/build/ck.build"
PREFIX=${PREFIX:-"/usr/local"}
export CFLAGS
export PREFIX
LC_ALL=C
export LC_ALL
if test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
set -o posix
fi
trap epilog 1 2 3 6
epilog()
{
rm -f .1.c .1
}
assert()
{
if test "$#" -eq 2; then
fail=$2
print=true
elif test "$#" -eq 3; then
fail=$3
print=echo
else
echo "Usage: assert <test> <fail string> or assert <test> <success string> <fail string>" 1>&2
exit $EXIT_FAILURE
fi
if test -z "$1"; then
echo "failed [$fail]"
exit $EXIT_FAILURE
else
${print} "success [$1]"
fi
}
generate()
{
sed -e "s#@PROFILE@#$PROFILE#g" \
-e "s#@VERSION@#$VERSION#g" \
-e "s#@VERSION_MAJOR@#$VERSION_MAJOR#g" \
-e "s#@CC@#$CC#g" \
-e "s#@CFLAGS@#$CFLAGS#g" \
-e "s#@HEADERS@#$HEADERS#g" \
-e "s#@LIBRARY@#$LIBRARY#g" \
-e "s#@PREFIX@#$PREFIX#g" \
-e "s#@CORES@#$CORES#g" \
-e "s#@LD@#$LD#g" \
-e "s#@LDFLAGS@#$LDFLAGS#g" \
-e "s#@PTHREAD_CFLAGS@#$PTHREAD_CFLAGS#g" \
-e "s#@MANDIR@#$MANDIR#g" \
-e "s#@GZIP@#$GZIP#g" \
-e "s#@GZIP_SUFFIX@#$GZIP_SUFFIX#g" \
-e "s#@POINTER_PACK_ENABLE@#$POINTER_PACK_ENABLE#g" \
-e "s#@RTM_ENABLE@#$RTM_ENABLE#g" \
-e "s#@VMA_BITS@#$VMA_BITS_R#g" \
-e "s#@VMA_BITS_VALUE@#$VMA_BITS_VALUE_R#g" \
-e "s#@MM@#$MM#g" \
-e "s#@BUILD_DIR@#$P_PWD#g" \
-e "s#@SRC_DIR@#$BUILD_DIR#g" \
$1 > $2
}
generate_stdout()
{
echo
echo " VERSION = $VERSION"
echo " BUILD_DIR = $P_PWD"
echo " SRC_DIR = $BUILD_DIR"
echo " SYSTEM = $SYSTEM"
echo " PROFILE = $PROFILE"
echo " CC = $CC"
echo " COMPILER = $COMPILER"
echo " CFLAGS = $CFLAGS"
echo " PTHREAD_CFLAGS = $PTHREAD_CFLAGS"
echo " LD = $LD"
echo " LDFLAGS = $LDFLAGS"
echo " GZIP = $GZIP"
echo " CORES = $CORES"
echo " POINTER_PACK = $POINTER_PACK_ENABLE"
echo " VMA_BITS = $VMA_BITS"
echo " MEMORY_MODEL = $MM"
echo " RTM = $RTM_ENABLE"
echo
echo "Headers will be installed in $HEADERS"
echo "Libraries will be installed in $LIBRARY"
echo "Documentation will be installed in $MANDIR"
}
for option in $*; do
value=`echo "$option" | sed -e 's/^[^=]*=\(.*\)/\1/'`
case "$option" in
--help)
echo "Usage: $0 [OPTIONS]"
echo
echo "The following options may be used for cross-building."
echo " --profile=N Use custom build profile (use in conjunction with \$CC)"
echo
echo "The following options may be used to modify installation behavior."
echo " --includedir=N Headers directory (default is ${PREFIX}/include)"
echo " --libdir=N Libraries directory (default is ${PREFIX}/lib)"
echo " --mandir=N Manual pages directory (default is ${PREFIX}/man)"
echo " --prefix=N Installs library files in N (default is $PREFIX)"
echo
echo "The following options will modify code generation."
echo " --cores=N Specify number of cores available on target machine"
echo " --enable-pointer-packing Assumes address encoding is subset of pointer range"
echo " --enable-rtm Enable restricted transactional memory (x86_64 only)"
echo " --memory-model=N Specify memory model (currently tso, pso or rmo)"
echo " --vma-bits=N Specify valid number of VMA bits"
echo
echo "The following environment variables may be used:"
echo " CC C compiler command"
echo " CFLAGS C compiler flags"
echo " LDFLAGS Linker flags"
echo " GZIP GZIP compression tool"
echo
echo "Report bugs to ${MAINTAINER}."
exit $EXIT_SUCCESS
;;
--memory-model=*)
case "$value" in
"tso")
MM="CK_MD_TSO"
;;
"rmo")
MM="CK_MD_RMO"
;;
"pso")
MM="CK_MD_PSO"
;;
*)
echo "./configure [--help]"
exit $EXIT_FAILURE
;;
esac
;;
--vma-bits=*)
VMA_BITS=$value
;;
--enable-pointer-packing)
POINTER_PACK_ENABLE="CK_MD_POINTER_PACK_ENABLE"
;;
--enable-rtm)
RTM_ENABLE_SET="CK_MD_RTM_ENABLE"
;;
--cores=*)
CORES=$value
;;
--profile=*)
PROFILE=$value
;;
--prefix=*)
PREFIX=$value
;;
--includedir=*)
HEADERS=$value
;;
--libdir=*)
LIBRARY=$value
;;
--mandir=*)
MANDIR=$value
;;
*=*)
NAME=`expr "$option" : '\([^=]*\)='`
VALUE=`echo "$value" | sed "s/'/'\\\\\\\\''/g"`
eval "$NAME='$VALUE'"
export $NAME
;;
*)
echo "$0 [--help]"
exit $EXIT_FAILURE
;;
esac
done
HEADERS=${HEADERS:-"${PREFIX}/include"}
LIBRARY=${LIBRARY:-"${PREFIX}/lib"}
MANDIR=${MANDIR:-"${PREFIX}/share/man"}
GZIP=${GZIP:-"gzip -c"}
POINTER_PACK_ENABLE=${POINTER_PACK_ENABLE:-"CK_MD_POINTER_PACK_DISABLE"}
RTM_ENABLE=${RTM_ENABLE_SET:-"CK_MD_RTM_DISABLE"}
VMA_BITS=${VMA_BITS:-"unknown"}
if test "$PROFILE"; then
printf "Using user-specified profile....."
if test -z "$CC"; then
echo "failed [specify compiler]"
exit $EXIT_FAILURE
fi
if test ! -f build/ck.build.$PROFILE; then
echo "failed [$PROFILE]"
exit $EXIT_FAILURE
fi
echo "success [$PROFILE]"
printf "Generating header files.........."
generate include/ck_md.h.in include/ck_md.h
echo "success"
printf "Generating build files..........."
generate doc/Makefile.in doc/Makefile
generate build/ck.build.in build/ck.build
generate build/regressions.build.in build/regressions.build
generate build/ck.pc.in build/ck.pc
generate build/ck.spec.in build/ck.spec
generate Makefile.in Makefile
echo "success"
generate_stdout
exit $EXIT_SUCCESS
fi
DCORES=2
printf "Detecting operating system......."
SYSTEM=`uname -s 2> /dev/null`
case "$SYSTEM" in
"SunOS")
SYSTEM=solaris
;;
"Linux"|"uClinux")
DCORES=`egrep '(^CPU[0-9]+|^processor.*:.*)' /proc/cpuinfo|wc -l`
SYSTEM=linux
;;
"FreeBSD"|"GNU/kFreeBSD")
DCORES=`sysctl -n hw.ncpu`
SYSTEM=freebsd
;;
"NetBSD")
DCORES=`sysctl -n hw.ncpu`
SYSTEM=netbsd
;;
"OpenBSD")
DCORES=`sysctl -n hw.ncpu`
SYSTEM=openbsd
;;
"DragonFly")
DCORES=`sysctl -n hw.ncpu`
SYSTEM=dragonflybsd
;;
"Darwin")
DCORES=`sysctl -n hw.ncpu`
SYSTEM=darwin
;;
MINGW32*)
SYSTEM=mingw32
LDFLAGS="-mthreads $LDFLAGS"
;;
*)
SYSTEM=
;;
esac
assert "$SYSTEM" "$SYSTEM" "unsupported"
CORES=${CORES:-${DCORES}}
printf "Detecting machine architecture..."
PLATFORM=`uname -m 2> /dev/null`
case $PLATFORM in
"macppc"|"Power Macintosh"|"powerpc")
RTM_ENABLE="CK_MD_RTM_DISABLE"
MM="${MM:-"CK_MD_RMO"}"
PLATFORM=ppc
ENVIRONMENT=32
LDFLAGS="-m32 $LDFLAGS"
;;
"sun4u"|"sun4v"|"sparc64")
RTM_ENABLE="CK_MD_RTM_DISABLE"
MM="${MM:-"CK_MD_TSO"}"
PLATFORM=sparcv9
ENVIRONMENT=64
LDFLAGS="-m64 $LDFLAGS"
;;
i386|i486|i586|i686|i586_i686|pentium*|athlon*|k5|k6|k6_2|k6_3)
MM="${MM:-"CK_MD_TSO"}"
case $SYSTEM in
darwin)
ENVIRONMENT=64
PLATFORM=x86_64
;;
freebsd)
PLATFORM=x86
ENVIRONMENT=32
# FreeBSD doesn't give us a nice way to determine the CPU
# class of the running system, reporting any 32-bit x86
# architecture as i386. 486 is its minimum supported CPU
# class and cmpxchg8b was implemented first in i586.
dmesg | grep -q "486-class"
if test "$?" -eq 0; then
assert "" "" "Must have an i586 class or higher CPU"
fi
# FreeBSD still generates code for 486-class CPUs as its
# default 32-bit target, but we need 586 at the least.
echo "$CFLAGS" | grep -q 'march='
if test "$?" -ne 0; then
# Needed for cmpxchg8b
CFLAGS="$CFLAGS -march=i586"
fi
;;
linux)
case $PLATFORM in
i386|i486)
assert "" "" "Must have an i586 class or higher CPU"
;;
esac
PLATFORM=x86
ENVIRONMENT=32
;;
*)
PLATFORM=x86
ENVIRONMENT=32
assert "$PLATFORM $ENVIRONMENT" "$PLATFORM $ENVIRONMENT" "unsupported"
;;
esac
;;
"amd64"|"x86_64")
PLATFORM=x86_64
ENVIRONMENT=64
LDFLAGS="-m64 $LDFLAGS"
MM="${MM:-"CK_MD_TSO"}"
;;
"i86pc")
RTM_ENABLE="CK_MD_RTM_DISABLE"
MM="${MM:-"CK_MD_TSO"}"
ISA=`isainfo -n 2> /dev/null || echo i386`
case "$ISA" in
"amd64")
RTM_ENABLE=${RTM_ENABLE_SET:-"CK_MD_RTM_DISABLE"}
PLATFORM=x86_64
ENVIRONMENT=64
;;
*)
PLATFORM=x86
ENVIRONMENT=32
assert "$PLATFORM $ENVIRONMENT" "$PLATFORM $ENVIRONMENT" "unsupported"
;;
esac
;;
"ppc64")
RTM_ENABLE="CK_MD_RTM_DISABLE"
MM="${MM:-"CK_MD_RMO"}"
PLATFORM=ppc64
ENVIRONMENT=64
;;
arm|armv6l|armv7l)
RTM_ENABLE="CK_MD_RTM_DISABLE"
MM="${MM:-"CK_MD_RMO"}"
PLATFORM=arm
ENVIRONMENT=32
;;
*)
RTM_ENABLE="CK_MD_RTM_DISABLE"
PLATFORM=
MM="${MM:-"CK_MD_RMO"}"
;;
esac
assert "$PLATFORM" "$PLATFORM" "unsupported"
if test "$VMA" = "unknown"; then
echo "unknown"
VMA_BITS_R="CK_MD_VMA_BITS_UNKNOWN"
VMA_BITS_VALUE_R=""
POINTER_PACK_ENABLE="CK_MD_POINTER_PACK_DISABLE"
else
echo "success [$VMA]"
VMA_BITS_R="CK_MD_VMA_BITS"
VMA_BITS_VALUE_R="${VMA_BITS}ULL"
fi
# `which` on Solaris sucks
pathsearch()
{
what=$1
oldFS="$IFS"
IFS=":"
for d in $PATH ; do
if test -x "$d/$what" ; then
echo "$d/$what";
IFS="$oldFS"
return
fi
done
IFS="$oldFS"
}
printf "Finding dirname command.........."
DIRNAME=`pathsearch "${DIRNAME:-dirname}"`
if test -z "$DIRNAME" -o ! -x "$DIRNAME"; then
DIRNAME=`pathsearch "${DIRNAME:-dirname}"`
DIRNAME="$DIRNAME"
else
echo "success [$DIRNAME]"
fi
if test -z "$DIRNAME"; then
echo "not found (out of source build unsupported)"
else
printf "Determining build directory......"
BUILD_DIR=`$DIRNAME $0`
cd `$DIRNAME $0`
BUILD_DIR=`pwd`
echo "success [$BUILD_DIR]"
fi
printf "Finding gzip tool................"
GZIP=`pathsearch "${GZIP:-gzip}"`
if test -z "$GZIP" -o ! -x "$GZIP"; then
GZIP=`pathsearch "${GZIP:-gzip}"`
GZIP="$GZIP"
fi
if test -z "$GZIP"; then
echo "not found"
GZIP=cat
GZIP_SUFFIX=""
else
echo "success [$GZIP]"
GZIP="$GZIP -c"
GZIP_SUFFIX=".gz"
fi
printf "Finding suitable compiler........"
CC=`pathsearch "${CC:-cc}"`
if test -z "$CC" -o ! -x "$CC"; then
CC=`pathsearch "${CC:-gcc}"`
fi
assert "$CC" "not found"
cat << EOF > .1.c
#include <stdio.h>
int main(void) {
#if defined(_WIN32)
#if defined(__MINGW64__)
puts("mingw64");
return (0);
#elif defined(__MINGW32__) && (__MINGW32_MAJOR_VERSION >= 3)
puts("mingw32");
return (0);
#else
return (1);
#endif /* __MINGW32__ && __MINGW32_MAJOR_VERSION >= 3 */
#elif defined(__clang__) && (__clang_major__ >= 4)
puts("clang");
return (0);
#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5110)
puts("suncc");
return (0);
#elif defined(__GNUC__) && (__GNUC__ >= 4)
puts("gcc");
return (0);
#else
return (1);
#endif
}
EOF
$CC -o .1 .1.c
COMPILER=`./.1`
r=$?
rm -f .1.c .1
if test "$r" -ne 0; then
assert "" "update compiler"
else
echo "success [$CC]"
fi
if test "$COMPILER" = "suncc"; then
LD=/bin/ld
LDFLAGS="-G -z text -h libck.so.$VERSION_MAJOR $LDFLAGS"
CFLAGS="-xO5 $CFLAGS"
PTHREAD_CFLAGS="-mt -lpthread"
elif test "$COMPILER" = "gcc" || test "$COMPILER" = "clang" || test "$COMPILER" = "mingw32" || test "$COMPILER" = "mingw64"; then
LD=$CC
if test "$SYSTEM" = "darwin"; then
CC_WL_OPT="-install_name"
else
CC_WL_OPT="-soname"
fi
LDFLAGS="-shared -fPIC -Wl,$CC_WL_OPT,libck.so.$VERSION_MAJOR $LDFLAGS"
CFLAGS="-D_XOPEN_SOURCE=600 -D_BSD_SOURCE -std=gnu99 -pedantic -Wall -W -Wundef -Wendif-labels -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline -Wdisabled-optimization -fstrict-aliasing -O2 -pipe -Wno-parentheses $CFLAGS"
PTHREAD_CFLAGS="-pthread"
if test "$COMPILER" = "mingw64"; then
ENVIRONMENT=64
PLATFORM=x86_64
fi
else
assert "" "unknown compiler"
fi
printf "Detecting VMA bits..............."
VMA="unknown"
if test "$VMA_BITS" = "unknown"; then
if test "$PLATFORM" = "x86" || test $PLATFORM = "x86_64"; then
case $SYSTEM in
darwin)
VMA=`sysctl -n machdep.cpu.address_bits.virtual`
;;
linux)
VMA=`awk '/address sizes/ {print $7;exit}' /proc/cpuinfo`
;;
*)
if test "$PLATFORM" = "x86"; then
VMA="32"
else
cat << EOF > .1.c
#include <stdio.h>
int main(int argc, char *argv[])
{
unsigned long ret = 0x80000000;
__asm __volatile("cpuid\n"
: "+a" (ret));
if (ret >= 0x80000008) {
ret = 0x80000008;
__asm __volatile("cpuid\n"
: "+a" (ret));
printf("%lu\n", (ret >> 8) & 0xff);
} else {
return (1);
}
return (0);
}
EOF
$CC -o .1 .1.c 2>/dev/null
VMA=`./.1 2>/dev/null`
if test $? -ne 0; then
VMA="unknown"
fi
rm -f .1.c .1
fi
esac
fi
VMA_BITS=$VMA
else
VMA=$VMA_BITS
fi
if test "$VMA" = "unknown"; then
echo "unknown"
VMA_BITS_R="CK_MD_VMA_BITS_UNKNOWN"
VMA_BITS_VALUE_R=""
POINTER_PACK_ENABLE="CK_MD_POINTER_PACK_DISABLE"
else
echo "success [$VMA]"
VMA_BITS_R="CK_MD_VMA_BITS"
VMA_BITS_VALUE_R="${VMA_BITS}ULL"
fi
for i in $REQUIRE_HEADER; do
printf "Checking header file usability..."
cat << EOF > .1.c
#include <$i>
int main(void){return(0);}
EOF
$CC -o .1 .1.c 2> /dev/null
hf_s=$?
rm -f .1 .1.c
if test $hf_s -eq 0; then
echo "success [$i]"
else
echo "failed [$i]"
exit $EXIT_FAILURE
fi
done
# Platform will be used as a macro.
PROFILE="${PROFILE:-$PLATFORM}"
PLATFORM="__${PLATFORM}__"
printf "Generating header files.........."
generate include/ck_md.h.in include/ck_md.h
echo "success"
printf "Generating build files..........."
mkdir -p $P_PWD/doc
mkdir -p $P_PWD/build
mkdir -p $P_PWD/include
mkdir -p $P_PWD/src
if test "$P_PWD" '!=' "$BUILD_DIR"; then
mkdir -p $P_PWD/regressions
cp $BUILD_DIR/regressions/Makefile.unsupported $P_PWD/regressions/Makefile &> /dev/null
cp $BUILD_DIR/build/ck.build.$PROFILE $P_PWD/build/ck.build.$PROFILE &> /dev/null
cp $BUILD_DIR/include/ck_md.h $P_PWD/include/ck_md.h &> /dev/null
fi
generate src/Makefile.in $P_PWD/src/Makefile
generate doc/Makefile.in $P_PWD/doc/Makefile
generate build/ck.build.in $P_PWD/build/ck.build
generate build/regressions.build.in $P_PWD/build/regressions.build
generate build/ck.pc.in $P_PWD/build/ck.pc
generate build/ck.spec.in $P_PWD/build/ck.spec
generate Makefile.in $P_PWD/Makefile
touch src/*.c
echo "success"
generate_stdout