Home | History | Annotate | Download | only in strace
      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