rm -rf $config_host_mak
rm -rf $config_host_h
+fatal() {
+ echo $@
+ echo "Configure failed, check config.log and/or the above output"
+ rm -rf $config_host_mak
+ rm -rf $config_host_h
+ exit 1
+}
+
# Default CFLAGS
-EXTFLAGS="-include config-host.h -D_GNU_SOURCE"
+CFLAGS="-D_GNU_SOURCE -include config-host.h"
+BUILD_CFLAGS=""
# Print a helpful header at the top of config.log
echo "# FIO configure log $(date)" >> config.log
echo "ERROR: configure test passed without -Werror but failed with -Werror."
echo "This is probably a bug in the configure script. The failing command"
echo "will be at the bottom of config.log."
- echo "You can run configure with --disable-werror to bypass this check."
- exit 1
+ fatal "You can run configure with --disable-werror to bypass this check."
}
compile_object() {
compile_prog() {
local_cflags="$1"
- local_ldflags="$2"
+ local_ldflags="$2 $LIBS"
echo "Compiling test case $3" >> config.log
do_cc $CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
}
feature_not_found() {
feature=$1
+ packages=$2
echo "ERROR"
echo "ERROR: User requested feature $feature"
+ if test ! -z "$packages" ; then
+ echo "ERROR: That feature needs $packages installed"
+ fi
echo "ERROR: configure was not able to find it"
- echo "ERROR"
- exit 1;
+ fatal "ERROR"
}
has() {
targetos=""
cpu=""
+cross_prefix=${cross_prefix-${CROSS_COMPILE}}
cc="${CC-${cross_prefix}gcc}"
+# default options
+show_help="no"
+exit_val=0
+gfio="no"
+
# parse options
for opt do
optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
case "$opt" in
+ --cpu=*) cpu="$optarg"
+ ;;
--cc=*) CC="$optarg"
;;
+ --extra-cflags=*) CFLAGS="$CFLAGS $optarg"
+ ;;
+ --build-32bit-win) build_32bit_win="yes"
+ ;;
+ --enable-gfio)
+ gfio="yes"
+ ;;
+ --help)
+ show_help="yes"
+ ;;
*)
echo "Bad option $opt"
- exit 1
+ show_help="yes"
+ exit_val=1
esac
done
-if check_define __linux__ ; then
+if test "$show_help" = "yes" ; then
+ echo "--cpu= Specify target CPU if auto-detect fails"
+ echo "--cc= Specify compiler to use"
+ echo "--extra-cflags= Specify extra CFLAGS to pass to compiler"
+ echo "--build-32bit-win Enable 32-bit build on Windows"
+ echo "--enable-gfio Enable building of gtk gfio"
+ exit $exit_val
+fi
+
+if check_define __ANDROID__ ; then
+ targetos="Android"
+elif check_define __linux__ ; then
targetos="Linux"
elif check_define __OpenBSD__ ; then
targetos='OpenBSD'
targetos=`uname -s`
fi
+echo "# Automatically generated by configure - do not modify" > $config_host_mak
+printf "# Configured with:" >> $config_host_mak
+printf " '%s'" "$0" "$@" >> $config_host_mak
+echo >> $config_host_mak
+echo "CONFIG_TARGET_OS=$targetos" >> $config_host_mak
+
# Some host OSes need non-standard checks for which CPU to use.
# Note that these checks are broken for cross-compilation: if you're
# cross-compiling to one of these OSes then you'll need to specify
if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
cpu="x86_64"
fi
+ LIBS="-lnsl -lsocket"
;;
CYGWIN*)
echo "Forcing known good options on Windows"
if test -z "$CC" ; then
- CC="x86_64-w64-mingw32-gcc"
+ if test ! -z "$build_32bit_win" && test "$build_32bit_win" = "yes"; then
+ CC="i686-w64-mingw32-gcc"
+ else
+ CC="x86_64-w64-mingw32-gcc"
+ fi
fi
output_sym "CONFIG_LITTLE_ENDIAN"
- output_sym "CONFIG_64BIT_LLP64"
- output_sym "CONFIG_CLOCK_GETTIME"
- output_sym "CONFIG_CLOCK_MONOTONIC"
- output_sym "CONFIG_GETTIMEOFDAY"
+ if test ! -z "$build_32bit_win" && test "$build_32bit_win" = "yes"; then
+ output_sym "CONFIG_32BIT"
+ else
+ output_sym "CONFIG_64BIT_LLP64"
+ fi
output_sym "CONFIG_FADVISE"
output_sym "CONFIG_SOCKLEN_T"
- output_sym "CONFIG_POSIX_FALLOCATE"
output_sym "CONFIG_FADVISE"
output_sym "CONFIG_SFAA"
output_sym "CONFIG_RUSAGE_THREAD"
output_sym "CONFIG_WINDOWSAIO"
output_sym "CONFIG_FDATASYNC"
+ output_sym "CONFIG_CLOCK_MONOTONIC"
output_sym "CONFIG_GETTIMEOFDAY"
output_sym "CONFIG_CLOCK_GETTIME"
+ output_sym "CONFIG_SCHED_IDLE"
+ output_sym "CONFIG_TCP_NODELAY"
echo "CC=$CC" >> $config_host_mak
- echo "EXTFLAGS=-include config-host.h -D_GNU_SOURCE" >> $config_host_mak
+ echo "BUILD_CFLAGS=$CFLAGS -include config-host.h -D_GNU_SOURCE" >> $config_host_mak
exit 0
+ ;;
esac
if test ! -z "$cpu" ; then
cpu="sparc"
;;
*)
- echo "Unknown CPU"
- exit 1;
+ echo "Unknown CPU"
;;
esac
cc="${CC-${cross_prefix}gcc}"
+##########################################
+# check cross compile
+
+cross_compile="no"
+cat > $TMPC <<EOF
+int main(void)
+{
+ return 0;
+}
+EOF
+if compile_prog "" "" "cross"; then
+ $TMPE 2>/dev/null || cross_compile="yes"
+else
+ fatal "compile test failed"
+fi
+
##########################################
# check endianness
bigendian="no"
-cat > $TMPC <<EOF
+if test "$cross_compile" = "no" ; then
+ cat > $TMPC <<EOF
#include <inttypes.h>
int main(void)
{
return (*((uint8_t*)(&i))) == 0x67;
}
EOF
-if compile_prog "" "" "endian"; then
- $TMPE && bigendian="yes"
+ if compile_prog "" "" "endian"; then
+ $TMPE && bigendian="yes"
+ fi
+else
+ # If we're cross compiling, try our best to work it out and rely on the
+ # run-time check to fail if we get it wrong.
+ cat > $TMPC <<EOF
+#include <endian.h>
+int main(void)
+{
+#if __BYTE_ORDER != __BIG_ENDIAN
+# error "Unknown endianness"
+#endif
+}
+EOF
+ compile_prog "" "" "endian" && bigendian="yes"
+ check_define "__ARMEB__" && bigendian="yes"
+ check_define "__MIPSEB__" && bigendian="yes"
fi
echo "CPU $cpu"
echo "Big endian $bigendian"
echo "Compiler $cc"
+echo "Cross compile $cross_compile"
echo
##########################################
# check for wordsize
wordsize="0"
cat > $TMPC <<EOF
-#include <stdio.h>
+#include <limits.h>
+#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
int main(void)
{
- unsigned int wsize = sizeof(long) * 8;
- printf("%d\n", wsize);
+ BUILD_BUG_ON(sizeof(long)*CHAR_BIT != WORDSIZE);
return 0;
}
EOF
-if compile_prog "" "" "wordsize"; then
- wordsize=$($TMPE)
+if compile_prog "-DWORDSIZE=32" "" "wordsize"; then
+ wordsize="32"
+elif compile_prog "-DWORDSIZE=64" "" "wordsize"; then
+ wordsize="64"
+else
+ fatal "Unknown wordsize"
fi
echo "Wordsize $wordsize"
+##########################################
+# zlib probe
+zlib="no"
+cat > $TMPC <<EOF
+#include <zlib.h>
+int main(void)
+{
+ z_stream stream;
+ if (inflateInit(&stream) != Z_OK)
+ return 1;
+ return 0;
+}
+EOF
+if compile_prog "" "-lz" "zlib" ; then
+ zlib=yes
+ LIBS="-lz $LIBS"
+fi
+echo "zlib $zlib"
+
##########################################
# linux-aio probe
libaio="no"
LIBS="-laio $LIBS"
else
if test "$libaio" = "yes" ; then
- feature_not_found "linux AIO"
+ feature_not_found "linux AIO" "libaio-dev or libaio-devel"
fi
libaio=no
fi
cat > $TMPC << EOF
static int sfaa(int *ptr)
{
- return __sync_fetch_and_and(ptr, 0);
+ return __sync_fetch_and_add(ptr, 0);
}
int main(int argc, char **argv)
if compile_prog "" "" "__sync_fetch_and_add()" ; then
sfaa="yes"
fi
-echo "__sync_fetch_and add $sfaa"
+echo "__sync_fetch_and_add $sfaa"
##########################################
# libverbs probe
# fusion-aw probe
fusion_aw="no"
cat > $TMPC << EOF
-#include <nvm/vectored_write.h>
+#include <nvm/nvm_primitives.h>
int main(int argc, char **argv)
{
- struct vsl_iovec iov;
- return vsl_vectored_write(0, &iov, 0, O_ATOMIC);
+ nvm_version_t ver_info;
+ nvm_handle_t handle;
+
+ handle = nvm_get_handle(0, &ver_info);
+ return nvm_atomic_write(handle, 0, 0, 0);
}
EOF
-if compile_prog "" "-L/usr/lib/fio -lnvm-primitives" "fusion-aw"; then
- LIBS="-L/usr/lib/fio -lnvm-primitives $LIBS"
+if compile_prog "" "-L/usr/lib/fio -L/usr/lib/nvm -lnvm-primitives -lvsl -ldl" "fusion-aw"; then
+ LIBS="-L/usr/lib/fio -L/usr/lib/nvm -lnvm-primitives -lvsl -ldl $LIBS"
fusion_aw="yes"
fi
echo "Fusion-io atomic engine $fusion_aw"
fi
echo "libnuma $libnuma"
+##########################################
+# libnuma 2.x version API
+if test "$libnuma" = "yes" ; then
+libnuma_v2="no"
+cat > $TMPC << EOF
+#include <numa.h>
+int main(int argc, char **argv)
+{
+ struct bitmask *mask = numa_parse_nodestring(NULL);
+ return 0;
+}
+EOF
+if compile_prog "" "" "libnuma api"; then
+ libnuma_v2="yes"
+fi
+echo "libnuma v2 $libnuma_v2"
+fi
+
##########################################
# strsep() probe
strsep="no"
fi
echo "strsep $strsep"
+##########################################
+# strcasestr() probe
+strcasestr="no"
+cat > $TMPC << EOF
+#include <string.h>
+int main(int argc, char **argv)
+{
+ strcasestr(NULL, NULL);
+ return 0;
+}
+EOF
+if compile_prog "" "" "strcasestr"; then
+ strcasestr="yes"
+fi
+echo "strcasestr $strcasestr"
+
##########################################
# getopt_long_only() probe
getopt_long_only="no"
# socklen_t probe
socklen_t="no"
cat > $TMPC << EOF
-#include <string.h>
-#include <netinet/in.h>
+#include <sys/socket.h>
int main(int argc, char **argv)
{
socklen_t len = 0;
echo "__thread $tls_thread"
##########################################
+# Check if we have required gtk/glib support for gfio
+if test "$gfio" = "yes" ; then
+ cat > $TMPC << EOF
+#include <glib.h>
+#include <cairo.h>
+#include <gtk/gtk.h>
+int main(void)
+{
+ gdk_threads_enter();
+ gdk_threads_leave();
+
+ printf("%d", GTK_CHECK_VERSION(2, 18, 0));
+}
+EOF
+GTK_CFLAGS=$(pkg-config --cflags gtk+-2.0 gthread-2.0)
+if test "$?" != "0" ; then
+ echo "configure: gtk and gthread not found"
+ exit 1
+fi
+GTK_LIBS=$(pkg-config --libs gtk+-2.0 gthread-2.0)
+if test "$?" != "0" ; then
+ echo "configure: gtk and gthread not found"
+ exit 1
+fi
+if compile_prog "$GTK_CFLAGS" "$GTK_LIBS" "gfio" ; then
+ r=$($TMPE)
+ if test "$r" != "0" ; then
+ gfio="yes"
+ LIBS="$LIBS $GTK_LIBS"
+ CFLAGS="$CFLAGS $GTK_CFLAGS"
+ else
+ echo "GTK found, but need version 2.18 or higher"
+ gfio="no"
+ fi
+else
+ echo "Please install gtk and gdk libraries"
+ gfio="no"
+fi
+fi
+
+echo "gtk 2.18 or higher $gfio"
+
# Check whether we have getrusage(RUSAGE_THREAD)
rusage_thread="no"
cat > $TMPC << EOF
fi
echo "RUSAGE_THREAD $rusage_thread"
-#############################################################################
+##########################################
+# Check whether we have SCHED_IDLE
+sched_idle="no"
+cat > $TMPC << EOF
+#include <sched.h>
+int main(int argc, char **argv)
+{
+ struct sched_param p;
+ return sched_setscheduler(0, SCHED_IDLE, &p);
+}
+EOF
+if compile_prog "" "" "SCHED_IDLE"; then
+ sched_idle="yes"
+fi
+echo "SCHED_IDLE $sched_idle"
-echo "# Automatically generated by configure - do not modify" > $config_host_mak
-printf "# Configured with:" >> $config_host_mak
-printf " '%s'" "$0" "$@" >> $config_host_mak
-echo >> $config_host_mak
+##########################################
+# Check whether we have TCP_NODELAY
+tcp_nodelay="no"
+cat > $TMPC << EOF
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+int main(int argc, char **argv)
+{
+ return getsockopt(0, 0, TCP_NODELAY, NULL, NULL);
+}
+EOF
+if compile_prog "" "" "TCP_NODELAY"; then
+ tcp_nodelay="yes"
+fi
+echo "TCP_NODELAY $tcp_nodelay"
+
+##########################################
+# Check whether we have RLIMIT_MEMLOCK
+rlimit_memlock="no"
+cat > $TMPC << EOF
+#include <sys/time.h>
+#include <sys/resource.h>
+int main(int argc, char **argv)
+{
+ struct rlimit rl;
+ return getrlimit(RLIMIT_MEMLOCK, &rl);
+}
+EOF
+if compile_prog "" "" "RLIMIT_MEMLOCK"; then
+ rlimit_memlock="yes"
+fi
+echo "RLIMIT_MEMLOCK $rlimit_memlock"
+
+##########################################
+# Check whether we have pwritev/preadv
+pwritev="no"
+cat > $TMPC << EOF
+#include <stdio.h>
+#include <sys/uio.h>
+int main(int argc, char **argv)
+{
+ return pwritev(0, NULL, 1, 0) + preadv(0, NULL, 1, 0);
+}
+EOF
+if compile_prog "" "" "pwritev"; then
+ pwritev="yes"
+fi
+echo "pwritev/preadv $pwritev"
+
+
+#############################################################################
if test "$wordsize" = "64" ; then
output_sym "CONFIG_64BIT"
elif test "$wordsize" = "32" ; then
output_sym "CONFIG_32BIT"
else
- echo "Unknown wordsize!"
- exit 1
+ fatal "Unknown wordsize!"
fi
if test "$bigendian" = "yes" ; then
output_sym "CONFIG_BIG_ENDIAN"
else
output_sym "CONFIG_LITTLE_ENDIAN"
fi
+if test "$zlib" = "yes" ; then
+ output_sym "CONFIG_ZLIB"
+fi
if test "$libaio" = "yes" ; then
output_sym "CONFIG_LIBAIO"
fi
if test "$sfaa" = "yes" ; then
output_sym "CONFIG_SFAA"
fi
-if test "$libverbs" = "yes" -o "rdmacm" = "yes" ; then
+if test "$libverbs" = "yes" -a "rdmacm" = "yes" ; then
output_sym "CONFIG_RDMA"
fi
if test "$clock_gettime" = "yes" ; then
if test "$strsep" = "yes" ; then
output_sym "CONFIG_STRSEP"
fi
+if test "$strcasestr" = "yes" ; then
+ output_sym "CONFIG_STRCASESTR"
+fi
if test "$getopt_long_only" = "yes" ; then
output_sym "CONFIG_GETOPT_LONG_ONLY"
fi
if test "$fusion_aw" = "yes" ; then
output_sym "CONFIG_FUSION_AW"
fi
-if test "$libnuma" = "yes" ; then
+if test "$libnuma_v2" = "yes" ; then
output_sym "CONFIG_LIBNUMA"
fi
if test "$solaris_aio" = "yes" ; then
if test "$rusage_thread" = "yes" ; then
output_sym "CONFIG_RUSAGE_THREAD"
fi
+if test "$gfio" = "yes" ; then
+ echo "CONFIG_GFIO=y" >> $config_host_mak
+fi
+if test "$sched_idle" = "yes" ; then
+ output_sym "CONFIG_SCHED_IDLE"
+fi
+if test "$tcp_nodelay" = "yes" ; then
+ output_sym "CONFIG_TCP_NODELAY"
+fi
+if test "$rlimit_memlock" = "yes" ; then
+ output_sym "CONFIG_RLIMIT_MEMLOCK"
+fi
+if test "$pwritev" = "yes" ; then
+ output_sym "CONFIG_PWRITEV"
+fi
echo "LIBS+=$LIBS" >> $config_host_mak
+echo "CFLAGS+=$CFLAGS" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
-echo "EXTFLAGS=$EXTFLAGS" >> $config_host_mak
+echo "BUILD_CFLAGS=$BUILD_CFLAGS $CFLAGS" >> $config_host_mak