Merge branch 'master' into gfio
[fio.git] / configure
index 59899dbda9f99d53370ad2751412b3a16572f62d..1ca461dd739d3cd27b142b214dbdca34f0ce2d7d 100755 (executable)
--- a/configure
+++ b/configure
@@ -24,10 +24,22 @@ trap "rm -f $TMPC $TMPO $TMPE" EXIT INT QUIT TERM
 rm -rf config.log
 
 config_host_mak="config-host.mak"
-config_host_ld="config-host.ld"
+config_host_h="config-host.h"
+
+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
-CFLAGS="-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
@@ -36,6 +48,14 @@ printf " '%s'" "$0" "$@" >> config.log
 echo >> config.log
 echo "#" >> config.log
 
+# Print configure header at the top of $config_host_h
+echo "/*" > $config_host_h
+echo " * Automatically generated by configure - do not modify" >> $config_host_h
+printf " * Configured with:" >> $config_host_h
+printf " * '%s'" "$0" "$@" >> $config_host_h
+echo "" >> $config_host_h
+echo " */" >> $config_host_h
+
 do_cc() {
     # Run the compiler, capturing its output to the log.
     echo $cc "$@" >> config.log
@@ -58,8 +78,7 @@ do_cc() {
     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() {
@@ -68,7 +87,7 @@ 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
 }
@@ -79,8 +98,7 @@ feature_not_found() {
   echo "ERROR"
   echo "ERROR: User requested feature $feature"
   echo "ERROR: configure was not able to find it"
-  echo "ERROR"
-  exit 1;
+  fatal "ERROR"
 }
 
 has() {
@@ -100,24 +118,59 @@ EOF
   compile_object
 }
 
+output_sym() {
+  echo "$1=y" >> $config_host_mak
+  echo "#define $1" >> $config_host_h
+}
+
 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="$optarg"
+  ;;
+  --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=     Specify yes for a 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'
@@ -127,6 +180,12 @@ else
   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
@@ -147,24 +206,39 @@ SunOS)
   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
-  echo "CC=$CC"                    >  $config_host_mak
-  echo "CONFIG_LITTLE_ENDIAN=y"    >> $config_host_mak
-  echo "CONFIG_64BIT_LLP64=y"      >> $config_host_mak
-  echo "CONFIG_CLOCK_GETTIME=y"    >> $config_host_mak
-  echo "CONFIG_CLOCK_MONOTONIC=y"  >> $config_host_mak
-  echo "CONFIG_GETTIMEOFDAY=y"     >> $config_host_mak
-  echo "CONFIG_FADVISE=y"          >> $config_host_mak
-  echo "CONFIG_SOCKLEN_T=y"        >> $config_host_mak
-  echo "CONFIG_POSIX_FALLOCATE=y"  >> $config_host_mak
-  echo "CONFIG_FADVISE=y"          >> $config_host_mak
-  echo "CONFIG_SFAA=y"             >> $config_host_mak
+  output_sym "CONFIG_LITTLE_ENDIAN"
+  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_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 "BUILD_CFLAGS=$CFLAGS -include config-host.h -D_GNU_SOURCE" >> $config_host_mak
   exit 0
+  ;;
 esac
 
 if test ! -z "$cpu" ; then
@@ -228,12 +302,11 @@ case "$cpu" in
     cpu="sparc"
   ;;
   *)
-    echo "Unknown CPU"
-    exit 1;
+  echo "Unknown CPU"
   ;;
 esac
 
-if test -z $CC; then
+if test -z "$CC" ; then
   if test "$targetos" = "FreeBSD"; then
     if has clang; then
       CC=clang
@@ -245,10 +318,27 @@ fi
 
 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)
 {
@@ -256,8 +346,24 @@ 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
 
 
@@ -265,25 +371,52 @@ echo "Operating system              $targetos"
 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"
+else
+  feature_not_found "zlib"
+  zlib=no
+fi
+echo "zlib                          $zlib"
+
 ##########################################
 # linux-aio probe
 libaio="no"
@@ -376,7 +509,7 @@ sfaa="no"
 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)
