1dnl OpenSSH-specific autoconf macros 2dnl 3 4dnl OSSH_CHECK_CFLAG_COMPILE(check_flag[, define_flag]) 5dnl Check that $CC accepts a flag 'check_flag'. If it is supported append 6dnl 'define_flag' to $CFLAGS. If 'define_flag' is not specified, then append 7dnl 'check_flag'. 8AC_DEFUN([OSSH_CHECK_CFLAG_COMPILE], [{ 9 AC_MSG_CHECKING([if $CC supports compile flag $1]) 10 saved_CFLAGS="$CFLAGS" 11 CFLAGS="$CFLAGS $WERROR $1" 12 _define_flag="$2" 13 test "x$_define_flag" = "x" && _define_flag="$1" 14 AC_COMPILE_IFELSE([AC_LANG_SOURCE([[ 15#include <stdlib.h> 16#include <stdio.h> 17int main(int argc, char **argv) { 18 /* Some math to catch -ftrapv problems in the toolchain */ 19 int i = 123 * argc, j = 456 + argc, k = 789 - argc; 20 float l = i * 2.1; 21 double m = l / 0.5; 22 long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; 23 printf("%d %d %d %f %f %lld %lld\n", i, j, k, l, m, n, o); 24 exit(0); 25} 26 ]])], 27 [ 28if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null 29then 30 AC_MSG_RESULT([no]) 31 CFLAGS="$saved_CFLAGS" 32else 33 AC_MSG_RESULT([yes]) 34 CFLAGS="$saved_CFLAGS $_define_flag" 35fi], 36 [ AC_MSG_RESULT([no]) 37 CFLAGS="$saved_CFLAGS" ] 38 ) 39}]) 40 41dnl OSSH_CHECK_CFLAG_LINK(check_flag[, define_flag]) 42dnl Check that $CC accepts a flag 'check_flag'. If it is supported append 43dnl 'define_flag' to $CFLAGS. If 'define_flag' is not specified, then append 44dnl 'check_flag'. 45AC_DEFUN([OSSH_CHECK_CFLAG_LINK], [{ 46 AC_MSG_CHECKING([if $CC supports compile flag $1 and linking succeeds]) 47 saved_CFLAGS="$CFLAGS" 48 CFLAGS="$CFLAGS $WERROR $1" 49 _define_flag="$2" 50 test "x$_define_flag" = "x" && _define_flag="$1" 51 AC_LINK_IFELSE([AC_LANG_SOURCE([[ 52#include <stdlib.h> 53#include <stdio.h> 54int main(int argc, char **argv) { 55 /* Some math to catch -ftrapv problems in the toolchain */ 56 int i = 123 * argc, j = 456 + argc, k = 789 - argc; 57 float l = i * 2.1; 58 double m = l / 0.5; 59 long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; 60 long long int p = n * o; 61 printf("%d %d %d %f %f %lld %lld %lld\n", i, j, k, l, m, n, o, p); 62 exit(0); 63} 64 ]])], 65 [ 66if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null 67then 68 AC_MSG_RESULT([no]) 69 CFLAGS="$saved_CFLAGS" 70else 71 AC_MSG_RESULT([yes]) 72 CFLAGS="$saved_CFLAGS $_define_flag" 73fi], 74 [ AC_MSG_RESULT([no]) 75 CFLAGS="$saved_CFLAGS" ] 76 ) 77}]) 78 79dnl OSSH_CHECK_LDFLAG_LINK(check_flag[, define_flag]) 80dnl Check that $LD accepts a flag 'check_flag'. If it is supported append 81dnl 'define_flag' to $LDFLAGS. If 'define_flag' is not specified, then append 82dnl 'check_flag'. 83AC_DEFUN([OSSH_CHECK_LDFLAG_LINK], [{ 84 AC_MSG_CHECKING([if $LD supports link flag $1]) 85 saved_LDFLAGS="$LDFLAGS" 86 LDFLAGS="$LDFLAGS $WERROR $1" 87 _define_flag="$2" 88 test "x$_define_flag" = "x" && _define_flag="$1" 89 AC_LINK_IFELSE([AC_LANG_SOURCE([[ 90#include <stdlib.h> 91#include <stdio.h> 92int main(int argc, char **argv) { 93 /* Some math to catch -ftrapv problems in the toolchain */ 94 int i = 123 * argc, j = 456 + argc, k = 789 - argc; 95 float l = i * 2.1; 96 double m = l / 0.5; 97 long long int n = argc * 12345LL, o = 12345LL * (long long int)argc; 98 long long p = n * o; 99 printf("%d %d %d %f %f %lld %lld %lld\n", i, j, k, l, m, n, o, p); 100 exit(0); 101} 102 ]])], 103 [ 104if $ac_cv_path_EGREP -i "unrecognized option|warning.*ignored" conftest.err >/dev/null 105then 106 AC_MSG_RESULT([no]) 107 LDFLAGS="$saved_LDFLAGS" 108else 109 AC_MSG_RESULT([yes]) 110 LDFLAGS="$saved_LDFLAGS $_define_flag" 111fi ], 112 [ AC_MSG_RESULT([no]) 113 LDFLAGS="$saved_LDFLAGS" ] 114 ) 115}]) 116 117dnl OSSH_CHECK_HEADER_FOR_FIELD(field, header, symbol) 118dnl Does AC_EGREP_HEADER on 'header' for the string 'field' 119dnl If found, set 'symbol' to be defined. Cache the result. 120dnl TODO: This is not foolproof, better to compile and read from there 121AC_DEFUN(OSSH_CHECK_HEADER_FOR_FIELD, [ 122# look for field '$1' in header '$2' 123 dnl This strips characters illegal to m4 from the header filename 124 ossh_safe=`echo "$2" | sed 'y%./+-%__p_%'` 125 dnl 126 ossh_varname="ossh_cv_$ossh_safe""_has_"$1 127 AC_MSG_CHECKING(for $1 field in $2) 128 AC_CACHE_VAL($ossh_varname, [ 129 AC_EGREP_HEADER($1, $2, [ dnl 130 eval "$ossh_varname=yes" dnl 131 ], [ dnl 132 eval "$ossh_varname=no" dnl 133 ]) dnl 134 ]) 135 ossh_result=`eval 'echo $'"$ossh_varname"` 136 if test -n "`echo $ossh_varname`"; then 137 AC_MSG_RESULT($ossh_result) 138 if test "x$ossh_result" = "xyes"; then 139 AC_DEFINE($3, 1, [Define if you have $1 in $2]) 140 fi 141 else 142 AC_MSG_RESULT(no) 143 fi 144]) 145 146dnl Check for socklen_t: historically on BSD it is an int, and in 147dnl POSIX 1g it is a type of its own, but some platforms use different 148dnl types for the argument to getsockopt, getpeername, etc. So we 149dnl have to test to find something that will work. 150AC_DEFUN([TYPE_SOCKLEN_T], 151[ 152 AC_CHECK_TYPE([socklen_t], ,[ 153 AC_MSG_CHECKING([for socklen_t equivalent]) 154 AC_CACHE_VAL([curl_cv_socklen_t_equiv], 155 [ 156 # Systems have either "struct sockaddr *" or 157 # "void *" as the second argument to getpeername 158 curl_cv_socklen_t_equiv= 159 for arg2 in "struct sockaddr" void; do 160 for t in int size_t unsigned long "unsigned long"; do 161 AC_TRY_COMPILE([ 162 #include <sys/types.h> 163 #include <sys/socket.h> 164 165 int getpeername (int, $arg2 *, $t *); 166 ],[ 167 $t len; 168 getpeername(0,0,&len); 169 ],[ 170 curl_cv_socklen_t_equiv="$t" 171 break 172 ]) 173 done 174 done 175 176 if test "x$curl_cv_socklen_t_equiv" = x; then 177 AC_MSG_ERROR([Cannot find a type to use in place of socklen_t]) 178 fi 179 ]) 180 AC_MSG_RESULT($curl_cv_socklen_t_equiv) 181 AC_DEFINE_UNQUOTED(socklen_t, $curl_cv_socklen_t_equiv, 182 [type to use in place of socklen_t if not defined])], 183 [#include <sys/types.h> 184#include <sys/socket.h>]) 185]) 186 187