mirror of
				https://github.com/libssh2/libssh2.git
				synced 2025-10-31 23:30:25 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			385 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			385 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
 | |
| dnl **********************************************************************
 | |
| dnl CURL_DETECT_ICC ([ACTION-IF-YES])
 | |
| dnl
 | |
| dnl check if this is the Intel ICC compiler, and if so run the ACTION-IF-YES
 | |
| dnl sets the $ICC variable to "yes" or "no"
 | |
| dnl **********************************************************************
 | |
| AC_DEFUN([CURL_DETECT_ICC],
 | |
| [
 | |
|     ICC="no"
 | |
|     AC_MSG_CHECKING([for icc in use])
 | |
|     if test "$GCC" = "yes"; then
 | |
|        dnl check if this is icc acting as gcc in disguise
 | |
|        AC_EGREP_CPP([^__INTEL_COMPILER], [__INTEL_COMPILER],
 | |
|          dnl action if the text is found, this it has not been replaced by the
 | |
|          dnl cpp
 | |
|          ICC="no",
 | |
|          dnl the text was not found, it was replaced by the cpp
 | |
|          ICC="yes"
 | |
|          AC_MSG_RESULT([yes])
 | |
|          [$1]
 | |
|        )
 | |
|     fi
 | |
|     if test "$ICC" = "no"; then
 | |
|         # this is not ICC
 | |
|         AC_MSG_RESULT([no])
 | |
|     fi
 | |
| ])
 | |
| 
 | |
| dnl We create a function for detecting which compiler we use and then set as
 | |
| dnl pendantic compiler options as possible for that particular compiler. The
 | |
| dnl options are only used for debug-builds.
 | |
| 
 | |
| AC_DEFUN([CURL_CC_DEBUG_OPTS],
 | |
| [
 | |
|     if test "z$ICC" = "z"; then
 | |
|       CURL_DETECT_ICC
 | |
|     fi
 | |
| 
 | |
|     if test "$GCC" = "yes"; then
 | |
| 
 | |
|        dnl figure out gcc version!
 | |
|        AC_MSG_CHECKING([gcc version])
 | |
|        gccver=`$CC -dumpversion`
 | |
|        num1=`echo $gccver | cut -d . -f1`
 | |
|        num2=`echo $gccver | cut -d . -f2`
 | |
|        gccnum=`(expr $num1 "*" 100 + $num2) 2>/dev/null`
 | |
|        AC_MSG_RESULT($gccver)
 | |
| 
 | |
|        if test "$ICC" = "yes"; then
 | |
|          dnl this is icc, not gcc.
 | |
| 
 | |
|          dnl ICC warnings we ignore:
 | |
|          dnl * 269 warns on our "%Od" printf formatters for curl_off_t output:
 | |
|          dnl   "invalid format string conversion"
 | |
|          dnl * 279 warns on static conditions in while expressions
 | |
|          dnl * 981 warns on "operands are evaluated in unspecified order"
 | |
|          dnl * 1418 "external definition with no prior declaration"
 | |
|          dnl * 1419 warns on "external declaration in primary source file"
 | |
|          dnl   which we know and do on purpose.
 | |
| 
 | |
|          WARN="-wd279,269,981,1418,1419"
 | |
| 
 | |
|          if test "$gccnum" -gt "600"; then
 | |
|             dnl icc 6.0 and older doesn't have the -Wall flag
 | |
|             WARN="-Wall $WARN"
 | |
|          fi
 | |
|        else dnl $ICC = yes
 | |
|          dnl this is a set of options we believe *ALL* gcc versions support:
 | |
|          WARN="-W -Wall -Wwrite-strings -pedantic -Wpointer-arith -Wnested-externs -Winline -Wmissing-prototypes"
 | |
| 
 | |
|          dnl -Wcast-align is a bit too annoying on all gcc versions ;-)
 | |
| 
 | |
|          if test "$gccnum" -ge "207"; then
 | |
|            dnl gcc 2.7 or later
 | |
|            WARN="$WARN -Wmissing-declarations"
 | |
|          fi
 | |
| 
 | |
|          if test "$gccnum" -gt "295"; then
 | |
|            dnl only if the compiler is newer than 2.95 since we got lots of
 | |
|            dnl "`_POSIX_C_SOURCE' is not defined" in system headers with
 | |
|            dnl gcc 2.95.4 on FreeBSD 4.9!
 | |
|            WARN="$WARN -Wundef -Wno-long-long -Wsign-compare"
 | |
|          fi
 | |
| 
 | |
|          if test "$gccnum" -ge "296"; then
 | |
|            dnl gcc 2.96 or later
 | |
|            WARN="$WARN -Wfloat-equal"
 | |
|          fi
 | |
| 
 | |
|          if test "$gccnum" -gt "296"; then
 | |
|            dnl this option does not exist in 2.96
 | |
|            WARN="$WARN -Wno-format-nonliteral"
 | |
|          fi
 | |
| 
 | |
|          dnl -Wunreachable-code seems totally unreliable on my gcc 3.3.2 on
 | |
|          dnl on i686-Linux as it gives us heaps with false positives.
 | |
|          dnl Also, on gcc 4.0.X it is totally unbearable and complains all
 | |
|          dnl over making it unusable for generic purposes. Let's not use it.
 | |
| 
 | |
|          if test "$gccnum" -ge "303"; then
 | |
|            dnl gcc 3.3 and later
 | |
|            WARN="$WARN -Wendif-labels -Wstrict-prototypes"
 | |
|          fi
 | |
| 
 | |
|          if test "$gccnum" -ge "304"; then
 | |
|            # try these on gcc 3.4
 | |
|            WARN="$WARN -Wdeclaration-after-statement"
 | |
|          fi
 | |
| 
 | |
|          for flag in $CPPFLAGS; do
 | |
|            case "$flag" in
 | |
|             -I*)
 | |
