Blame m4/lftp.m4

Packit 8f70b4
dnl -*-autoconf-*-
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_PROG_CXXLINK],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(how to link simple c++ programs)
Packit 8f70b4
   if test "$GCC" = yes -a "$GXX" = yes; then
Packit 8f70b4
      old_CXX="$CXX"
Packit 8f70b4
      CXX="$CC"
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[char *a=new char[10];delete[] a;]])],[],[
Packit 8f70b4
	 old_LIBS="$LIBS"
Packit 8f70b4
	 LIBS="-lsupc++ $LIBS"
Packit 8f70b4
	 AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[char *a=new char[10];delete[] a;]])],[],[LIBS="$old_LIBS"; CXX="$old_CXX";])
Packit 8f70b4
	 ])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   fi
Packit 8f70b4
   AC_MSG_RESULT(using $CXX)
Packit 8f70b4
])
Packit 8f70b4
dnl try to build and run a dummy program
Packit 8f70b4
AC_DEFUN([LFTP_CXX_TEST],
Packit 8f70b4
[
Packit 8f70b4
   AC_LANG_PUSH(C++)
Packit 8f70b4
   AC_MSG_CHECKING(if c++ compiler works)
Packit 8f70b4
   AC_RUN_IFELSE([AC_LANG_SOURCE([[int main() { return(0); } ]])],[AC_MSG_RESULT(yes)],[
Packit 8f70b4
	   AC_MSG_RESULT(no)
Packit 8f70b4
	   AC_MSG_ERROR(C++ test compile failed; check your C++ compiler)],[AC_MSG_RESULT(cross-compiling)])
Packit 8f70b4
   AC_LANG_POP(C++)
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_FUNC_SSCANF_CONST],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(whether sscanf works on const strings)
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_func_sscanf_const_works,
Packit 8f70b4
   [
Packit 8f70b4
      AC_RUN_IFELSE([AC_LANG_SOURCE([[   #include <stdio.h>
Packit 8f70b4
		     int main() {
Packit 8f70b4
			int a,b;
Packit 8f70b4
			return !(sscanf("123x","%d%n",&a,&b)>0);
Packit 8f70b4
		  }]])],[lftp_cv_func_sscanf_const_works=yes;],[lftp_cv_func_sscanf_const_works=no;],[lftp_cv_func_sscanf_const_works=yes;])
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_func_sscanf_const_works)
Packit 8f70b4
   if test $lftp_cv_func_sscanf_const_works = no; then
Packit 8f70b4
      AC_MSG_WARN(sscanf does not work on const strings)
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Do nothing if the compiler accepts the inline keyword.
Packit 8f70b4
dnl Otherwise define c_inline to __inline__ or __inline if one of those work,
Packit 8f70b4
dnl otherwise define c_inline to be empty.
Packit 8f70b4
AC_DEFUN([LFTP_C_INLINE],
Packit 8f70b4
[AC_CACHE_CHECK([for inline], ac_cv_c_inline,
Packit 8f70b4
[ac_cv_c_inline=no
Packit 8f70b4
for ac_kw in inline __inline__ __inline; do
Packit 8f70b4
  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[} $ac_kw foo() {]])],[ac_cv_c_inline=$ac_kw; break],[])
Packit 8f70b4
done
Packit 8f70b4
])
Packit 8f70b4
case "$ac_cv_c_inline" in
Packit 8f70b4
  inline | yes) ;;
Packit 8f70b4
  no) AC_DEFINE(c_inline, ) ;;
Packit 8f70b4
  *)  AC_DEFINE_UNQUOTED(c_inline, $ac_cv_c_inline) ;;
Packit 8f70b4
esac
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_NOIMPLEMENTINLINE],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(if -fno-implement-inlines implements virtual functions)
Packit 8f70b4
   flags="-fno-implement-inlines"
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_noimplementinline,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      old_CXXFLAGS="$CXXFLAGS"
Packit 8f70b4
      CXXFLAGS="$CXXFLAGS $flags"
Packit 8f70b4
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
	 class aaa
Packit 8f70b4
	 {
Packit 8f70b4
	    int var;
Packit 8f70b4
	 public:
Packit 8f70b4
	    virtual void func() { var=1; }
Packit 8f70b4
	    aaa();
Packit 8f70b4
	    virtual ~aaa();
Packit 8f70b4
	 };
Packit 8f70b4
	 aaa::aaa() { var=0; }
Packit 8f70b4
	 aaa::~aaa() {}
Packit 8f70b4
	 ]], [[]])],[lftp_cv_noimplementinline=yes],[lftp_cv_noimplementinline=no])
Packit 8f70b4
      CXXFLAGS="$old_CXXFLAGS"
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_noimplementinline)
Packit 8f70b4
   if test x$lftp_cv_noimplementinline = xyes; then