@@ -389,7 +522,7 @@ EOF
 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
@@ -704,6 +837,24 @@ if compile_prog "" "-lnuma" "libnuma"; then
 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"
@@ -720,6 +871,22 @@ if compile_prog "" "" "strsep"; then
 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"
@@ -759,8 +926,7 @@ echo "inet_aton                     $inet_aton"
 # 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;
@@ -789,6 +955,48 @@ fi
 echo "__thread                      $tls_thread"
 
 ##########################################
+# Whether or not __thread is supported for TLS
+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 "gfio                          $gfio"
+
 # Check whether we have getrusage(RUSAGE_THREAD)
 rusage_thread="no"
 cat > $TMPC << EOF
@@ -806,110 +1014,171 @@ if compile_prog "" "" "RUSAGE_THREAD"; then
 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"
+
+#############################################################################
 
 if test "$wordsize" = "64" ; then
-  echo "CONFIG_64BIT=y" >> $config_host_mak
+  output_sym "CONFIG_64BIT"
 elif test "$wordsize" = "32" ; then
-  echo "CONFIG_32BIT=y" >> $config_host_mak
+  output_sym "CONFIG_32BIT"
 else
-  echo "Unknown wordsize!"
-  exit 1
+  fatal "Unknown wordsize!"
 fi
 if test "$bigendian" = "yes" ; then
-  echo "CONFIG_BIG_ENDIAN=y" >> $config_host_mak
+  output_sym "CONFIG_BIG_ENDIAN"
 else
-  echo "CONFIG_LITTLE_ENDIAN=y" >> $config_host_mak
+  output_sym "CONFIG_LITTLE_ENDIAN"
 fi
 if test "$libaio" = "yes" ; then
-  echo "CONFIG_LIBAIO=y" >> $config_host_mak
+  output_sym "CONFIG_LIBAIO"
 fi
 if test "$posix_aio" = "yes" ; then
-  echo "CONFIG_POSIXAIO=y" >> $config_host_mak
+  output_sym "CONFIG_POSIXAIO"
 fi
 if test "$posix_aio_fsync" = "yes" ; then
-  echo "CONFIG_POSIXAIO_FSYNC=y" >> $config_host_mak
+  output_sym "CONFIG_POSIXAIO_FSYNC"
 fi
 if test "$linux_fallocate" = "yes" ; then
-  echo "CONFIG_LINUX_FALLOCATE=y" >> $config_host_mak
+  output_sym "CONFIG_LINUX_FALLOCATE"
 fi
 if test "$posix_fallocate" = "yes" ; then
-  echo "CONFIG_POSIX_FALLOCATE=y" >> $config_host_mak
+  output_sym "CONFIG_POSIX_FALLOCATE"
 fi
 if test "$fdatasync" = "yes" ; then
-  echo "CONFIG_FDATASYNC=y" >> $config_host_mak
+  output_sym "CONFIG_FDATASYNC"
 fi
 if test "$sync_file_range" = "yes" ; then
-  echo "CONFIG_SYNC_FILE_RANGE=y" >> $config_host_mak
+  output_sym "CONFIG_SYNC_FILE_RANGE"
 fi
 if test "$sfaa" = "yes" ; then
-  echo "CONFIG_SFAA=y" >> $config_host_mak
+  output_sym "CONFIG_SFAA"
 fi
-if test "$libverbs" = "yes" -o "rdmacm" = "yes" ; then
-  echo "CONFIG_RDMA=y" >> $config_host_mak
+if test "$libverbs" = "yes" -a "rdmacm" = "yes" ; then
+  output_sym "CONFIG_RDMA"
 fi
 if test "$clock_gettime" = "yes" ; then
-  echo "CONFIG_CLOCK_GETTIME=y" >> $config_host_mak
+  output_sym "CONFIG_CLOCK_GETTIME"
 fi
 if test "$clock_monotonic" = "yes" ; then
-  echo "CONFIG_CLOCK_MONOTONIC=y" >> $config_host_mak
+  output_sym "CONFIG_CLOCK_MONOTONIC"
 fi
 if test "$clock_monotonic_precise" = "yes" ; then