|               dnl Include path, provide a -isystem option for the same dir
 | |
|               dnl to prevent warnings in those dirs. The -isystem was not very
 | |
|               dnl reliable on earlier gcc versions.
 | |
|               add=`echo $flag | sed 's/^-I/-isystem /g'`
 | |
|               WARN="$WARN $add"
 | |
|               ;;
 | |
|            esac
 | |
|          done
 | |
| 
 | |
|        fi dnl $ICC = no
 | |
| 
 | |
|        CFLAGS="$CFLAGS $WARN"
 | |
| 
 | |
|       AC_MSG_NOTICE([Added this set of compiler options: $WARN])
 | |
| 
 | |
|     else dnl $GCC = yes
 | |
| 
 | |
|       AC_MSG_NOTICE([Added no extra compiler options])
 | |
| 
 | |
|     fi dnl $GCC = yes
 | |
| 
 | |
|     dnl strip off optimizer flags
 | |
|     NEWFLAGS=""
 | |
|     for flag in $CFLAGS; do
 | |
|       case "$flag" in
 | |
|       -O*)
 | |
|         dnl echo "cut off $flag"
 | |
|         ;;
 | |
|       *)
 | |
|         NEWFLAGS="$NEWFLAGS $flag"
 | |
|         ;;
 | |
|       esac
 | |
|     done
 | |
|     CFLAGS=$NEWFLAGS
 | |
| 
 | |
| ]) dnl end of AC_DEFUN()
 | |
| 
 | |
| dnl CURL_CHECK_NONBLOCKING_SOCKET
 | |
| dnl -------------------------------------------------
 | |
| dnl Check for how to set a socket to non-blocking state. There seems to exist
 | |
| dnl four known different ways, with the one used almost everywhere being POSIX
 | |
| dnl and XPG3, while the other different ways for different systems (old BSD,
 | |
| dnl Windows and Amiga).
 | |
| dnl
 | |
| dnl There are two known platforms (AIX 3.x and SunOS 4.1.x) where the
 | |
| dnl O_NONBLOCK define is found but does not work. This condition is attempted
 | |
| dnl to get caught in this script by using an excessive number of #ifdefs...
 | |
| dnl
 | |
