#!/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
WANT_PIC=yes

P_PWD=`pwd`
MAINTAINER='sbahra@repnop.org'
VERSION=${VERSION:-'1.0.0'}
VERSION_MAJOR='0'
BUILD="$PWD/build/ck.build"
PREFIX=${PREFIX:-"/usr/local"}
LDNAME="libck.so"
LDNAME_VERSION="libck.so.$VERSION"
LDNAME_MAJOR="libck.so.$VERSION_MAJOR"

OPTION_CHECKING=1

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
}

get_git_sha()
{
    # return a short SHA for the current HEAD
    GIT_SHA=""
    GIT_MSG="success"
    gitcmd=`which git`
    if test -n "$gitcmd"; then
	GIT_SHA=`git rev-parse --short HEAD  2>/dev/null`
	if ! test -n "$GIT_SHA"; then
	    GIT_MSG="not within a git repo"
	fi
    else
	GIT_MSG="git not installed or executable"
    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#@ALL_LIBS@#$ALL_LIBS#g"			\
	    -e "s#@INSTALL_LIBS@#$INSTALL_LIBS#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#@DISABLE_DOUBLE@#$DISABLE_DOUBLE#g"		\
	    -e "s#@RTM_ENABLE@#$RTM_ENABLE#g"			\
	    -e "s#@LSE_ENABLE@#$LSE_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"			\
	    -e "s#@LDNAME@#$LDNAME#g"				\
	    -e "s#@LDNAME_MAJOR@#$LDNAME_MAJOR#g"		\
	    -e "s#@LDNAME_VERSION@#$LDNAME_VERSION#g"		\
	    -e "s#@PC_CFLAGS@#$PC_CFLAGS#g"			\
	    -e "s#@GIT_SHA@#$GIT_SHA#g"			        \
		$1 > $2
}

generate_stdout()
{

	echo
	echo "           VERSION = $VERSION"
	echo "           GIT_SHA = $GIT_SHA"
	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 "            LDNAME = $LDNAME"
	echo "    LDNAME_VERSION = $LDNAME_VERSION"
	echo "      LDNAME_MAJOR = $LDNAME_MAJOR"
	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 "               LSE = $LSE_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; do
	case "$option" in
	*=?*)
		optname=`echo $option|cut -c 3-`
		value=`expr "$optname" : '[^=]*=\(.*\)'`
		;;
	*=)
		value=
		;;
	*)
		value=yes
		;;
	esac

	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 affect generated code."
		echo "  --enable-pointer-packing Assumes address encoding is subset of pointer range"
		echo "  --enable-rtm             Enable restricted transactional memory (power, x86_64)"
		echo "  --enable-lse             Enable large system extensions (arm64)"
		echo "  --memory-model=N         Specify memory model (currently tso, pso or rmo)"
		echo "  --vma-bits=N             Specify valid number of VMA bits"
		echo "  --platform=N             Force the platform type, instead of relying on autodetection"
		echo "  --use-cc-builtins        Use the compiler atomic bultin functions, instead of the CK implementation"
		echo "  --disable-double         Don't generate any of the functions using the \"double\" type"
		echo
		echo "The following options affect regression testing."
		echo "  --cores=N                Specify number of cores available on target machine"
		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"
		;;
	--enable-lse)
		LSE_ENABLE_SET="CK_MD_LSE_ENABLE"
		;;
	--cores=*)
		CORES=$value
		;;
	--profile=*)
		PROFILE=$value
		;;
	--prefix=*)
		PREFIX=$value
		;;
	--includedir=*)
		HEADERS=$value
		;;
	--libdir=*)
		LIBRARY=$value
		;;
	--mandir=*)
		MANDIR=$value
		;;
	--with-pic)
		WANT_PIC=yes
		;;
	--without-pic)
		WANT_PIC=no
		;;
	--disable-option-checking)
		OPTION_CHECKING=0
		;;
	--use-cc-builtins)
		USE_CC_BUILTINS=1
		;;
	--disable-double)
		DISABLE_DOUBLE="CK_PR_DISABLE_DOUBLE"
		;;
	--platform=*)
		PLATFORM=$value
		;;
	--build=*|--host=*|--target=*|--exec-prefix=*|--bindir=*|--sbindir=*|\
	--sysconfdir=*|--datadir=*|--libexecdir=*|--localstatedir=*|\
	--enable-static|\
	--sharedstatedir=*|--infodir=*|--enable-shared|--disable-shared|\
	--cache-file=*|--srcdir=*)
		# ignore for compat with regular configure
		;;
	--*)
		if test "$OPTION_CHECKING" -eq 1; then
			echo "$0 [--help]"
			echo "Unknown option $option"
			exit $EXIT_FAILURE
		fi
		;;
	*=*)
		optname=`echo $option|cut -c 3-`
		NAME=`expr "$optname" : '\([^=]*\)='`
		eval "$NAME='$value'"
		export $NAME
		;;
	*)
		echo "$0 [--help]"
		echo "Unknown option $option"
		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"}
