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"
fatal "ERROR"
}
targetos=""
cpu=""
-cross_prefix=${cross_prefix-${CROSS_COMPILE}}
-cc="${CC-${cross_prefix}gcc}"
-
# default options
show_help="no"
exit_val=0
-gfio="no"
+gfio_check="no"
+libhdfs="no"
# parse options
for opt do
case "$opt" in
--cpu=*) cpu="$optarg"
;;
+ # esx is cross compiled and cannot be detect through simple uname calls
+ --esx)
+ esx="yes"
+ ;;
--cc=*) CC="$optarg"
;;
--extra-cflags=*) CFLAGS="$CFLAGS $optarg"
;;
- --build-32bit-win=*) build_32bit_win="$optarg"
+ --build-32bit-win) build_32bit_win="yes"
+ ;;
+ --build-static) build_static="yes"
;;
--enable-gfio)
- gfio="yes"
+ gfio_check="yes"
+ ;;
+ --disable-numa) disable_numa="yes"
+ ;;
+ --disable-rbd) disable_rbd="yes"
+ ;;
+ --disable-gfapi) disable_gfapi="yes"
+ ;;
+ --enable-libhdfs) libhdfs="yes"
;;
--help)
show_help="yes"
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 "--build-32bit-win Enable 32-bit build on Windows"
+ echo "--build-static Build a static fio"
+ echo "--esx Configure build options for esx"
echo "--enable-gfio Enable building of gtk gfio"
+ echo "--disable-numa Disable libnuma even if found"
+ echo "--enable-libhdfs Enable hdfs support"
exit $exit_val
fi
+cross_prefix=${cross_prefix-${CROSS_COMPILE}}
+cc="${CC-${cross_prefix}gcc}"
+
if check_define __ANDROID__ ; then
targetos="Android"
elif check_define __linux__ ; then
targetos='OpenBSD'
elif check_define __sun__ ; then
targetos='SunOS'
+ CFLAGS="$CFLAGS -D_REENTRANT"
+elif check_define _WIN32 ; then
+ targetos='CYGWIN'
else
targetos=`uname -s`
fi
output_sym "CONFIG_CLOCK_GETTIME"
output_sym "CONFIG_SCHED_IDLE"
output_sym "CONFIG_TCP_NODELAY"
+ output_sym "CONFIG_TLS_THREAD"
+ output_sym "CONFIG_IPV6"
echo "CC=$CC" >> $config_host_mak
echo "BUILD_CFLAGS=$CFLAGS -include config-host.h -D_GNU_SOURCE" >> $config_host_mak
exit 0
echo "Cross compile $cross_compile"
echo
+##########################################
+# See if we need to build a static build
+if test "$build_static" = "yes" ; then
+ CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
+ LDFLAGS="$LDFLAGS -static -Wl,--gc-sections"
+else
+ build_static="no"
+fi
+echo "Static build $build_static"
+
##########################################
# check for wordsize
wordsize="0"
if compile_prog "" "-lz" "zlib" ; then
zlib=yes
LIBS="-lz $LIBS"
-else
- feature_not_found "zlib"
- zlib=no
fi
echo "zlib $zlib"
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
linux_fallocate="no"
cat > $TMPC << EOF
#include <stdio.h>
+#include <fcntl.h>
#include <linux/falloc.h>
int main(int argc, char **argv)
{
# 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"
return numa_available();
}
EOF
-if compile_prog "" "-lnuma" "libnuma"; then
+if test "$disable_numa" != "yes" && compile_prog "" "-lnuma" "libnuma"; then
libnuma="yes"
LIBS="-lnuma $LIBS"
fi
#include <string.h>
int main(int argc, char **argv)
{
- strcasestr(NULL, NULL);
- return 0;
+ return strcasestr(argv[0], argv[1]) != NULL;
}
EOF
if compile_prog "" "" "strcasestr"; then
cat > $TMPC << EOF
#include <unistd.h>
#include <stdio.h>
+#include <getopt.h>
int main(int argc, char **argv)
{
int c = getopt_long_only(argc, argv, NULL, NULL, NULL);
tls_thread="no"
cat > $TMPC << EOF
#include <stdio.h>
-static int __thread ret;
+static __thread int ret;
int main(int argc, char **argv)
{
return ret;
##########################################
# Check if we have required gtk/glib support for gfio
-if test "$gfio" = "yes" ; then
+gfio="no"
+if test "$gfio_check" = "yes" ; then
cat > $TMPC << EOF
#include <glib.h>
#include <cairo.h>
fi
fi
-echo "gtk 2.18 or higher $gfio"
+if test "$gfio_check" = "yes" ; then
+ echo "gtk 2.18 or higher $gfio"
+fi
# Check whether we have getrusage(RUSAGE_THREAD)
rusage_thread="no"
fi
echo "TCP_NODELAY $tcp_nodelay"
+##########################################
+# Check whether we have SO_SNDBUF
+window_size="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)
+{
+ setsockopt(0, SOL_SOCKET, SO_SNDBUF, NULL, 0);
+ setsockopt(0, SOL_SOCKET, SO_RCVBUF, NULL, 0);
+}
+EOF
+if compile_prog "" "" "SO_SNDBUF"; then
+ window_size="yes"
+fi
+echo "Net engine window_size $window_size"
+
+##########################################
+# Check whether we have TCP_MAXSEG
+mss="no"
+cat > $TMPC << EOF
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/tcp.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
+int main(int argc, char **argv)
+{
+ return setsockopt(0, IPPROTO_TCP, TCP_MAXSEG, NULL, 0);
+}
+EOF
+if compile_prog "" "" "TCP_MAXSEG"; then
+ mss="yes"
+fi
+echo "TCP_MAXSEG $mss"
+
##########################################
# Check whether we have RLIMIT_MEMLOCK
rlimit_memlock="no"
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"
+
+##########################################
+# Check whether we have the required functions for ipv6
+ipv6="no"
+cat > $TMPC << EOF
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <stdio.h>
+int main(int argc, char **argv)
+{
+ struct addrinfo hints;
+ struct in6_addr addr;
+ int ret;
+
+ ret = getaddrinfo(NULL, NULL, &hints, NULL);
+ freeaddrinfo(NULL);
+ printf("%s\n", gai_strerror(ret));
+ addr = in6addr_any;
+ return 0;
+}
+EOF
+if compile_prog "" "" "ipv6"; then
+ ipv6="yes"
+fi
+echo "IPv6 helpers $ipv6"
+
+##########################################
+# check for rbd
+rbd="no"
+cat > $TMPC << EOF
+#include <rbd/librbd.h>
+
+int main(int argc, char **argv)
+{
+
+ rados_t cluster;
+ rados_ioctx_t io_ctx;
+ const char pool[] = "rbd";
+
+ int major, minor, extra;
+ rbd_version(&major, &minor, &extra);
+
+ rados_ioctx_create(cluster, pool, &io_ctx);
+ return 0;
+}
+EOF
+if test "$disable_rbd" != "yes" && compile_prog "" "-lrbd -lrados" "rbd"; then
+ LIBS="-lrbd -lrados $LIBS"
+ rbd="yes"
+fi
+echo "Rados Block Device engine $rbd"
+
+##########################################
+# check for rbd_invaidate_cache()
+rbd_inval="no"
+if test "$rbd" = "yes"; then
+cat > $TMPC << EOF
+#include <rbd/librbd.h>
+
+int main(int argc, char **argv)
+{
+ rbd_image_t image;
+
+ return rbd_invalidate_cache(image);
+}
+EOF
+if compile_prog "" "-lrbd -lrados" "rbd"; then
+ rbd_inval="yes"
+fi
+echo "rbd_invalidate_cache $rbd_inval"
+fi
+
+##########################################
+# Check whether we have setvbuf
+setvbuf="no"
+cat > $TMPC << EOF
+#include <stdio.h>
+int main(int argc, char **argv)
+{
+ FILE *f = NULL;
+ char buf[80];
+ setvbuf(f, buf, _IOFBF, sizeof(buf));
+ return 0;
+}
+EOF
+if compile_prog "" "" "setvbuf"; then
+ setvbuf="yes"
+fi
+echo "setvbuf $setvbuf"
+
+# check for gfapi
+gfapi="no"
+cat > $TMPC << EOF
+#include <glusterfs/api/glfs.h>
+
+int main(int argc, char **argv)
+{
+
+ glfs_t *g = glfs_new("foo");
+
+ return 0;
+}
+EOF
+if test "$disable_gfapi" != "yes" && compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then
+ LIBS="-lgfapi -lglusterfs $LIBS"
+ gfapi="yes"
+fi
+ echo "Gluster API engine $gfapi"
+
+##########################################
+# check for gfapi fadvise support
+if test "$gfapi" = "yes" ; then
+gf_fadvise="no"
+cat > $TMPC << EOF
+#include <glusterfs/api/glfs.h>
+
+int main(int argc, char **argv)
+{
+ struct glfs_fd *fd;
+ int ret = glfs_fadvise(fd, 0, 0, 1);
+
+ return 0;
+}
+EOF
+if compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then
+ gf_fadvise="yes"
+fi
+echo "Gluster API use fadvise $gf_fadvise"
+fi
+
+##########################################
+# check for gfapi trim support
+gf_trim="no"
+if test "$gfapi" = "yes" ; then
+cat > $TMPC << EOF
+#include <glusterfs/api/glfs.h>
+
+int main(int argc, char **argv)
+{
+ return glfs_discard_async(NULL, 0, 0);
+}
+EOF
+if compile_prog "" "-lgfapi -lglusterfs" "gf trim"; then
+ gf_trim="yes"
+fi
+echo "Gluster API trim support $gf_trim"
+fi
+
+##########################################
+# Check if we support stckf on s390
+s390_z196_facilities="no"
+cat > $TMPC << EOF
+#define STFLE_BITS_Z196 45 /* various z196 facilities ... */
+int main(int argc, char **argv)
+{
+ /* We want just 1 double word to be returned. */
+ register unsigned long reg0 asm("0") = 0;
+ unsigned long stfle_bits;
+ asm volatile(".machine push" "\n\t"
+ ".machine \"z9-109\"" "\n\t"
+ "stfle %0" "\n\t"
+ ".machine pop" "\n"
+ : "=QS" (stfle_bits), "+d" (reg0)
+ : : "cc");
+
+ if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0)
+ return 0;
+ else
+ return -1;
+}
+EOF
+if compile_prog "" "" "s390_z196_facilities"; then
+ $TMPE
+ if [[ $? -eq 0 ]]; then
+ s390_z196_facilities="yes"
+ fi
+fi
+echo "s390_z196_facilities $s390_z196_facilities"
+
+##########################################
+# Check if we have required environment variables configured for libhdfs
+if test "$libhdfs" = "yes" ; then
+ hdfs_conf_error=0
+ if test "$JAVA_HOME" = "" ; then
+ echo "configure: JAVA_HOME should be defined to jdk/jvm path"
+ hdfs_conf_error=1
+ fi
+ if test "$FIO_LIBHDFS_INCLUDE" = "" ; then
+ echo "configure: FIO_LIBHDFS_INCLUDE should be defined to libhdfs inlude path"
+ hdfs_conf_error=1
+ fi
+ if test "$FIO_LIBHDFS_LIB" = "" ; then
+ echo "configure: FIO_LIBHDFS_LIB should be defined to libhdfs library path"
+ hdfs_conf_error=1
+ fi
+ if test "$hdfs_conf_error" = "1" ; then
+ exit 1
+ fi
+fi
+echo "HDFS engine $libhdfs"
+
+# Check if we have lex/yacc available
+yacc="no"
+yacc_is_bison="no"
+lex="no"
+arith="no"
+if test "$targetos" != "SunOS" ; then
+LEX=$(which lex 2> /dev/null)
+if test -x "$LEX" ; then
+ lex="yes"
+fi
+YACC=$(which bison 2> /dev/null)
+if test -x "$YACC" ; then
+ yacc="yes"
+ yacc_is_bison="yes"
+else
+ YACC=$(which yacc 2> /dev/null)
+ if test -x "$YACC" ; then
+ yacc="yes"
+ fi
+fi
+if test "$yacc" = "yes" && test "$lex" = "yes" ; then
+ arith="yes"
+fi
+
+if test "$arith" = "yes" ; then
+cat > $TMPC << EOF
+extern int yywrap(void);
+
+int main(int argc, char **argv)
+{
+ yywrap();
+ return 0;
+}
+EOF
+if compile_prog "" "-ll" "lex"; then
+ LIBS="-ll $LIBS"
+else
+ arith="no"
+fi
+fi
+fi
+
+echo "lex/yacc for arithmetic $arith"
+
#############################################################################
if test "$wordsize" = "64" ; then
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" -a "rdmacm" = "yes" ; then
+if test "$libverbs" = "yes" -a "$rdmacm" = "yes" ; then
output_sym "CONFIG_RDMA"
fi
if test "$clock_gettime" = "yes" ; then
if test "$gfio" = "yes" ; then
echo "CONFIG_GFIO=y" >> $config_host_mak
fi
+if test "$esx" = "yes" ; then
+ output_sym "CONFIG_ESX"
+ output_sym "CONFIG_NO_SHM"
+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 "$window_size" = "yes" ; then
+ output_sym "CONFIG_NET_WINDOWSIZE"
+fi
+if test "$mss" = "yes" ; then
+ output_sym "CONFIG_NET_MSS"
+fi
if test "$rlimit_memlock" = "yes" ; then
output_sym "CONFIG_RLIMIT_MEMLOCK"
fi
+if test "$pwritev" = "yes" ; then
+ output_sym "CONFIG_PWRITEV"
+fi
+if test "$ipv6" = "yes" ; then
+ output_sym "CONFIG_IPV6"
+fi
+if test "$rbd" = "yes" ; then
+ output_sym "CONFIG_RBD"
+fi
+if test "$rbd_inval" = "yes" ; then
+ output_sym "CONFIG_RBD_INVAL"
+fi
+if test "$setvbuf" = "yes" ; then
+ output_sym "CONFIG_SETVBUF"
+fi
+if test "$s390_z196_facilities" = "yes" ; then
+ output_sym "CONFIG_S390_Z196_FACILITIES"
+ CFLAGS="$CFLAGS -march=z9-109"
+fi
+if test "$gfapi" = "yes" ; then
+ output_sym "CONFIG_GFAPI"
+fi
+if test "$gf_fadvise" = "yes" ; then
+ output_sym "CONFIG_GF_FADVISE"
+fi
+if test "$gf_trim" = "yes" ; then
+ output_sym "CONFIG_GF_TRIM"
+fi
+if test "$libhdfs" = "yes" ; then
+ output_sym "CONFIG_LIBHDFS"
+fi
+if test "$arith" = "yes" ; then
+ output_sym "CONFIG_ARITHMETIC"
+ if test "$yacc_is_bison" = "yes" ; then
+ echo "YACC=$YACC -y" >> $config_host_mak
+ else
+ echo "YACC=$YACC" >> $config_host_mak
+ fi
+fi
+
+if test "$zlib" = "no" ; then
+ echo "Consider installing zlib-dev (zlib-devel), some fio features depend on it."
+fi
echo "LIBS+=$LIBS" >> $config_host_mak
echo "CFLAGS+=$CFLAGS" >> $config_host_mak
+echo "LDFLAGS+=$LDFLAGS" >> $config_host_mak
echo "CC=$cc" >> $config_host_mak
echo "BUILD_CFLAGS=$BUILD_CFLAGS $CFLAGS" >> $config_host_mak