| AC_DEFUN([CURL_CHECK_NONBLOCKING_SOCKET],
 | |
| [
 | |
|   AC_MSG_CHECKING([non-blocking sockets style])
 | |
| 
 | |
|   AC_TRY_COMPILE([
 | |
| /* headers for O_NONBLOCK test */
 | |
| #include <sys/types.h>
 | |
| #include <unistd.h>
 | |
| #include <fcntl.h>
 | |
| ],[
 | |
| /* try to compile O_NONBLOCK */
 | |
| 
 | |
| #if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
 | |
| # if defined(__SVR4) || defined(__srv4__)
 | |
| #  define PLATFORM_SOLARIS
 | |
| # else
 | |
| #  define PLATFORM_SUNOS4
 | |
| # endif
 | |
| #endif
 | |
| #if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX41)
 | |
| # define PLATFORM_AIX_V3
 | |
| #endif
 | |
| 
 | |
| #if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3) || defined(__BEOS__)
 | |
| #error "O_NONBLOCK does not work on this platform"
 | |
| #endif
 | |
|   int socket;
 | |
|   int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
 | |
| ],[
 | |
| dnl the O_NONBLOCK test was fine
 | |
| nonblock="O_NONBLOCK"
 | |
| AC_DEFINE(HAVE_O_NONBLOCK, 1, [use O_NONBLOCK for non-blocking sockets])
 | |
| ],[
 | |
| dnl the code was bad, try a different program now, test 2
 | |
| 
 | |
|   AC_TRY_COMPILE([
 | |
| /* headers for FIONBIO test */
 | |
| #include <unistd.h>
 | |
| #include <stropts.h>
 | |
| ],[
 | |
| /* FIONBIO source test (old-style unix) */
 | |
|  int socket;
 | |
|  int flags = ioctl(socket, FIONBIO, &flags);
 | |
| ],[
 | |
| dnl FIONBIO test was good
 | |
| nonblock="FIONBIO"
 | |
| AC_DEFINE(HAVE_FIONBIO, 1, [use FIONBIO for non-blocking sockets])
 | |
| ],[
 | |
| dnl FIONBIO test was also bad
 | |
| dnl the code was bad, try a different program now, test 3
 | |
| 
 | |
|   AC_TRY_COMPILE([
 | |
| /* headers for ioctlsocket test (Windows) */
 | |
| #undef inline
 | |
| #ifdef HAVE_WINDOWS_H
 | |
| #ifndef WIN32_LEAN_AND_MEAN
 | |
| #define WIN32_LEAN_AND_MEAN
 | |
| #endif
 | |
| #include <windows.h>
 | |
| #ifdef HAVE_WINSOCK2_H
 | |
| #include <winsock2.h>
 | |
| #else
 | |
| #ifdef HAVE_WINSOCK_H
 | |
| #include <winsock.h>
 | |
| #endif
 | |
| #endif
 | |
| #endif
 | |
| ],[
 | |
| /* ioctlsocket source code */
 | |
|  SOCKET sd;
 | |
|  unsigned long flags = 0;
 | |
|  sd = socket(0, 0, 0);
 | |
|  ioctlsocket(sd, FIONBIO, &flags);
 | |
| ],[
 | |
| dnl ioctlsocket test was good
 | |
| nonblock="ioctlsocket"
 | |
| AC_DEFINE(HAVE_IOCTLSOCKET, 1, [use ioctlsocket() for non-blocking sockets])
 | |
| ],[
 | |
| dnl ioctlsocket didnt compile!, go to test 4
 | |
| 
 | |
|   AC_TRY_LINK([
 | |
| /* headers for IoctlSocket test (Amiga?) */
 | |
| #include <sys/ioctl.h>
 | |
| ],[
 | |
| /* IoctlSocket source code */
 | |
|  int socket;
 | |
|  int flags = IoctlSocket(socket, FIONBIO, (long)1);
 | |
| ],[
 | |
| dnl ioctlsocket test was good
 | |
| nonblock="IoctlSocket"
 | |
| AC_DEFINE(HAVE_IOCTLSOCKET_CASE, 1, [use Ioctlsocket() for non-blocking sockets])
 | |
| ],[
 | |
| dnl Ioctlsocket didnt compile, do test 5!
 | |
|   AC_TRY_COMPILE([
 | |
| /* headers for SO_NONBLOCK test (BeOS) */
 | |
| #include <socket.h>
 | |
| ],[
 | |
| /* SO_NONBLOCK source code */
 | |
|  long b = 1;
 | |
|  int socket;
 | |
|  int flags = setsockopt(socket, SOL_SOCKET, SO_NONBLOCK, &b, sizeof(b));
 | |
| ],[
 | |
| dnl the SO_NONBLOCK test was good
 | |
| nonblock="SO_NONBLOCK"
 | |
| AC_DEFINE(HAVE_SO_NONBLOCK, 1, [use SO_NONBLOCK for non-blocking sockets])
 | |
| ],[
 | |
| dnl test 5 didnt compile!
 | |
| nonblock="nada"
 | |
| AC_DEFINE(HAVE_DISABLED_NONBLOCKING, 1, [disabled non-blocking sockets])
 | |
| ])
 | |
| dnl end of fifth test
 | |
| 
 | |
| ])
 | |
| dnl end of forth test
 | |
| 
 | |
| ])
 | |
| dnl end of third test
 | |
| 
 | |
| ])
 | |
| dnl end of second test
 | |
| 
 | |
| ])
 | |
| dnl end of non-blocking try-compile test
 | |
|   AC_MSG_RESULT($nonblock)
 | |
| 
 | |
|   if test "$nonblock" = "nada"; then
 | |
|     AC_MSG_WARN([non-block sockets disabled])
 | |
|   fi
 | |
| ])
 | |
