gettime: Introduce fio_get_mono_time()
[fio.git] / configure
1 #!/bin/sh
2 #
3 # Fio configure script. Heavily influenced by the manual qemu configure
4 # script. Sad this is easier than autoconf and enemies.
5 #
6
7 # set temporary file name
8 if test ! -z "$TMPDIR" ; then
9     TMPDIR1="${TMPDIR}"
10 elif test ! -z "$TEMPDIR" ; then
11     TMPDIR1="${TEMPDIR}"
12 else
13     TMPDIR1="/tmp"
14 fi
15
16 TMPC="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.c"
17 TMPC2="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}-2.c"
18 TMPO="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.o"
19 TMPE="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.exe"
20
21 # NB: do not call "exit" in the trap handler; this is buggy with some shells;
22 # see <1285349658-3122-1-git-send-email-loic.minier@linaro.org>
23 trap "rm -f $TMPC $TMPC2 $TMPO $TMPE" EXIT INT QUIT TERM
24
25 rm -rf config.log
26
27 config_host_mak="config-host.mak"
28 config_host_h="config-host.h"
29
30 rm -rf $config_host_mak
31 rm -rf $config_host_h
32
33 fatal() {
34   echo $@
35   echo "Configure failed, check config.log and/or the above output"
36   rm -rf $config_host_mak
37   rm -rf $config_host_h
38   exit 1
39 }
40
41 # Print result for each configuration test
42 print_config() {
43   printf "%-30s%s\n" "$1" "$2"
44 }
45
46 # Default CFLAGS
47 CFLAGS="-D_GNU_SOURCE -include config-host.h $CFLAGS"
48 BUILD_CFLAGS=""
49
50 # Print a helpful header at the top of config.log
51 echo "# FIO configure log $(date)" >> config.log
52 printf "# Configured with:" >> config.log
53 printf " '%s'" "$0" "$@" >> config.log
54 echo >> config.log
55 echo "#" >> config.log
56
57 # Print configure header at the top of $config_host_h
58 echo "/*" > $config_host_h
59 echo " * Automatically generated by configure - do not modify" >> $config_host_h
60 printf " * Configured with:" >> $config_host_h
61 printf " * '%s'" "$0" "$@" >> $config_host_h
62 echo "" >> $config_host_h
63 echo " */" >> $config_host_h
64
65 do_cc() {
66     # Run the compiler, capturing its output to the log.
67     echo $cc "$@" >> config.log
68     $cc "$@" >> config.log 2>&1 || return $?
69     # Test passed. If this is an --enable-werror build, rerun
70     # the test with -Werror and bail out if it fails. This
71     # makes warning-generating-errors in configure test code
72     # obvious to developers.
73     if test "$werror" != "yes"; then
74         return 0
75     fi
76     # Don't bother rerunning the compile if we were already using -Werror
77     case "$*" in
78         *-Werror*)
79            return 0
80         ;;
81     esac
82     echo $cc -Werror "$@" >> config.log
83     $cc -Werror "$@" >> config.log 2>&1 && return $?
84     echo "ERROR: configure test passed without -Werror but failed with -Werror."
85     echo "This is probably a bug in the configure script. The failing command"
86     echo "will be at the bottom of config.log."
87     fatal "You can run configure with --disable-werror to bypass this check."
88 }
89
90 compile_object() {
91   do_cc $CFLAGS -Werror-implicit-function-declaration -c -o $TMPO $TMPC
92 }
93
94 compile_prog() {
95   local_cflags="$1"
96   local_ldflags="$2 $LIBS"
97   echo "Compiling test case $3" >> config.log
98   do_cc $CFLAGS -Werror-implicit-function-declaration $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
99 }
100
101 feature_not_found() {
102   feature=$1
103   packages=$2
104
105   echo "ERROR"
106   echo "ERROR: User requested feature $feature"
107   if test ! -z "$packages" ; then
108     echo "ERROR: That feature needs $packages installed"
109   fi
110   echo "ERROR: configure was not able to find it"
111   fatal "ERROR"
112 }
113
114 has() {
115   type "$1" >/dev/null 2>&1
116 }
117
118 check_define() {
119   cat > $TMPC <<EOF
120 #if !defined($1)
121 #error $1 not defined
122 #endif
123 int main(void)
124 {
125   return 0;
126 }
127 EOF
128   compile_object
129 }
130
131 output_sym() {
132   echo "$1=y" >> $config_host_mak
133   echo "#define $1" >> $config_host_h
134 }
135
136 check_min_lib_version() {
137   _feature=$3
138
139   if "${cross_prefix}"pkg-config --atleast-version="$2" "$1" > /dev/null 2>&1; then
140     return 0
141   fi
142   : "${_feature:=${1}}"
143   if "${cross_prefix}"pkg-config --version > /dev/null 2>&1; then
144     if eval "echo \$$_feature" = "yes" ; then
145       feature_not_found "$_feature" "$1 >= $2"
146     fi
147   else
148     print_config "$1" "missing pkg-config, can't check $_feature version"
149   fi
150   return 1
151 }
152
153 targetos=""
154 cpu=""
155
156 # default options
157 show_help="no"
158 exit_val=0
159 gfio_check="no"
160 libhdfs="no"
161 pmemblk="no"
162 devdax="no"
163 pmem="no"
164 cuda="no"
165 disable_lex=""
166 disable_pmem="no"
167 disable_native="no"
168 march_set="no"
169 libiscsi="no"
170 libnbd="no"
171 libaio_uring="no"
172 libzbc=""
173 dynamic_engines="no"
174 prefix=/usr/local
175
176 # parse options
177 for opt do
178   optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'`
179   case "$opt" in
180   --prefix=*) prefix="$optarg"
181   ;;
182   --cpu=*) cpu="$optarg"
183   ;;
184   #  esx is cross compiled and cannot be detect through simple uname calls
185   --esx)
186   esx="yes"
187   ;;
188   --cc=*) CC="$optarg"
189   ;;
190   --extra-cflags=*) CFLAGS="$CFLAGS $optarg"
191   ;;
192   --build-32bit-win) build_32bit_win="yes"
193   ;;
194   --target-win-ver=*) target_win_ver="$optarg"
195   ;;
196   --enable-pdb) pdb="yes"
197   ;;
198   --build-static) build_static="yes"
199   ;;
200   --enable-gfio) gfio_check="yes"
201   ;;
202   --disable-numa) disable_numa="yes"
203   ;;
204   --disable-rdma) disable_rdma="yes"
205   ;;
206   --disable-rados) disable_rados="yes"
207   ;;
208   --disable-rbd) disable_rbd="yes"
209   ;;
210   --disable-http) disable_http="yes"
211   ;;
212   --disable-gfapi) disable_gfapi="yes"
213   ;;
214   --enable-libhdfs) libhdfs="yes"
215   ;;
216   --disable-lex) disable_lex="yes"
217   ;;
218   --enable-lex) disable_lex="no"
219   ;;
220   --disable-shm) no_shm="yes"
221   ;;
222   --disable-optimizations) disable_opt="yes"
223   ;;
224   --disable-pmem) disable_pmem="yes"
225   ;;
226   --enable-cuda) cuda="yes"
227   ;;
228   --disable-native) disable_native="yes"
229   ;;
230   --with-ime=*) ime_path="$optarg"
231   ;;
232   --enable-libiscsi) libiscsi="yes"
233   ;;
234   --enable-libnbd) libnbd="yes"
235   ;;
236   --disable-libzbc) libzbc="no"
237   ;;
238   --disable-tcmalloc) disable_tcmalloc="yes"
239   ;;
240   --enable-libaio-uring) libaio_uring="yes"
241   ;;
242   --dynamic-libengines) dynamic_engines="yes"
243   ;;
244   --help)
245     show_help="yes"
246     ;;
247   *)
248   echo "Bad option $opt"
249   show_help="yes"
250   exit_val=1
251   esac
252 done
253
254 if test "$show_help" = "yes" ; then
255   echo "--prefix=               Use this directory as installation prefix"
256   echo "--cpu=                  Specify target CPU if auto-detect fails"
257   echo "--cc=                   Specify compiler to use"
258   echo "--extra-cflags=         Specify extra CFLAGS to pass to compiler"
259   echo "--build-32bit-win       Enable 32-bit build on Windows"
260   echo "--target-win-ver=       Minimum version of Windows to target (XP or 7)"
261   echo "--enable-pdb            Enable Windows PDB symbols generation (needs clang/lld)"
262   echo "--build-static          Build a static fio"
263   echo "--esx                   Configure build options for esx"
264   echo "--enable-gfio           Enable building of gtk gfio"
265   echo "--disable-numa          Disable libnuma even if found"
266   echo "--disable-rdma          Disable RDMA support even if found"
267   echo "--disable-rados         Disable Rados support even if found"
268   echo "--disable-rbd           Disable Rados Block Device even if found"
269   echo "--disable-http          Disable HTTP support even if found"
270   echo "--disable-gfapi         Disable gfapi"
271   echo "--enable-libhdfs        Enable hdfs support"
272   echo "--disable-lex           Disable use of lex/yacc for math"
273   echo "--disable-pmem          Disable pmem based engines even if found"
274   echo "--enable-lex            Enable use of lex/yacc for math"
275   echo "--disable-shm           Disable SHM support"
276   echo "--disable-optimizations Don't enable compiler optimizations"
277   echo "--enable-cuda           Enable GPUDirect RDMA support"
278   echo "--disable-native        Don't build for native host"
279   echo "--with-ime=             Install path for DDN's Infinite Memory Engine"
280   echo "--enable-libiscsi       Enable iscsi support"
281   echo "--enable-libnbd         Enable libnbd (NBD engine) support"
282   echo "--disable-libzbc        Disable libzbc even if found"
283   echo "--disable-tcmalloc      Disable tcmalloc support"
284   echo "--enable-libaio-uring   Enable libaio emulated over io_uring"
285   echo "--dynamic-libengines    Lib-based ioengines as dynamic libraries"
286   exit $exit_val
287 fi
288
289 cross_prefix=${cross_prefix-${CROSS_COMPILE}}
290 # Preferred compiler (can be overriden later after we know the platform):
291 #  ${CC} (if set)
292 #  ${cross_prefix}gcc (if cross-prefix specified)
293 #  gcc if available
294 #  clang if available
295 if test -z "${CC}${cross_prefix}"; then
296   if has gcc; then
297     cc=gcc
298   elif has clang; then
299     cc=clang
300   fi
301 else
302   cc="${CC-${cross_prefix}gcc}"
303 fi
304
305 if check_define __ANDROID__ ; then
306   targetos="Android"
307 elif check_define __linux__ ; then
308   targetos="Linux"
309 elif check_define __OpenBSD__ ; then
310   targetos='OpenBSD'
311 elif check_define __NetBSD__ ; then
312   targetos='NetBSD'
313 elif check_define __sun__ ; then
314   targetos='SunOS'
315   CFLAGS="$CFLAGS -D_REENTRANT"
316 elif check_define _WIN32 ; then
317   targetos='CYGWIN'
318 else
319   targetos=`uname -s`
320 fi
321
322 echo "# Automatically generated by configure - do not modify" > $config_host_mak
323 printf "# Configured with:" >> $config_host_mak
324 printf " '%s'" "$0" "$@" >> $config_host_mak
325 echo >> $config_host_mak
326 echo "CONFIG_TARGET_OS=$targetos" >> $config_host_mak
327
328 if test "$no_shm" = "yes" ; then
329   output_sym "CONFIG_NO_SHM"
330 fi
331
332 if test "$disable_opt" = "yes" ; then
333   output_sym "CONFIG_FIO_NO_OPT"
334 fi
335
336 # Some host OSes need non-standard checks for which CPU to use.
337 # Note that these checks are broken for cross-compilation: if you're
338 # cross-compiling to one of these OSes then you'll need to specify
339 # the correct CPU with the --cpu option.
340 case $targetos in
341 AIX|OpenBSD|NetBSD)
342   # Unless explicitly enabled, turn off lex.
343   # OpenBSD will hit syntax error when enabled.
344   if test -z "$disable_lex" ; then
345     disable_lex="yes"
346   else
347     force_no_lex_o="yes"
348   fi
349   ;;
350 FreeBSD)
351   CFLAGS="$CFLAGS -I/usr/local/include"
352   LDFLAGS="$LDFLAGS -L/usr/local/lib"
353   ;;
354 Darwin)
355   # on Leopard most of the system is 32-bit, so we have to ask the kernel if
356   # we can run 64-bit userspace code.
357   # If the user didn't specify a CPU explicitly and the kernel says this is
358   # 64 bit hw, then assume x86_64. Otherwise fall through to the usual
359   # detection code.
360   if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then
361     cpu="x86_64"
362   fi
363   # Error at compile time linking of weak/partial symbols if possible...
364 cat > $TMPC <<EOF
365 int main(void)
366 {
367   return 0;
368 }
369 EOF
370   if compile_prog "" "-Wl,-no_weak_imports" "disable weak symbols"; then
371     echo "Disabling weak symbols"
372     LDFLAGS="$LDFLAGS -Wl,-no_weak_imports"
373   fi
374   ;;
375 SunOS)
376   # `uname -m` returns i86pc even on an x86_64 box, so default based on isainfo
377   if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then
378     cpu="x86_64"
379   fi
380   LIBS="-lnsl -lsocket"
381   ;;
382 CYGWIN*)
383   # We still force some options, so keep this message here.
384   echo "Forcing some known good options on Windows"
385   if test -z "${CC}${cross_prefix}"; then
386     if test ! -z "$build_32bit_win" && test "$build_32bit_win" = "yes"; then
387       cc="i686-w64-mingw32-gcc"
388     else
389       cc="x86_64-w64-mingw32-gcc"
390     fi
391   fi
392
393   target_win_ver=$(echo "$target_win_ver" | tr '[:lower:]' '[:upper:]')
394   if test -z "$target_win_ver"; then
395     # Default Windows API target
396     target_win_ver="7"
397   fi
398   if test "$target_win_ver" = "XP"; then
399     output_sym "CONFIG_WINDOWS_XP"
400     # Technically the below is targeting 2003
401     CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0502"
402   elif test "$target_win_ver" = "7"; then
403     output_sym "CONFIG_WINDOWS_7"
404     CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0601"
405   else
406     fatal "Unknown target Windows version"
407   fi
408
409   # We need this to be output_sym'd here because this is Windows specific.
410   # The regular configure path never sets this config.
411   output_sym "CONFIG_WINDOWSAIO"
412   # We now take the regular configuration path without having exit 0 here.
413   # Flags below are still necessary mostly for MinGW.
414   build_static="yes"
415   rusage_thread="yes"
416   fdatasync="yes"
417   clock_gettime="yes" # clock_monotonic probe has dependency on this
418   clock_monotonic="yes"
419   sched_idle="yes"
420   ;;
421 esac
422
423 # Now we know the target platform we can have another guess at the preferred
424 # compiler when it wasn't explictly set
425 if test -z "${CC}${cross_prefix}"; then
426   if test "$targetos" = "FreeBSD" || test "$targetos" = "Darwin"; then
427     if has clang; then
428       cc=clang
429     fi
430   fi
431 fi
432 if test -z "$cc"; then
433     echo "configure: failed to find compiler"
434     exit 1
435 fi
436
437 if test ! -z "$cpu" ; then
438   # command line argument
439   :
440 elif check_define __i386__ ; then
441   cpu="i386"
442 elif check_define __x86_64__ ; then
443   cpu="x86_64"
444 elif check_define __sparc__ ; then
445   if check_define __arch64__ ; then
446     cpu="sparc64"
447   else
448     cpu="sparc"
449   fi
450 elif check_define _ARCH_PPC ; then
451   if check_define _ARCH_PPC64 ; then
452     cpu="ppc64"
453   else
454     cpu="ppc"
455   fi
456 elif check_define __mips__ ; then
457   cpu="mips"
458 elif check_define __ia64__ ; then
459   cpu="ia64"
460 elif check_define __s390__ ; then
461   if check_define __s390x__ ; then
462     cpu="s390x"
463   else
464     cpu="s390"
465   fi
466 elif check_define __arm__ ; then
467   cpu="arm"
468 elif check_define __aarch64__ ; then
469   cpu="aarch64"
470 elif check_define __hppa__ ; then
471   cpu="hppa"
472 else
473   cpu=`uname -m`
474 fi
475
476 # Normalise host CPU name and set ARCH.
477 case "$cpu" in
478   ia64|ppc|ppc64|s390|s390x|sparc64)
479     cpu="$cpu"
480   ;;
481   i386|i486|i586|i686|i86pc|BePC)
482     cpu="x86"
483   ;;
484   x86_64|amd64)
485     cpu="x86_64"
486   ;;
487   armv*b|armv*l|arm)
488     cpu="arm"
489   ;;
490   aarch64)
491     cpu="arm64"
492   ;;
493   hppa|parisc|parisc64)
494     cpu="hppa"
495   ;;
496   mips*)
497     cpu="mips"
498   ;;
499   sparc|sun4[cdmuv])
500     cpu="sparc"
501   ;;
502   *)
503   echo "Unknown CPU"
504   ;;
505 esac
506
507 ##########################################
508 # check cross compile
509
510 if test "$cross_compile" != "yes" ; then
511   cross_compile="no"
512 fi
513 cat > $TMPC <<EOF
514 int main(void)
515 {
516   return 0;
517 }
518 EOF
519 if compile_prog "" "" "cross"; then
520   $TMPE 2>/dev/null || cross_compile="yes"
521 else
522   fatal "compile test failed"
523 fi
524
525 ##########################################
526 # check endianness
527 if test "$bigendian" != "yes" ; then
528   bigendian="no"
529 fi
530 if test "$cross_compile" = "no" ; then
531   cat > $TMPC <<EOF
532 #include <inttypes.h>
533 int main(void)
534 {
535   volatile uint32_t i=0x01234567;
536   return (*((uint8_t*)(&i))) == 0x67;
537 }
538 EOF
539   if compile_prog "" "" "endian"; then
540     $TMPE && bigendian="yes"
541   fi
542 else
543   # If we're cross compiling, try our best to work it out and rely on the
544   # run-time check to fail if we get it wrong.
545   cat > $TMPC <<EOF
546 #include <endian.h>
547 int main(void)
548 {
549 #if __BYTE_ORDER != __BIG_ENDIAN
550 # error "Unknown endianness"
551 #endif
552 }
553 EOF
554   compile_prog "" "" "endian" && bigendian="yes"
555   check_define "__ARMEB__" && bigendian="yes"
556   check_define "__MIPSEB__" && bigendian="yes"
557 fi
558
559
560 print_config "Operating system" "$targetos"
561 print_config "CPU" "$cpu"
562 print_config "Big endian" "$bigendian"
563 if test ! -z "$target_win_ver"; then
564   print_config "Target Windows version" "$target_win_ver"
565 fi
566 print_config "Compiler" "$cc"
567 print_config "Cross compile" "$cross_compile"
568 echo
569
570 ##########################################
571 # See if we need to build a static build
572 if test "$build_static" = "yes" ; then
573   CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
574   LDFLAGS="$LDFLAGS -static -Wl,--gc-sections"
575 else
576   build_static="no"
577 fi
578 print_config "Static build" "$build_static"
579
580 ##########################################
581 # check for C11 atomics support
582 cat > $TMPC <<EOF
583 #include <stdatomic.h>
584 int main(void)
585 {
586   _Atomic unsigned v;
587   atomic_load(&v);
588   return 0;
589 }
590 EOF
591 if ! compile_prog "" "" "C11 atomics"; then
592   echo
593   echo "Your compiler doesn't support C11 atomics. gcc 4.9/clang 3.6 are the"
594   echo "minimum versions with it - perhaps your compiler is too old?"
595   fatal "C11 atomics support not found"
596 fi
597
598
599 ##########################################
600 # check for wordsize
601 wordsize="0"
602 cat > $TMPC <<EOF
603 #include <limits.h>
604 #define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)]))
605 int main(void)
606 {
607   BUILD_BUG_ON(sizeof(long)*CHAR_BIT != WORDSIZE);
608   return 0;
609 }
610 EOF
611 if compile_prog "-DWORDSIZE=32" "" "wordsize"; then
612   wordsize="32"
613 elif compile_prog "-DWORDSIZE=64" "" "wordsize"; then
614   wordsize="64"
615 else
616   fatal "Unknown wordsize"
617 fi
618 print_config "Wordsize" "$wordsize"
619
620 ##########################################
621 # zlib probe
622 if test "$zlib" != "yes" ; then
623   zlib="no"
624 fi
625 cat > $TMPC <<EOF
626 #include <zlib.h>
627 int main(void)
628 {
629   z_stream stream;
630   if (inflateInit(&stream) != Z_OK)
631     return 1;
632   return 0;
633 }
634 EOF
635 if compile_prog "" "-lz" "zlib" ; then
636   zlib=yes
637   LIBS="-lz $LIBS"
638 fi
639 print_config "zlib" "$zlib"
640
641 ##########################################
642 # linux-aio probe
643 if test "$libaio" != "yes" ; then
644   libaio="no"
645 fi
646 if test "$esx" != "yes" ; then
647   cat > $TMPC <<EOF
648 #include <libaio.h>
649 #include <stddef.h>
650 int main(void)
651 {
652   io_setup(0, NULL);
653   return 0;
654 }
655 EOF
656   if test "$libaio_uring" = "yes"; then
657     if compile_prog "" "-luring" "libaio io_uring" ; then
658       libaio=yes
659       LIBS="-luring $LIBS"
660     else
661       feature_not_found "libaio io_uring" ""
662     fi
663   elif compile_prog "" "-laio" "libaio" ; then
664     libaio=yes
665     libaio_uring=no
666   else
667     if test "$libaio" = "yes" ; then
668       feature_not_found "linux AIO" "libaio-dev or libaio-devel"
669     fi
670     libaio=no
671     libaio_uring=no
672   fi
673
674   cat > $TMPC <<EOF
675 #include <libaio.h>
676 #include <stddef.h>
677 int main(void)
678 {
679   io_prep_preadv2(NULL, 0, NULL, 0, 0, 0);
680   io_prep_pwritev2(NULL, 0, NULL, 0, 0, 0);
681   return 0;
682 }
683 EOF
684   if compile_prog "" "" "libaio rw flags" ; then
685     libaio_rw_flags=yes
686   else
687     libaio_rw_flags=no
688   fi
689 fi
690 print_config "Linux AIO support" "$libaio"
691 print_config "Linux AIO support rw flags" "$libaio_rw_flags"
692 print_config "Linux AIO over io_uring" "$libaio_uring"
693
694 ##########################################
695 # posix aio probe
696 if test "$posix_aio" != "yes" ; then
697   posix_aio="no"
698 fi
699 if test "$posix_aio_lrt" != "yes" ; then
700   posix_aio_lrt="no"
701 fi
702 cat > $TMPC <<EOF
703 #include <aio.h>
704 int main(void)
705 {
706   struct aiocb cb;
707   aio_read(&cb);
708   return 0;
709 }
710 EOF
711 if compile_prog "" "" "posixaio" ; then
712   posix_aio="yes"
713 elif compile_prog "" "-lrt" "posixaio -lrt"; then
714   posix_aio="yes"
715   posix_aio_lrt="yes"
716   LIBS="-lrt $LIBS"
717 fi
718 print_config "POSIX AIO support" "$posix_aio"
719 print_config "POSIX AIO support needs -lrt" "$posix_aio_lrt"
720
721 ##########################################
722 # posix aio fsync probe
723 if test "$posix_aio_fsync" != "yes" ; then
724   posix_aio_fsync="no"
725 fi
726 if test "$posix_aio" = "yes" ; then
727   cat > $TMPC <<EOF
728 #include <fcntl.h>
729 #include <aio.h>
730 int main(void)
731 {
732   struct aiocb cb;
733   return aio_fsync(O_SYNC, &cb);
734   return 0;
735 }
736 EOF
737   if compile_prog "" "$LIBS" "posix_aio_fsync" ; then
738     posix_aio_fsync=yes
739   fi
740 fi
741 print_config "POSIX AIO fsync" "$posix_aio_fsync"
742
743 ##########################################
744 # POSIX pshared attribute probe
745 if test "$posix_pshared" != "yes" ; then
746   posix_pshared="no"
747 fi
748 cat > $TMPC <<EOF
749 #include <unistd.h>
750 int main(void)
751 {
752 #if defined(_POSIX_THREAD_PROCESS_SHARED) && ((_POSIX_THREAD_PROCESS_SHARED + 0) > 0)
753 # if defined(__CYGWIN__)
754 #  error "_POSIX_THREAD_PROCESS_SHARED is buggy on Cygwin"
755 # elif defined(__APPLE__)
756 #  include <AvailabilityMacros.h>
757 #  include <TargetConditionals.h>
758 #  if TARGET_OS_MAC && MAC_OS_X_VERSION_MIN_REQUIRED < 1070
759 #   error "_POSIX_THREAD_PROCESS_SHARED is buggy/unsupported prior to OSX 10.7"
760 #  endif
761 # endif
762 #else
763 # error "_POSIX_THREAD_PROCESS_SHARED is unsupported"
764 #endif
765   return 0;
766 }
767 EOF
768 if compile_prog "" "$LIBS" "posix_pshared" ; then
769   posix_pshared=yes
770 fi
771 print_config "POSIX pshared support" "$posix_pshared"
772
773 ##########################################
774 # POSIX pthread_condattr_setclock() probe
775 if test "$pthread_condattr_setclock" != "yes" ; then
776   pthread_condattr_setclock="no"
777 fi
778 cat > $TMPC <<EOF
779 #include <pthread.h>
780 int main(void)
781 {
782   pthread_condattr_t condattr;
783   pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC);
784   return 0;
785 }
786 EOF
787 if compile_prog "" "$LIBS" "pthread_condattr_setclock" ; then
788   pthread_condattr_setclock=yes
789 elif compile_prog "" "$LIBS -lpthread" "pthread_condattr_setclock" ; then
790   pthread_condattr_setclock=yes
791   LIBS="$LIBS -lpthread"
792 fi
793 print_config "pthread_condattr_setclock()" "$pthread_condattr_setclock"
794
795 ##########################################
796 # pthread_sigmask() probe
797 if test "$pthread_sigmask" != "yes" ; then
798   pthread_sigmask="no"
799 fi
800 cat > $TMPC <<EOF
801 #include <stddef.h> /* NULL */
802 #include <signal.h> /* pthread_sigmask() */
803 int main(void)
804 {
805   return pthread_sigmask(0, NULL, NULL);
806 }
807 EOF
808 if compile_prog "" "$LIBS" "pthread_sigmask" ; then
809   pthread_sigmask=yes
810 elif compile_prog "" "$LIBS -lpthread" "pthread_sigmask" ; then
811   pthread_sigmask=yes
812   LIBS="$LIBS -lpthread"
813 fi
814 print_config "pthread_sigmask()" "$pthread_sigmask"
815
816 ##########################################
817 # solaris aio probe
818 if test "$solaris_aio" != "yes" ; then
819   solaris_aio="no"
820 fi
821 cat > $TMPC <<EOF
822 #include <sys/types.h>
823 #include <sys/asynch.h>
824 #include <unistd.h>
825 int main(void)
826 {
827   aio_result_t res;
828   return aioread(0, NULL, 0, 0, SEEK_SET, &res);
829   return 0;
830 }
831 EOF
832 if compile_prog "" "-laio" "solarisaio" ; then
833   solaris_aio=yes
834   LIBS="-laio $LIBS"
835 fi
836 print_config "Solaris AIO support" "$solaris_aio"
837
838 ##########################################
839 # __sync_fetch_and_add test
840 if test "$sfaa" != "yes" ; then
841   sfaa="no"
842 fi
843 cat > $TMPC << EOF
844 #include <inttypes.h>
845 static int sfaa(uint64_t *ptr)
846 {
847   return __sync_fetch_and_add(ptr, 0);
848 }
849
850 int main(int argc, char **argv)
851 {
852   uint64_t val = 42;
853   sfaa(&val);
854   return val;
855 }
856 EOF
857 if compile_prog "" "" "__sync_fetch_and_add()" ; then
858     sfaa="yes"
859 fi
860 print_config "__sync_fetch_and_add" "$sfaa"
861
862 ##########################################
863 # __sync_synchronize() test
864 if test "$sync_sync" != "yes" ; then
865   sync_sync="no"
866 fi
867 cat > $TMPC << EOF
868 #include <inttypes.h>
869
870 int main(int argc, char **argv)
871 {
872   __sync_synchronize();
873   return 0;
874 }
875 EOF
876 if compile_prog "" "" "__sync_synchronize()" ; then
877     sync_sync="yes"
878 fi
879 print_config "__sync_synchronize" "$sync_sync"
880
881 ##########################################
882 # __sync_val_compare_and_swap() test
883 if test "$cmp_swap" != "yes" ; then
884   cmp_swap="no"
885 fi
886 cat > $TMPC << EOF
887 #include <inttypes.h>
888
889 int main(int argc, char **argv)
890 {
891   int x = 0;
892   return __sync_val_compare_and_swap(&x, 1, 2);
893 }
894 EOF
895 if compile_prog "" "" "__sync_val_compare_and_swap()" ; then
896     cmp_swap="yes"
897 fi
898 print_config "__sync_val_compare_and_swap" "$cmp_swap"
899
900 ##########################################
901 # libverbs probe
902 if test "$libverbs" != "yes" ; then
903   libverbs="no"
904 fi
905 cat > $TMPC << EOF
906 #include <infiniband/verbs.h>
907 int main(int argc, char **argv)
908 {
909   struct ibv_pd *pd = ibv_alloc_pd(NULL);
910   return pd != NULL;
911 }
912 EOF
913 if test "$disable_rdma" != "yes" && compile_prog "" "-libverbs" "libverbs" ; then
914     libverbs="yes"
915 fi
916 print_config "libverbs" "$libverbs"
917
918 ##########################################
919 # rdmacm probe
920 if test "$rdmacm" != "yes" ; then
921   rdmacm="no"
922 fi
923 cat > $TMPC << EOF
924 #include <stdio.h>
925 #include <rdma/rdma_cma.h>
926 int main(int argc, char **argv)
927 {
928   rdma_destroy_qp(NULL);
929   return 0;
930 }
931 EOF
932 if test "$disable_rdma" != "yes" && compile_prog "" "-lrdmacm" "rdma"; then
933     rdmacm="yes"
934 fi
935 print_config "rdmacm" "$rdmacm"
936
937 ##########################################
938 # asprintf() and vasprintf() probes
939 if test "$have_asprintf" != "yes" ; then
940   have_asprintf="no"
941 fi
942 cat > $TMPC << EOF
943 #include <stdio.h>
944
945 int main(int argc, char **argv)
946 {
947   char *buf;
948   return asprintf(&buf, "%s", "str") == 0;
949 }
950 EOF
951 if compile_prog "" "" "have_asprintf"; then
952     have_asprintf="yes"
953 fi
954 print_config "asprintf()" "$have_asprintf"
955
956 if test "$have_vasprintf" != "yes" ; then
957   have_vasprintf="no"
958 fi
959 cat > $TMPC << EOF
960 #include <stdio.h>
961
962 int main(int argc, char **argv)
963 {
964   va_list ap;
965   char *buf;
966   return vasprintf(&buf, "%s", ap) == 0;
967 }
968 EOF
969 if compile_prog "" "" "have_vasprintf"; then
970     have_vasprintf="yes"
971 fi
972 print_config "vasprintf()" "$have_vasprintf"
973
974 ##########################################
975 # Linux fallocate probe
976 if test "$linux_fallocate" != "yes" ; then
977   linux_fallocate="no"
978 fi
979 cat > $TMPC << EOF
980 #include <stdio.h>
981 #include <fcntl.h>
982 #include <linux/falloc.h>
983 int main(int argc, char **argv)
984 {
985   int r = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 1024);
986   return r;
987 }
988 EOF
989 if compile_prog "" "" "linux_fallocate"; then
990     linux_fallocate="yes"
991 fi
992 print_config "Linux fallocate" "$linux_fallocate"
993
994 ##########################################
995 # POSIX fadvise probe
996 if test "$posix_fadvise" != "yes" ; then
997   posix_fadvise="no"
998 fi
999 cat > $TMPC << EOF
1000 #include <stdio.h>
1001 #include <fcntl.h>
1002 int main(int argc, char **argv)
1003 {
1004   int r = posix_fadvise(0, 0, 0, POSIX_FADV_NORMAL);
1005   return r;
1006 }
1007 EOF
1008 if compile_prog "" "" "posix_fadvise"; then
1009     posix_fadvise="yes"
1010 fi
1011 print_config "POSIX fadvise" "$posix_fadvise"
1012
1013 ##########################################
1014 # POSIX fallocate probe
1015 if test "$posix_fallocate" != "yes" ; then
1016   posix_fallocate="no"
1017 fi
1018 cat > $TMPC << EOF
1019 #include <stdio.h>
1020 #include <fcntl.h>
1021 int main(int argc, char **argv)
1022 {
1023   int r = posix_fallocate(0, 0, 1024);
1024   return r;
1025 }
1026 EOF
1027 if compile_prog "" "" "posix_fallocate"; then
1028     posix_fallocate="yes"
1029 fi
1030 print_config "POSIX fallocate" "$posix_fallocate"
1031
1032 ##########################################
1033 # sched_set/getaffinity 2 or 3 argument test
1034 if test "$linux_2arg_affinity" != "yes" ; then
1035   linux_2arg_affinity="no"
1036 fi
1037 if test "$linux_3arg_affinity" != "yes" ; then
1038   linux_3arg_affinity="no"
1039 fi
1040 cat > $TMPC << EOF
1041 #include <sched.h>
1042 int main(int argc, char **argv)
1043 {
1044   cpu_set_t mask;
1045   return sched_setaffinity(0, sizeof(mask), &mask);
1046 }
1047 EOF
1048 if compile_prog "" "" "sched_setaffinity(,,)"; then
1049   linux_3arg_affinity="yes"
1050 else
1051   cat > $TMPC << EOF
1052 #include <sched.h>
1053 int main(int argc, char **argv)
1054 {
1055   cpu_set_t mask;
1056   return sched_setaffinity(0, &mask);
1057 }
1058 EOF
1059   if compile_prog "" "" "sched_setaffinity(,)"; then
1060     linux_2arg_affinity="yes"
1061   fi
1062 fi
1063 print_config "sched_setaffinity(3 arg)" "$linux_3arg_affinity"
1064 print_config "sched_setaffinity(2 arg)" "$linux_2arg_affinity"
1065
1066 ##########################################
1067 # clock_gettime probe
1068 if test "$clock_gettime" != "yes" ; then
1069   clock_gettime="no"
1070 fi
1071 cat > $TMPC << EOF
1072 #include <stdio.h>
1073 #include <time.h>
1074 int main(int argc, char **argv)
1075 {
1076   return clock_gettime(0, NULL);
1077 }
1078 EOF
1079 if compile_prog "" "" "clock_gettime"; then
1080     clock_gettime="yes"
1081 elif compile_prog "" "-lrt" "clock_gettime"; then
1082     clock_gettime="yes"
1083     LIBS="-lrt $LIBS"
1084 fi
1085 print_config "clock_gettime" "$clock_gettime"
1086
1087 ##########################################
1088 # CLOCK_MONOTONIC probe
1089 if test "$clock_monotonic" != "yes" ; then
1090   clock_monotonic="no"
1091 fi
1092 if test "$clock_gettime" = "yes" ; then
1093   cat > $TMPC << EOF
1094 #include <stdio.h>
1095 #include <time.h>
1096 int main(int argc, char **argv)
1097 {
1098   return clock_gettime(CLOCK_MONOTONIC, NULL);
1099 }
1100 EOF
1101   if compile_prog "" "$LIBS" "clock monotonic"; then
1102       clock_monotonic="yes"
1103   fi
1104 fi
1105 print_config "CLOCK_MONOTONIC" "$clock_monotonic"
1106
1107 ##########################################
1108 # clockid_t probe
1109 if test "$clockid_t" != "yes" ; then
1110   clockid_t="no"
1111 fi
1112 cat > $TMPC << EOF
1113 #include <time.h>
1114 #include <string.h>
1115 int main(int argc, char **argv)
1116 {
1117   volatile clockid_t cid;
1118   memset((void*)&cid, 0, sizeof(cid));
1119   return 0;
1120 }
1121 EOF
1122 if compile_prog "" "$LIBS" "clockid_t"; then
1123   clockid_t="yes"
1124 fi
1125 print_config "clockid_t" "$clockid_t"
1126
1127 ##########################################
1128 # gettimeofday() probe
1129 if test "$gettimeofday" != "yes" ; then
1130   gettimeofday="no"
1131 fi
1132 cat > $TMPC << EOF
1133 #include <sys/time.h>
1134 #include <stdio.h>
1135 int main(int argc, char **argv)
1136 {
1137   struct timeval tv;
1138   return gettimeofday(&tv, NULL);
1139 }
1140 EOF
1141 if compile_prog "" "" "gettimeofday"; then
1142     gettimeofday="yes"
1143 fi
1144 print_config "gettimeofday" "$gettimeofday"
1145
1146 ##########################################
1147 # fdatasync() probe
1148 if test "$fdatasync" != "yes" ; then
1149   fdatasync="no"
1150 fi
1151 cat > $TMPC << EOF
1152 #include <stdio.h>
1153 #include <unistd.h>
1154 int main(int argc, char **argv)
1155 {
1156   return fdatasync(0);
1157 }
1158 EOF
1159 if compile_prog "" "" "fdatasync"; then
1160   fdatasync="yes"
1161 fi
1162 print_config "fdatasync" "$fdatasync"
1163
1164 ##########################################
1165 # pipe() probe
1166 if test "$pipe" != "yes" ; then
1167   pipe="no"
1168 fi
1169 cat > $TMPC << EOF
1170 #include <unistd.h>
1171 int main(int argc, char **argv)
1172 {
1173   int fd[2];
1174   return pipe(fd);
1175 }
1176 EOF
1177 if compile_prog "" "" "pipe"; then
1178   pipe="yes"
1179 fi
1180 print_config "pipe()" "$pipe"
1181
1182 ##########################################
1183 # pipe2() probe
1184 if test "$pipe2" != "yes" ; then
1185   pipe2="no"
1186 fi
1187 cat > $TMPC << EOF
1188 #include <unistd.h>
1189 int main(int argc, char **argv)
1190 {
1191   int fd[2];
1192   return pipe2(fd, 0);
1193 }
1194 EOF
1195 if compile_prog "" "" "pipe2"; then
1196   pipe2="yes"
1197 fi
1198 print_config "pipe2()" "$pipe2"
1199
1200 ##########################################
1201 # pread() probe
1202 if test "$pread" != "yes" ; then
1203   pread="no"
1204 fi
1205 cat > $TMPC << EOF
1206 #include <unistd.h>
1207 int main(int argc, char **argv)
1208 {
1209   return pread(0, NULL, 0, 0);
1210 }
1211 EOF
1212 if compile_prog "" "" "pread"; then
1213   pread="yes"
1214 fi
1215 print_config "pread()" "$pread"
1216
1217 ##########################################
1218 # sync_file_range() probe
1219 if test "$sync_file_range" != "yes" ; then
1220   sync_file_range="no"
1221 fi
1222 cat > $TMPC << EOF
1223 #include <stdio.h>
1224 #include <unistd.h>
1225 #include <fcntl.h>
1226 #include <linux/fs.h>
1227 int main(int argc, char **argv)
1228 {
1229   unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE |
1230                         SYNC_FILE_RANGE_WAIT_AFTER;
1231   return sync_file_range(0, 0, 0, flags);
1232 }
1233 EOF
1234 if compile_prog "" "" "sync_file_range"; then
1235   sync_file_range="yes"
1236 fi
1237 print_config "sync_file_range" "$sync_file_range"
1238
1239 ##########################################
1240 # ext4 move extent probe
1241 if test "$ext4_me" != "yes" ; then
1242   ext4_me="no"
1243 fi
1244 cat > $TMPC << EOF
1245 #include <fcntl.h>
1246 #include <sys/ioctl.h>
1247 int main(int argc, char **argv)
1248 {
1249   struct move_extent me;
1250   return ioctl(0, EXT4_IOC_MOVE_EXT, &me);
1251 }
1252 EOF
1253 if compile_prog "" "" "ext4 move extent" ; then
1254   ext4_me="yes"
1255 elif test $targetos = "Linux" ; then
1256   # On Linux, just default to it on and let it error at runtime if we really
1257   # don't have it. None of my updated systems have it defined, but it does
1258   # work. Takes a while to bubble back.
1259   ext4_me="yes"
1260 fi
1261 print_config "EXT4 move extent" "$ext4_me"
1262
1263 ##########################################
1264 # splice probe
1265 if test "$linux_splice" != "yes" ; then
1266   linux_splice="no"
1267 fi
1268 cat > $TMPC << EOF
1269 #include <stdio.h>
1270 #include <fcntl.h>
1271 int main(int argc, char **argv)
1272 {
1273   return splice(0, NULL, 0, NULL, 0, SPLICE_F_NONBLOCK);
1274 }
1275 EOF
1276 if compile_prog "" "" "linux splice"; then
1277   linux_splice="yes"
1278 fi
1279 print_config "Linux splice(2)" "$linux_splice"
1280
1281 ##########################################
1282 # libnuma probe
1283 if test "$libnuma" != "yes" ; then
1284   libnuma="no"
1285 fi
1286 cat > $TMPC << EOF
1287 #include <numa.h>
1288 int main(int argc, char **argv)
1289 {
1290   return numa_available();
1291 }
1292 EOF
1293 if test "$disable_numa" != "yes"  && compile_prog "" "-lnuma" "libnuma"; then
1294   libnuma="yes"
1295   LIBS="-lnuma $LIBS"
1296 fi
1297 print_config "libnuma" "$libnuma"
1298
1299 ##########################################
1300 # libnuma 2.x version API, initialize with "no" only if $libnuma is set to "yes"
1301 if test "$libnuma" = "yes" ; then
1302 libnuma_v2="no"
1303 cat > $TMPC << EOF
1304 #include <numa.h>
1305 int main(int argc, char **argv)
1306 {
1307   struct bitmask *mask = numa_parse_nodestring(NULL);
1308   return mask->size == 0;
1309 }
1310 EOF
1311 if compile_prog "" "" "libnuma api"; then
1312   libnuma_v2="yes"
1313 fi
1314 print_config "libnuma v2" "$libnuma_v2"
1315 fi
1316
1317 ##########################################
1318 # strsep() probe
1319 if test "$strsep" != "yes" ; then
1320   strsep="no"
1321 fi
1322 cat > $TMPC << EOF
1323 #include <string.h>
1324 int main(int argc, char **argv)
1325 {
1326   static char *string = "This is a string";
1327   strsep(&string, "needle");
1328   return 0;
1329 }
1330 EOF
1331 if compile_prog "" "" "strsep"; then
1332   strsep="yes"
1333 fi
1334 print_config "strsep" "$strsep"
1335
1336 ##########################################
1337 # strcasestr() probe
1338 if test "$strcasestr" != "yes" ; then
1339   strcasestr="no"
1340 fi
1341 cat > $TMPC << EOF
1342 #include <string.h>
1343 int main(int argc, char **argv)
1344 {
1345   return strcasestr(argv[0], argv[1]) != NULL;
1346 }
1347 EOF
1348 if compile_prog "" "" "strcasestr"; then
1349   strcasestr="yes"
1350 fi
1351 print_config "strcasestr" "$strcasestr"
1352
1353 ##########################################
1354 # strlcat() probe
1355 if test "$strlcat" != "yes" ; then
1356   strlcat="no"
1357 fi
1358 cat > $TMPC << EOF
1359 #include <string.h>
1360 int main(int argc, char **argv)
1361 {
1362   static char dst[64];
1363   static char *string = "This is a string";
1364   memset(dst, 0, sizeof(dst));
1365   strlcat(dst, string, sizeof(dst));
1366   return 0;
1367 }
1368 EOF
1369 if compile_prog "" "" "strlcat"; then
1370   strlcat="yes"
1371 fi
1372 print_config "strlcat" "$strlcat"
1373
1374 ##########################################
1375 # getopt_long_only() probe
1376 if test "$getopt_long_only" != "yes" ; then
1377   getopt_long_only="no"
1378 fi
1379 cat > $TMPC << EOF
1380 #include <unistd.h>
1381 #include <stdio.h>
1382 #include <getopt.h>
1383 int main(int argc, char **argv)
1384 {
1385   int c = getopt_long_only(argc, argv, "", NULL, NULL);
1386   return c;
1387 }
1388 EOF
1389 if compile_prog "" "" "getopt_long_only"; then
1390   getopt_long_only="yes"
1391 fi
1392 print_config "getopt_long_only()" "$getopt_long_only"
1393
1394 ##########################################
1395 # inet_aton() probe
1396 if test "$inet_aton" != "yes" ; then
1397   inet_aton="no"
1398 fi
1399 cat > $TMPC << EOF
1400 #ifdef _WIN32
1401 #include <winsock2.h>
1402 #else
1403 #include <sys/socket.h>
1404 #include <arpa/inet.h>
1405 #endif
1406 #include <stdio.h>
1407 int main(int argc, char **argv)
1408 {
1409   struct in_addr in;
1410   return inet_aton(NULL, &in);
1411 }
1412 EOF
1413 if compile_prog "" "" "inet_aton"; then
1414   inet_aton="yes"
1415 fi
1416 print_config "inet_aton" "$inet_aton"
1417
1418 ##########################################
1419 # socklen_t probe
1420 if test "$socklen_t" != "yes" ; then
1421   socklen_t="no"
1422 fi
1423 cat > $TMPC << EOF
1424 #ifdef _WIN32
1425 #include <winsock2.h>
1426 #include <ws2tcpip.h>
1427 #else
1428 #include <sys/socket.h>
1429 #endif
1430 int main(int argc, char **argv)
1431 {
1432   socklen_t len = 0;
1433   return len;
1434 }
1435 EOF
1436 if compile_prog "" "" "socklen_t"; then
1437   socklen_t="yes"
1438 fi
1439 print_config "socklen_t" "$socklen_t"
1440
1441 ##########################################
1442 # Whether or not __thread is supported for TLS
1443 if test "$tls_thread" != "yes" ; then
1444   tls_thread="no"
1445 fi
1446 cat > $TMPC << EOF
1447 #include <stdio.h>
1448 static __thread int ret;
1449 int main(int argc, char **argv)
1450 {
1451   return ret;
1452 }
1453 EOF
1454 if compile_prog "" "" "__thread"; then
1455   tls_thread="yes"
1456 fi
1457 print_config "__thread" "$tls_thread"
1458
1459 ##########################################
1460 # Check if we have required gtk/glib support for gfio
1461 if test "$gfio" != "yes" ; then
1462   gfio="no"
1463 fi
1464 if test "$gfio_check" = "yes" ; then
1465   cat > $TMPC << EOF
1466 #include <glib.h>
1467 #include <cairo.h>
1468 #include <gtk/gtk.h>
1469 int main(void)
1470 {
1471   gdk_threads_enter();
1472   gdk_threads_leave();
1473
1474   return GTK_CHECK_VERSION(2, 18, 0) ? 0 : 1; /* 0 on success */
1475 }
1476 EOF
1477 GTK_CFLAGS=$(${cross_prefix}pkg-config --cflags gtk+-2.0 gthread-2.0)
1478 ORG_LDFLAGS=$LDFLAGS
1479 LDFLAGS=$(echo $LDFLAGS | sed s/"-static"//g)
1480 if test "$?" != "0" ; then
1481   echo "configure: gtk and gthread not found"
1482   exit 1
1483 fi
1484 GTK_LIBS=$(${cross_prefix}pkg-config --libs gtk+-2.0 gthread-2.0)
1485 if test "$?" != "0" ; then
1486   echo "configure: gtk and gthread not found"
1487   exit 1
1488 fi
1489 gfio="yes"
1490 if check_min_lib_version gtk+-2.0 2.18.0 "gfio"; then
1491   if compile_prog "$GTK_CFLAGS" "$GTK_LIBS" "gfio" ; then
1492     GFIO_LIBS="$LIBS $GTK_LIBS"
1493     CFLAGS="$CFLAGS $GTK_CFLAGS"
1494   else
1495     echo "Please install gtk and gdk libraries"
1496     gfio="no"
1497   fi
1498 else
1499   gfio="no"
1500 fi
1501 LDFLAGS=$ORG_LDFLAGS
1502 fi
1503
1504 if test "$gfio_check" = "yes" ; then
1505   print_config "gtk 2.18 or higher" "$gfio"
1506 fi
1507
1508 ##########################################
1509 # Check whether we have getrusage(RUSAGE_THREAD)
1510 if test "$rusage_thread" != "yes" ; then
1511   rusage_thread="no"
1512 fi
1513 cat > $TMPC << EOF
1514 #include <sys/time.h>
1515 #include <sys/resource.h>
1516 int main(int argc, char **argv)
1517 {
1518   struct rusage ru;
1519   getrusage(RUSAGE_THREAD, &ru);
1520   return 0;
1521 }
1522 EOF
1523 if compile_prog "" "" "RUSAGE_THREAD"; then
1524   rusage_thread="yes"
1525 fi
1526 print_config "RUSAGE_THREAD" "$rusage_thread"
1527
1528 ##########################################
1529 # Check whether we have SCHED_IDLE
1530 if test "$sched_idle" != "yes" ; then
1531   sched_idle="no"
1532 fi
1533 cat > $TMPC << EOF
1534 #include <sched.h>
1535 int main(int argc, char **argv)
1536 {
1537   struct sched_param p;
1538   return sched_setscheduler(0, SCHED_IDLE, &p);
1539 }
1540 EOF
1541 if compile_prog "" "" "SCHED_IDLE"; then
1542   sched_idle="yes"
1543 fi
1544 print_config "SCHED_IDLE" "$sched_idle"
1545
1546 ##########################################
1547 # Check whether we have TCP_NODELAY
1548 if test "$tcp_nodelay" != "yes" ; then
1549   tcp_nodelay="no"
1550 fi
1551 cat > $TMPC << EOF
1552 #ifdef _WIN32
1553 #include <winsock2.h>
1554 #else
1555 #include <stdio.h>
1556 #include <sys/types.h>
1557 #include <sys/socket.h>
1558 #include <netinet/tcp.h>
1559 #endif
1560 int main(int argc, char **argv)
1561 {
1562   return getsockopt(0, 0, TCP_NODELAY, NULL, NULL);
1563 }
1564 EOF
1565 if compile_prog "" "" "TCP_NODELAY"; then
1566   tcp_nodelay="yes"
1567 elif compile_prog "" "-lws2_32" "TCP_NODELAY"; then
1568   tcp_nodelay="yes"
1569   LIBS="$LIBS -lws2_32"
1570 fi
1571 print_config "TCP_NODELAY" "$tcp_nodelay"
1572
1573 ##########################################
1574 # Check whether we have SO_SNDBUF
1575 if test "$window_size" != "yes" ; then
1576   window_size="no"
1577 fi
1578 cat > $TMPC << EOF
1579 #ifdef _WIN32
1580 #include <winsock2.h>
1581 #else
1582 #include <stdio.h>
1583 #include <sys/types.h>
1584 #include <sys/socket.h>
1585 #include <netinet/tcp.h>
1586 #endif
1587 int main(int argc, char **argv)
1588 {
1589   setsockopt(0, SOL_SOCKET, SO_SNDBUF, NULL, 0);
1590   setsockopt(0, SOL_SOCKET, SO_RCVBUF, NULL, 0);
1591 }
1592 EOF
1593 if compile_prog "" "" "SO_SNDBUF"; then
1594   window_size="yes"
1595 elif compile_prog "" "-lws2_32" "SO_SNDBUF"; then
1596   window_size="yes"
1597   LIBS="$LIBS -lws2_32"
1598 fi
1599 print_config "Net engine window_size" "$window_size"
1600
1601 ##########################################
1602 # Check whether we have TCP_MAXSEG
1603 if test "$mss" != "yes" ; then
1604   mss="no"
1605 fi
1606 cat > $TMPC << EOF
1607 #ifdef _WIN32
1608 #include <winsock2.h>
1609 #else
1610 #include <stdio.h>
1611 #include <sys/types.h>
1612 #include <sys/socket.h>
1613 #include <netinet/tcp.h>
1614 #include <arpa/inet.h>
1615 #include <netinet/in.h>
1616 #endif
1617 int main(int argc, char **argv)
1618 {
1619   return setsockopt(0, IPPROTO_TCP, TCP_MAXSEG, NULL, 0);
1620 }
1621 EOF
1622 if compile_prog "" "" "TCP_MAXSEG"; then
1623   mss="yes"
1624 elif compile_prog "" "-lws2_32" "TCP_MAXSEG"; then
1625   mss="yes"
1626   LIBS="$LIBS -lws2_32"
1627 fi
1628 print_config "TCP_MAXSEG" "$mss"
1629
1630 ##########################################
1631 # Check whether we have RLIMIT_MEMLOCK
1632 if test "$rlimit_memlock" != "yes" ; then
1633   rlimit_memlock="no"
1634 fi
1635 cat > $TMPC << EOF
1636 #include <sys/time.h>
1637 #include <sys/resource.h>
1638 int main(int argc, char **argv)
1639 {
1640   struct rlimit rl;
1641   return getrlimit(RLIMIT_MEMLOCK, &rl);
1642 }
1643 EOF
1644 if compile_prog "" "" "RLIMIT_MEMLOCK"; then
1645   rlimit_memlock="yes"
1646 fi
1647 print_config "RLIMIT_MEMLOCK" "$rlimit_memlock"
1648
1649 ##########################################
1650 # Check whether we have pwritev/preadv
1651 if test "$pwritev" != "yes" ; then
1652   pwritev="no"
1653 fi
1654 cat > $TMPC << EOF
1655 #include <stdio.h>
1656 #include <sys/uio.h>
1657 int main(int argc, char **argv)
1658 {
1659   return pwritev(0, NULL, 1, 0) + preadv(0, NULL, 1, 0);
1660 }
1661 EOF
1662 if compile_prog "" "" "pwritev"; then
1663   pwritev="yes"
1664 fi
1665 print_config "pwritev/preadv" "$pwritev"
1666
1667 ##########################################
1668 # Check whether we have pwritev2/preadv2
1669 if test "$pwritev2" != "yes" ; then
1670   pwritev2="no"
1671 fi
1672 cat > $TMPC << EOF
1673 #include <stdio.h>
1674 #include <sys/uio.h>
1675 int main(int argc, char **argv)
1676 {
1677   return pwritev2(0, NULL, 1, 0, 0) + preadv2(0, NULL, 1, 0, 0);
1678 }
1679 EOF
1680 if compile_prog "" "" "pwritev2"; then
1681   pwritev2="yes"
1682 fi
1683 print_config "pwritev2/preadv2" "$pwritev2"
1684
1685 ##########################################
1686 # Check whether we have the required functions for ipv6
1687 if test "$ipv6" != "yes" ; then
1688   ipv6="no"
1689 fi
1690 cat > $TMPC << EOF
1691 #ifdef _WIN32
1692 #include <winsock2.h>
1693 #include <ws2tcpip.h>
1694 #else
1695 #include <sys/types.h>
1696 #include <sys/socket.h>
1697 #include <netinet/in.h>
1698 #include <netdb.h>
1699 #endif
1700 #include <stdio.h>
1701 int main(int argc, char **argv)
1702 {
1703   struct addrinfo hints;
1704   struct in6_addr addr;
1705   int ret;
1706
1707   ret = getaddrinfo(NULL, NULL, &hints, NULL);
1708   freeaddrinfo(NULL);
1709   printf("%s\n", gai_strerror(ret));
1710   addr = in6addr_any;
1711   return 0;
1712 }
1713 EOF
1714 if compile_prog "" "" "ipv6"; then
1715   ipv6="yes"
1716 fi
1717 print_config "IPv6 helpers" "$ipv6"
1718
1719 ##########################################
1720 # check for http
1721 if test "$http" != "yes" ; then
1722   http="no"
1723 fi
1724 # check for openssl >= 1.1.0, which uses an opaque HMAC_CTX pointer
1725 cat > $TMPC << EOF
1726 #include <curl/curl.h>
1727 #include <openssl/hmac.h>
1728
1729 int main(int argc, char **argv)
1730 {
1731   CURL *curl;
1732   HMAC_CTX *ctx;
1733
1734   curl = curl_easy_init();
1735   curl_easy_cleanup(curl);
1736
1737   ctx = HMAC_CTX_new();
1738   HMAC_CTX_reset(ctx);
1739   HMAC_CTX_free(ctx);
1740   return 0;
1741 }
1742 EOF
1743 # openssl < 1.1.0 uses the HMAC_CTX type directly
1744 cat > $TMPC2 << EOF
1745 #include <curl/curl.h>
1746 #include <openssl/hmac.h>
1747
1748 int main(int argc, char **argv)
1749 {
1750   CURL *curl;
1751   HMAC_CTX ctx;
1752
1753   curl = curl_easy_init();
1754   curl_easy_cleanup(curl);
1755
1756   HMAC_CTX_init(&ctx);
1757   HMAC_CTX_cleanup(&ctx);
1758   return 0;
1759 }
1760 EOF
1761 if test "$disable_http" != "yes"; then
1762   HTTP_LIBS="-lcurl -lssl -lcrypto"
1763   if compile_prog "" "$HTTP_LIBS" "curl-new-ssl"; then
1764     output_sym "CONFIG_HAVE_OPAQUE_HMAC_CTX"
1765     http="yes"
1766   elif mv $TMPC2 $TMPC && compile_prog "" "$HTTP_LIBS" "curl-old-ssl"; then
1767     http="yes"
1768   fi
1769 fi
1770 print_config "http engine" "$http"
1771
1772 ##########################################
1773 # check for rados
1774 if test "$rados" != "yes" ; then
1775   rados="no"
1776 fi
1777 cat > $TMPC << EOF
1778 #include <rados/librados.h>
1779
1780 int main(int argc, char **argv)
1781 {
1782   rados_t cluster;
1783   rados_ioctx_t io_ctx;
1784   const char cluster_name[] = "ceph";
1785   const char user_name[] = "client.admin";
1786   const char pool[] = "rados";
1787
1788   /* The rados_create2 signature required was only introduced in ceph 0.65 */
1789   rados_create2(&cluster, cluster_name, user_name, 0);
1790   rados_ioctx_create(cluster, pool, &io_ctx);
1791
1792   return 0;
1793 }
1794 EOF
1795 if test "$disable_rados" != "yes"  && compile_prog "" "-lrados" "rados"; then
1796   rados="yes"
1797 fi
1798 print_config "Rados engine" "$rados"
1799
1800 ##########################################
1801 # check for rbd
1802 if test "$rbd" != "yes" ; then
1803   rbd="no"
1804 fi
1805 cat > $TMPC << EOF
1806 #include <rbd/librbd.h>
1807
1808 int main(int argc, char **argv)
1809 {
1810   rados_t cluster;
1811   rados_ioctx_t io_ctx;
1812   const char cluster_name[] = "ceph";
1813   const char user_name[] = "client.admin";
1814   const char pool[] = "rbd";
1815   int major, minor, extra;
1816
1817   rbd_version(&major, &minor, &extra);
1818   /* The rados_create2 signature required was only introduced in ceph 0.65 */
1819   rados_create2(&cluster, cluster_name, user_name, 0);
1820   rados_ioctx_create(cluster, pool, &io_ctx);
1821
1822   return 0;
1823 }
1824 EOF
1825 if test "$disable_rbd" != "yes"  && compile_prog "" "-lrbd -lrados" "rbd"; then
1826   rbd="yes"
1827 fi
1828 print_config "Rados Block Device engine" "$rbd"
1829
1830 ##########################################
1831 # check for rbd_poll
1832 if test "$rbd_poll" != "yes" ; then
1833   rbd_poll="no"
1834 fi
1835 if test "$rbd" = "yes"; then
1836 cat > $TMPC << EOF
1837 #include <rbd/librbd.h>
1838 #include <sys/eventfd.h>
1839
1840 int main(int argc, char **argv)
1841 {
1842   rbd_image_t image;
1843   rbd_completion_t comp;
1844
1845   int fd = eventfd(0, EFD_NONBLOCK);
1846   rbd_set_image_notification(image, fd, EVENT_TYPE_EVENTFD);
1847   rbd_poll_io_events(image, comp, 1);
1848
1849   return 0;
1850 }
1851 EOF
1852 if compile_prog "" "-lrbd -lrados" "rbd"; then
1853   rbd_poll="yes"
1854 fi
1855 print_config "rbd_poll" "$rbd_poll"
1856 fi
1857
1858 ##########################################
1859 # check for rbd_invalidate_cache()
1860 if test "$rbd_inval" != "yes" ; then
1861   rbd_inval="no"
1862 fi
1863 if test "$rbd" = "yes"; then
1864 cat > $TMPC << EOF
1865 #include <rbd/librbd.h>
1866
1867 int main(int argc, char **argv)
1868 {
1869   rbd_image_t image;
1870
1871   return rbd_invalidate_cache(image);
1872 }
1873 EOF
1874 if compile_prog "" "-lrbd -lrados" "rbd"; then
1875   rbd_inval="yes"
1876 fi
1877 print_config "rbd_invalidate_cache" "$rbd_inval"
1878 fi
1879
1880 ##########################################
1881 # Check whether we have setvbuf
1882 if test "$setvbuf" != "yes" ; then
1883   setvbuf="no"
1884 fi
1885 cat > $TMPC << EOF
1886 #include <stdio.h>
1887 int main(int argc, char **argv)
1888 {
1889   FILE *f = NULL;
1890   char buf[80];
1891   setvbuf(f, buf, _IOFBF, sizeof(buf));
1892   return 0;
1893 }
1894 EOF
1895 if compile_prog "" "" "setvbuf"; then
1896   setvbuf="yes"
1897 fi
1898 print_config "setvbuf" "$setvbuf"
1899
1900 ##########################################
1901 # check for gfapi
1902 if test "$gfapi" != "yes" ; then
1903   gfapi="no"
1904 fi
1905 cat > $TMPC << EOF
1906 #include <glusterfs/api/glfs.h>
1907
1908 int main(int argc, char **argv)
1909 {
1910   glfs_t *g = glfs_new("foo");
1911
1912   return 0;
1913 }
1914 EOF
1915 if test "$disable_gfapi" != "yes"  && compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then
1916   gfapi="yes"
1917 fi
1918 print_config "Gluster API engine" "$gfapi"
1919
1920 ##########################################
1921 # check for gfapi fadvise support, initialize with "no" only if $gfapi is set to "yes"
1922 if test "$gfapi" = "yes" ; then
1923 gf_fadvise="no"
1924 cat > $TMPC << EOF
1925 #include <glusterfs/api/glfs.h>
1926
1927 int main(int argc, char **argv)
1928 {
1929   struct glfs_fd *fd;
1930   int ret = glfs_fadvise(fd, 0, 0, 1);
1931
1932   return 0;
1933 }
1934 EOF
1935 if compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then
1936   gf_fadvise="yes"
1937 fi
1938 print_config "Gluster API use fadvise" "$gf_fadvise"
1939 fi
1940
1941 ##########################################
1942 # check for newer gfapi
1943 if test "$gfapi" = "yes" ; then
1944 gf_new="no"
1945 cat > $TMPC << EOF
1946 #include <glusterfs/api/glfs.h>
1947
1948 int main(int argc, char **argv)
1949 {
1950   return glfs_fsync(NULL, NULL, NULL) && glfs_ftruncate(NULL, 0, NULL, NULL);
1951 }
1952 EOF
1953 if compile_prog "" "-lgfapi -lglusterfs" "gf new api"; then
1954   gf_new="yes"
1955 fi
1956 print_config "Gluster new API" "$gf_new"
1957 fi
1958
1959 ##########################################
1960 # check for gfapi trim support
1961 if test "$gf_trim" != "yes" ; then
1962   gf_trim="no"
1963 fi
1964 if test "$gfapi" = "yes" ; then
1965 cat > $TMPC << EOF
1966 #include <glusterfs/api/glfs.h>
1967
1968 int main(int argc, char **argv)
1969 {
1970   return glfs_discard_async(NULL, 0, 0);
1971 }
1972 EOF
1973 if compile_prog "" "-lgfapi -lglusterfs" "gf trim"; then
1974   gf_trim="yes"
1975 fi
1976 print_config "Gluster API trim support" "$gf_trim"
1977 fi
1978
1979 ##########################################
1980 # Check if we support stckf on s390
1981 if test "$s390_z196_facilities" != "yes" ; then
1982   s390_z196_facilities="no"
1983 fi
1984 cat > $TMPC << EOF
1985 #define STFLE_BITS_Z196 45 /* various z196 facilities ... */
1986 int main(int argc, char **argv)
1987 {
1988     /* We want just 1 double word to be returned.  */
1989     register unsigned long reg0 asm("0") = 0;
1990     unsigned long stfle_bits;
1991     asm volatile(".machine push"        "\n\t"
1992                  ".machine \"z9-109\""  "\n\t"
1993                  "stfle %0"             "\n\t"
1994                  ".machine pop"         "\n"
1995                  : "=QS" (stfle_bits), "+d" (reg0)
1996                  : : "cc");
1997
1998     if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0)
1999       return 0;
2000     else
2001       return -1;
2002 }
2003 EOF
2004 if compile_prog "" "" "s390_z196_facilities"; then
2005   $TMPE
2006   if [ $? -eq 0 ]; then
2007         s390_z196_facilities="yes"
2008   fi
2009 fi
2010 print_config "s390_z196_facilities" "$s390_z196_facilities"
2011
2012 ##########################################
2013 # Check if we have required environment variables configured for libhdfs
2014 if test "$libhdfs" = "yes" ; then
2015   hdfs_conf_error=0
2016   if test "$JAVA_HOME" = "" ; then
2017     echo "configure: JAVA_HOME should be defined to jdk/jvm path"
2018     hdfs_conf_error=1
2019   fi
2020   if test "$FIO_LIBHDFS_INCLUDE" = "" ; then
2021     echo "configure: FIO_LIBHDFS_INCLUDE should be defined to libhdfs inlude path"
2022     hdfs_conf_error=1
2023   fi
2024   if test "$FIO_LIBHDFS_LIB" = "" ; then
2025     echo "configure: FIO_LIBHDFS_LIB should be defined to libhdfs library path"
2026     hdfs_conf_error=1
2027   fi
2028   if test "$hdfs_conf_error" = "1" ; then
2029     feature_not_found "libhdfs" ""
2030   fi
2031   FIO_HDFS_CPU=$cpu
2032   if test "$FIO_HDFS_CPU" = "x86_64" ; then
2033     FIO_HDFS_CPU="amd64"
2034   fi
2035 fi
2036 print_config "HDFS engine" "$libhdfs"
2037
2038 ##########################################
2039 # Check whether we have MTD
2040 if test "$mtd" != "yes" ; then
2041   mtd="no"
2042 fi
2043 cat > $TMPC << EOF
2044 #include <string.h>
2045 #include <mtd/mtd-user.h>
2046 #include <sys/ioctl.h>
2047 int main(int argc, char **argv)
2048 {
2049   struct mtd_write_req ops;
2050   struct mtd_info_user info;
2051   memset(&ops, 0, sizeof(ops));
2052   info.type = MTD_MLCNANDFLASH;
2053   return ioctl(0, MEMGETINFO, &info);
2054 }
2055 EOF
2056 if compile_prog "" "" "mtd"; then
2057   mtd="yes"
2058 fi
2059 print_config "MTD" "$mtd"
2060
2061 ##########################################
2062 # Check whether we have libpmem
2063 if test "$libpmem" != "yes" ; then
2064   libpmem="no"
2065 fi
2066 cat > $TMPC << EOF
2067 #include <libpmem.h>
2068 #include <stdlib.h>
2069 int main(int argc, char **argv)
2070 {
2071   int rc;
2072   rc = pmem_is_pmem(NULL, NULL);
2073   return 0;
2074 }
2075 EOF
2076 if compile_prog "" "-lpmem" "libpmem"; then
2077   libpmem="yes"
2078 fi
2079 print_config "libpmem" "$libpmem"
2080
2081 ##########################################
2082 # Check whether libpmem's version >= 1.5
2083 if test "$libpmem1_5" != "yes" ; then
2084   libpmem1_5="no"
2085 fi
2086 if test "$libpmem" = "yes"; then
2087   cat > $TMPC << EOF
2088 #include <libpmem.h>
2089 #include <stdlib.h>
2090 int main(int argc, char **argv)
2091 {
2092   pmem_memcpy(NULL, NULL, NULL, NULL);
2093   return 0;
2094 }
2095 EOF
2096   if compile_prog "" "-lpmem" "libpmem1_5"; then
2097     libpmem1_5="yes"
2098   fi
2099 fi
2100 print_config "libpmem1_5" "$libpmem1_5"
2101
2102 ##########################################
2103 # Check whether we have libpmemblk
2104 # libpmem is a prerequisite
2105 if test "$libpmemblk" != "yes" ; then
2106   libpmemblk="no"
2107 fi
2108 if test "$libpmem" = "yes"; then
2109   cat > $TMPC << EOF
2110 #include <libpmemblk.h>
2111 int main(int argc, char **argv)
2112 {
2113   PMEMblkpool *pbp;
2114   pbp = pmemblk_open("", 0);
2115   return 0;
2116 }
2117 EOF
2118   if compile_prog "" "-lpmemblk" "libpmemblk"; then
2119     libpmemblk="yes"
2120   fi
2121 fi
2122 print_config "libpmemblk" "$libpmemblk"
2123
2124 # Choose libpmem-based ioengines
2125 if test "$libpmem" = "yes" && test "$disable_pmem" = "no"; then
2126   devdax="yes"
2127   if test "$libpmem1_5" = "yes"; then
2128     pmem="yes"
2129   fi
2130   if test "$libpmemblk" = "yes"; then
2131     pmemblk="yes"
2132   fi
2133 fi
2134
2135 ##########################################
2136 # Report whether pmemblk engine is enabled
2137 print_config "PMDK pmemblk engine" "$pmemblk"
2138
2139 ##########################################
2140 # Report whether dev-dax engine is enabled
2141 print_config "PMDK dev-dax engine" "$devdax"
2142
2143 ##########################################
2144 # Report whether libpmem engine is enabled
2145 print_config "PMDK libpmem engine" "$pmem"
2146
2147 ##########################################
2148 # Check whether we support DDN's IME
2149 if test "$libime" != "yes" ; then
2150   libime="no"
2151 fi
2152 cat > $TMPC << EOF
2153 #include <ime_native.h>
2154 int main(int argc, char **argv)
2155 {
2156   int rc;
2157   ime_native_init();
2158   rc = ime_native_finalize();
2159   return 0;
2160 }
2161 EOF
2162 if compile_prog "-I${ime_path}/include" "-L${ime_path}/lib -lim_client" "libime"; then
2163   libime="yes"
2164   CFLAGS="-I${ime_path}/include $CFLAGS"
2165   LDFLAGS="-Wl,-rpath ${ime_path}/lib -L${ime_path}/lib $LDFLAGS"
2166   LIBS="-lim_client $LIBS"
2167 fi
2168 print_config "DDN's Infinite Memory Engine" "$libime"
2169
2170 ##########################################
2171 # Check if we have libiscsi
2172 if test "$libiscsi" != "no" ; then
2173   if check_min_lib_version libiscsi 1.9.0; then
2174     libiscsi="yes"
2175     libiscsi_cflags=$(pkg-config --cflags libiscsi)
2176     libiscsi_libs=$(pkg-config --libs libiscsi)
2177   else
2178     libiscsi="no"
2179   fi
2180 fi
2181 print_config "iscsi engine" "$libiscsi"
2182
2183 ##########################################
2184 # Check if we have libnbd (for NBD support)
2185 if test "$libnbd" != "no" ; then
2186   if check_min_lib_version libnbd 0.9.8; then
2187     libnbd="yes"
2188     libnbd_cflags=$(pkg-config --cflags libnbd)
2189     libnbd_libs=$(pkg-config --libs libnbd)
2190   else
2191     libnbd="no"
2192   fi
2193 fi
2194 print_config "NBD engine" "$libnbd"
2195
2196 ##########################################
2197 # Check if we have lex/yacc available
2198 yacc="no"
2199 yacc_is_bison="no"
2200 lex="no"
2201 arith="no"
2202 if test "$disable_lex" = "no" || test -z "$disable_lex" ; then
2203 if test "$targetos" != "SunOS" ; then
2204 if has lex; then
2205   lex="yes"
2206 fi
2207 if has bison; then
2208   yacc="yes"
2209   yacc_is_bison="yes"
2210 elif has yacc; then
2211   yacc="yes"
2212 fi
2213 if test "$yacc" = "yes" && test "$lex" = "yes" ; then
2214   arith="yes"
2215 fi
2216
2217 if test "$arith" = "yes" ; then
2218 cat > $TMPC << EOF
2219 extern int yywrap(void);
2220
2221 int main(int argc, char **argv)
2222 {
2223   yywrap();
2224   return 0;
2225 }
2226 EOF
2227 if compile_prog "" "-lfl" "flex"; then
2228   LIBS="-lfl $LIBS"
2229 elif compile_prog "" "-ll" "lex"; then
2230   LIBS="-ll $LIBS"
2231 else
2232   arith="no"
2233 fi
2234 fi
2235 fi
2236 fi
2237
2238 # Check if lex fails using -o
2239 if test "$arith" = "yes" ; then
2240 if test "$force_no_lex_o" = "yes" ; then
2241   lex_use_o="no"
2242 else
2243 if lex -o lex.yy.c exp/expression-parser.l 2> /dev/null; then
2244   lex_use_o="yes"
2245 else
2246   lex_use_o="no"
2247 fi
2248 fi
2249 fi
2250
2251 print_config "lex/yacc for arithmetic" "$arith"
2252
2253 ##########################################
2254 # Check whether we have setmntent/getmntent
2255 if test "$getmntent" != "yes" ; then
2256   getmntent="no"
2257 fi
2258 cat > $TMPC << EOF
2259 #include <stdio.h>
2260 #include <mntent.h>
2261 int main(int argc, char **argv)
2262 {
2263   FILE *mtab = setmntent(NULL, "r");
2264   struct mntent *mnt = getmntent(mtab);
2265   endmntent(mtab);
2266   return 0;
2267 }
2268 EOF
2269 if compile_prog "" "" "getmntent"; then
2270   getmntent="yes"
2271 fi
2272 print_config "getmntent" "$getmntent"
2273
2274 ##########################################
2275 # Check whether we have getmntinfo
2276 # These are originally added for BSDs, but may also work
2277 # on other operating systems with getmntinfo(3).
2278
2279 # getmntinfo(3) for FreeBSD/DragonFlyBSD/OpenBSD.
2280 # Note that NetBSD needs -Werror to catch warning as error.
2281 if test "$getmntinfo" != "yes" ; then
2282   getmntinfo="no"
2283 fi
2284 cat > $TMPC << EOF
2285 #include <stdio.h>
2286 #include <sys/param.h>
2287 #include <sys/mount.h>
2288 int main(int argc, char **argv)
2289 {
2290   struct statfs *st;
2291   return getmntinfo(&st, MNT_NOWAIT);
2292 }
2293 EOF
2294 if compile_prog "-Werror" "" "getmntinfo"; then
2295   getmntinfo="yes"
2296 fi
2297 print_config "getmntinfo" "$getmntinfo"
2298
2299 # getmntinfo(3) for NetBSD.
2300 if test "$getmntinfo_statvfs" != "yes" ; then
2301   getmntinfo_statvfs="no"
2302 fi
2303 cat > $TMPC << EOF
2304 #include <stdio.h>
2305 #include <sys/statvfs.h>
2306 int main(int argc, char **argv)
2307 {
2308   struct statvfs *st;
2309   return getmntinfo(&st, MNT_NOWAIT);
2310 }
2311 EOF
2312 # Skip the test if the one with statfs arg is detected.
2313 if test "$getmntinfo" != "yes" && compile_prog "-Werror" "" "getmntinfo_statvfs"; then
2314   getmntinfo_statvfs="yes"
2315   print_config "getmntinfo_statvfs" "$getmntinfo_statvfs"
2316 fi
2317
2318 ##########################################
2319 # Check whether we have _Static_assert
2320 if test "$static_assert" != "yes" ; then
2321   static_assert="no"
2322 fi
2323 cat > $TMPC << EOF
2324 #include <assert.h>
2325 #include <stdlib.h>
2326 #include <stddef.h>
2327
2328 struct foo {
2329   int a, b;
2330 };
2331
2332 int main(int argc, char **argv)
2333 {
2334   _Static_assert(offsetof(struct foo, a) == 0 , "Check");
2335   return 0 ;
2336 }
2337 EOF
2338 if compile_prog "" "" "static_assert"; then
2339     static_assert="yes"
2340 fi
2341 print_config "Static Assert" "$static_assert"
2342
2343 ##########################################
2344 # Check whether we have bool / stdbool.h
2345 if test "$have_bool" != "yes" ; then
2346   have_bool="no"
2347 fi
2348 cat > $TMPC << EOF
2349 #include <stdbool.h>
2350 int main(int argc, char **argv)
2351 {
2352   bool var = true;
2353   return var != false;
2354 }
2355 EOF
2356 if compile_prog "" "" "bool"; then
2357   have_bool="yes"
2358 fi
2359 print_config "bool" "$have_bool"
2360
2361 ##########################################
2362 # Check whether we have strndup()
2363 strndup="no"
2364 cat > $TMPC << EOF
2365 #include <string.h>
2366 #include <stdlib.h>
2367 int main(int argc, char **argv)
2368 {
2369   char *res = strndup("test string", 8);
2370
2371   free(res);
2372   return 0;
2373 }
2374 EOF
2375 if compile_prog "" "" "strndup"; then
2376   strndup="yes"
2377 fi
2378 print_config "strndup" "$strndup"
2379
2380 ##########################################
2381 # <valgrind/drd.h> probe
2382 # Note: presence of <valgrind/drd.h> implies that <valgrind/valgrind.h> is
2383 # also available but not the other way around.
2384 if test "$valgrind_dev" != "yes" ; then
2385   valgrind_dev="no"
2386 fi
2387 cat > $TMPC << EOF
2388 #include <valgrind/drd.h>
2389 int main(int argc, char **argv)
2390 {
2391   return 0;
2392 }
2393 EOF
2394 if compile_prog "" "" "valgrind_dev"; then
2395   valgrind_dev="yes"
2396 fi
2397 print_config "Valgrind headers" "$valgrind_dev"
2398
2399 if test "$targetos" = "Linux" ; then
2400 ##########################################
2401 # <linux/blkzoned.h> probe
2402 if test "$linux_blkzoned" != "yes" ; then
2403   linux_blkzoned="no"
2404 fi
2405 cat > $TMPC << EOF
2406 #include <linux/blkzoned.h>
2407 int main(int argc, char **argv)
2408 {
2409   return 0;
2410 }
2411 EOF
2412 if compile_prog "" "" "linux_blkzoned"; then
2413   linux_blkzoned="yes"
2414 fi
2415 print_config "Zoned block device support" "$linux_blkzoned"
2416
2417 ##########################################
2418 # Check BLK_ZONE_REP_CAPACITY
2419 cat > $TMPC << EOF
2420 #include <linux/blkzoned.h>
2421 int main(void)
2422 {
2423   return BLK_ZONE_REP_CAPACITY;
2424 }
2425 EOF
2426 if compile_prog "" "" "blkzoned report capacity"; then
2427   output_sym "CONFIG_HAVE_REP_CAPACITY"
2428   rep_capacity="yes"
2429 else
2430   rep_capacity="no"
2431 fi
2432 print_config "Zoned block device capacity" "$rep_capacity"
2433 fi
2434
2435 ##########################################
2436 # libzbc probe
2437 cat > $TMPC << EOF
2438 #include <libzbc/zbc.h>
2439 int main(int argc, char **argv)
2440 {
2441   struct zbc_device *dev = NULL;
2442
2443   return zbc_open("foo=bar", O_RDONLY, &dev);
2444 }
2445 EOF
2446 if test "$libzbc" != "no" ; then
2447   if compile_prog "" "-lzbc" "libzbc"; then
2448     libzbc="yes"
2449     if ! check_min_lib_version libzbc 5; then
2450       libzbc="no"
2451     fi
2452   else
2453     if test "$libzbc" = "yes" ; then
2454       feature_not_found "libzbc" "libzbc or libzbc/zbc.h"
2455     fi
2456     libzbc="no"
2457   fi
2458 fi
2459 print_config "libzbc engine" "$libzbc"
2460
2461 ##########################################
2462 # check march=armv8-a+crc+crypto
2463 if test "$march_armv8_a_crc_crypto" != "yes" ; then
2464   march_armv8_a_crc_crypto="no"
2465 fi
2466 if test "$cpu" = "arm64" ; then
2467   cat > $TMPC <<EOF
2468 #include <arm_acle.h>
2469 #include <arm_neon.h>
2470 #include <sys/auxv.h>
2471
2472 int main(void)
2473 {
2474   /* Can we also do a runtime probe? */
2475 #if __linux__
2476   return getauxval(AT_HWCAP);
2477 #else
2478 # error "Don't know how to do runtime probe for ARM CRC32c"
2479 #endif
2480 }
2481 EOF
2482   if compile_prog "-march=armv8-a+crc+crypto" "" "ARM CRC32c"; then
2483     march_armv8_a_crc_crypto="yes"
2484     CFLAGS="$CFLAGS -march=armv8-a+crc+crypto"
2485     march_set="yes"
2486   fi
2487 fi
2488 print_config "march_armv8_a_crc_crypto" "$march_armv8_a_crc_crypto"
2489
2490 ##########################################
2491 # cuda probe
2492 if test "$cuda" != "no" ; then
2493 cat > $TMPC << EOF
2494 #include <cuda.h>
2495 int main(int argc, char **argv)
2496 {
2497   return cuInit(0);
2498 }
2499 EOF
2500   if compile_prog "" "-lcuda" "cuda"; then
2501     cuda="yes"
2502     LIBS="-lcuda $LIBS"
2503   else
2504     if test "$cuda" = "yes" ; then
2505       feature_not_found "cuda" ""
2506     fi
2507     cuda="no"
2508   fi
2509 fi
2510 print_config "cuda" "$cuda"
2511
2512 ##########################################
2513 # check for cc -march=native
2514 build_native="no"
2515 cat > $TMPC << EOF
2516 int main(int argc, char **argv)
2517 {
2518   return 0;
2519 }
2520 EOF
2521 if test "$disable_native" = "no" && test "$disable_opt" != "yes" && \
2522    compile_prog "-march=native" "" "march=native"; then
2523   build_native="yes"
2524 fi
2525 print_config "Build march=native" "$build_native"
2526
2527 ##########################################
2528 # check for -lcunit
2529 if test "$cunit" != "yes" ; then
2530   cunit="no"
2531 fi
2532 cat > $TMPC << EOF
2533 #include <CUnit/CUnit.h>
2534 #include <CUnit/Basic.h>
2535 int main(void)
2536 {
2537   if (CU_initialize_registry() != CUE_SUCCESS)
2538     return CU_get_error();
2539   CU_basic_set_mode(CU_BRM_VERBOSE);
2540   CU_basic_run_tests();
2541   CU_cleanup_registry();
2542   return CU_get_error();
2543 }
2544 EOF
2545 if compile_prog "" "-lcunit" "CUnit"; then
2546   cunit="yes"
2547 fi
2548 print_config "CUnit" "$cunit"
2549
2550 ##########################################
2551 # check for __kernel_rwf_t
2552 __kernel_rwf_t="no"
2553 cat > $TMPC << EOF
2554 #include <linux/fs.h>
2555 int main(int argc, char **argv)
2556 {
2557   __kernel_rwf_t x;
2558   x = 0;
2559   return x;
2560 }
2561 EOF
2562 if compile_prog "" "" "__kernel_rwf_t"; then
2563   __kernel_rwf_t="yes"
2564 fi
2565 print_config "__kernel_rwf_t" "$__kernel_rwf_t"
2566
2567 ##########################################
2568 # check if gcc has -Wimplicit-fallthrough=2
2569 fallthrough="no"
2570 cat > $TMPC << EOF
2571 int main(int argc, char **argv)
2572 {
2573   return 0;
2574 }
2575 EOF
2576 if compile_prog "-Wimplicit-fallthrough=2" "" "-Wimplicit-fallthrough=2"; then
2577   fallthrough="yes"
2578 fi
2579 print_config "-Wimplicit-fallthrough=2" "$fallthrough"
2580
2581 ##########################################
2582 # check for MADV_HUGEPAGE support
2583 if test "$thp" != "yes" ; then
2584   thp="no"
2585 fi
2586 if test "$esx" != "yes" ; then
2587   cat > $TMPC <<EOF
2588 #include <sys/mman.h>
2589 int main(void)
2590 {
2591   return madvise(0, 0x1000, MADV_HUGEPAGE);
2592 }
2593 EOF
2594   if compile_prog "" "" "thp" ; then
2595     thp=yes
2596   else
2597     if test "$thp" = "yes" ; then
2598       feature_not_found "Transparent Huge Page" ""
2599     fi
2600     thp=no
2601   fi
2602 fi
2603 print_config "MADV_HUGEPAGE" "$thp"
2604
2605 ##########################################
2606 # check for gettid()
2607 gettid="no"
2608 cat > $TMPC << EOF
2609 #include <unistd.h>
2610 int main(int argc, char **argv)
2611 {
2612   return gettid();
2613 }
2614 EOF
2615 if compile_prog "" "" "gettid"; then
2616   gettid="yes"
2617 fi
2618 print_config "gettid" "$gettid"
2619
2620 ##########################################
2621 # check for statx(2) support by libc
2622 statx="no"
2623 cat > $TMPC << EOF
2624 #include <unistd.h>
2625 #include <sys/stat.h>
2626
2627 int main(int argc, char **argv)
2628 {
2629         struct statx st;
2630         return statx(-1, *argv, 0, 0, &st);
2631 }
2632 EOF
2633 if compile_prog "" "" "statx"; then
2634   statx="yes"
2635 fi
2636 print_config "statx(2)/libc" "$statx"
2637
2638 ##########################################
2639 # check for statx(2) support by kernel
2640 statx_syscall="no"
2641 cat > $TMPC << EOF
2642 #include <unistd.h>
2643 #include <linux/stat.h>
2644 #include <sys/stat.h>
2645 #include <sys/syscall.h>
2646
2647 static int _statx(int dfd, const char *pathname, int flags, unsigned int mask,
2648                   struct statx *buffer)
2649 {
2650         return syscall(__NR_statx, dfd, pathname, flags, mask, buffer);
2651 }
2652
2653 int main(int argc, char **argv)
2654 {
2655         struct statx st;
2656         return _statx(-1, *argv, 0, 0, &st);
2657 }
2658 EOF
2659 if compile_prog "" "" "statx_syscall"; then
2660   statx_syscall="yes"
2661 fi
2662 print_config "statx(2)/syscall" "$statx_syscall"
2663
2664 ##########################################
2665 # check for Windows PDB generation support
2666 if test "pdb" != "no" ; then
2667   cat > $TMPC <<EOF
2668 int main(void)
2669 {
2670   return 0;
2671 }
2672 EOF
2673   if compile_prog "-g -gcodeview" "-fuse-ld=lld -Wl,-pdb,$TMPO" "pdb"; then
2674     pdb=yes
2675   else
2676     if test "$pdb" = "yes"; then
2677       feature_not_found "PDB" "clang and lld"
2678     fi
2679     pdb=no
2680   fi
2681 else
2682   pdb=no
2683 fi
2684 print_config "Windows PDB generation" "$pdb"
2685 #############################################################################
2686
2687 if test "$wordsize" = "64" ; then
2688   output_sym "CONFIG_64BIT"
2689 elif test "$wordsize" = "32" ; then
2690   output_sym "CONFIG_32BIT"
2691 else
2692   fatal "Unknown wordsize!"
2693 fi
2694 if test "$bigendian" = "yes" ; then
2695   output_sym "CONFIG_BIG_ENDIAN"
2696 else
2697   output_sym "CONFIG_LITTLE_ENDIAN"
2698 fi
2699 if test "$zlib" = "yes" ; then
2700   output_sym "CONFIG_ZLIB"
2701 fi
2702 if test "$libaio" = "yes" ; then
2703   output_sym "CONFIG_LIBAIO"
2704   if test "$libaio_rw_flags" = "yes" ; then
2705     output_sym "CONFIG_LIBAIO_RW_FLAGS"
2706   fi
2707   if test "$libaio_uring" = "yes" ; then
2708     output_sym "CONFIG_LIBAIO_URING"
2709   fi
2710 fi
2711 if test "$posix_aio" = "yes" ; then
2712   output_sym "CONFIG_POSIXAIO"
2713 fi
2714 if test "$posix_aio_fsync" = "yes" ; then
2715   output_sym "CONFIG_POSIXAIO_FSYNC"
2716 fi
2717 if test "$posix_pshared" = "yes" ; then
2718   output_sym "CONFIG_PSHARED"
2719 fi
2720 if test "$pthread_condattr_setclock" = "yes" ; then
2721   output_sym "CONFIG_PTHREAD_CONDATTR_SETCLOCK"
2722 fi
2723 if test "$pthread_sigmask" = "yes" ; then
2724   output_sym "CONFIG_PTHREAD_SIGMASK"
2725 fi
2726 if test "$have_asprintf" = "yes" ; then
2727     output_sym "CONFIG_HAVE_ASPRINTF"
2728 fi
2729 if test "$have_vasprintf" = "yes" ; then
2730     output_sym "CONFIG_HAVE_VASPRINTF"
2731 fi
2732 if test "$linux_fallocate" = "yes" ; then
2733   output_sym "CONFIG_LINUX_FALLOCATE"
2734 fi
2735 if test "$posix_fallocate" = "yes" ; then
2736   output_sym "CONFIG_POSIX_FALLOCATE"
2737 fi
2738 if test "$fdatasync" = "yes" ; then
2739   output_sym "CONFIG_FDATASYNC"
2740 fi
2741 if test "$pipe" = "yes" ; then
2742   output_sym "CONFIG_PIPE"
2743 fi
2744 if test "$pipe2" = "yes" ; then
2745   output_sym "CONFIG_PIPE2"
2746 fi
2747 if test "$pread" = "yes" ; then
2748   output_sym "CONFIG_PREAD"
2749 fi
2750 if test "$sync_file_range" = "yes" ; then
2751   output_sym "CONFIG_SYNC_FILE_RANGE"
2752 fi
2753 if test "$sfaa" = "yes" ; then
2754   output_sym "CONFIG_SFAA"
2755 fi
2756 if test "$sync_sync" = "yes" ; then
2757   output_sym "CONFIG_SYNC_SYNC"
2758 fi
2759 if test "$cmp_swap" = "yes" ; then
2760   output_sym "CONFIG_CMP_SWAP"
2761 fi
2762 if test "$libverbs" = "yes" -a "$rdmacm" = "yes" ; then
2763   output_sym "CONFIG_RDMA"
2764 fi
2765 if test "$clock_gettime" = "yes" ; then
2766   output_sym "CONFIG_CLOCK_GETTIME"
2767 fi
2768 if test "$clock_monotonic" = "yes" ; then
2769   output_sym "CONFIG_CLOCK_MONOTONIC"
2770 fi
2771 if test "$clock_monotonic_raw" = "yes" ; then
2772   output_sym "CONFIG_CLOCK_MONOTONIC_RAW"
2773 fi
2774 if test "$clock_monotonic_precise" = "yes" ; then
2775   output_sym "CONFIG_CLOCK_MONOTONIC_PRECISE"
2776 fi
2777 if test "$clockid_t" = "yes"; then
2778   output_sym "CONFIG_CLOCKID_T"
2779 fi
2780 if test "$gettimeofday" = "yes" ; then
2781   output_sym "CONFIG_GETTIMEOFDAY"
2782 fi
2783 if test "$posix_fadvise" = "yes" ; then
2784   output_sym "CONFIG_POSIX_FADVISE"
2785 fi
2786 if test "$linux_3arg_affinity" = "yes" ; then
2787   output_sym "CONFIG_3ARG_AFFINITY"
2788 elif test "$linux_2arg_affinity" = "yes" ; then
2789   output_sym "CONFIG_2ARG_AFFINITY"
2790 fi
2791 if test "$strsep" = "yes" ; then
2792   output_sym "CONFIG_STRSEP"
2793 fi
2794 if test "$strcasestr" = "yes" ; then
2795   output_sym "CONFIG_STRCASESTR"
2796 fi
2797 if test "$strlcat" = "yes" ; then
2798   output_sym "CONFIG_STRLCAT"
2799 fi
2800 if test "$getopt_long_only" = "yes" ; then
2801   output_sym "CONFIG_GETOPT_LONG_ONLY"
2802 fi
2803 if test "$inet_aton" = "yes" ; then
2804   output_sym "CONFIG_INET_ATON"
2805 fi
2806 if test "$socklen_t" = "yes" ; then
2807   output_sym "CONFIG_SOCKLEN_T"
2808 fi
2809 if test "$ext4_me" = "yes" ; then
2810   output_sym "CONFIG_LINUX_EXT4_MOVE_EXTENT"
2811 fi
2812 if test "$linux_splice" = "yes" ; then
2813   output_sym "CONFIG_LINUX_SPLICE"
2814 fi
2815 if test "$libnuma_v2" = "yes" ; then
2816   output_sym "CONFIG_LIBNUMA"
2817 fi
2818 if test "$solaris_aio" = "yes" ; then
2819   output_sym "CONFIG_SOLARISAIO"
2820 fi
2821 if test "$tls_thread" = "yes" ; then
2822   output_sym "CONFIG_TLS_THREAD"
2823 fi
2824 if test "$rusage_thread" = "yes" ; then
2825   output_sym "CONFIG_RUSAGE_THREAD"
2826 fi
2827 if test "$gfio" = "yes" ; then
2828   output_sym "CONFIG_GFIO"
2829 fi
2830 if test "$esx" = "yes" ; then
2831   output_sym "CONFIG_ESX"
2832   output_sym "CONFIG_NO_SHM"
2833 fi
2834 if test "$sched_idle" = "yes" ; then
2835   output_sym "CONFIG_SCHED_IDLE"
2836 fi
2837 if test "$tcp_nodelay" = "yes" ; then
2838   output_sym "CONFIG_TCP_NODELAY"
2839 fi
2840 if test "$window_size" = "yes" ; then
2841   output_sym "CONFIG_NET_WINDOWSIZE"
2842 fi
2843 if test "$mss" = "yes" ; then
2844   output_sym "CONFIG_NET_MSS"
2845 fi
2846 if test "$rlimit_memlock" = "yes" ; then
2847   output_sym "CONFIG_RLIMIT_MEMLOCK"
2848 fi
2849 if test "$pwritev" = "yes" ; then
2850   output_sym "CONFIG_PWRITEV"
2851 fi
2852 if test "$pwritev2" = "yes" ; then
2853   output_sym "CONFIG_PWRITEV2"
2854 fi
2855 if test "$ipv6" = "yes" ; then
2856   output_sym "CONFIG_IPV6"
2857 fi
2858 if test "$http" = "yes" ; then
2859   output_sym "CONFIG_HTTP"
2860 fi
2861 if test "$rados" = "yes" ; then
2862   output_sym "CONFIG_RADOS"
2863 fi
2864 if test "$rbd" = "yes" ; then
2865   output_sym "CONFIG_RBD"
2866 fi
2867 if test "$rbd_poll" = "yes" ; then
2868   output_sym "CONFIG_RBD_POLL"
2869 fi
2870 if test "$rbd_inval" = "yes" ; then
2871   output_sym "CONFIG_RBD_INVAL"
2872 fi
2873 if test "$setvbuf" = "yes" ; then
2874   output_sym "CONFIG_SETVBUF"
2875 fi
2876 if test "$s390_z196_facilities" = "yes" ; then
2877   output_sym "CONFIG_S390_Z196_FACILITIES"
2878   CFLAGS="$CFLAGS -march=z9-109"
2879   march_set="yes"
2880 fi
2881 if test "$gfapi" = "yes" ; then
2882   output_sym "CONFIG_GFAPI"
2883 fi
2884 if test "$gf_fadvise" = "yes" ; then
2885   output_sym "CONFIG_GF_FADVISE"
2886 fi
2887 if test "$gf_trim" = "yes" ; then
2888   output_sym "CONFIG_GF_TRIM"
2889 fi
2890 if test "$gf_new" = "yes" ; then
2891   output_sym "CONFIG_GF_NEW_API"
2892 fi
2893 if test "$libhdfs" = "yes" ; then
2894   output_sym "CONFIG_LIBHDFS"
2895   echo "FIO_HDFS_CPU=$FIO_HDFS_CPU" >> $config_host_mak
2896   echo "JAVA_HOME=$JAVA_HOME" >> $config_host_mak
2897   echo "FIO_LIBHDFS_INCLUDE=$FIO_LIBHDFS_INCLUDE" >> $config_host_mak
2898   echo "FIO_LIBHDFS_LIB=$FIO_LIBHDFS_LIB" >> $config_host_mak
2899 fi
2900 if test "$mtd" = "yes" ; then
2901   output_sym "CONFIG_MTD"
2902 fi
2903 if test "$pmemblk" = "yes" ; then
2904   output_sym "CONFIG_PMEMBLK"
2905 fi
2906 if test "$devdax" = "yes" ; then
2907   output_sym "CONFIG_LINUX_DEVDAX"
2908 fi
2909 if test "$pmem" = "yes" ; then
2910   output_sym "CONFIG_LIBPMEM"
2911 fi
2912 if test "$libime" = "yes" ; then
2913   output_sym "CONFIG_IME"
2914 fi
2915 if test "$arith" = "yes" ; then
2916   output_sym "CONFIG_ARITHMETIC"
2917   if test "$yacc_is_bison" = "yes" ; then
2918     echo "YACC=bison -y" >> $config_host_mak
2919   else
2920     echo "YACC=yacc" >> $config_host_mak
2921   fi
2922   if test "$lex_use_o" = "yes" ; then
2923     echo "CONFIG_LEX_USE_O=y" >> $config_host_mak
2924   fi
2925 fi
2926 if test "$getmntent" = "yes" ; then
2927   output_sym "CONFIG_GETMNTENT"
2928 fi
2929 if test "$getmntinfo" = "yes" ; then
2930   output_sym "CONFIG_GETMNTINFO"
2931 fi
2932 if test "$getmntinfo_statvfs" = "yes" ; then
2933   output_sym "CONFIG_GETMNTINFO_STATVFS"
2934 fi
2935 if test "$static_assert" = "yes" ; then
2936   output_sym "CONFIG_STATIC_ASSERT"
2937 fi
2938 if test "$have_bool" = "yes" ; then
2939   output_sym "CONFIG_HAVE_BOOL"
2940 fi
2941 if test "$strndup" = "yes" ; then
2942   output_sym "CONFIG_HAVE_STRNDUP"
2943 fi
2944 if test "$disable_opt" = "yes" ; then
2945   output_sym "CONFIG_DISABLE_OPTIMIZATIONS"
2946 fi
2947 if test "$valgrind_dev" = "yes"; then
2948   output_sym "CONFIG_VALGRIND_DEV"
2949 fi
2950 if test "$linux_blkzoned" = "yes" ; then
2951   output_sym "CONFIG_HAS_BLKZONED"
2952 fi
2953 if test "$libzbc" = "yes" ; then
2954   output_sym "CONFIG_LIBZBC"
2955 fi
2956 if test "$zlib" = "no" ; then
2957   echo "Consider installing zlib-dev (zlib-devel, some fio features depend on it."
2958   if test "$build_static" = "yes"; then
2959     echo "Note that some distros have separate packages for static libraries."
2960   fi
2961 fi
2962 if test "$march_armv8_a_crc_crypto" = "yes" ; then
2963   output_sym "ARCH_HAVE_CRC_CRYPTO"
2964 fi
2965 if test "$cuda" = "yes" ; then
2966   output_sym "CONFIG_CUDA"
2967 fi
2968 if test "$march_set" = "no" && test "$build_native" = "yes" ; then
2969   output_sym "CONFIG_BUILD_NATIVE"
2970 fi
2971 if test "$cunit" = "yes" ; then
2972   output_sym "CONFIG_HAVE_CUNIT"
2973 fi
2974 if test "$__kernel_rwf_t" = "yes"; then
2975   output_sym "CONFIG_HAVE_KERNEL_RWF_T"
2976 fi
2977 if test "$gettid" = "yes"; then
2978   output_sym "CONFIG_HAVE_GETTID"
2979 fi
2980 if test "$statx" = "yes"; then
2981   output_sym "CONFIG_HAVE_STATX"
2982 fi
2983 if test "$statx_syscall" = "yes"; then
2984   output_sym "CONFIG_HAVE_STATX_SYSCALL"
2985 fi
2986 if test "$fallthrough" = "yes"; then
2987   CFLAGS="$CFLAGS -Wimplicit-fallthrough"
2988 fi
2989 if test "$thp" = "yes" ; then
2990   output_sym "CONFIG_HAVE_THP"
2991 fi
2992 if test "$libiscsi" = "yes" ; then
2993   output_sym "CONFIG_LIBISCSI"
2994   echo "CONFIG_LIBISCSI=m" >> $config_host_mak
2995   echo "LIBISCSI_CFLAGS=$libiscsi_cflags" >> $config_host_mak
2996   echo "LIBISCSI_LIBS=$libiscsi_libs" >> $config_host_mak
2997 fi
2998 if test "$libnbd" = "yes" ; then
2999   output_sym "CONFIG_LIBNBD"
3000   echo "CONFIG_LIBNBD=m" >> $config_host_mak
3001   echo "LIBNBD_CFLAGS=$libnbd_cflags" >> $config_host_mak
3002   echo "LIBNBD_LIBS=$libnbd_libs" >> $config_host_mak
3003 fi
3004 if test "$dynamic_engines" = "yes" ; then
3005   output_sym "CONFIG_DYNAMIC_ENGINES"
3006 fi
3007 if test "$pdb" = yes; then
3008   output_sym "CONFIG_PDB"
3009 fi
3010
3011 print_config "Lib-based ioengines dynamic" "$dynamic_engines"
3012 cat > $TMPC << EOF
3013 int main(int argc, char **argv)
3014 {
3015   return 0;
3016 }
3017 EOF
3018 if test "$disable_tcmalloc" != "yes"; then
3019   if compile_prog "" "-ltcmalloc" "tcmalloc"; then
3020     tcmalloc="yes"
3021     LIBS="-ltcmalloc $LIBS"
3022   elif compile_prog "" "-l:libtcmalloc_minimal.so.4" "tcmalloc_minimal4"; then
3023     tcmalloc="yes"
3024     LIBS="-l:libtcmalloc_minimal.so.4 $LIBS"
3025   else
3026     tcmalloc="no"
3027   fi
3028 fi
3029 print_config "TCMalloc support" "$tcmalloc"
3030
3031 echo "LIBS+=$LIBS" >> $config_host_mak
3032 echo "GFIO_LIBS+=$GFIO_LIBS" >> $config_host_mak
3033 echo "CFLAGS+=$CFLAGS" >> $config_host_mak
3034 echo "LDFLAGS+=$LDFLAGS" >> $config_host_mak
3035 echo "CC=$cc" >> $config_host_mak
3036 echo "BUILD_CFLAGS=$BUILD_CFLAGS $CFLAGS" >> $config_host_mak
3037 echo "INSTALL_PREFIX=$prefix" >> $config_host_mak
3038
3039 if [ `dirname $0` != "." -a ! -e Makefile ]; then
3040     cat > Makefile <<EOF
3041 SRCDIR:=`dirname $0`
3042 include \$(SRCDIR)/Makefile
3043 EOF
3044 fi