Packit 8f70b4
      CXXFLAGS="$CXXFLAGS $flags"
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
AC_DEFUN([LFTP_CHECK_CXX_FLAGS],
Packit 8f70b4
[
Packit 8f70b4
   flags="$1"
Packit 8f70b4
   AC_MSG_CHECKING(if $CXX supports $flags)
Packit 8f70b4
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      old_CXXFLAGS="$CXXFLAGS"
Packit 8f70b4
      CXXFLAGS="$CXXFLAGS $flags"
Packit 8f70b4
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
	 class aaa
Packit 8f70b4
	 {
Packit 8f70b4
	    int var;
Packit 8f70b4
	 public:
Packit 8f70b4
	    virtual void func() { var=1; }
Packit 8f70b4
	    aaa();
Packit 8f70b4
	    virtual ~aaa();
Packit 8f70b4
	 };
Packit 8f70b4
	 aaa::aaa() { var=0; }
Packit 8f70b4
	 aaa::~aaa() {}
Packit 8f70b4
	 ]], [[]])],[support=yes],[support=no])
Packit 8f70b4
      CXXFLAGS="$old_CXXFLAGS"
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
Packit 8f70b4
   AC_MSG_RESULT($support)
Packit 8f70b4
   if test x$support = xyes; then
Packit 8f70b4
      CXXFLAGS="$CXXFLAGS $flags"
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
AC_DEFUN([LFTP_CHECK_LIBM],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(if math library is needed)
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_libm_needed,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
	    #include <math.h>
Packit 8f70b4
	    double a,b;
Packit 8f70b4
	 ]], [[
Packit 8f70b4
	    return int(exp(a)+log(b)+pow(a,b));
Packit 8f70b4
	 ]])],[lftp_cv_libm_needed=no],[lftp_cv_libm_needed=yes])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_libm_needed)
Packit 8f70b4
   if test x$lftp_cv_libm_needed = xyes; then
Packit 8f70b4
      AC_SEARCH_LIBS(exp,m)
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
dnl try to build and run a dummy program
Packit 8f70b4
AC_DEFUN([LFTP_CXX_BOOL],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(whether $CXX supports bool type)
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_cxx_bool,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[bool t=true;bool f=false;]], [[]])],[lftp_cv_cxx_bool=yes],[lftp_cv_cxx_bool=no])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_cxx_bool)
Packit 8f70b4
   if test x$lftp_cv_cxx_bool = xyes; then
Packit 8f70b4
      AC_DEFINE(HAVE_CXX_BOOL, 1, [define if c++ compiler supports bool])
Packit 8f70b4
   fi
Packit 8f70b4
   AH_VERBATIM([OPT_CPP_BOOL], [
Packit 8f70b4
#if defined(__cplusplus) && !defined(HAVE_CXX_BOOL)
Packit 8f70b4
   typedef unsigned _bool;
Packit 8f70b4
#define bool   _bool
Packit 8f70b4
#define false  0U
Packit 8f70b4
#define true   1U
Packit 8f70b4
#endif ])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl try to build and run a dummy program
Packit 8f70b4
AC_DEFUN([LFTP_CXX__BOOL],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING(whether $CXX supports _Bool type)
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_cxx__Bool,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[_Bool t=true;bool f=false;]], [[]])],[lftp_cv_cxx__Bool=yes],[lftp_cv_cxx__Bool=no])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_cxx__Bool)
Packit 8f70b4
   if test x$lftp_cv_cxx__Bool = xyes; then
Packit 8f70b4
      AC_DEFINE(HAVE_CXX__BOOL, 1, [define if c++ compiler supports _Bool])
Packit 8f70b4
   fi
Packit 8f70b4
   AH_VERBATIM([OPT_CPP__BOOL], [
Packit 8f70b4
#if defined(__cplusplus) && !defined(HAVE_CXX__BOOL)
Packit 8f70b4
   typedef bool _Bool;
Packit 8f70b4
#endif ])
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl check if C++ compiler needs extra arguments to grok ANSI scoping rules
Packit 8f70b4
AC_DEFUN([LFTP_CXX_ANSI_SCOPE],
Packit 8f70b4
[
Packit 8f70b4
   AC_MSG_CHECKING([whether $CXX understands ANSI scoping rules])
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_cxx_ansi_scope,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
Packit 8f70b4
  for (int i = 0; i < 4; i++) ;
Packit 8f70b4
  for (int i = 0; i < 4; i++) ;]])],[lftp_cv_cxx_ansi_scope=yes],[
Packit 8f70b4
         # IRIX C++ needs -LANG:ansi-for-init-scope=ON if
Packit 8f70b4
         # -LANG:std not used
Packit 8f70b4
         _cxxflags=$CXXFLAGS
Packit 8f70b4
         CXXFLAGS="$CXXFLAGS -LANG:ansi-for-init-scope=ON"
Packit 8f70b4
         AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[
Packit 8f70b4
  for (int i = 0; i < 4; i++) ;
Packit 8f70b4
  for (int i = 0; i < 4; i++) ;]])],[lftp_cv_cxx_ansi_scope="-LANG:ansi-for-init-scope=ON"],[lftp_cv_cxx_ansi_scope=no])