| 
 | |
| dnl CURL_CHECK_NEED_REENTRANT_SYSTEM
 | |
| dnl -------------------------------------------------
 | |
| dnl Checks if the preprocessor _REENTRANT definition
 | |
| dnl must be unconditionally done for this platform.
 | |
| dnl Internal macro for CURL_CONFIGURE_REENTRANT.
 | |
| 
 | |
| AC_DEFUN([CURL_CHECK_NEED_REENTRANT_SYSTEM], [
 | |
|   case $host in
 | |
|     *-*-solaris* | *-*-hpux*)
 | |
|       tmp_need_reentrant="yes"
 | |
|       ;;
 | |
|     *)
 | |
|       tmp_need_reentrant="no"
 | |
|       ;;
 | |
|   esac
 | |
| ])
 | |
| 
 | |
| 
 | |
| dnl CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT
 | |
| dnl -------------------------------------------------
 | |
| dnl This macro ensures that configuration tests done
 | |
| dnl after this will execute with preprocessor symbol
 | |
| dnl _REENTRANT defined. This macro also ensures that
 | |
| dnl the generated config file defines NEED_REENTRANT
 | |
| dnl and that in turn setup.h will define _REENTRANT.
 | |
| dnl Internal macro for CURL_CONFIGURE_REENTRANT.
 | |
| 
 | |
| AC_DEFUN([CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT], [
 | |
| AC_DEFINE(NEED_REENTRANT, 1,
 | |
|   [Define to 1 if _REENTRANT preprocessor symbol must be defined.])
 | |
| cat >>confdefs.h <<_EOF
 | |
| #ifndef _REENTRANT
 | |
| #  define _REENTRANT
 | |
| #endif
 | |
| _EOF
 | |
| ])
 | |
| 
 | |
| 
 | |
| dnl CURL_CONFIGURE_REENTRANT
 | |
| dnl -------------------------------------------------
 | |
| dnl This first checks if the preprocessor _REENTRANT
 | |
| dnl symbol is already defined. If it isn't currently
 | |
| dnl defined a set of checks are performed to verify
 | |
| dnl if its definition is required to make visible to
 | |
| dnl the compiler a set of *_r functions. Finally, if
 | |
| dnl _REENTRANT is already defined or needed it takes
 | |
| dnl care of making adjustments necessary to ensure
 | |
| dnl that it is defined equally for further configure
 | |
| dnl tests and generated config file.
 | |
| 
 | |
| AC_DEFUN([CURL_CONFIGURE_REENTRANT], [
 | |
|   AC_PREREQ([2.50])dnl
 | |
|   #
 | |
|   AC_MSG_CHECKING([if _REENTRANT is already defined])
 | |
|   AC_COMPILE_IFELSE([
 | |
|     AC_LANG_PROGRAM([[
 | |
|     ]],[[
 | |
| #ifdef _REENTRANT
 | |
|       int dummy=1;
 | |
| #else
 | |
|       force compilation error
 | |
| #endif
 | |
|     ]])
 | |
|   ],[
 | |
|     AC_MSG_RESULT([yes])
 | |
|     tmp_reentrant_initially_defined="yes"
 | |
|   ],[
 | |
|     AC_MSG_RESULT([no])
 | |
|     tmp_reentrant_initially_defined="no"
 | |
|   ])
 | |
|   #
 | |
|   if test "$tmp_reentrant_initially_defined" = "no"; then
 | |
|     AC_MSG_CHECKING([if _REENTRANT is actually needed])
 | |
|     CURL_CHECK_NEED_REENTRANT_SYSTEM
 | |
| 
 | |
|     if test "$tmp_need_reentrant" = "yes"; then
 | |
|       AC_MSG_RESULT([yes])
 | |
|     else
 | |
|       AC_MSG_RESULT([no])
 | |
|     fi
 | |
|   fi
 | |
|   #
 | |
|   AC_MSG_CHECKING([if _REENTRANT is onwards defined])
 | |
|   if test "$tmp_reentrant_initially_defined" = "yes" ||
 | |
|     test "$tmp_need_reentrant" = "yes"; then
 | |
|     CURL_CONFIGURE_FROM_NOW_ON_WITH_REENTRANT
 | |
|     AC_MSG_RESULT([yes])
 | |
|   else
 | |
|     AC_MSG_RESULT([no])
 | |
|   fi
 | |
|   #
 | |
| ])
 | |
| 
 |