DISABLE_DOUBLE=${DISABLE_DOUBLE:-"CK_PR_ENABLE_DOUBLE"}
RTM_ENABLE=${RTM_ENABLE_SET:-"CK_MD_RTM_DISABLE"}
LSE_ENABLE=${LSE_ENABLE_SET:-"CK_MD_LSE_DISABLE"}
VMA_BITS=${VMA_BITS:-"unknown"}

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*|MSYS_NT*)
		SYSTEM=mingw32
		LDFLAGS="-mthreads $LDFLAGS"
		;;
  CYGWIN_NT*)
    SYSTEM=cygwin
    LDFLAGS="-mthreads $LDFLAGS"
    ;;
	*)
		SYSTEM=
		;;
esac

assert "$SYSTEM" "$SYSTEM" "unsupported"

CORES=${CORES:-${DCORES}}
printf "Detecting machine architecture..."
if test "x$PLATFORM" = "x"; then
	PLATFORM=`uname -m 2> /dev/null`
fi

case $PLATFORM in
	"macppc"|"Power Macintosh"|"powerpc")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		MM="${MM:-"CK_MD_RMO"}"
		PLATFORM=ppc
		ENVIRONMENT=32
		LDFLAGS="-m32 $LDFLAGS"
		;;
	"sun4u"|"sun4v"|"sparc64")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_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)
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		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")
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		PLATFORM=x86_64
		ENVIRONMENT=64
		LDFLAGS="-m64 $LDFLAGS"
		MM="${MM:-"CK_MD_TSO"}"
		;;
	"i86pc")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		MM="${MM:-"CK_MD_TSO"}"
		if test -z "$ISA"; then ISA=`isainfo -n 2> /dev/null || echo i386` ; fi
		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"|"ppc64le")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		MM="${MM:-"CK_MD_RMO"}"
		PLATFORM=ppc64
		ENVIRONMENT=64
		;;
	arm|armv6l|armv7l)
		if test "$PLATFORM" = "armv6l"; then
			CFLAGS="$CFLAGS -march=armv6k";
		elif test "$PLATFORM" = "armv7l"; then
			CFLAGS="$CFLAGS -march=armv7-a";
		fi
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		MM="${MM:-"CK_MD_RMO"}"
		PLATFORM=arm
		ENVIRONMENT=32
		;;
	"arm64"|"aarch64")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		MM="${MM:-"CK_MD_RMO"}"
		PLATFORM=aarch64
		ENVIRONMENT=64
		;;
	"s390x")
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		MM="${MM:-"CK_MD_RMO"}"
		PLATFORM=s390x
		ENVIRONMENT=64
		;;
	*)
		RTM_ENABLE="CK_MD_RTM_DISABLE"
		LSE_ENABLE="CK_MD_LSE_DISABLE"
		PLATFORM=
		MM="${MM:-"CK_MD_RMO"}"
		;;
esac

assert "$PLATFORM" "$PLATFORM" "unsupported"

if test "$VMA" = "unknown"; then
	VMA_BITS_R="CK_MD_VMA_BITS_UNKNOWN"
	VMA_BITS_VALUE_R=""
	POINTER_PACK_ENABLE="CK_MD_POINTER_PACK_DISABLE"
else
	VMA_BITS_R="CK_MD_VMA_BITS"
	VMA_BITS_VALUE_R="${VMA_BITS}ULL"
fi

if test "$USE_CC_BUILTINS"; then
	CFLAGS="$CFLAGS -DCK_CC_BUILTINS"
	PC_CFLAGS="-DCK_CC_BULITINS"
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........"
if test ! -x "${CC}"; then
	CC=`pathsearch "${CC:-cc}"`
	if test -z "$CC" -o ! -x "$CC"; then
		CC=`pathsearch "${CC:-gcc}"`
	fi
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__ >= 3)
	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 2> /dev/null`
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
	SONAME="$LDNAME_MAJOR"
	if test "$SYSTEM" = "darwin"; then
		CC_WL_OPT="-install_name"
		LDNAME="libck.dylib"
		LDNAME_VERSION="libck.$VERSION.dylib"
		LDNAME_MAJOR="libck.$VERSION_MAJOR.dylib"
		SONAME="$LIBRARY/$LDNAME_MAJOR"
	else
		CC_WL_OPT="-soname"
	fi

	LDFLAGS="-Wl,$CC_WL_OPT,$SONAME $LDFLAGS"
	if test "$WANT_PIC" = "yes"; then
		LDFLAGS="$LDFLAGS -shared -fPIC"
		CFLAGS="$CFLAGS -fPIC"
		ALL_LIBS="libck.so libck.a"
		INSTALL_LIBS="install-so install-lib"
	else
		LDFLAGS="$LDFLAGS -fno-PIC"
		CFLAGS="$CFLAGS -fno-PIC"
		ALL_LIBS="libck.a"
		INSTALL_LIBS="install-lib"
	fi

	CFLAGS="-D_XOPEN_SOURCE=600 -D_BSD_SOURCE -D_DEFAULT_SOURCE -std=gnu99 -pedantic -Wall -W -Wundef -Wendif-labels -Wshadow -Wpointer-arith -Wcast-align -Wcast-qual -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

printf "Detecting git SHA................"
get_git_sha
echo "$GIT_MSG [$GIT_SHA]"

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 src/Makefile.in src/Makefile
	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

# 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