Packit 8f70b4
         CXXFLAGS=$_cxxflags
Packit 8f70b4
      ])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   if test x$lftp_cv_cxx_ansi_scope = xno; then
Packit 8f70b4
      AC_MSG_RESULT([$lftp_cv_cxx_ansi_scope])
Packit 8f70b4
      AC_MSG_ERROR([C++ compiler does not understand ANSI scoping rules])
Packit 8f70b4
   elif test x$lftp_cv_cxx_ansi_scope != xyes; then
Packit 8f70b4
      AC_MSG_RESULT([$lftp_cv_cxx_ansi_scope added to \$CXXFLAGS])
Packit 8f70b4
      CXXFLAGS="$CXXFLAGS $lftp_cv_cxx_ansi_scope"
Packit 8f70b4
   else
Packit 8f70b4
     AC_MSG_RESULT($lftp_cv_cxx_ansi_scope)
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_ENVIRON_CHECK],[
Packit 8f70b4
   AC_CACHE_CHECK([for environ variable],[lftp_cv_environ],[
Packit 8f70b4
      AC_LINK_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
	 #include <unistd.h>
Packit 8f70b4
	 extern char **environ;
Packit 8f70b4
      ]], [[
Packit 8f70b4
	 return environ==(char**)0;
Packit 8f70b4
      ]])],[lftp_cv_environ=yes],[lftp_cv_environ=no])
Packit 8f70b4
   ])
Packit 8f70b4
   if test x$lftp_cv_environ = xyes; then
Packit 8f70b4
      AC_DEFINE(HAVE_ENVIRON, 1, [define if you have global environ variable])
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
dnl Taken from dovecot
Packit 8f70b4
AC_DEFUN([LFTP_POSIX_FALLOCATE_CHECK],[
Packit 8f70b4
   dnl * Old glibcs have broken posix_fallocate(). Make sure not to use it.
Packit 8f70b4
   dnl * It may also be broken in AIX.
Packit 8f70b4
   AC_CACHE_CHECK([whether posix_fallocate() works],[i_cv_posix_fallocate_works],[
Packit 8f70b4
     AC_RUN_IFELSE([AC_LANG_SOURCE([[
Packit 8f70b4
       #define _XOPEN_SOURCE 600
Packit 8f70b4
       #include <stdio.h>
Packit 8f70b4
       #include <stdlib.h>
Packit 8f70b4
       #include <fcntl.h>
Packit 8f70b4
       #include <unistd.h>
Packit 8f70b4
       #if defined(__GLIBC__) && (__GLIBC__ < 2 || __GLIBC_MINOR__ < 7)
Packit 8f70b4
	 possibly broken posix_fallocate
Packit 8f70b4
       #endif
Packit 8f70b4
       int main() {
Packit 8f70b4
	 int fd = creat("conftest.temp", 0600);
Packit 8f70b4
	 int ret;
Packit 8f70b4
	 if (fd == -1) {
Packit 8f70b4
      perror("creat()");
Packit 8f70b4
      return 2;
Packit 8f70b4
	 }
Packit 8f70b4
	 ret = posix_fallocate(fd, 1024, 1024) < 0 ? 1 : 0;
Packit 8f70b4
	 unlink("conftest.temp");
Packit 8f70b4
	 return ret;
Packit 8f70b4
       }
Packit 8f70b4
     ]])],[
Packit 8f70b4
       i_cv_posix_fallocate_works=yes
Packit 8f70b4
     ],[
Packit 8f70b4
       i_cv_posix_fallocate_works=no
Packit 8f70b4
     ],[
Packit 8f70b4
       dnl * Cross-compilation: we can only test if the code compiles and links.
Packit 8f70b4
       dnl * If it does, assume that it works, because cross-compilation for AIX or old glibc is unlikely.
Packit 8f70b4
       AC_CACHE_VAL([i_cv_posix_fallocate_works],[
Packit 8f70b4
         AC_LINK_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
           #include <fcntl.h>
Packit 8f70b4
	 ]], [[
Packit 8f70b4
             posix_fallocate(0, 0, 0);
Packit 8f70b4
         ]])],[
Packit 8f70b4
           i_cv_posix_fallocate_works=yes
Packit 8f70b4
         ],[
Packit 8f70b4
           i_cv_posix_fallocate_works=no
Packit 8f70b4
         ])
Packit 8f70b4
       ])
Packit 8f70b4
     ])
