381 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			381 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/bin/sh
 | |
| 
 | |
| cc=${CC:-gcc}
 | |
| cxx=${CXX:-g++}
 | |
| 
 | |
| for opt do
 | |
|   optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
 | |
|   case "$opt" in
 | |
|   --help|-h) show_help=yes
 | |
|   ;;
 | |
|   --prefix=*) prefix="$optarg"
 | |
|   ;;
 | |
|   --includedir=*) includedir="$optarg"
 | |
|   ;;
 | |
|   --libdir=*) libdir="$optarg"
 | |
|   ;;
 | |
|   --libdevdir=*) libdevdir="$optarg"
 | |
|   ;;
 | |
|   --mandir=*) mandir="$optarg"
 | |
|   ;;
 | |
|   --datadir=*) datadir="$optarg"
 | |
|   ;;
 | |
|   --cc=*) cc="$optarg"
 | |
|   ;;
 | |
|   --cxx=*) cxx="$optarg"
 | |
|   ;;
 | |
|   *)
 | |
|     echo "ERROR: unknown option $opt"
 | |
|     echo "Try '$0 --help' for more information"
 | |
|     exit 1
 | |
|   ;;
 | |
|   esac
 | |
| done
 | |
| 
 | |
| if test -z "$prefix"; then
 | |
|   prefix=/usr
 | |
| fi
 | |
| if test -z "$includedir"; then
 | |
|   includedir="$prefix/include"
 | |
| fi
 | |
| if test -z "$libdir"; then
 | |
|   libdir="$prefix/lib"
 | |
| fi
 | |
| if test -z "$libdevdir"; then
 | |
|   libdevdir="$prefix/lib"
 | |
| fi
 | |
| if test -z "$mandir"; then
 | |
|   mandir="$prefix/man"
 | |
| fi
 | |
| if test -z "$datadir"; then
 | |
|   datadir="$prefix/share"
 | |
| fi
 | |
| 
 | |
| if test x"$libdir" = x"$libdevdir"; then
 | |
|   relativelibdir=""
 | |
| else
 | |
|   relativelibdir="$libdir/"
 | |
| fi
 | |
| 
 | |
| if test "$show_help" = "yes"; then
 | |
| cat <<EOF
 | |
| 
 | |
| Usage: configure [options]
 | |
| Options: [defaults in brackets after descriptions]
 | |
|   --help                   print this message
 | |
|   --prefix=PATH            install in PATH [$prefix]
 | |
|   --includedir=PATH        install headers in PATH [$includedir]
 | |
|   --libdir=PATH            install runtime libraries in PATH [$libdir]
 | |
|   --libdevdir=PATH         install development libraries in PATH [$libdevdir]
 | |
|   --mandir=PATH            install man pages in PATH [$mandir]
 | |
|   --datadir=PATH           install shared data in PATH [$datadir]
 | |
| EOF
 | |
| exit 0
 | |
| fi
 | |
| 
 | |
| TMPC="$(mktemp --tmpdir fio-conf-XXXXXXXXXX.c)"
 | |
| TMPC2="$(mktemp --tmpdir fio-conf-XXXXXXXXXX-2.c)"
 | |
| TMPO="$(mktemp --tmpdir fio-conf-XXXXXXXXXX.o)"
 | |
| TMPE="$(mktemp --tmpdir fio-conf-XXXXXXXXXX.exe)"
 | |
| 
 | |
| # NB: do not call "exit" in the trap handler; this is buggy with some shells;
 | |
| # see <1285349658-3122-1-git-send-email-loic.minier@linaro.org>
 | |
| trap "rm -f $TMPC $TMPC2 $TMPO $TMPE" EXIT INT QUIT TERM
 | |
| 
 | |
| rm -rf config.log
 | |
| 
 | |
| config_host_mak="config-host.mak"
 | |
| config_host_h="config-host.h"
 | |
| 
 | |
| rm -rf $config_host_mak
 | |
| rm -rf $config_host_h
 | |
| 
 | |
| fatal() {
 | |
|   echo $@
 | |
|   echo "Configure failed, check config.log and/or the above output"
 | |
|   rm -rf $config_host_mak
 | |
|   rm -rf $config_host_h
 | |
|   exit 1
 | |
| }
 | |
| 
 | |
| # Print result for each configuration test
 | |
| print_config() {
 | |
|   printf "%-30s%s\n" "$1" "$2"
 | |
| }
 | |
| 
 | |
| # Default CFLAGS
 | |
| CFLAGS="-D_GNU_SOURCE -include config-host.h"
 | |
| BUILD_CFLAGS=""
 | |
| 
 | |
| # Print configure header at the top of $config_host_h
 | |
| echo "/*" > $config_host_h
 | |
| echo " * Automatically generated by configure - do not modify" >> $config_host_h
 | |