-  echo "CONFIG_CLOCK_MONOTONIC_PRECISE=y" >> $config_host_mak
+  output_sym "CONFIG_CLOCK_MONOTONIC_PRECISE"
 fi
 if test "$gettimeofday" = "yes" ; then
-  echo "CONFIG_GETTIMEOFDAY=y" >> $config_host_mak
+  output_sym "CONFIG_GETTIMEOFDAY"
 fi
 if test "$posix_fadvise" = "yes" ; then
-  echo "CONFIG_POSIX_FADVISE=y" >> $config_host_mak
+  output_sym "CONFIG_POSIX_FADVISE"
 fi
 if test "$linux_3arg_affinity" = "yes" ; then
-  echo "CONFIG_3ARG_AFFINITY=y" >> $config_host_mak
+  output_sym "CONFIG_3ARG_AFFINITY"
 elif test "$linux_2arg_affinity" = "yes" ; then
-  echo "CONFIG_2ARG_AFFINITY=y" >> $config_host_mak
+  output_sym "CONFIG_2ARG_AFFINITY"
 fi
 if test "$strsep" = "yes" ; then
-  echo "CONFIG_STRSEP=y" >> $config_host_mak
+  output_sym "CONFIG_STRSEP"
+fi
+if test "$strcasestr" = "yes" ; then
+  output_sym "CONFIG_STRCASESTR"
 fi
 if test "$getopt_long_only" = "yes" ; then
-  echo "CONFIG_GETOPT_LONG_ONLY=y" >> $config_host_mak
+  output_sym "CONFIG_GETOPT_LONG_ONLY"
 fi
 if test "$inet_aton" = "yes" ; then
-  echo "CONFIG_INET_ATON=y" >> $config_host_mak
+  output_sym "CONFIG_INET_ATON"
 fi
 if test "$socklen_t" = "yes" ; then
-  echo "CONFIG_SOCKLEN_T=y" >> $config_host_mak
+  output_sym "CONFIG_SOCKLEN_T"
 fi
 if test "$ext4_me" = "yes" ; then
-  echo "CONFIG_LINUX_EXT4_MOVE_EXTENT=y" >> $config_host_mak
+  output_sym "CONFIG_LINUX_EXT4_MOVE_EXTENT"
 fi
 if test "$linux_splice" = "yes" ; then
-  echo "CONFIG_LINUX_SPLICE=y" >> $config_host_mak
+  output_sym "CONFIG_LINUX_SPLICE"
 fi
 if test "$guasi" = "yes" ; then
-  echo "CONFIG_GUASI=y" >> $config_host_mak
+  output_sym "CONFIG_GUASI"
 fi
 if test "$fusion_aw" = "yes" ; then
-  echo "CONFIG_FUSION_AW=y" >> $config_host_mak
+  output_sym "CONFIG_FUSION_AW"
 fi
-if test "$libnuma" = "yes" ; then
-  echo "CONFIG_LIBNUMA=y" >> $config_host_mak
+if test "$libnuma_v2" = "yes" ; then
+  output_sym "CONFIG_LIBNUMA"
 fi
 if test "$solaris_aio" = "yes" ; then
-  echo "CONFIG_SOLARISAIO=y" >> $config_host_mak
+  output_sym "CONFIG_SOLARISAIO"
 fi
 if test "$tls_thread" = "yes" ; then
-  echo "CONFIG_TLS_THREAD=y" >> $config_host_mak
+  output_sym "CONFIG_TLS_THREAD"
 fi
 if test "$rusage_thread" = "yes" ; then
-  echo "CONFIG_RUSAGE_THREAD=y" >> $config_host_mak
+  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
 
 echo "LIBS+=$LIBS" >> $config_host_mak
+echo "CFLAGS+=$CFLAGS" >> $config_host_mak
 echo "CC=$cc" >> $config_host_mak
-echo "CFLAGS=$CFLAGS" >> $config_host_mak
+echo "BUILD_CFLAGS=$BUILD_CFLAGS $CFLAGS" >> $config_host_mak