dnl -*- mode: shell-script; sh-indentation: 2; -*-
dnl $Id$
dnl Process this file with autoconf to produce a configure script.
AC_INIT(src/lsh_types.h)
AM_INIT_AUTOMAKE(lsh, 0.9.2)
dnl No real versioning yet, use dated snapshots instead.
dnl AM_INIT_AUTOMAKE(lsh, esyscmd([date +snapshot-%Y-%m-%d]))
AM_CONFIG_HEADER(config.h)
dnl This macro turns of a the Makefile.in: Makefile.am dependencies, unless
dnl --enable-maintainer-mode is passed to ./configure. But I want
dnl maintainermode to be *on* by default.
dnl AM_MAINTAINER_MODE
# We want an absolute path to the source-dir.
case "$srcdir" in
/*)
;;
*)
oldsrcdir="$srcdir"
srcdir="`cd \"$srcdir\";pwd`"
AC_MSG_WARN([ Converted $oldsrcdir to $srcdir,
If this does not work, please use an absolute path to the configure script. ])
;;
esac
# We want to compile the crypto lib for use with lsh
CPPFLAGS="$CPPFLAGS -I$srcdir -I$srcdir/src -I$srcdir/src/symmetric/include -DLSH"
# GNU libc defaults to supplying the ISO C library functions only.
# initgroups() and strsignal() are extensions; the _GNU_SOURCE define
# enables these extensions.
# Enable it on all systems; no problems have been reported with it so far.
CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE"
dnl Check options
AC_ARG_WITH(debug_alloc,
[--without-debug-alloc sanity check memory allocation and casts],,
[with_debug_alloc=yes])
if test x$with_debug_alloc = xyes ; then
AC_DEFINE(DEBUG_ALLOC)
fi
AC_ARG_WITH(debug_trace,
[--without-debug-trace support for tracing],,
[with_debug_trace=yes])
if test x$with_debug_trace = xyes ; then
AC_DEFINE(DEBUG_TRACE)
fi
AC_ARG_WITH(zlib,
[--without-zlib use zlib compression],,
[with_zlib=yes])
dnl Checking this variable is delayed until we have checked if zlib is
dnl actually available.
AC_ARG_WITH(pty,
[--without-pty disable pty support],,
[with_pty=yes])
if test x$with_pty = xyes ; then
AC_DEFINE(WITH_PTY_SUPPORT)
fi
AC_ARG_WITH(sshd1,
[--with-sshd1[=PROGRAM] support fallback to SSH1 daemon],,
[with_sshd1=yes])
# Default sshd1 path
if test x$with_sshd1 = xyes ; then
with_sshd1=/usr/local/sbin/sshd1
fi
if test x$with_sshd1 != xno ; then
AC_DEFINE(WITH_SSH1_FALLBACK)
AC_DEFINE_UNQUOTED(SSHD1,"$with_sshd1")
fi
AC_ARG_WITH(idea,
[--with-idea support the patent-encumbered IDEA algorithm],,
[with_idea=no])
if test x$with_idea = xyes ; then
AC_DEFINE(WITH_IDEA)
fi
AC_ARG_WITH(datafellows_workarounds,
[--without-datafellows-workarounds Bug-compatibility with DataFellows ssh2 clients and servers],,
[with_datafellows_workarounds=yes])
if test x$with_datafellows_workarounds = xyes ; then
AC_DEFINE(DATAFELLOWS_WORKAROUNDS)
fi
AC_ARG_WITH(tcp_forward,
[--without-tcp-forward Support tcp forwarding],,
[with_tcp_forward=yes])
if test x$with_tcp_forward = xyes ; then
AC_DEFINE(WITH_TCP_FORWARD)
fi
AC_ARG_WITH(x11_forward,
[--without-x11-forward Support x11 forwarding (proxy only)],,
[with_x11_forward=yes])
if test x$with_x11_forward = xyes ; then
AC_DEFINE(WITH_X11_FORWARD)
fi
AC_ARG_WITH(agent_forward,
[--without-agent-forward Support auth-agent forwarding (proxy
only)],,
[with_agent_forward=yes])
if test x$with_agent_forward = xyes ; then
AC_DEFINE(WITH_AGENT_FORWARD)
fi
AC_ARG_WITH(scheme,
[--with-scheme[=PROGRAM] Use a particular scheme implementation],,
[with_scheme=])
AC_ARG_WITH(system-argp,
[--without-system-argp Don't use the system's argp.],,
[with_system_argp=yes])
dnl Checks for programs.
AC_PROG_CC
AC_PROG_MAKE_SET
AC_PROG_RANLIB
AM_PROG_CC_STDC
if test x$am_cv_prog_cc_stdc = xno ; then
AC_ERROR([the C compiler doesn't handle ANSI-C])
fi
# Use a particular scheme implementation?
if test x$with_scheme != x ; then
AC_PATH_PROG(SCHEME_PROGRAM, $with_scheme,, $PATH)
else
AC_PATH_PROGS(SCHEME_PROGRAM, guile scsh,, $PATH)
fi
if test x$SCHEME_PROGRAM = x ; then
AC_MSG_WARN([No scheme implementation found.])
SCHEME_PROGRAM=false
fi
SCHEME_NAME=`basename $SCHEME_PROGRAM`
AC_SUBST(SCHEME_NAME)
AC_PATH_PROG(BASH, bash,, $PATH)
AC_PATH_PROG(GROFF, groff,, $PATH)
AC_PATH_PROG(M4, m4, m4)
AC_CACHE_CHECK([if m4 can handle eight-bit quote characters],
lsh_cv_prog_m4_quote_8bit,
[ if test xfoo = x`echo 'change''quote(»,«)»foo«' | $M4`; then
lsh_cv_prog_m4_quote_8bit=yes
else
lsh_cv_prog_m4_quote_8bit=no
fi])
if test x$lsh_cv_prog_m4_quote_8bit = xno; then
AC_MSG_WARN(
[Upgrade to a better version than GNU m4 1.4,
or recompile it with CFLAGS=-funsigned-char.
Latest version is available at ])
M4="false --"
fi
dnl Checks for libraries.
AC_CHECK_LIB(gmp, mpz_set_d,,
dnl Some debian systems have both gmp1 and gmp2.
[AC_CHECK_LIB(gmp2, mpz_set_d,,
AC_ERROR([GMP is missing (ftp://ftp.gnu.org/pub/gnu/gmp/gmp-2.0.2.tar.gz)]))])
if test x$with_zlib = xyes; then
AC_CHECK_LIB(z, inflate,, [with_zlib=no])
fi
AC_CHECK_LIB(crypt, crypt)
AC_CHECK_LIB(xnet, inet_addr)
AC_CHECK_LIB(nsl, gethostbyname)
AC_CHECK_LIB(socket, setsockopt)
AC_CHECK_LIB(util, openpty)
dnl This macro is new in autoconf-2.13
AC_SEARCH_LIBS(syslog, bsd socket inet, AC_DEFINE(HAVE_SYSLOG))
dnl Checks for header files.
AC_HEADER_STDC
dnl Some debian systems have both gmp and gmp2.
dnl This will probably not work right if both gmp.h and gmp2/gmp.h exists,
dnl and gmp.h is too old (i.e GMP-1.x).
gmp_header_found=no
AC_CHECK_HEADERS(gmp.h gmp2/gmp.h, [gmp_header_found=yes; break])
if test "$gmp_header_found" = no; then
AC_ERROR([Neither gmp.h nor gmp2/gmp.h found])
fi
AC_CHECK_HEADERS(fcntl.h strings.h sys/time.h unistd.h)
AC_CHECK_HEADERS(shadow.h)
if test x$with_zlib = xyes; then
AC_CHECK_HEADERS(zlib.h,, [with_zlib=no])
fi
AC_CHECK_HEADERS(poll.h sys/poll.h)
AC_CHECK_HEADERS(crypt.h)
AC_CHECK_HEADERS(pty.h)
AC_CHECK_HEADERS(stropts.h)
AC_CHECK_HEADERS(syslog.h)
AC_CHECK_HEADERS(argp.h)
AC_CHECK_HEADERS(utmp.h, [have_utmp_h=yes], [have_utmp_h=no])
if test x$have_utmp_h = xyes; then
AC_CHECK_MEMBER([#include ], [utmp], [ut_host])
AC_CHECK_MEMBER([#include ], [utmp], [ut_addr])
AC_CHECK_MEMBER([#include ], [utmp], [ut_addr_v6])
fi
AC_CHECK_HEADERS(utmpx.h)
dnl Some systems (in particular, Unixware) doesn't have socklen_t, but
dnl uses size_t. Falling back to int will cause some warnings.
dnl AC_CHECK_TYPE doesn't work, probably because the type in
dnl question is not defined in sys/types.h.
AC_CACHE_CHECK([for socklen_t in sys/socket.h],
lsh_cv_type_socklen_t,
[ AC_EGREP_HEADER(socklen_t, sys/socket.h,
lsh_cv_type_socklen_t=yes,
lsh_cv_type_socklen_t=no]))
if test x$lsh_cv_type_socklen_t = xno ; then
AC_DEFINE(socklen_t, int)
fi
dnl Should we use zlib?
if test x$with_zlib = xyes ; then
AC_DEFINE(WITH_ZLIB)
fi
dnl Find the SSH1 daemon; try 'sshd1' first; if it fails, look for 'sshd'
dnl ## if test x$with_sshd1 = xyes ; then
dnl ## AC_DEFINE(SSH1_FALLBACK)
dnl ## dnl We have to provide an additional path: regular users seldomly have
dnl ## dnl the sbin directories in their $PATH.
dnl ## AC_PATH_PROG(SSHD1BIN, sshd1, [],
dnl ## $PATH:/usr/local/sbin:/usr/local/etc:/usr/sbin:/usr/etc:/sbin:/etc)
dnl ## if test x$SSHD1BIN = x ; then
dnl ## AC_PATH_PROG(SSHD1BIN, sshd, [],
dnl ## $PATH:/usr/local/sbin:/usr/local/etc:/usr/sbin:/usr/etc:/sbin:/etc)
dnl ## fi
dnl ## if test x$SSHD1BIN = x ; then
dnl ## AC_MSG_ERROR([
dnl ## You requested SSH1 fallback support (--with-sshd1), but no sshd1 could be found.
dnl ## You can
dnl ## - supply the location of sshd1, i.e. --with-sshd1=/home/foo/sbin/sshd ,
dnl ## - install sshd1 (ftp://ftp.cs.hut.fi/pub/ssh/); note that it is not free
dnl ## software, or
dnl ## - configure --without-sshd1 .
dnl ## ])
dnl ## fi
dnl ##
dnl ## dnl OK. We've found an SSH1 daemon. Now we need to make sure it is
dnl ## dnl recent enough to be used as a fallback daemon. This means it has to
dnl ## dnl support the -V option, which tells it not to read the client version
dnl ## dnl string as lshd has already done that, and which supplies that version
dnl ## dnl string.
dnl ## AC_MSG_CHECKING(if $SSHD1BIN has the -V compatibility flag)
dnl ## changequote(<<, >>)dnl
dnl ## if ($SSHD1BIN -h 2>&1 ; true) | grep '^[ \t]*-V' > /dev/null ; then
dnl ## changequote([, ])dnl
dnl ## AC_MSG_RESULT(yes)
dnl ## else
dnl ## AC_MSG_ERROR([
dnl ## Found SSH1 daemon ]$SSHD1BIN[, but it does not support the -V option.
dnl ## This means we cannot use it as a fallback daemon. Please install a more recent
dnl ## SSH1 daemon (ftp://ftp.cs.hut.fi/pub/ssh/), or configure --without-sshd1 .])
dnl ## fi
dnl ## AC_DEFINE_UNQUOTED(SSHD1,"$SSHD1BIN")
dnl ## fi
dnl Checks for typedefs, structures, and compiler characteristics.
AC_C_CONST
AC_C_INLINE
AC_TYPE_UID_T
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_CHECK_SIZEOF(short, 2)
AC_CHECK_SIZEOF(int, 4)
AC_CHECK_SIZEOF(long, 4)
dnl FIXME: We should check that a pid_t fits in an int
dnl Checks for library functions.
AC_FUNC_ALLOCA
AC_FUNC_MEMCMP
AC_FUNC_VPRINTF
AC_CHECK_FUNCS(select socket strerror strsignal strtol)
AC_CHECK_FUNCS(getspnam)
AC_CHECK_FUNCS(vsnprintf inet_aton)
AC_CHECK_FUNCS(openpty)
AC_CHECK_FUNCS(cfmakeraw)
AC_FUNC_GETPGRP
AC_CHECK_FUNCS(syslog)
AC_REPLACE_FUNCS(memxor)
dnl Needed by argp
AC_CHECK_FUNCS(mempcpy strndup)
AC_CHECK_FUNCS(flockfile putc_unlocked)
AC_CHECK_FUNCS(fputs_unlocked fwrite_unlocked)
AC_CHECK_VAR(program_invocation_name, [#include ])
AC_CHECK_VAR(program_invocation_short_name, [#include ])
AC_CHECK_FUNCS(poll,,[LIBOBJS="jpoll.o $LIBOBJS"])
dnl This macro is mentioned in the automake manual, but where is it
dnl supposed to be defined?
dnl AC_REPLACE_GNU_GETOPT
dnl AC_CHECK_FUNCS(getopt_long,,[LIBOBJS="getopt.o $LIBOBJS"])
AC_CHECK_FUNCS(getopt_long,,[LIBOBJS="getopt.o getopt1.o $LIBOBJS"])
# Use system argp only if we can actually link with it.
if test x$with_system_argp = xyes ; then
AC_CHECK_FUNCS(argp_parse,, with_system_argp=no)
fi
# FIXME: If the system already has argp, it's unnecessary to build our own.
# As we want to load the objects into liblsh.a, we list all the objects
# rather than libargp.a.
## LIBOBJS="$LIBOBJS argp/libargp.a"
if test x$with_system_argp = xno ; then
LIBOBJS="$LIBOBJS argp/argp-ba.o argp/argp-fmtstream.o \
argp/argp-help.o argp/argp-parse.o argp/argp-pin.o argp/argp-pv.o \
argp/argp-pvh.o argp/argp-eexst.o"
fi
dnl Check for broken shutdown
AC_CACHE_CHECK(for working shutdown on AF_UNIX sockets,
lsh_cv_func_shutdown_works_on_unix_sockets,
[
AC_TRY_RUN([
#include
#include
#include
#include
#include
#ifdef HAVE_UNISTD_H
#include
#endif
/* Creates a one-way socket connection. Returns 1 on success, 0 on
* failure. fds[0] is for reading, fds[1] for writing (like for the
* pipe() system call). */
static int make_pipe(int *fds)
{
#ifndef SHUT_RD
#define SHUT_RD 0
#define SHUT_WR 1
#define SHUT_RDWR 2
#endif
if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds) < 0)
{
fprintf(stderr, "socketpair() failed: %s\n", strerror(errno));
return 0;
}
fprintf(stderr, "Created socket pair. Using fd:s %d <-- %d\n", fds[0], fds[1]);
if(shutdown(fds[0], SHUT_WR) < 0)
{
fprintf(stderr, "shutdown(%d, SHUT_WR) failed: %s\n",
fds[0], strerror(errno));
return 0;
}
if (shutdown(fds[1], SHUT_RD) < 0)
{
fprintf(stderr, "shutdown(%d, SHUT_RD) failed: %s\n",
fds[1], strerror(errno));
return 0;
}
return 1;
}
int main(int argc, char **argv)
{
int fds[2];
if (!make_pipe(fds))
exit(1);
if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
{
fprintf(stderr, "signal failed.\n");
exit(1);
}
if ( (write(fds[1], "foo", 3) < 0)
&& (errno == EPIPE))
exit(1);
exit(0);
}
], lsh_cv_func_shutdown_works_on_unix_sockets=yes,
lsh_cv_func_shutdown_works_on_unix_sockets=no,
lsh_cv_func_shutdown_works_on_unix_sockets=yes)])
if test x$lsh_cv_func_shutdown_works_on_unix_sockets = xyes ; then
AC_DEFINE(SHUTDOWN_WORKS_WITH_UNIX_SOCKETS)
fi
AC_CACHE_CHECK(
[for working UNIX98 ptys],
lsh_cv_sys_unix98_ptys,
AC_TRY_RUN([
/* Try to obtain a working UNIX98-style pty master and slave */
/* Based on example code from the GNU C library documentation */
#include /* EXIT_FAILURE, EXIT_SUCCESS, ptsname */
#include /* close(2) */
#include /* open(2) */
#include /* - " - */
#ifdef HAVE_FCNTL_H
# include /* - " - */
#endif
#ifdef HAVE_STROPTS_H
# include /* isastream() */
#endif
int main(int argc, char* argv[]) {
int master, slave;
char *name;
master = open("/dev/ptmx", O_RDWR); /* PTY master multiplex */
if (master < 0) {
exit(EXIT_FAILURE);
}
if (grantpt(master) < 0 || unlockpt(master) < 0)
goto close_master;
name = ptsname(master);
if (name == NULL)
goto close_master;
slave = open(name, O_RDWR);
if (slave == -1)
goto close_master;
#ifdef HAVE_STROPTS_H
if (isastream(slave))
{
if (ioctl(slave, I_PUSH, "ptem") < 0
|| ioctl(slave, I_PUSH, "ldterm") < 0)
goto close_slave;
}
#endif
exit(0);
close_slave:
close (slave);
close_master:
close (master);
exit(1);
}
],
[lsh_cv_sys_unix98_ptys=yes],
[lsh_cv_sys_unix98_ptys=no],
dnl FIXME: Pessimistic default for cross compilation.
[lsh_cv_sys_unix98_ptys=no]))
if test x$lsh_cv_sys_unix98_ptys = xyes; then
AC_DEFINE(HAVE_UNIX98_PTYS)
fi
dnl Check for gcc's __attribute__ construction
AC_CACHE_CHECK(for __attribute__,
lsh_cv_c_attribute,
[ AC_TRY_COMPILE([
#include
],
[
static void foo(void) __attribute__ ((noreturn));
static void __attribute__ ((noreturn))
foo(void)
{
exit(1);
}
],
lsh_cv_c_attribute=yes,
lsh_cv_c_attribute=no)])
if test "x$lsh_cv_c_attribute" = "xyes"; then
AC_DEFINE(HAVE_GCC_ATTRIBUTE)
fi
dnl Check for gcc's __FUNCTION__ variable
AC_CACHE_CHECK(for __FUNCTION__,
lsh_cv_c_FUNCTION,
[ AC_TRY_COMPILE(,
[ void foo(void) { char c = __FUNCTION__[0]; } ],
lsh_cv_c_FUNCTION=yes,
lsh_cv_c_FUNCTION=no)])
if test "x$lsh_cv_c_FUNCTION" = "xyes"; then
AC_DEFINE(HAVE_GCC_FUNCTION)
fi
AC_MSG_CHECKING(for BSD pty names)
dnl FIXME: What is most portable, tr -d '\n' or tr -d '\012' ?
AC_DEFINE_UNQUOTED(PTY_BSD_SCHEME_FIRST_CHARS, "`ls /dev/pty* | cut -c 9-9 | uniq | tr -d '\n'`")
AC_DEFINE_UNQUOTED(PTY_BSD_SCHEME_SECOND_CHARS, "`ls /dev/pty* | cut -c 10-10 | sort | uniq | tr -d '\n'`")
dnl FIXME: How can we test if the bsd scheme is likely to work?
AC_DEFINE(PTY_BSD_SCHEME)
AC_MSG_RESULT([done])
# Set these flags *last*, or else the test programs won't compile
if test x$GCC = xyes ; then
CFLAGS="$CFLAGS -ggdb3 -Wall -W \
-Wmissing-prototypes -Wmissing-declarations -Wstrict-prototypes \
-Waggregate-return \
-Wpointer-arith -Wbad-function-cast -Wnested-externs"
# Don't enable -Wcast-align as it results in tons of warnings in the
# DES code. And when using stdio.
fi
AC_OUTPUT(Makefile doc/Makefile misc/Makefile
src/Makefile src/argp/Makefile src/scm/Makefile
src/testsuite/Makefile src/rsync/Makefile
src/symmetric/Makefile src/symmetric/include/Makefile
contrib/Makefile contrib/lsh.spec)