| printf " * Configured with:" >> $config_host_h
 | |
| printf " * '%s'" "$0" "$@" >> $config_host_h
 | |
| echo "" >> $config_host_h
 | |
| echo " */" >> $config_host_h
 | |
| 
 | |
| echo "# Automatically generated by configure - do not modify" > $config_host_mak
 | |
| printf "# Configured with:" >> $config_host_mak
 | |
| printf " '%s'" "$0" "$@" >> $config_host_mak
 | |
| echo >> $config_host_mak
 | |
| 
 | |
| do_cxx() {
 | |
|     # Run the compiler, capturing its output to the log.
 | |
|     echo $cxx "$@" >> config.log
 | |
|     $cxx "$@" >> config.log 2>&1 || return $?
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| do_cc() {
 | |
|     # Run the compiler, capturing its output to the log.
 | |
|     echo $cc "$@" >> config.log
 | |
|     $cc "$@" >> config.log 2>&1 || return $?
 | |
|     # Test passed. If this is an --enable-werror build, rerun
 | |
|     # the test with -Werror and bail out if it fails. This
 | |
|     # makes warning-generating-errors in configure test code
 | |
|     # obvious to developers.
 | |
|     if test "$werror" != "yes"; then
 | |
|         return 0
 | |
|     fi
 | |
|     # Don't bother rerunning the compile if we were already using -Werror
 | |
|     case "$*" in
 | |
|         *-Werror*)
 | |
|            return 0
 | |
|         ;;
 | |
|     esac
 | |
|     echo $cc -Werror "$@" >> config.log
 | |
|     $cc -Werror "$@" >> config.log 2>&1 && return $?
 | |
|     echo "ERROR: configure test passed without -Werror but failed with -Werror."
 | |
|     echo "This is probably a bug in the configure script. The failing command"
 | |
|     echo "will be at the bottom of config.log."
 | |
|     fatal "You can run configure with --disable-werror to bypass this check."
 | |
| }
 | |
| 
 | |
| compile_prog() {
 | |
|   local_cflags="$1"
 | |
|   local_ldflags="$2 $LIBS"
 | |
|   echo "Compiling test case $3" >> config.log
 | |
|   do_cc $CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
 | |
| }
 | |
| 
 | |
| compile_prog_cxx() {
 | |
|   local_cflags="$1"
 | |
|   local_ldflags="$2 $LIBS"
 | |
|   echo "Compiling test case $3" >> config.log
 | |
|   do_cxx $CFLAGS $local_cflags -o $TMPE $TMPC $LDFLAGS $local_ldflags
 | |
| }
 | |
| 
 | |
| has() {
 | |
|   type "$1" >/dev/null 2>&1
 | |
| }
 | |
| 
 | |
| output_mak() {
 | |
|   echo "$1=$2" >> $config_host_mak
 | |
| }
 | |
| 
 | |
| output_sym() {
 | |
|   output_mak "$1" "y"
 | |
|   echo "#define $1" >> $config_host_h
 | |
| }
 | |
| 
 | |
| print_and_output_mak() {
 | |
|   print_config "$1" "$2"
 | |
|   output_mak "$1" "$2"
 | |
| }
 | |
| print_and_output_mak "prefix" "$prefix"
 | |
| print_and_output_mak "includedir" "$includedir"
 | |
| print_and_output_mak "libdir" "$libdir"
 | |
| print_and_output_mak "libdevdir" "$libdevdir"
 | |
| print_and_output_mak "relativelibdir" "$relativelibdir"
 | |
| print_and_output_mak "mandir" "$mandir"
 | |
| print_and_output_mak "datadir" "$datadir"
 | |
| 
 | |
| ##########################################
 | |
| # check for __kernel_rwf_t
 | |
| __kernel_rwf_t="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <linux/fs.h>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   __kernel_rwf_t x;
 | |
|   x = 0;
 | |
|   return x;
 | |
| }
 | |
| EOF
 | |
| if compile_prog "" "" "__kernel_rwf_t"; then
 | |
|   __kernel_rwf_t="yes"
 | |
| fi
 | |
| print_config "__kernel_rwf_t" "$__kernel_rwf_t"
 | |
| 
 | |
| ##########################################
 | |
| # check for __kernel_timespec
 | |
| __kernel_timespec="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <linux/time.h>
 | |
| #include <linux/time_types.h>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   struct __kernel_timespec ts;
 | |
|   ts.tv_sec = 0;
 | |
|   ts.tv_nsec = 1;
 | |
|   return 0;
 | |
| }
 | |
| EOF
 | |
| if compile_prog "" "" "__kernel_timespec"; then
 | |
|   __kernel_timespec="yes"
 | |
| fi
 | |
| print_config "__kernel_timespec" "$__kernel_timespec"
 | |
