configure revision b50afc415a32cb01658a927c0412dd92d6fc7fa1
1#!/bin/sh 2# 3# Fio configure script. Heavily influenced by the manual qemu configure 4# script. Sad this this is easier than autoconf and enemies. 5# 6 7# set temporary file name 8if test ! -z "$TMPDIR" ; then 9 TMPDIR1="${TMPDIR}" 10elif test ! -z "$TEMPDIR" ; then 11 TMPDIR1="${TEMPDIR}" 12else 13 TMPDIR1="/tmp" 14fi 15 16TMPC="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.c" 17TMPO="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.o" 18TMPE="${TMPDIR1}/fio-conf-${RANDOM}-$$-${RANDOM}.exe" 19 20# NB: do not call "exit" in the trap handler; this is buggy with some shells; 21# see <1285349658-3122-1-git-send-email-loic.minier@linaro.org> 22trap "rm -f $TMPC $TMPO $TMPE" EXIT INT QUIT TERM 23 24rm -rf config.log 25 26config_host_mak="config-host.mak" 27config_host_h="config-host.h" 28 29rm -rf $config_host_mak 30rm -rf $config_host_h 31 32fatal() { 33 echo $@ 34 echo "Configure failed, check config.log and/or the above output" 35 rm -rf $config_host_mak 36 rm -rf $config_host_h 37 exit 1 38} 39 40# Default CFLAGS 41CFLAGS="-D_GNU_SOURCE -include config-host.h" 42BUILD_CFLAGS="" 43 44# Print a helpful header at the top of config.log 45echo "# FIO configure log $(date)" >> config.log 46printf "# Configured with:" >> config.log 47printf " '%s'" "$0" "$@" >> config.log 48echo >> config.log 49echo "#" >> config.log 50 51# Print configure header at the top of $config_host_h 52echo "/*" > $config_host_h 53echo " * Automatically generated by configure - do not modify" >> $config_host_h 54printf " * Configured with:" >> $config_host_h 55printf " * '%s'" "$0" "$@" >> $config_host_h 56echo "" >> $config_host_h 57echo " */" >> $config_host_h 58 59do_cc() { 60 # Run the compiler, capturing its output to the log. 61 echo $cc "$@" >> config.log 62 $cc "$@" >> config.log 2>&1 || return $? 63 # Test passed. If this is an --enable-werror build, rerun 64 # the test with -Werror and bail out if it fails. This 65 # makes warning-generating-errors in configure test code 66 # obvious to developers. 67 if test "$werror" != "yes"; then 68 return 0 69 fi 70 # Don't bother rerunning the compile if we were already using -Werror 71 case "$*" in 72 *-Werror*) 73 return 0 74 ;; 75 esac 76 echo $cc -Werror "$@" >> config.log 77 $cc -Werror "$@" >> config.log 2>&1 && return $? 78 echo "ERROR: configure test passed without -Werror but failed with -Werror." 79 echo "This is probably a bug in the configure script. The failing command" 80 echo "will be at the bottom of config.log." 81 fatal "You can run configure with --disable-werror to bypass this check." 82} 83 84compile_object() { 85 do_cc $CFLAGS -c -o $TMPO $TMPC 86} 87 88compile_prog() { 89 local_cflags="$1" 90 local_ldflags="$2 $LIBS" 91 echo "Compiling test case $3" >> config.log 92 do_cc $CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags 93} 94 95feature_not_found() { 96 feature=$1 97 packages=$2 98 99 echo "ERROR" 100 echo "ERROR: User requested feature $feature" 101 if test ! -z "$packages" ; then 102 echo "ERROR: That feature needs $packages installed" 103 fi 104 echo "ERROR: configure was not able to find it" 105 fatal "ERROR" 106} 107 108has() { 109 type "$1" >/dev/null 2>&1 110} 111 112check_define() { 113 cat > $TMPC <<EOF 114#if !defined($1) 115#error $1 not defined 116#endif 117int main(void) 118{ 119 return 0; 120} 121EOF 122 compile_object 123} 124 125output_sym() { 126 echo "$1=y" >> $config_host_mak 127 echo "#define $1" >> $config_host_h 128} 129 130targetos="" 131cpu="" 132 133# default options 134show_help="no" 135exit_val=0 136gfio="no" 137libhdfs="no" 138 139# parse options 140for opt do 141 optarg=`expr "x$opt" : 'x[^=]*=\(.*\)'` 142 case "$opt" in 143 --cpu=*) cpu="$optarg" 144 ;; 145 # esx is cross compiled and cannot be detect through simple uname calls 146 --esx) 147 esx="yes" 148 ;; 149 --cc=*) CC="$optarg" 150 ;; 151 --extra-cflags=*) CFLAGS="$CFLAGS $optarg" 152 ;; 153 --build-32bit-win) build_32bit_win="yes" 154 ;; 155 --enable-gfio) 156 gfio="yes" 157 ;; 158 --disable-numa) disable_numa="yes" 159 ;; 160 --disable-rbd) disable_rbd="yes" 161 ;; 162 --disable-gfapi) disable_gfapi="yes" 163 ;; 164 --enable-libhdfs) libhdfs="yes" 165 ;; 166 --help) 167 show_help="yes" 168 ;; 169 *) 170 echo "Bad option $opt" 171 show_help="yes" 172 exit_val=1 173 esac 174done 175 176if test "$show_help" = "yes" ; then 177 echo "--cpu= Specify target CPU if auto-detect fails" 178 echo "--cc= Specify compiler to use" 179 echo "--extra-cflags= Specify extra CFLAGS to pass to compiler" 180 echo "--build-32bit-win Enable 32-bit build on Windows" 181 echo "--esx Configure build options for esx" 182 echo "--enable-gfio Enable building of gtk gfio" 183 echo "--disable-numa Disable libnuma even if found" 184 echo "--enable-libhdfs Enable hdfs support" 185 exit $exit_val 186fi 187 188cross_prefix=${cross_prefix-${CROSS_COMPILE}} 189cc="${CC-${cross_prefix}gcc}" 190 191if check_define __ANDROID__ ; then 192 targetos="Android" 193elif check_define __linux__ ; then 194 targetos="Linux" 195elif check_define __OpenBSD__ ; then 196 targetos='OpenBSD' 197elif check_define __sun__ ; then 198 targetos='SunOS' 199 CFLAGS="$CFLAGS -D_REENTRANT" 200elif check_define _WIN32 ; then 201 targetos='CYGWIN' 202else 203 targetos=`uname -s` 204fi 205 206echo "# Automatically generated by configure - do not modify" > $config_host_mak 207printf "# Configured with:" >> $config_host_mak 208printf " '%s'" "$0" "$@" >> $config_host_mak 209echo >> $config_host_mak 210echo "CONFIG_TARGET_OS=$targetos" >> $config_host_mak 211 212# Some host OSes need non-standard checks for which CPU to use. 213# Note that these checks are broken for cross-compilation: if you're 214# cross-compiling to one of these OSes then you'll need to specify 215# the correct CPU with the --cpu option. 216case $targetos in 217Darwin) 218 # on Leopard most of the system is 32-bit, so we have to ask the kernel if 219 # we can run 64-bit userspace code. 220 # If the user didn't specify a CPU explicitly and the kernel says this is 221 # 64 bit hw, then assume x86_64. Otherwise fall through to the usual 222 # detection code. 223 if test -z "$cpu" && test "$(sysctl -n hw.optional.x86_64)" = "1"; then 224 cpu="x86_64" 225 fi 226 ;; 227SunOS) 228 # `uname -m` returns i86pc even on an x86_64 box, so default based on isainfo 229 if test -z "$cpu" && test "$(isainfo -k)" = "amd64"; then 230 cpu="x86_64" 231 fi 232 LIBS="-lnsl -lsocket" 233 ;; 234CYGWIN*) 235 echo "Forcing known good options on Windows" 236 if test -z "$CC" ; then 237 if test ! -z "$build_32bit_win" && test "$build_32bit_win" = "yes"; then 238 CC="i686-w64-mingw32-gcc" 239 else 240 CC="x86_64-w64-mingw32-gcc" 241 fi 242 fi 243 output_sym "CONFIG_LITTLE_ENDIAN" 244 if test ! -z "$build_32bit_win" && test "$build_32bit_win" = "yes"; then 245 output_sym "CONFIG_32BIT" 246 else 247 output_sym "CONFIG_64BIT_LLP64" 248 fi 249 output_sym "CONFIG_FADVISE" 250 output_sym "CONFIG_SOCKLEN_T" 251 output_sym "CONFIG_FADVISE" 252 output_sym "CONFIG_SFAA" 253 output_sym "CONFIG_RUSAGE_THREAD" 254 output_sym "CONFIG_WINDOWSAIO" 255 output_sym "CONFIG_FDATASYNC" 256 output_sym "CONFIG_CLOCK_MONOTONIC" 257 output_sym "CONFIG_GETTIMEOFDAY" 258 output_sym "CONFIG_CLOCK_GETTIME" 259 output_sym "CONFIG_SCHED_IDLE" 260 output_sym "CONFIG_TCP_NODELAY" 261 output_sym "CONFIG_TLS_THREAD" 262 output_sym "CONFIG_IPV6" 263 echo "CC=$CC" >> $config_host_mak 264 echo "BUILD_CFLAGS=$CFLAGS -include config-host.h -D_GNU_SOURCE" >> $config_host_mak 265 exit 0 266 ;; 267esac 268 269if test ! -z "$cpu" ; then 270 # command line argument 271 : 272elif check_define __i386__ ; then 273 cpu="i386" 274elif check_define __x86_64__ ; then 275 cpu="x86_64" 276elif check_define __sparc__ ; then 277 if check_define __arch64__ ; then 278 cpu="sparc64" 279 else 280 cpu="sparc" 281 fi 282elif check_define _ARCH_PPC ; then 283 if check_define _ARCH_PPC64 ; then 284 cpu="ppc64" 285 else 286 cpu="ppc" 287 fi 288elif check_define __mips__ ; then 289 cpu="mips" 290elif check_define __ia64__ ; then 291 cpu="ia64" 292elif check_define __s390__ ; then 293 if check_define __s390x__ ; then 294 cpu="s390x" 295 else 296 cpu="s390" 297 fi 298elif check_define __arm__ ; then 299 cpu="arm" 300elif check_define __hppa__ ; then 301 cpu="hppa" 302else 303 cpu=`uname -m` 304fi 305 306# Normalise host CPU name and set ARCH. 307case "$cpu" in 308 ia64|ppc|ppc64|s390|s390x|sparc64) 309 cpu="$cpu" 310 ;; 311 i386|i486|i586|i686|i86pc|BePC) 312 cpu="i386" 313 ;; 314 x86_64|amd64) 315 cpu="x86_64" 316 ;; 317 armv*b|armv*l|arm) 318 cpu="arm" 319 ;; 320 hppa|parisc|parisc64) 321 cpu="hppa" 322 ;; 323 mips*) 324 cpu="mips" 325 ;; 326 sparc|sun4[cdmuv]) 327 cpu="sparc" 328 ;; 329 *) 330 echo "Unknown CPU" 331 ;; 332esac 333 334if test -z "$CC" ; then 335 if test "$targetos" = "FreeBSD"; then 336 if has clang; then 337 CC=clang 338 else 339 CC=gcc 340 fi 341 fi 342fi 343 344cc="${CC-${cross_prefix}gcc}" 345 346########################################## 347# check cross compile 348 349cross_compile="no" 350cat > $TMPC <<EOF 351int main(void) 352{ 353 return 0; 354} 355EOF 356if compile_prog "" "" "cross"; then 357 $TMPE 2>/dev/null || cross_compile="yes" 358else 359 fatal "compile test failed" 360fi 361 362########################################## 363# check endianness 364bigendian="no" 365if test "$cross_compile" = "no" ; then 366 cat > $TMPC <<EOF 367#include <inttypes.h> 368int main(void) 369{ 370 volatile uint32_t i=0x01234567; 371 return (*((uint8_t*)(&i))) == 0x67; 372} 373EOF 374 if compile_prog "" "" "endian"; then 375 $TMPE && bigendian="yes" 376 fi 377else 378 # If we're cross compiling, try our best to work it out and rely on the 379 # run-time check to fail if we get it wrong. 380 cat > $TMPC <<EOF 381#include <endian.h> 382int main(void) 383{ 384#if __BYTE_ORDER != __BIG_ENDIAN 385# error "Unknown endianness" 386#endif 387} 388EOF 389 compile_prog "" "" "endian" && bigendian="yes" 390 check_define "__ARMEB__" && bigendian="yes" 391 check_define "__MIPSEB__" && bigendian="yes" 392fi 393 394 395echo "Operating system $targetos" 396echo "CPU $cpu" 397echo "Big endian $bigendian" 398echo "Compiler $cc" 399echo "Cross compile $cross_compile" 400echo 401 402########################################## 403# check for wordsize 404wordsize="0" 405cat > $TMPC <<EOF 406#include <limits.h> 407#define BUILD_BUG_ON(condition) ((void)sizeof(char[1 - 2*!!(condition)])) 408int main(void) 409{ 410 BUILD_BUG_ON(sizeof(long)*CHAR_BIT != WORDSIZE); 411 return 0; 412} 413EOF 414if compile_prog "-DWORDSIZE=32" "" "wordsize"; then 415 wordsize="32" 416elif compile_prog "-DWORDSIZE=64" "" "wordsize"; then 417 wordsize="64" 418else 419 fatal "Unknown wordsize" 420fi 421echo "Wordsize $wordsize" 422 423########################################## 424# zlib probe 425zlib="no" 426cat > $TMPC <<EOF 427#include <zlib.h> 428int main(void) 429{ 430 z_stream stream; 431 if (inflateInit(&stream) != Z_OK) 432 return 1; 433 return 0; 434} 435EOF 436if compile_prog "" "-lz" "zlib" ; then 437 zlib=yes 438 LIBS="-lz $LIBS" 439fi 440echo "zlib $zlib" 441 442########################################## 443# linux-aio probe 444libaio="no" 445cat > $TMPC <<EOF 446#include <libaio.h> 447#include <stddef.h> 448int main(void) 449{ 450 io_setup(0, NULL); 451 return 0; 452} 453EOF 454if compile_prog "" "-laio" "libaio" ; then 455 libaio=yes 456 LIBS="-laio $LIBS" 457else 458 if test "$libaio" = "yes" ; then 459 feature_not_found "linux AIO" "libaio-dev or libaio-devel" 460 fi 461 libaio=no 462fi 463echo "Linux AIO support $libaio" 464 465########################################## 466# posix aio probe 467posix_aio="no" 468posix_aio_lrt="no" 469cat > $TMPC <<EOF 470#include <aio.h> 471int main(void) 472{ 473 struct aiocb cb; 474 aio_read(&cb); 475 return 0; 476} 477EOF 478if compile_prog "" "" "posixaio" ; then 479 posix_aio="yes" 480elif compile_prog "" "-lrt" "posixaio"; then 481 posix_aio="yes" 482 posix_aio_lrt="yes" 483 LIBS="-lrt $LIBS" 484fi 485echo "POSIX AIO support $posix_aio" 486echo "POSIX AIO support needs -lrt $posix_aio_lrt" 487 488########################################## 489# posix aio fsync probe 490posix_aio_fsync="no" 491if test "$posix_aio" = "yes" ; then 492 cat > $TMPC <<EOF 493#include <fcntl.h> 494#include <aio.h> 495int main(void) 496{ 497 struct aiocb cb; 498 return aio_fsync(O_SYNC, &cb); 499 return 0; 500} 501EOF 502 if compile_prog "" "$LIBS" "posix_aio_fsync" ; then 503 posix_aio_fsync=yes 504 fi 505fi 506echo "POSIX AIO fsync $posix_aio_fsync" 507 508########################################## 509# solaris aio probe 510solaris_aio="no" 511cat > $TMPC <<EOF 512#include <sys/types.h> 513#include <sys/asynch.h> 514#include <unistd.h> 515int main(void) 516{ 517 aio_result_t res; 518 return aioread(0, NULL, 0, 0, SEEK_SET, &res); 519 return 0; 520} 521EOF 522if compile_prog "" "-laio" "solarisaio" ; then 523 solaris_aio=yes 524 LIBS="-laio $LIBS" 525fi 526echo "Solaris AIO support $solaris_aio" 527 528########################################## 529# __sync_fetch_and_and test 530sfaa="no" 531cat > $TMPC << EOF 532static int sfaa(int *ptr) 533{ 534 return __sync_fetch_and_add(ptr, 0); 535} 536 537int main(int argc, char **argv) 538{ 539 int val = 42; 540 sfaa(&val); 541 return val; 542} 543EOF 544if compile_prog "" "" "__sync_fetch_and_add()" ; then 545 sfaa="yes" 546fi 547echo "__sync_fetch_and_add $sfaa" 548 549########################################## 550# libverbs probe 551libverbs="no" 552cat > $TMPC << EOF 553#include <stdio.h> 554#include <infiniband/arch.h> 555int main(int argc, char **argv) 556{ 557 struct ibv_pd *pd = ibv_alloc_pd(NULL); 558 return 0; 559} 560EOF 561if compile_prog "" "-libverbs" "libverbs" ; then 562 libverbs="yes" 563 LIBS="-libverbs $LIBS" 564fi 565echo "libverbs $libverbs" 566 567########################################## 568# rdmacm probe 569rdmacm="no" 570cat > $TMPC << EOF 571#include <stdio.h> 572#include <rdma/rdma_cma.h> 573int main(int argc, char **argv) 574{ 575 rdma_destroy_qp(NULL); 576 return 0; 577} 578EOF 579if compile_prog "" "-lrdmacm" "rdma"; then 580 rdmacm="yes" 581 LIBS="-lrdmacm $LIBS" 582fi 583echo "rdmacm $rdmacm" 584 585########################################## 586# Linux fallocate probe 587linux_fallocate="no" 588cat > $TMPC << EOF 589#include <stdio.h> 590#include <fcntl.h> 591#include <linux/falloc.h> 592int main(int argc, char **argv) 593{ 594 int r = fallocate(0, FALLOC_FL_KEEP_SIZE, 0, 1024); 595 return r; 596} 597EOF 598if compile_prog "" "" "linux_fallocate"; then 599 linux_fallocate="yes" 600fi 601echo "Linux fallocate $linux_fallocate" 602 603########################################## 604# POSIX fadvise probe 605posix_fadvise="no" 606cat > $TMPC << EOF 607#include <stdio.h> 608#include <fcntl.h> 609int main(int argc, char **argv) 610{ 611 int r = posix_fadvise(0, 0, 0, POSIX_FADV_NORMAL); 612 return r; 613} 614EOF 615if compile_prog "" "" "posix_fadvise"; then 616 posix_fadvise="yes" 617fi 618echo "POSIX fadvise $posix_fadvise" 619 620########################################## 621# POSIX fallocate probe 622posix_fallocate="no" 623cat > $TMPC << EOF 624#include <stdio.h> 625#include <fcntl.h> 626int main(int argc, char **argv) 627{ 628 int r = posix_fallocate(0, 0, 1024); 629 return r; 630} 631EOF 632if compile_prog "" "" "posix_fallocate"; then 633 posix_fallocate="yes" 634fi 635echo "POSIX fallocate $posix_fallocate" 636 637########################################## 638# sched_set/getaffinity 2 or 3 argument test 639linux_2arg_affinity="no" 640linux_3arg_affinity="no" 641cat > $TMPC << EOF 642#include <sched.h> 643int main(int argc, char **argv) 644{ 645 cpu_set_t mask; 646 return sched_setaffinity(0, sizeof(mask), &mask); 647} 648EOF 649if compile_prog "" "" "sched_setaffinity(,,)"; then 650 linux_3arg_affinity="yes" 651else 652 cat > $TMPC << EOF 653#include <sched.h> 654int main(int argc, char **argv) 655{ 656 cpu_set_t mask; 657 return sched_setaffinity(0, &mask); 658} 659EOF 660 if compile_prog "" "" "sched_setaffinity(,)"; then 661 linux_2arg_affinity="yes" 662 fi 663fi 664echo "sched_setaffinity(3 arg) $linux_3arg_affinity" 665echo "sched_setaffinity(2 arg) $linux_2arg_affinity" 666 667########################################## 668# clock_gettime probe 669clock_gettime="no" 670cat > $TMPC << EOF 671#include <stdio.h> 672#include <time.h> 673int main(int argc, char **argv) 674{ 675 return clock_gettime(0, NULL); 676} 677EOF 678if compile_prog "" "" "clock_gettime"; then 679 clock_gettime="yes" 680elif compile_prog "" "-lrt" "clock_gettime"; then 681 clock_gettime="yes" 682 LIBS="-lrt $LIBS" 683fi 684echo "clock_gettime $clock_gettime" 685 686########################################## 687# CLOCK_MONOTONIC probe 688clock_monotonic="no" 689if test "$clock_gettime" = "yes" ; then 690 cat > $TMPC << EOF 691#include <stdio.h> 692#include <time.h> 693int main(int argc, char **argv) 694{ 695 return clock_gettime(CLOCK_MONOTONIC, NULL); 696} 697EOF 698 if compile_prog "" "$LIBS" "clock monotonic"; then 699 clock_monotonic="yes" 700 fi 701fi 702echo "CLOCK_MONOTONIC $clock_monotonic" 703 704########################################## 705# CLOCK_MONOTONIC_PRECISE probe 706clock_monotonic_precise="no" 707if test "$clock_gettime" = "yes" ; then 708 cat > $TMPC << EOF 709#include <stdio.h> 710#include <time.h> 711int main(int argc, char **argv) 712{ 713 return clock_gettime(CLOCK_MONOTONIC_PRECISE, NULL); 714} 715EOF 716 if compile_prog "" "$LIBS" "clock monotonic precise"; then 717 clock_monotonic_precise="yes" 718 fi 719fi 720echo "CLOCK_MONOTONIC_PRECISE $clock_monotonic_precise" 721 722########################################## 723# gettimeofday() probe 724gettimeofday="no" 725cat > $TMPC << EOF 726#include <sys/time.h> 727#include <stdio.h> 728int main(int argc, char **argv) 729{ 730 struct timeval tv; 731 return gettimeofday(&tv, NULL); 732} 733EOF 734if compile_prog "" "" "gettimeofday"; then 735 gettimeofday="yes" 736fi 737echo "gettimeofday $gettimeofday" 738 739########################################## 740# fdatasync() probe 741fdatasync="no" 742cat > $TMPC << EOF 743#include <stdio.h> 744#include <unistd.h> 745int main(int argc, char **argv) 746{ 747 return fdatasync(0); 748} 749EOF 750if compile_prog "" "" "fdatasync"; then 751 fdatasync="yes" 752fi 753echo "fdatasync $fdatasync" 754 755########################################## 756# sync_file_range() probe 757sync_file_range="no" 758cat > $TMPC << EOF 759#include <stdio.h> 760#include <unistd.h> 761#include <fcntl.h> 762#include <linux/fs.h> 763int main(int argc, char **argv) 764{ 765 unsigned int flags = SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | 766 SYNC_FILE_RANGE_WAIT_AFTER; 767 return sync_file_range(0, 0, 0, flags); 768} 769EOF 770if compile_prog "" "" "sync_file_range"; then 771 sync_file_range="yes" 772fi 773echo "sync_file_range $sync_file_range" 774 775########################################## 776# ext4 move extent probe 777ext4_me="no" 778cat > $TMPC << EOF 779#include <fcntl.h> 780#include <sys/ioctl.h> 781int main(int argc, char **argv) 782{ 783 struct move_extent me; 784 return ioctl(0, EXT4_IOC_MOVE_EXT, &me); 785} 786EOF 787if compile_prog "" "" "ext4 move extent" ; then 788 ext4_me="yes" 789elif test $targetos = "Linux" ; then 790 # On Linux, just default to it on and let it error at runtime if we really 791 # don't have it. None of my updated systems have it defined, but it does 792 # work. Takes a while to bubble back. 793 ext4_me="yes" 794fi 795echo "EXT4 move extent $ext4_me" 796 797########################################## 798# splice probe 799linux_splice="no" 800cat > $TMPC << EOF 801#include <stdio.h> 802#include <fcntl.h> 803int main(int argc, char **argv) 804{ 805 return splice(0, NULL, 0, NULL, 0, SPLICE_F_NONBLOCK); 806} 807EOF 808if compile_prog "" "" "linux splice"; then 809 linux_splice="yes" 810fi 811echo "Linux splice(2) $linux_splice" 812 813########################################## 814# GUASI probe 815guasi="no" 816cat > $TMPC << EOF 817#include <guasi.h> 818#include <guasi_syscalls.h> 819int main(int argc, char **argv) 820{ 821 guasi_t ctx = guasi_create(0, 0, 0); 822 return 0; 823} 824EOF 825if compile_prog "" "" "guasi"; then 826 guasi="yes" 827fi 828echo "GUASI $guasi" 829 830########################################## 831# fusion-aw probe 832fusion_aw="no" 833cat > $TMPC << EOF 834#include <nvm/nvm_primitives.h> 835int main(int argc, char **argv) 836{ 837 nvm_version_t ver_info; 838 nvm_handle_t handle; 839 840 handle = nvm_get_handle(0, &ver_info); 841 return nvm_atomic_write(handle, 0, 0, 0); 842} 843EOF 844if compile_prog "" "-L/usr/lib/fio -L/usr/lib/nvm -lnvm-primitives -lvsl -ldl" "fusion-aw"; then 845 LIBS="-L/usr/lib/fio -L/usr/lib/nvm -lnvm-primitives -lvsl -ldl $LIBS" 846 fusion_aw="yes" 847fi 848echo "Fusion-io atomic engine $fusion_aw" 849 850########################################## 851# libnuma probe 852libnuma="no" 853cat > $TMPC << EOF 854#include <numa.h> 855int main(int argc, char **argv) 856{ 857 return numa_available(); 858} 859EOF 860if test "$disable_numa" != "yes" && compile_prog "" "-lnuma" "libnuma"; then 861 libnuma="yes" 862 LIBS="-lnuma $LIBS" 863fi 864echo "libnuma $libnuma" 865 866########################################## 867# libnuma 2.x version API 868if test "$libnuma" = "yes" ; then 869libnuma_v2="no" 870cat > $TMPC << EOF 871#include <numa.h> 872int main(int argc, char **argv) 873{ 874 struct bitmask *mask = numa_parse_nodestring(NULL); 875 return 0; 876} 877EOF 878if compile_prog "" "" "libnuma api"; then 879 libnuma_v2="yes" 880fi 881echo "libnuma v2 $libnuma_v2" 882fi 883 884########################################## 885# strsep() probe 886strsep="no" 887cat > $TMPC << EOF 888#include <string.h> 889int main(int argc, char **argv) 890{ 891 strsep(NULL, NULL); 892 return 0; 893} 894EOF 895if compile_prog "" "" "strsep"; then 896 strsep="yes" 897fi 898echo "strsep $strsep" 899 900########################################## 901# strcasestr() probe 902strcasestr="no" 903cat > $TMPC << EOF 904#include <string.h> 905int main(int argc, char **argv) 906{ 907 return strcasestr(argv[0], argv[1]) != NULL; 908} 909EOF 910if compile_prog "" "" "strcasestr"; then 911 strcasestr="yes" 912fi 913echo "strcasestr $strcasestr" 914 915########################################## 916# getopt_long_only() probe 917getopt_long_only="no" 918cat > $TMPC << EOF 919#include <unistd.h> 920#include <stdio.h> 921#include <getopt.h> 922int main(int argc, char **argv) 923{ 924 int c = getopt_long_only(argc, argv, NULL, NULL, NULL); 925 return c; 926} 927EOF 928if compile_prog "" "" "getopt_long_only"; then 929 getopt_long_only="yes" 930fi 931echo "getopt_long_only() $getopt_long_only" 932 933########################################## 934# inet_aton() probe 935inet_aton="no" 936cat > $TMPC << EOF 937#include <sys/socket.h> 938#include <arpa/inet.h> 939#include <stdio.h> 940int main(int argc, char **argv) 941{ 942 struct in_addr in; 943 return inet_aton(NULL, &in); 944} 945EOF 946if compile_prog "" "" "inet_aton"; then 947 inet_aton="yes" 948fi 949echo "inet_aton $inet_aton" 950 951########################################## 952# socklen_t probe 953socklen_t="no" 954cat > $TMPC << EOF 955#include <sys/socket.h> 956int main(int argc, char **argv) 957{ 958 socklen_t len = 0; 959 return len; 960} 961EOF 962if compile_prog "" "" "socklen_t"; then 963 socklen_t="yes" 964fi 965echo "socklen_t $socklen_t" 966 967########################################## 968# Whether or not __thread is supported for TLS 969tls_thread="no" 970cat > $TMPC << EOF 971#include <stdio.h> 972static __thread int ret; 973int main(int argc, char **argv) 974{ 975 return ret; 976} 977EOF 978if compile_prog "" "" "__thread"; then 979 tls_thread="yes" 980fi 981echo "__thread $tls_thread" 982 983########################################## 984# Check if we have required gtk/glib support for gfio 985if test "$gfio" = "yes" ; then 986 cat > $TMPC << EOF 987#include <glib.h> 988#include <cairo.h> 989#include <gtk/gtk.h> 990int main(void) 991{ 992 gdk_threads_enter(); 993 gdk_threads_leave(); 994 995 printf("%d", GTK_CHECK_VERSION(2, 18, 0)); 996} 997EOF 998GTK_CFLAGS=$(pkg-config --cflags gtk+-2.0 gthread-2.0) 999if test "$?" != "0" ; then 1000 echo "configure: gtk and gthread not found" 1001 exit 1 1002fi 1003GTK_LIBS=$(pkg-config --libs gtk+-2.0 gthread-2.0) 1004if test "$?" != "0" ; then 1005 echo "configure: gtk and gthread not found" 1006 exit 1 1007fi 1008if compile_prog "$GTK_CFLAGS" "$GTK_LIBS" "gfio" ; then 1009 r=$($TMPE) 1010 if test "$r" != "0" ; then 1011 gfio="yes" 1012 LIBS="$LIBS $GTK_LIBS" 1013 CFLAGS="$CFLAGS $GTK_CFLAGS" 1014 else 1015 echo "GTK found, but need version 2.18 or higher" 1016 gfio="no" 1017 fi 1018else 1019 echo "Please install gtk and gdk libraries" 1020 gfio="no" 1021fi 1022fi 1023 1024echo "gtk 2.18 or higher $gfio" 1025 1026# Check whether we have getrusage(RUSAGE_THREAD) 1027rusage_thread="no" 1028cat > $TMPC << EOF 1029#include <sys/time.h> 1030#include <sys/resource.h> 1031int main(int argc, char **argv) 1032{ 1033 struct rusage ru; 1034 getrusage(RUSAGE_THREAD, &ru); 1035 return 0; 1036} 1037EOF 1038if compile_prog "" "" "RUSAGE_THREAD"; then 1039 rusage_thread="yes" 1040fi 1041echo "RUSAGE_THREAD $rusage_thread" 1042 1043########################################## 1044# Check whether we have SCHED_IDLE 1045sched_idle="no" 1046cat > $TMPC << EOF 1047#include <sched.h> 1048int main(int argc, char **argv) 1049{ 1050 struct sched_param p; 1051 return sched_setscheduler(0, SCHED_IDLE, &p); 1052} 1053EOF 1054if compile_prog "" "" "SCHED_IDLE"; then 1055 sched_idle="yes" 1056fi 1057echo "SCHED_IDLE $sched_idle" 1058 1059########################################## 1060# Check whether we have TCP_NODELAY 1061tcp_nodelay="no" 1062cat > $TMPC << EOF 1063#include <stdio.h> 1064#include <sys/types.h> 1065#include <sys/socket.h> 1066#include <netinet/tcp.h> 1067int main(int argc, char **argv) 1068{ 1069 return getsockopt(0, 0, TCP_NODELAY, NULL, NULL); 1070} 1071EOF 1072if compile_prog "" "" "TCP_NODELAY"; then 1073 tcp_nodelay="yes" 1074fi 1075echo "TCP_NODELAY $tcp_nodelay" 1076 1077########################################## 1078# Check whether we have RLIMIT_MEMLOCK 1079rlimit_memlock="no" 1080cat > $TMPC << EOF 1081#include <sys/time.h> 1082#include <sys/resource.h> 1083int main(int argc, char **argv) 1084{ 1085 struct rlimit rl; 1086 return getrlimit(RLIMIT_MEMLOCK, &rl); 1087} 1088EOF 1089if compile_prog "" "" "RLIMIT_MEMLOCK"; then 1090 rlimit_memlock="yes" 1091fi 1092echo "RLIMIT_MEMLOCK $rlimit_memlock" 1093 1094########################################## 1095# Check whether we have pwritev/preadv 1096pwritev="no" 1097cat > $TMPC << EOF 1098#include <stdio.h> 1099#include <sys/uio.h> 1100int main(int argc, char **argv) 1101{ 1102 return pwritev(0, NULL, 1, 0) + preadv(0, NULL, 1, 0); 1103} 1104EOF 1105if compile_prog "" "" "pwritev"; then 1106 pwritev="yes" 1107fi 1108echo "pwritev/preadv $pwritev" 1109 1110########################################## 1111# Check whether we have the required functions for ipv6 1112ipv6="no" 1113cat > $TMPC << EOF 1114#include <sys/types.h> 1115#include <sys/socket.h> 1116#include <netinet/in.h> 1117#include <netdb.h> 1118#include <stdio.h> 1119int main(int argc, char **argv) 1120{ 1121 struct addrinfo hints; 1122 struct in6_addr addr; 1123 int ret; 1124 1125 ret = getaddrinfo(NULL, NULL, &hints, NULL); 1126 freeaddrinfo(NULL); 1127 printf("%s\n", gai_strerror(ret)); 1128 addr = in6addr_any; 1129 return 0; 1130} 1131EOF 1132if compile_prog "" "" "ipv6"; then 1133 ipv6="yes" 1134fi 1135echo "IPv6 helpers $ipv6" 1136 1137########################################## 1138# check for rbd 1139rbd="no" 1140cat > $TMPC << EOF 1141#include <rbd/librbd.h> 1142 1143int main(int argc, char **argv) 1144{ 1145 1146 rados_t cluster; 1147 rados_ioctx_t io_ctx; 1148 const char pool[] = "rbd"; 1149 1150 int major, minor, extra; 1151 rbd_version(&major, &minor, &extra); 1152 1153 rados_ioctx_create(cluster, pool, &io_ctx); 1154 return 0; 1155} 1156EOF 1157if test "$disable_rbd" != "yes" && compile_prog "" "-lrbd -lrados" "rbd"; then 1158 LIBS="-lrbd -lrados $LIBS" 1159 rbd="yes" 1160fi 1161echo "Rados Block Device engine $rbd" 1162 1163########################################## 1164# check for gfapi 1165gfapi="no" 1166cat > $TMPC << EOF 1167#include <glusterfs/api/glfs.h> 1168 1169int main(int argc, char **argv) 1170{ 1171 1172 glfs_t *g = glfs_new("foo"); 1173 1174 return 0; 1175} 1176EOF 1177if test "$disable_gfapi" != "yes" && compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then 1178 LIBS="-lgfapi -lglusterfs $LIBS" 1179 gfapi="yes" 1180fi 1181 echo "Gluster API engine $gfapi" 1182 1183########################################## 1184# check for gfapi fadvise support 1185gf_fadvise="no" 1186cat > $TMPC << EOF 1187#include <glusterfs/api/glfs.h> 1188 1189int main(int argc, char **argv) 1190{ 1191 struct glfs_fd *fd; 1192 int ret = glfs_fadvise(fd, 0, 0, 1); 1193 1194 return 0; 1195} 1196EOF 1197 1198if compile_prog "" "-lgfapi -lglusterfs" "gfapi"; then 1199 gf_fadvise="yes" 1200fi 1201echo "Gluster API use fadvise $gf_fadvise" 1202 1203########################################## 1204# Check if we support stckf on s390 1205s390_z196_facilities="no" 1206cat > $TMPC << EOF 1207#define STFLE_BITS_Z196 45 /* various z196 facilities ... */ 1208int main(int argc, char **argv) 1209{ 1210 /* We want just 1 double word to be returned. */ 1211 register unsigned long reg0 asm("0") = 0; 1212 unsigned long stfle_bits; 1213 asm volatile(".machine push" "\n\t" 1214 ".machine \"z9-109\"" "\n\t" 1215 "stfle %0" "\n\t" 1216 ".machine pop" "\n" 1217 : "=QS" (stfle_bits), "+d" (reg0) 1218 : : "cc"); 1219 1220 if ((stfle_bits & (1UL << (63 - STFLE_BITS_Z196))) != 0) 1221 return 0; 1222 else 1223 return -1; 1224} 1225EOF 1226if compile_prog "" "" "s390_z196_facilities"; then 1227 $TMPE 1228 if [[ $? -eq 0 ]]; then 1229 s390_z196_facilities="yes" 1230 fi 1231fi 1232echo "s390_z196_facilities $s390_z196_facilities" 1233 1234########################################## 1235# Check if we have required environment variables configured for libhdfs 1236if test "$libhdfs" = "yes" ; then 1237 hdfs_conf_error=0 1238 if test "$JAVA_HOME" = "" ; then 1239 echo "configure: JAVA_HOME should be defined to jdk/jvm path" 1240 hdfs_conf_error=1 1241 fi 1242 if test "$FIO_LIBHDFS_INCLUDE" = "" ; then 1243 echo "configure: FIO_LIBHDFS_INCLUDE should be defined to libhdfs inlude path" 1244 hdfs_conf_error=1 1245 fi 1246 if test "$FIO_LIBHDFS_LIB" = "" ; then 1247 echo "configure: FIO_LIBHDFS_LIB should be defined to libhdfs library path" 1248 hdfs_conf_error=1 1249 fi 1250 if test "$hdfs_conf_error" = "1" ; then 1251 exit 1 1252 fi 1253fi 1254echo "HDFS engine $libhdfs" 1255 1256# Check if we have lex/yacc available 1257yacc="no" 1258yacc_is_bison="no" 1259lex="no" 1260arith="no" 1261LEX=$(which lex 2> /dev/null) 1262if test -x "$LEX" ; then 1263 lex="yes" 1264fi 1265YACC=$(which yacc 2> /dev/null) 1266if test -x "$YACC" ; then 1267 yacc="yes" 1268else 1269 YACC=$(which bison 2> /dev/null) 1270 if test -x "$YACC" ; then 1271 yacc="yes" 1272 yacc_is_bison="yes" 1273 fi 1274fi 1275if test "$yacc" = "yes" && test "$lex" = "yes" ; then 1276 arith="yes" 1277fi 1278 1279if test "$arith" = "yes" ; then 1280cat > $TMPC << EOF 1281extern int yywrap(void); 1282 1283int main(int argc, char **argv) 1284{ 1285 yywrap(); 1286 return 0; 1287} 1288EOF 1289 1290if compile_prog "" "-ll -ly" "lex"; then 1291 LIBS="-ll -ly $LIBS" 1292else 1293 arith="no" 1294fi 1295fi 1296 1297echo "lex/yacc for arithmetic $arith" 1298 1299############################################################################# 1300 1301if test "$wordsize" = "64" ; then 1302 output_sym "CONFIG_64BIT" 1303elif test "$wordsize" = "32" ; then 1304 output_sym "CONFIG_32BIT" 1305else 1306 fatal "Unknown wordsize!" 1307fi 1308if test "$bigendian" = "yes" ; then 1309 output_sym "CONFIG_BIG_ENDIAN" 1310else 1311 output_sym "CONFIG_LITTLE_ENDIAN" 1312fi 1313if test "$zlib" = "yes" ; then 1314 output_sym "CONFIG_ZLIB" 1315fi 1316if test "$libaio" = "yes" ; then 1317 output_sym "CONFIG_LIBAIO" 1318fi 1319if test "$posix_aio" = "yes" ; then 1320 output_sym "CONFIG_POSIXAIO" 1321fi 1322if test "$posix_aio_fsync" = "yes" ; then 1323 output_sym "CONFIG_POSIXAIO_FSYNC" 1324fi 1325if test "$linux_fallocate" = "yes" ; then 1326 output_sym "CONFIG_LINUX_FALLOCATE" 1327fi 1328if test "$posix_fallocate" = "yes" ; then 1329 output_sym "CONFIG_POSIX_FALLOCATE" 1330fi 1331if test "$fdatasync" = "yes" ; then 1332 output_sym "CONFIG_FDATASYNC" 1333fi 1334if test "$sync_file_range" = "yes" ; then 1335 output_sym "CONFIG_SYNC_FILE_RANGE" 1336fi 1337if test "$sfaa" = "yes" ; then 1338 output_sym "CONFIG_SFAA" 1339fi 1340if test "$libverbs" = "yes" -a "$rdmacm" = "yes" ; then 1341 output_sym "CONFIG_RDMA" 1342fi 1343if test "$clock_gettime" = "yes" ; then 1344 output_sym "CONFIG_CLOCK_GETTIME" 1345fi 1346if test "$clock_monotonic" = "yes" ; then 1347 output_sym "CONFIG_CLOCK_MONOTONIC" 1348fi 1349if test "$clock_monotonic_precise" = "yes" ; then 1350 output_sym "CONFIG_CLOCK_MONOTONIC_PRECISE" 1351fi 1352if test "$gettimeofday" = "yes" ; then 1353 output_sym "CONFIG_GETTIMEOFDAY" 1354fi 1355if test "$posix_fadvise" = "yes" ; then 1356 output_sym "CONFIG_POSIX_FADVISE" 1357fi 1358if test "$linux_3arg_affinity" = "yes" ; then 1359 output_sym "CONFIG_3ARG_AFFINITY" 1360elif test "$linux_2arg_affinity" = "yes" ; then 1361 output_sym "CONFIG_2ARG_AFFINITY" 1362fi 1363if test "$strsep" = "yes" ; then 1364 output_sym "CONFIG_STRSEP" 1365fi 1366if test "$strcasestr" = "yes" ; then 1367 output_sym "CONFIG_STRCASESTR" 1368fi 1369if test "$getopt_long_only" = "yes" ; then 1370 output_sym "CONFIG_GETOPT_LONG_ONLY" 1371fi 1372if test "$inet_aton" = "yes" ; then 1373 output_sym "CONFIG_INET_ATON" 1374fi 1375if test "$socklen_t" = "yes" ; then 1376 output_sym "CONFIG_SOCKLEN_T" 1377fi 1378if test "$ext4_me" = "yes" ; then 1379 output_sym "CONFIG_LINUX_EXT4_MOVE_EXTENT" 1380fi 1381if test "$linux_splice" = "yes" ; then 1382 output_sym "CONFIG_LINUX_SPLICE" 1383fi 1384if test "$guasi" = "yes" ; then 1385 output_sym "CONFIG_GUASI" 1386fi 1387if test "$fusion_aw" = "yes" ; then 1388 output_sym "CONFIG_FUSION_AW" 1389fi 1390if test "$libnuma_v2" = "yes" ; then 1391 output_sym "CONFIG_LIBNUMA" 1392fi 1393if test "$solaris_aio" = "yes" ; then 1394 output_sym "CONFIG_SOLARISAIO" 1395fi 1396if test "$tls_thread" = "yes" ; then 1397 output_sym "CONFIG_TLS_THREAD" 1398fi 1399if test "$rusage_thread" = "yes" ; then 1400 output_sym "CONFIG_RUSAGE_THREAD" 1401fi 1402if test "$gfio" = "yes" ; then 1403 echo "CONFIG_GFIO=y" >> $config_host_mak 1404fi 1405if test "$esx" = "yes" ; then 1406 output_sym "CONFIG_ESX" 1407 output_sym "CONFIG_NO_SHM" 1408fi 1409if test "$sched_idle" = "yes" ; then 1410 output_sym "CONFIG_SCHED_IDLE" 1411fi 1412if test "$tcp_nodelay" = "yes" ; then 1413 output_sym "CONFIG_TCP_NODELAY" 1414fi 1415if test "$rlimit_memlock" = "yes" ; then 1416 output_sym "CONFIG_RLIMIT_MEMLOCK" 1417fi 1418if test "$pwritev" = "yes" ; then 1419 output_sym "CONFIG_PWRITEV" 1420fi 1421if test "$ipv6" = "yes" ; then 1422 output_sym "CONFIG_IPV6" 1423fi 1424if test "$rbd" = "yes" ; then 1425 output_sym "CONFIG_RBD" 1426fi 1427if test "$setvbuf" = "yes" ; then 1428 output_sym "CONFIG_SETVBUF" 1429fi 1430if test "$s390_z196_facilities" = "yes" ; then 1431 output_sym "CONFIG_S390_Z196_FACILITIES" 1432 CFLAGS="$CFLAGS -march=z9-109" 1433fi 1434if test "$gfapi" = "yes" ; then 1435 output_sym "CONFIG_GFAPI" 1436fi 1437if test "$gf_fadvise" = "yes" ; then 1438 output_sym "CONFIG_GF_FADVISE" 1439fi 1440if test "$libhdfs" = "yes" ; then 1441 output_sym "CONFIG_LIBHDFS" 1442fi 1443if test "$arith" = "yes" ; then 1444 output_sym "CONFIG_ARITHMETIC" 1445 if test "$yacc_is_bison" = "yes" ; then 1446 echo "YACC=$YACC -y" >> $config_host_mak 1447 else 1448 echo "YACC=$YACC" >> $config_host_mak 1449 fi 1450fi 1451 1452if test "$zlib" = "no" ; then 1453 echo "Consider installing zlib-dev (zlib-devel), some fio features depend on it." 1454fi 1455 1456echo "LIBS+=$LIBS" >> $config_host_mak 1457echo "CFLAGS+=$CFLAGS" >> $config_host_mak 1458echo "CC=$cc" >> $config_host_mak 1459echo "BUILD_CFLAGS=$BUILD_CFLAGS $CFLAGS" >> $config_host_mak 1460