Packit 8f70b4
   ])
Packit 8f70b4
   if test x$i_cv_posix_fallocate_works = xyes; then
Packit 8f70b4
     AC_DEFINE(HAVE_POSIX_FALLOCATE, 1, [Define if you have a working posix_fallocate()])
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_POSIX_FADVISE_CHECK],[
Packit 8f70b4
   AC_CACHE_CHECK([for posix_fadvise], [ac_cv_posix_fadvise], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
   #define _XOPEN_SOURCE 600
Packit 8f70b4
   #include <stdio.h>
Packit 8f70b4
   #include <stdlib.h>
Packit 8f70b4
   #include <fcntl.h>
Packit 8f70b4
   #include <unistd.h>
Packit 8f70b4
   ]], [[
Packit 8f70b4
      int res = posix_fadvise ((int)0, (off_t)0, (off_t)0, POSIX_FADV_NORMAL);
Packit 8f70b4
      int a = POSIX_FADV_SEQUENTIAL;
Packit 8f70b4
      int b = POSIX_FADV_NOREUSE;
Packit 8f70b4
      int c = POSIX_FADV_RANDOM;
Packit 8f70b4
      int d = POSIX_FADV_WILLNEED;
Packit 8f70b4
      int e = POSIX_FADV_DONTNEED;
Packit 8f70b4
   ]])],[ac_cv_posix_fadvise=yes],[ac_cv_posix_fadvise=no])])
Packit 8f70b4
   if test x$ac_cv_posix_fadvise = xyes; then
Packit 8f70b4
      AC_DEFINE(HAVE_POSIX_FADVISE, 1, [Define if posix_fadvise() is available])
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_CXX_STDC_LIMIT_MACROS],[
Packit 8f70b4
   dnl * Old glibcs requires that __STDC_LIMIT_MACROS is defined for using
Packit 8f70b4
   dnl * stdint.h in c++ mode
Packit 8f70b4
   AC_MSG_CHECKING(whether stdint.h needs __STDC_LIMIT_MACROS in C++ mode)
Packit 8f70b4
   AC_CACHE_VAL(lftp_cv_cxx_stdc_limit_macros,
Packit 8f70b4
   [
Packit 8f70b4
      AC_LANG_PUSH(C++)
Packit 8f70b4
      AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
Packit 8f70b4
         #include <stdint.h>
Packit 8f70b4
	 int i = INT_MIN==INT32_MIN && INT_MAX == INT32_MAX;]], [[]])],[lftp_cv_cxx_stdc_limit_macros=no],[lftp_cv_cxx_stdc_limit_macros=yes])
Packit 8f70b4
      AC_LANG_POP(C++)
Packit 8f70b4
   ])
Packit 8f70b4
   AC_MSG_RESULT($lftp_cv_cxx_stdc_limit_macros)
Packit 8f70b4
   if test x$lftp_cv_cxx_stdc_limit_macros = xyes; then
Packit 8f70b4
      AC_DEFINE(__STDC_LIMIT_MACROS, 1, [Use STDC Limit Macros in C++])
Packit 8f70b4
   fi
Packit 8f70b4
])
Packit 8f70b4
Packit 8f70b4
AC_DEFUN([LFTP_LIBIDN2_CHECK],[
Packit 8f70b4
     AC_ARG_WITH(libidn2, AS_HELP_STRING([--with-libidn2@<:@=DIR@:>@],[Support IDN2 (needs GNU Libidn2)]),
Packit 8f70b4
       libidn2=$withval, libidn2=yes)
Packit 8f70b4
     if test "$libidn2" != "no"; then
Packit 8f70b4
       if test "$libidn2" != "yes"; then
Packit 8f70b4
         LDFLAGS="${LDFLAGS} -L$libidn2/lib"
Packit 8f70b4
         CPPFLAGS="${CPPFLAGS} -I$libidn2/include"
Packit 8f70b4
       fi
Packit 8f70b4
       AC_CHECK_HEADER(idn2.h,
Packit 8f70b4
         AC_CHECK_LIB(idn2, idn2_check_version,
Packit 8f70b4
           [libidn2=yes LIBS="${LIBS} -lidn2"], libidn2=no),
Packit 8f70b4
         libidn2=no)
Packit 8f70b4
     fi
Packit 8f70b4
     if test "$libidn2" != "no" ; then
Packit 8f70b4
       AC_DEFINE(LIBIDN2, 1, [Define to 1 if you want IDN2 support.])
Packit 8f70b4
     else
Packit 8f70b4
       AC_MSG_WARN([Libidn2 not found])
Packit 8f70b4
     fi
Packit 8f70b4
     AC_MSG_CHECKING([if Libidn2 should be used])
Packit 8f70b4
     AC_MSG_RESULT($libidn2)
Packit 8f70b4
])