| 
 | |
| ##########################################
 | |
| # check for open_how
 | |
| open_how="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <fcntl.h>
 | |
| #include <string.h>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   struct open_how how;
 | |
|   how.flags = 0;
 | |
|   how.mode = 0;
 | |
|   how.resolve = 0;
 | |
|   return 0;
 | |
| }
 | |
| EOF
 | |
| if compile_prog "" "" "open_how"; then
 | |
|   open_how="yes"
 | |
| fi
 | |
| print_config "open_how" "$open_how"
 | |
| 
 | |
| ##########################################
 | |
| # check for statx
 | |
| statx="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <sys/types.h>
 | |
| #include <sys/stat.h>
 | |
| #include <unistd.h>
 | |
| #include <fcntl.h>
 | |
| #include <string.h>
 | |
| #include <linux/stat.h>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   struct statx x;
 | |
| 
 | |
|   return memset(&x, 0, sizeof(x)) != NULL;
 | |
| }
 | |
| EOF
 | |
| if compile_prog "" "" "statx"; then
 | |
|   statx="yes"
 | |
| fi
 | |
| print_config "statx" "$statx"
 | |
| 
 | |
| ##########################################
 | |
| # check for C++
 | |
| has_cxx="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <iostream>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   std::cout << "Test";
 | |
|   return 0;
 | |
| }
 | |
| EOF
 | |
| if compile_prog_cxx "" "" "C++"; then
 | |
|   has_cxx="yes"
 | |
| fi
 | |
| print_config "C++" "$has_cxx"
 | |
| 
 | |
| ##########################################
 | |
| # check for ucontext support
 | |
| has_ucontext="no"
 | |
| cat > $TMPC << EOF
 | |
| #include <ucontext.h>
 | |
| int main(int argc, char **argv)
 | |
| {
 | |
|   ucontext_t ctx;
 | |
|   getcontext(&ctx);
 | |
|   return 0;
 | |
| }
 | |
| EOF
 | |
| if compile_prog "" "" "has_ucontext"; then
 | |
|   has_ucontext="yes"
 | |
| fi
 | |
| print_config "has_ucontext" "$has_ucontext"
 | |
| 
 | |
| 
 | |
| #############################################################################
 | |
| 
 | |
| if test "$__kernel_rwf_t" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_KERNEL_RWF_T"
 | |
| fi
 | |
| if test "$__kernel_timespec" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_KERNEL_TIMESPEC"
 | |
| fi
 | |
| if test "$open_how" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_OPEN_HOW"
 | |
| fi
 | |
| if test "$statx" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_STATX"
 | |
| fi
 | |
| if test "$has_cxx" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_CXX"
 | |
| fi
 | |
| if test "$has_ucontext" = "yes"; then
 | |
|   output_sym "CONFIG_HAVE_UCONTEXT"
 | |
| fi
 | |
| 
 | |
| echo "CC=$cc" >> $config_host_mak
 | |
| print_config "CC" "$cc"
 | |
| echo "CXX=$cxx" >> $config_host_mak
 | |
| print_config "CXX" "$cxx"
 | |
| 
 | |
| # generate compat.h
 | |
| compat_h="src/include/liburing/compat.h"
 | |
| cat > $compat_h << EOF
 | |
| /* SPDX-License-Identifier: MIT */
 | |
| #ifndef LIBURING_COMPAT_H
 | |
| #define LIBURING_COMPAT_H
 | |
| 
 | |
| EOF
 | |
| 
 | |
| if test "$__kernel_rwf_t" != "yes"; then
 | |
| cat >> $compat_h << EOF
 | |
| typedef int __kernel_rwf_t;
 | |
| 
 | |
| EOF
 | |
| fi
 | |
| if test "$__kernel_timespec" != "yes"; then
 | |
| cat >> $compat_h << EOF
 | |
| #include <stdint.h>
 | |
| 
 | |
| struct __kernel_timespec {
 | |
| 	int64_t		tv_sec;
 | |
| 	long long	tv_nsec;
 | |
| };
 | |
| 
 | |
| EOF
 | |
| else
 | |
| cat >> $compat_h << EOF
 | |
| #include <linux/time_types.h>
 | |
| 
 | |
| EOF
 | |
| fi
 | |
| if test "$open_how" != "yes"; then
 | |
| cat >> $compat_h << EOF
 | |
| #include <inttypes.h>
 | |
| 
 | |
| struct open_how {
 | |
| 	uint64_t	flags;
 | |
| 	uint64_t	mode;
 | |
| 	uint64_t	resolve;
 | |
| };
 | |
| 
 | |
| EOF
 | |
| fi
 | |
| 
 | |
| cat >> $compat_h << EOF
 | |
| #endif
 | |
| EOF
 |