AC_INIT(interpret.c)
AC_PROG_CC
OLD_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -pipe"
OPTIMIZE=""
AC_COMPILE_CHECK(-pipe,
[ ],
[ exit(0); ],
[
OPTIMIZE="$OPTIMIZE -pipe"
AC_VERBOSE(-pipe found)
],
[
CFLAGS="$OLD_CFLAGS"
AC_VERBOSE(-pipe not found)
]
)
OLD_CFLAGS="$CFLAGS"
CFLAGS="$OLD_CFLAGS -O2"
AC_COMPILE_CHECK(-O2, [ ], [ exit(0); ],
[
OPTIMIZE="$OPTIMIZE -O2"
AC_VERBOSE(-O2 found)
],
[
AC_VERBOSE(-O2 not found)
CFLAGS="$OLD_CFLAGS -O"
AC_COMPILE_CHECK(-O, [ ], [ exit(0); ],
[
OPTIMIZE="$OPTIMIZE -O"
AC_VERBOSE(-O found)
],
[
AC_VERBOSE(-O not found)
])
])
for a in -g -W -Wunused -Wformat
do
CFLAGS="$CFLAGS $OPTIMIZE $a"
AC_COMPILE_CHECK($a, [ ], [ exit(0); ],
[
OPTIMIZE="$OPTIMIZE $a"
AC_VERBOSE($a found)
],
[
AC_VERBOSE($a not found)
])
done
CFLAGS="$OLD_CFLAGS"
AC_CHECKING(mudlib and source dir)
[
basedir=`(cd $srcdir; cd ..; pwd | sed 's#^/tmp_mnt##' )`
MUD_LIB=$basedir/lib
BINDIR=$basedir/bin
]
AC_PROG_INSTALL
AC_CONFIG_HEADER(machine.h)
AC_PROG_YACC
AC_PROG_CPP
AC_SET_MAKE
AC_PROGRAM_CHECK(COMPARE,diff,diff -wh >/dev/null 2>/dev/null,cmp -s)
[
if test "$COMPARE" = "diff -wh >/dev/null 2>/dev/null" ; then
cat >conftest.tmp1 <<END
a simple test
a simple test
END
cat >conftest.tmp2 <<END
a simple test
a simple test
END
cat >conftest.tmp3 <<END
a simple test
a hard test
END
if diff -hw >/dev/null 2>/dev/null conftest.tmp1 conftest.tmp2; then
if diff -hw >/dev/null 2>/dev/null conftest.tmp1 conftest.tmp3; then
COMPARE="cmp -s"
else
COMPARE="diff -wh >/dev/null 2>/dev/null"
fi
else
COMPARE="cmp -s"
fi
rm -f conftest.tmp1 conftest.tmp2 conftest.tmp3
fi
]
AC_CHECKING(first yacc define)
[
cat >conftest.y <<\EOF
%token GURKA
%%
all: GURKA
%%
EOF
foffset=257;
if $YACC -d conftest.y ; then
if test -f y.tab.h; then
foffset=`egrep GURKA y.tab.h | sed 's/^#[^0-9]*\([0-9]*\)[^0-9]*$/\1/'`
echo $foffset >conftest.out
if egrep '^[0-9]+$' conftest.out >/dev/null 2>&1; then
echo >/dev/null
else
foffset=257
fi
fi
fi
]
AC_DEFINE_UNQUOTED(F_OFFSET,$foffset)
rm -rf conftest.y y.tab.c y.tab.h conftest.out
AC_HAVE_HEADERS(sys/rusage.h sys/time.h unistd.h stdlib.h memory.h values.h \
string.h fcntl.h sys/filio.h sys/sockio.h netinet/in.h crypt.h \
sys/socketvar.h)
AC_STDC_HEADERS
AC_DIR_HEADER
AC_SIZEOF_TYPE(char *)
AC_SIZEOF_TYPE(long)
AC_SIZEOF_TYPE(int)
AC_SIZEOF_TYPE(short)
AC_SIZE_T
AC_PID_T
AC_UID_T
AC_RETSIGTYPE
AC_HAVE_FUNCS(memset memcpy memchr memcmp strchr strrchr fchmod getrusage \
strcspn crypt _crypt getwd getcwd strtod strtok getenv vfprintf bzero bcopy \
strtol rindex vsprintf)
AC_HEADER_EGREP(strchr,string.h, ,
AC_HEADER_EGREP(strchr,unistd.h, ,
AC_HEADER_EGREP(strchr,stdlib.h, ,
AC_DEFINE(STRCHR_DECL_MISSING))))
AC_HEADER_EGREP(malloc,memory.h, ,
AC_HEADER_EGREP(malloc,unistd.h, ,
AC_HEADER_EGREP(malloc,stdlib.h, ,
AC_DEFINE(MALLOC_DECL_MISSING))))
AC_HEADER_EGREP(getpeername,sys/socket.h, ,
AC_HEADER_EGREP(getpeername,sys/socketvar.h, ,
AC_HEADER_EGREP(getpeername,sys/sockio.h, ,
AC_DEFINE(GETPEERNAME_DECL_MISSING))))
AC_HEADER_EGREP(popen,stdio.h, ,
AC_DEFINE(POPEN_DECL_MISSING))
AC_HEADER_EGREP(getenv,unistd.h, ,
AC_HEADER_EGREP(getenv,stdlib.h, ,
AC_DEFINE(GETENV_DECL_MISSING)))
AC_COMPILE_CHECK(return type of free, [
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
#include <memory.h>
#endif
void free();
],, AC_DEFINE(FREE_RETURNS_VOID))
AC_COMPILE_CHECK([void* or char* from malloc],
[
#include <sys/types.h>
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#if !defined(STDC_HEADERS) && defined(HAVE_MEMORY_H)
#include <memory.h>
#endif
#define POINTER void *
POINTER malloc(size_t);
#ifdef FREE_RETURNS_VOID
void free(POINTER);
#else
int free(POINTER);
#endif
],,AC_DEFINE(POINTER, void *), AC_DEFINE(POINTER, char *))
AC_HEADER_EGREP(gethostname,unistd.h, ,AC_DEFINE(GETHOSTNAME_DECL_MISSING))
AC_ALLOCA
AC_CONST
AC_INLINE
AC_HAVE_LIBRARY(m)
AC_HAVE_LIBRARY(socket)
dnl AC_HAVE_LIBRARY(ucb, LIBS="$LIBS -lc -lucb")
case "$DEFS" in
*HAVE_LIBSOCKET* | *HAVE_LIBUCB*)
AC_HAVE_LIBRARY(nsl)
;;
esac
AC_REPLACE_FUNCS(ualarm)
case "$LIBOBJS" in
*ualarm.o*) ;;
*)
AC_DEFINE(HAVE_UALARM)
;;
esac
AC_CHECKING(unaligned read/writes)
AC_TEST_PROGRAM([
int main()
{
char *c;
c=(char *)malloc(100);
*((int *)(c+0))=0x1243abcd;
if(*((int *)(c+0))!=0x1243abcd) return 1;
*((int *)(c+1))=0x1243abcd;
if(*((int *)(c+1))!=0x1243abcd) return 1;
*((int *)(c+2))=0x1243abcd;
if(*((int *)(c+2))!=0x1243abcd) return 1;
*((int *)(c+3))=0x1243abcd;
if(*((int *)(c+3))!=0x1243abcd) return 1;
*((short *)(c+1))=0x1243;
if(*((short *)(c+1))!=0x1243) return 1;
*((short *)(c+0))=0x1243;
if(*((short *)(c+0))!=0x1243) return 1;
return 0;
}
],AC_DEFINE(HANDLES_UNALIGNED_MEMORY_ACCESS))
AC_CHECKING(for working memmem)
AC_TEST_PROGRAM([
#include <string.h>
char *a="foo bar gazonk";
char *b="foo";
char *c="bar";
char *d="gazonk";
void main()
{
if(memmem(b,strlen(b),a,strlen(a))!=a ||
memmem(c,strlen(c),a,strlen(a))!=(a+4) ||
memmem(d,strlen(d),a,strlen(a))!=(a+8) ||
memmem(d,0,a,strlen(a))!=a ||
memmem(d,strlen(d)+1,a,strlen(a))!=0)
exit(1);
exit(0);
}
],AC_DEFINE(HAVE_MEMMEM))
AC_CHECKING(how to extract an unsigned char)
AC_TEST_PROGRAM([
void main()
{
char i,*p;
i=-10;
p=&i;
if(*(unsigned char *)(p)!= 0x100 - 10) exit(1);
exit(0);
}
],AC_DEFINE(EXTRACT_UCHAR_BY_CAST))
case "$DEFS" in
*HAVE_GETRUSAGE*)
AC_COMPILE_CHECK(full availability of struct rusage members, [
#include <sys/time.h>
#ifdef HAVE_SYS_RUSAGE_H
#include <sys/rusage.h>
#endif
#include <sys/resource.h>
#ifndef RUSAGE_SELF
#define RUSAGE_SELF 0
#endif
],[
struct rusage rus;
long *v = (long *)main;
getrusage(RUSAGE_SELF, &rus);
*v++ = rus.ru_maxrss;
*v++ = rus.ru_ixrss;
*v++ = rus.ru_idrss;
*v++ = rus.ru_isrss;
*v++ = rus.ru_minflt;
*v++ = rus.ru_majflt;
*v++ = rus.ru_nswap;
*v++ = rus.ru_inblock;
*v++ = rus.ru_oublock;
*v++ = rus.ru_msgsnd;
*v++ = rus.ru_msgrcv;
*v++ = rus.ru_nsignals;
*v++ = rus.ru_nvcsw;
*v++ = rus.ru_nivcsw;
],, AC_DEFINE(GETRUSAGE_RESTRICTED)) ;;
*)
AC_COMPILE_CHECK(getrusage() through procfs, [
#include <sys/procfs.h>
#include <sys/fcntl.h>
int proc_fd;
char proc_name[20];
],[
sprintf(proc_name, "/proc/%05d", getpid());
proc_fd = open(proc_name, O_RDONLY);
], AC_DEFINE(GETRUSAGE_THROUGH_PROCFS) AC_DEFINE(HAVE_GETRUSAGE))
;;
esac
AC_CHECKING(for pragma alloca)
AC_TEST_PROGRAM([
#pragma alloca
void main()
{
char *a=alloca();
exit(0);
}
], AC_DEFINE(USE_PRAGMA_ALLOCA))
AC_COMPILE_CHECK(checking for volatile, [
],[
volatile int foo=1;
],AC_DEFINE(VOLATILE,volatile),AC_DEFINE(VOLATILE,))
AC_CHECKING(for gcc function attributes)
AC_TEST_PROGRAM([
#include <stdarg.h>
void fatal(char *foo,...) __attribute__ ((noreturn,format (printf,1,2)));
int sqr(int x) __attribute__ ((const));
int sqr(int x) { return x*x; }
void fatal(char *foo,...)
{
va_list args;
va_start(foo,args);
printf(foo,args);
va_end(args);
exit(2);
}
main() { exit(0); }
], AC_DEFINE(HAVE_FUNCTION_ATTRIBUTES))
AC_CHECKING(how to set things nonblocking)
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_FNDELAY
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_FNDELAY),
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_O_NDELAY
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_O_NDELAY),
AC_TEST_PROGRAM([
#define TESTING
#define USE_FCNTL_NONBLOCK
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_FCNTL_NONBLOCK),
AC_TEST_PROGRAM([
#define TESTING
#define USE_IOCTL_FIONBIO
#include "$srcdir/socket_ctrl.c"
],AC_DEFINE(USE_IOCTL_FIONBIO),
echo "Couldn't find nonblock method."
))))
AC_SUBST(WARN)
AC_SUBST(COMPARE)
AC_SUBST(OPTIMIZE)
AC_SUBST(EXTRA_OBJS)
AC_SUBST(MUD_LIB)
AC_SUBST(BINDIR)
AC_OUTPUT(Makefile)