1 dnl 2 dnl This file contains macros used in configure.ac. 3 dnl automake uses this file to generate aclocal.m4, which is used by autoconf. 4 dnl 5 6 dnl ### A macro to find the include directory, useful for cross-compiling. 7 AC_DEFUN([AC_INCLUDEDIR], 8 [AC_REQUIRE([AC_PROG_AWK])dnl 9 AC_SUBST(includedir) 10 AC_MSG_CHECKING(for primary include directory) 11 includedir=/usr/include 12 if test -n "$GCC" 13 then 14 >conftest.c 15 new_includedir=` 16 $CC -v -E conftest.c 2>&1 | $AWK ' 17 /^End of search list/ { print last; exit } 18 { last = [$]1 } 19 ' 20 ` 21 rm -f conftest.c 22 if test -n "$new_includedir" && test -d "$new_includedir" 23 then 24 includedir=$new_includedir 25 fi 26 fi 27 AC_MSG_RESULT($includedir) 28 ]) 29 30 dnl ### A macro to set gcc warning flags. 31 define(AC_WARNFLAGS, 32 [AC_SUBST(WARNFLAGS) 33 if test -z "$WARNFLAGS" 34 then 35 if test -n "$GCC" 36 then 37 # If we're using gcc we want warning flags. 38 WARNFLAGS=-Wall 39 fi 40 fi 41 ]) 42 43 dnl ### A macro to determine if we have a "MP" type procfs 44 AC_DEFUN([AC_MP_PROCFS], 45 [AC_MSG_CHECKING(for MP procfs) 46 AC_CACHE_VAL(ac_cv_mp_procfs, 47 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 48 #include <stdio.h> 49 #include <signal.h> 50 #include <sys/procfs.h> 51 52 main() 53 { 54 int pid; 55 char proc[32]; 56 FILE *ctl; 57 FILE *status; 58 int cmd; 59 struct pstatus pstatus; 60 61 if ((pid = fork()) == 0) { 62 pause(); 63 exit(0); 64 } 65 sprintf(proc, "/proc/%d/ctl", pid); 66 if ((ctl = fopen(proc, "w")) == NULL) 67 goto fail; 68 sprintf(proc, "/proc/%d/status", pid); 69 if ((status = fopen (proc, "r")) == NULL) 70 goto fail; 71 cmd = PCSTOP; 72 if (write (fileno (ctl), &cmd, sizeof cmd) < 0) 73 goto fail; 74 if (read (fileno (status), &pstatus, sizeof pstatus) < 0) 75 goto fail; 76 kill(pid, SIGKILL); 77 exit(0); 78 fail: 79 kill(pid, SIGKILL); 80 exit(1); 81 } 82 ]])],[ac_cv_mp_procfs=yes],[ac_cv_mp_procfs=no],[ 83 # Guess or punt. 84 case "$host_os" in 85 svr4.2*|svr5*) 86 ac_cv_mp_procfs=yes 87 ;; 88 *) 89 ac_cv_mp_procfs=no 90 ;; 91 esac 92 ])]) 93 AC_MSG_RESULT($ac_cv_mp_procfs) 94 if test "$ac_cv_mp_procfs" = yes 95 then 96 AC_DEFINE([HAVE_MP_PROCFS], 1, 97 [Define if you have a SVR4 MP type procfs. 98 I.E. /dev/xxx/ctl, /dev/xxx/status. 99 Also implies that you have the pr_lwp member in prstatus.]) 100 fi 101 ]) 102 103 dnl ### A macro to determine if procfs is pollable. 104 AC_DEFUN([AC_POLLABLE_PROCFS], 105 [AC_MSG_CHECKING(for pollable procfs) 106 AC_CACHE_VAL(ac_cv_pollable_procfs, 107 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 108 #include <stdio.h> 109 #include <signal.h> 110 #include <sys/procfs.h> 111 #include <sys/stropts.h> 112 #include <poll.h> 113 114 #ifdef HAVE_MP_PROCFS 115 #define PIOCSTOP PCSTOP 116 #define POLLWANT POLLWRNORM 117 #define PROC "/proc/%d/ctl" 118 #define PROC_MODE "w" 119 int IOCTL (int fd, int cmd, int arg) { 120 return write (fd, &cmd, sizeof cmd); 121 } 122 #else 123 #define POLLWANT POLLPRI 124 #define PROC "/proc/%d" 125 #define PROC_MODE "r+" 126 #define IOCTL ioctl 127 #endif 128 129 main() 130 { 131 int pid; 132 char proc[32]; 133 FILE *pfp; 134 struct pollfd pfd; 135 136 if ((pid = fork()) == 0) { 137 pause(); 138 exit(0); 139 } 140 sprintf(proc, PROC, pid); 141 if ((pfp = fopen(proc, PROC_MODE)) == NULL) 142 goto fail; 143 if (IOCTL(fileno(pfp), PIOCSTOP, NULL) < 0) 144 goto fail; 145 pfd.fd = fileno(pfp); 146 pfd.events = POLLWANT; 147 if (poll(&pfd, 1, 0) < 0) 148 goto fail; 149 if (!(pfd.revents & POLLWANT)) 150 goto fail; 151 kill(pid, SIGKILL); 152 exit(0); 153 fail: 154 kill(pid, SIGKILL); 155 exit(1); 156 } 157 ]])],[ac_cv_pollable_procfs=yes],[ac_cv_pollable_procfs=no],[ 158 # Guess or punt. 159 case "$host_os" in 160 solaris2*|irix5*|svr4.2uw*|svr5*) 161 ac_cv_pollable_procfs=yes 162 ;; 163 *) 164 ac_cv_pollable_procfs=no 165 ;; 166 esac 167 ])]) 168 AC_MSG_RESULT($ac_cv_pollable_procfs) 169 if test "$ac_cv_pollable_procfs" = yes 170 then 171 AC_DEFINE([HAVE_POLLABLE_PROCFS], 1, 172 [Define if you have SVR4 and the poll system call works on /proc files.]) 173 fi 174 ]) 175 176 dnl ### A macro to determine if the prstatus structure has a pr_syscall member. 177 AC_DEFUN([AC_STRUCT_PR_SYSCALL], 178 [AC_MSG_CHECKING(for pr_syscall in struct prstatus) 179 AC_CACHE_VAL(ac_cv_struct_pr_syscall, 180 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/procfs.h>]], [[#ifdef HAVE_MP_PROCFS 181 pstatus_t s; 182 s.pr_lwp.pr_syscall 183 #else 184 prstatus_t s; 185 s.pr_syscall 186 #endif]])],[ac_cv_struct_pr_syscall=yes],[ac_cv_struct_pr_syscall=no])]) 187 AC_MSG_RESULT($ac_cv_struct_pr_syscall) 188 if test "$ac_cv_struct_pr_syscall" = yes 189 then 190 AC_DEFINE([HAVE_PR_SYSCALL], 1, 191 [Define if the prstatus structure in sys/procfs.h has a pr_syscall member.]) 192 fi 193 ]) 194 195 dnl ### A macro to determine whether stat64 is defined. 196 AC_DEFUN([AC_STAT64], 197 [AC_MSG_CHECKING(for stat64 in (asm|sys)/stat.h) 198 AC_CACHE_VAL(ac_cv_type_stat64, 199 [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef LINUX 200 #include <linux/types.h> 201 #include <asm/stat.h> 202 #else 203 #include <sys/stat.h> 204 #endif]], [[struct stat64 st;]])],[ac_cv_type_stat64=yes],[ac_cv_type_stat64=no])]) 205 AC_MSG_RESULT($ac_cv_type_stat64) 206 if test "$ac_cv_type_stat64" = yes 207 then 208 AC_DEFINE([HAVE_STAT64], 1, 209 [Define if stat64 is available in asm/stat.h.]) 210 fi 211 ]) 212 213 dnl ### A macro to determine if off_t is a long long 214 AC_DEFUN([AC_OFF_T_IS_LONG_LONG], 215 [AC_MSG_CHECKING(for long long off_t) 216 AC_CACHE_VAL(ac_cv_have_long_long_off_t, 217 [AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <sys/types.h> 218 main () { 219 if (sizeof (off_t) == sizeof (long long) && 220 sizeof (off_t) > sizeof (long)) 221 return 0; 222 return 1; 223 } 224 ]])],[ac_cv_have_long_long_off_t=yes],[ac_cv_have_long_long_off_t=no],[# Should try to guess here 225 ac_cv_have_long_long_off_t=no 226 ])]) 227 AC_MSG_RESULT($ac_cv_have_long_long_off_t) 228 if test "$ac_cv_have_long_long_off_t" = yes 229 then 230 AC_DEFINE([HAVE_LONG_LONG_OFF_T], 1, [Define if off_t is a long long.]) 231 fi 232 ]) 233 234 dnl ### A macro to determine if rlim_t is a long long 235 AC_DEFUN([AC_RLIM_T_IS_LONG_LONG], 236 [AC_MSG_CHECKING(for long long rlim_t) 237 AC_CACHE_VAL(ac_cv_have_long_long_rlim_t, 238 [AC_RUN_IFELSE([AC_LANG_SOURCE([[#include <sys/types.h> 239 #include <sys/time.h> 240 #include <sys/resource.h> 241 main () { 242 if (sizeof (rlim_t) == sizeof (long long) && 243 sizeof (rlim_t) > sizeof (long)) 244 return 0; 245 return 1; 246 } 247 ]])],[ac_cv_have_long_long_rlim_t=yes],[ac_cv_have_long_long_rlim_t=no],[# Should try to guess here 248 ac_cv_have_long_long_rlim_t=no 249 ])]) 250 AC_MSG_RESULT($ac_cv_have_long_long_rlim_t) 251 if test "$ac_cv_have_long_long_rlim_t" = yes 252 then 253 AC_DEFINE([HAVE_LONG_LONG_RLIM_T], 1, [Define if rlim_t is a long long.]) 254 fi 255 ]) 256 257 dnl ### A macro to determine endianness of long long 258 AC_DEFUN([AC_LITTLE_ENDIAN_LONG_LONG], 259 [AC_MSG_CHECKING(for little endian long long) 260 AC_CACHE_VAL(ac_cv_have_little_endian_long_long, 261 [AC_RUN_IFELSE([AC_LANG_SOURCE([[ 262 int main () { 263 union { 264 long long ll; 265 long l [2]; 266 } u; 267 u.ll = 0x12345678; 268 if (u.l[0] == 0x12345678) 269 return 0; 270 return 1; 271 } 272 ]])],[ac_cv_have_little_endian_long_long=yes],[ac_cv_have_little_endian_long_long=no],[# Should try to guess here 273 ac_cv_have_little_endian_long_long=no 274 ])]) 275 AC_MSG_RESULT($ac_cv_have_little_endian_long_long) 276 if test "$ac_cv_have_little_endian_long_long" = yes 277 then 278 AC_DEFINE([HAVE_LITTLE_ENDIAN_LONG_LONG], 1, 279 [Define if long long is little-endian.]) 280 fi 281 ]) 282