Merged from silc_1_0_branch.
[silc.git] / configure.in.pre
index 3fac2eaf5aac74f6ad6c0c8823aad29246d94edc..671dac894b0f2fabe6e7c1f8ce2c30b203f3873e 100644 (file)
@@ -1,9 +1,9 @@
 #
-#  configure.in
+#  configure.in.pre
 #
-#  Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
+#  Author: Pekka Riikonen <priikone@silcnet.org>
 #
-#  Copyright (C) 2000 - 2001 Pekka Riikonen
+#  Copyright (C) 2000 - 2002 Pekka Riikonen
 #
 #  This program is free software; you can redistribute it and/or modify
 #  it under the terms of the GNU General Public License as published by
 #  GNU General Public License for more details.
 #
 
-AC_INIT(includes/version.h)
+AC_INIT(includes/silcversion.h)
 
-# Compiler settings
-CFLAGS="-Wall $CFLAGS"
-
-#
 # Put here any platform specific stuff
 #
 AC_CANONICAL_SYSTEM
 case "$target" in
-  *-*-linux*|*-*-mklinux*)
-    CFLAGS="-D_GNU_SOURCE $CFLAGS"
+  *-*-freebsd*)
+    check_threads=true
+    ;;
+  *-*-*bsd*)
+    check_threads=false
     ;;
   *)
+    check_threads=true
     ;;
 esac
 
 # ./prepare script will automatically put the correct version. Do not edit!
+#
 AM_INIT_AUTOMAKE(SILC_PACKAGE, SILC_VERSION)
-AC_PREREQ(2.3)
-AM_CONFIG_HEADER(includes/silcdefs.h)
+AC_PREREQ(2.52)
+AC_CONFIG_HEADERS(includes/silcdefs.h)
 
 AC_PROG_CC
 AC_C_INLINE
 AC_C_CONST
-AC_ARG_PROGRAM
 
 AC_PROG_LN_S
 AC_SUBST(LN_S)
 
+# Distribution definition. ./prepare will automatically add here a correct
+# value. Do not edit!
+#
+silc_dist=SILC_PACKAGE
+SILC_DIST_SUBDIRS="SILC_DISTRIBUTION_SUBDIRS"
+AC_DEFINE(SILC_DIST_DEFINE)
+
 # XXX
 # Compiler flags
+#
 if test "$GCC"; then
-  CFLAGS="-finline-functions $CFLAGS"
-else
-  # Currently GCC is only supported compiler
-  AC_MSG_ERROR(GCC is only supported compiler currently)
+  CFLAGS="-Wall -finline-functions $CFLAGS"
 fi
 
+#
+# Library versioning.
+#
+# Do the releases and library versioning according to following rules:
+#
+#  - If any code has changed in library, increment [LIB]_REVISION
+#  - If functions were added, set [LIB]_REVISION to 0
+#  - If functions were added, removed or changed, increment [LIB]_CURRENT
+#  - If functions were added, increment [LIB]_AGE
+#  - If functions were removed, set [LIB]_AGE to 0
+#
+# where [LIB] is LIBSILC and LIBSILCCLIENT, and where "functions" means
+# functions public interfaces.
+#
+# The LIB_BASE_VERSION defines the SILC software major.minor version and 
+# it is increment only when these version numbers actually change.
+#
+
+# Base version for libraries.  Do not change this unless SILC version
+# changes too.
+LIB_BASE_VERSION=1.0
+
+# libsilc versions
+LIBSILC_CURRENT=1
+LIBSILC_REVISION=0
+LIBSILC_AGE=1
+
+# libsilcclient versions
+LIBSILCCLIENT_CURRENT=1
+LIBSILCCLIENT_REVISION=1
+LIBSILCCLIENT_AGE=0
+
+# Substitute the version numbers
+AC_SUBST(LIB_BASE_VERSION)
+AC_SUBST(LIBSILC_CURRENT)
+AC_SUBST(LIBSILC_REVISION)
+AC_SUBST(LIBSILC_AGE)
+AC_SUBST(LIBSILCCLIENT_CURRENT)
+AC_SUBST(LIBSILCCLIENT_REVISION)
+AC_SUBST(LIBSILCCLIENT_AGE)
+
+#
 # Program checking
+#
 AC_PROG_INSTALL
 AC_PROG_RANLIB
 AC_PROG_MAKE_SET
+AC_DISABLE_SHARED
+AC_PROG_LIBTOOL
+AC_PATH_PROG(sedpath, sed)
 
 # Header checking
+#
 AC_HEADER_STDC
 AC_HEADER_TIME
 AC_HEADER_STAT
 
 # More header checking
+#
 AC_CHECK_HEADERS(unistd.h string.h getopt.h errno.h fcntl.h assert.h)
-AC_CHECK_HEADERS(sys/types.h sys/stat.h sys/time.h)
-AC_CHECK_HEADERS(netinet/in.h netinet/tcp.h netdb.h)
+AC_CHECK_HEADERS(sys/types.h sys/stat.h sys/time.h stddef.h)
+AC_CHECK_HEADERS(netinet/in.h netinet/tcp.h xti.h netdb.h)
 AC_CHECK_HEADERS(pwd.h grp.h termcap.h paths.h)
-AC_CHECK_HEADERS(ncurses.h signal.h ctype.h regex.h)
-AC_CHECK_HEADERS(arpa/inet.h sys/mman.h)
+AC_CHECK_HEADERS(ncurses.h signal.h ctype.h utime.h)
+AC_CHECK_HEADERS(arpa/inet.h sys/mman.h limits.h termios.h locale.h langinfo.h)
 
 # Data type checking
+#
 AC_TYPE_SIGNAL
 AC_TYPE_SIZE_T
 AC_TYPE_MODE_T
@@ -81,232 +135,421 @@ AC_TYPE_UID_T
 AC_TYPE_PID_T
 
 AC_CHECK_SIZEOF(long long, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_LONG_LONG, $ac_cv_sizeof_long_long)
+AC_SUBST(SILC_SIZEOF_LONG_LONG, $ac_cv_sizeof_long_long)
 AC_CHECK_SIZEOF(long, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_LONG, $ac_cv_sizeof_long)
+AC_SUBST(SILC_SIZEOF_LONG, $ac_cv_sizeof_long)
 AC_CHECK_SIZEOF(int, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_INT, $ac_cv_sizeof_int)
+AC_SUBST(SILC_SIZEOF_INT, $ac_cv_sizeof_int)
 AC_CHECK_SIZEOF(short, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_SHORT, $ac_cv_sizeof_short)
+AC_SUBST(SILC_SIZEOF_SHORT, $ac_cv_sizeof_short)
 AC_CHECK_SIZEOF(char, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_CHAR, $ac_cv_sizeof_char)
+AC_SUBST(SILC_SIZEOF_CHAR, $ac_cv_sizeof_char)
 AC_CHECK_SIZEOF(void *, 0)
-AC_DEFINE_UNQUOTED(SILC_SIZEOF_VOID_P, $ac_cv_sizeof_void_p)
+AC_SUBST(SILC_SIZEOF_VOID_P, $ac_cv_sizeof_void_p)
 
 # Function and library checking
-AC_CHECK_FUNC(initscr, ac_initscr_found=1, ac_initscr_found=0)
-if test x$ac_initscr_found = x0; then
-    AC_CHECK_LIB(ncurses, initscr, LIBS="$LIBS -lncurses")
-fi
-AC_CHECK_FUNC(gethostbyname, ac_gethostbyname_found=1,
-ac_gethostbyname_found=0)
-if test x$ac_gethostbyname_found = x0; then
+#
+AC_CHECK_FUNC(gethostbyname, [],
+  [
     AC_CHECK_LIB(nsl, gethostbyname, LIBS="$LIBS -lnsl")
-    AC_CHECK_FUNC(res_gethostbyname, ac_res_ghbn_found=1, ac_res_ghbn_found=0)
-    if test x$ac_res_ghbn_found = x0; then
-        AC_CHECK_LIB(resolv, res_gethostbyname,  LIBS="$LIBS -lresolv")
-    fi
-fi
-AC_CHECK_FUNC(socket, ac_socket_found=1, ac_socket_found=0)
-if test x$ac_socket_found = x0; then
-    AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
-fi
+    AC_CHECK_FUNC(res_gethostbyname, [],
+       AC_CHECK_LIB(resolv, res_gethostbyname, LIBS="$LIBS -lresolv")
+    )
+  ])
+AC_CHECK_FUNC(socket, [],
+  AC_CHECK_LIB(socket, socket, LIBS="$LIBS -lsocket")
+)
 AC_CHECK_FUNCS(gethostname gethostbyaddr getservbyname getservbyport)
-AC_CHECK_FUNCS(select listen bind shutdown close connect)
-AC_CHECK_FUNCS(fcntl setsockopt)
-AC_CHECK_FUNCS(getopt_long time)
-AC_CHECK_FUNCS(mlock munlock)
-AC_CHECK_FUNCS(chmod stat fstat getenv putenv strerror ctime gettimeofday)
+AC_CHECK_FUNCS(select listen bind shutdown close connect setsockopt)
+AC_CHECK_FUNCS(time ctime utime gettimeofday)
+AC_CHECK_FUNCS(chmod fcntl stat fstat getenv putenv strerror)
 AC_CHECK_FUNCS(getpid getgid getsid getpgid getpgrp getuid)
+AC_CHECK_FUNCS(setgroups initgroups nl_langinfo)
 AC_CHECK_FUNCS(strchr strstr strcpy strncpy memcpy memset memmove)
 
 # SIM support checking
 # XXX These needs to be changed as more supported platforms appear.
 # XXX This probably needs to be made platform dependant check.
+#
 sim_support=false
+AC_MSG_CHECKING(for SIM support)
+AC_MSG_RESULT()
+AC_CHECK_HEADERS(dlfcn.h,
+  [
+    AC_CHECK_LIB(dl, dlopen,
+      [
+        AC_DEFINE(SILC_SIM)
+        sim_support=true
+        LIBS="$LIBS -ldl"
+      ],
+      [
+        AC_CHECK_LIB(c, dlopen,
+          [
+            AC_DEFINE(SILC_SIM)
+            sim_support=true
+          ])
+      ])
+   ])
+
 AM_CONDITIONAL(SILC_SIM, test x$sim_support = xtrue)
-AC_CHECKING(for SIM support)
-AC_CHECK_HEADERS(dlfcn.h, 
-  AC_CHECK_LIB(dl, dlopen, 
-    AC_DEFINE(SILC_SIM) 
-    sim_support=true
-    AM_CONDITIONAL(SILC_SIM, test x$sim_support = xtrue)
-    AC_MSG_RESULT(enabled SIM support)
-    LIBS="$LIBS -ldl",
-    AC_MSG_RESULT(no SIM support found)),
-  AC_MSG_RESULT(no SIM support found))
+if test x$sim_support = xtrue; then
+  AC_MSG_RESULT(Enabled SIM support.)
+else
+  AC_MSG_RESULT(No SIM support found.)
+fi
+
+# lib/contrib conditionals
+#
+AC_CHECK_HEADER(regex.h, have_regex=1, have_regex=0)
+AM_CONDITIONAL(HAVE_REGEX, test x$have_regex = x1)
+AC_CHECK_FUNC(getopt_long, have_getopt_long=1, have_getopt_long=0)
+AM_CONDITIONAL(HAVE_GETOPT_LONG, test x$have_getopt_long = x1)
+
+
+##
+##  Enable/disable checking
+##
+
+# IPv6 support
+#
+AC_MSG_CHECKING(whether to enable IPv6 support)
+AC_ARG_ENABLE(ipv6,
+  [  --enable-ipv6           enable IPv6 support],
+  [
+    case "${enableval}" in
+      yes)
+        want_ipv6=true
+        check_ipv6=false
+       summary_ipv6="yes"
+        AC_DEFINE(HAVE_IPV6)
+        AC_MSG_RESULT(yes)
+        ;;
+      *)
+        want_ipv6=false
+        check_ipv6=false
+       summary_ipv6="no"
+        AC_MSG_RESULT(no)
+        ;;
+    esac
+  ],
+    check_ipv6=true
+  )
+
+if test x$check_ipv6 = xtrue; then
+  summary_ipv6="no"
+  AC_TRY_COMPILE(
+    [
+      #ifdef HAVE_SYS_TYPES_H
+      #include <sys/types.h>
+      #endif
+      #ifdef HAVE_NETINET_TCP_H
+      #include <netinet/tcp.h>
+      #endif
+      #ifdef HAVE_NETDB_H
+      #include <netdb.h>
+      #endif
+      #include <sys/socket.h>
+      #ifdef HAVE_NETINET_IN_H
+      #include <netinet/in.h>
+      #endif
+    ],
+    [
+      struct sockaddr_in6 sin6;
+      int family = AF_INET6;
+    ],
+    [
+      AC_DEFINE(HAVE_IPV6)
+      AC_MSG_RESULT(yes)
+      summary_ipv6="yes"
+    ],
+      AC_MSG_RESULT(no)
+    )
+fi
+
+# Debug checking
+#
+AC_MSG_CHECKING(whether to enable debugging)
+summary_debug="no"
+AC_ARG_ENABLE(debug,
+  [  --enable-debug          enable debugging],
+  [
+    case "${enableval}" in
+      yes)
+        AC_MSG_RESULT(yes)
+        AC_DEFINE(SILC_DEBUG)
+        CFLAGS="-O -g $CFLAGS"
+       summary_debug="yes"
+        ;;
+      *)
+        AC_MSG_RESULT(no)
+        CFLAGS="-O2 -g $CFLAGS"
+        ;;
+    esac
+  ],
+  [
+    CFLAGS="-O2 -g $CFLAGS"
+    AC_MSG_RESULT(no)
+  ])
 
+# Stack trace checking
 #
-# Installation
+AC_MSG_CHECKING(whether to enable stack tracing)
+summary_stacktrace="no"
+AC_ARG_ENABLE(stack-trace,
+  [  --enable-stack-trace    enable memory stack trace],
+  [
+    case "${enableval}" in
+    yes)
+      AC_MSG_RESULT(yes)
+      AC_DEFINE(SILC_STACKTRACE)
+      summary_stacktrace="yes"
+      ;;
+    *)
+      AC_MSG_RESULT(no)
+      ;;
+    esac
+  ],
+    AC_MSG_RESULT(no)
+  )
+
+# Disable all assembler optimizations
 #
+AC_MSG_CHECKING(whether to enable assembler optimizations)
+summary_asm="no"
+AC_ARG_ENABLE(asm,
+  [  --disable-asm           do not use assembler optimizations],
+  [
+    AC_MSG_RESULT(no)
+  ],
+  [
+    AC_MSG_RESULT(yes)
+    summary_asm="yes"
+  ])
+
+
+##
+##  Installation
+##
 
 # Default installation destination
+#
 AC_PREFIX_DEFAULT(/usr/local/silc)
+if test "x$prefix" != xNONE; then
+  silc_prefix="$prefix"
+else
+  silc_prefix="$ac_default_prefix"
+fi
 
 # etc directory
-ETCDIR="/etc/silc"
+#
+if test "x$sysconfdir" != 'x${prefix}/etc'; then
+  ETCDIR="$sysconfdir"
+else
+  ETCDIR="$silc_prefix/etc"
+fi
+
 AC_ARG_WITH(etcdir,
-[  --with-etcdir[=PATH]    Directory for system files [/etc/silc]],
-[ case "$withval" in
-  no)
-    ;;
-  yes)
-    ;;
-  *)
-    ETCDIR="$withwal"
-    ;;
-  esac ],
-)
+  [[  --with-etcdir=DIR       directory for system files [/etc/silc]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+        ETCDIR="$withval"
+        ;;
+    esac
+  ])
 AC_SUBST(ETCDIR)
+AC_DEFINE_UNQUOTED(SILC_ETCDIR, "$ETCDIR")
 
 # help directory
-HELPDIR="help"
+#
+HELPDIR="$silc_prefix/help"
 AC_ARG_WITH(helpdir,
-[  --with-helpdir[=PATH]   Directory for SILC help files [PREFIX/help]],
-[ case "$withval" in
-  no)
-    ;;
-  yes)
-    ;;
-  *)
-    HELPDIR="$withwal"
-    ;;
-  esac ],
-)
+  [[  --with-helpdir=DIR      directory for SILC help files [PREFIX/help]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+       HELPDIR="$withval"
+       ;;
+    esac
+  ])
 AC_SUBST(HELPDIR)
+AC_DEFINE_UNQUOTED(SILC_HELPDIR, "$HELPDIR")
 
 # doc directory
-DOCDIR="doc"
+#
+DOCDIR="$silc_prefix/doc"
 AC_ARG_WITH(docdir,
-[  --with-docdir[=PATH]    Directory for SILC documentation [PREFIX/doc]],
-[ case "$withval" in
-  no)
-    ;;
-  yes)
-    ;;
-  *)
-    DOCDIR="$withwal"
-    ;;
-  esac ],
-)
+  [[  --with-docdir=DIR       directory for SILC documentation [PREFIX/doc]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+        DOCDIR="$withval"
+        ;;
+    esac
+  ])
 AC_SUBST(DOCDIR)
+AC_DEFINE_UNQUOTED(SILC_DOCDIR, "$DOCDIR")
 
 # SIM modules directory
-MODULESDIR="modules"
+#
+MODULESDIR="$silc_prefix/modules"
 AC_ARG_WITH(simdir,
-[  --with-simdir[=PATH]    Directory for SIM modules [PREFIX/modules]],
-[ case "$withval" in
-  no)
-    ;;
-  yes)
-    ;;
-  *)
-    MODULESDIR="$withwal"
-    ;;
-  esac ],
-)
+  [[  --with-simdir=DIR       directory for SIM modules [PREFIX/modules]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+        MODULESDIR="$withval"
+        ;;
+    esac
+  ])
 AC_SUBST(MODULESDIR)
+AC_DEFINE_UNQUOTED(SILC_MODULESDIR, "$MODULESDIR")
 
 # Logs directory
-LOGSDIR="logs"
+#
+LOGSDIR="$silc_prefix/logs"
 AC_ARG_WITH(logsdir,
-[  --with-logsdir[=PATH]   Directory for Server logs [PREFIX/logs]],
-[ case "$withval" in
-  no)
-    ;;
-  yes)
-    ;;
-  *)
-    LOGSDIR="$withwal"
-    ;;
-  esac ],
-)
+  [[  --with-logsdir=DIR      directory for SILC Server logs [PREFIX/logs]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+        LOGSDIR="$withval"
+        ;;
+    esac
+  ])
 AC_SUBST(LOGSDIR)
+AC_DEFINE_UNQUOTED(SILC_LOGSDIR, "$LOGSDIR")
 
-# Debug checking
-AC_MSG_CHECKING(for enabled debugging)
-AC_ARG_ENABLE(debug,
-[  --enable-debug          Enable debugging (warning: it is heavy!)],
-[ case "${enableval}" in
-  yes) 
-    AC_MSG_RESULT(yes)
-    AC_DEFINE(SILC_DEBUG)
-    CFLAGS="-O -g $CFLAGS"
-    ;;
-  *)
-    AC_MSG_RESULT(no)
-    CFLAGS="-O2 -g $CFLAGS"
-    ;;
-esac ], CFLAGS="-O2 -g $CFLAGS"
-        AC_MSG_RESULT(no))
+# silcd config file checking
+#
+summary_silcd_configfile="/etc/silc/silcd.conf"
+AC_ARG_WITH(silcd-config-file,
+  [[  --with-silcd-config-file=FILE  use FILE as default configuration file
+                                 for SILC Server [/etc/silc/silcd.conf]]],
+    AC_DEFINE_UNQUOTED(SILC_SERVER_CONFIG_FILE, "$withval")
+    summary_silcd_configfile="$withval"
+  )
+
+# silcd pid file checking
+#
+if test "x$localstatedir" != 'x${prefix}/var'; then
+  PIDFILE="$localstatedir/silcd.pid"
+else
+  PIDFILE="$silc_prefix/var/silcd.pid"
+fi
+
+AC_ARG_WITH(silcd-pid-file,
+  [[  --with-silcd-pid-file=FILE     use FILE as default pid file for SILC
+                                 Server [/var/run/silcd.pid]]],
+  [
+    case "$withval" in
+      no|yes)
+        ;;
+      *)
+        PIDFILE="$withval"
+        ;;
+    esac
+  ])
+AC_SUBST(PIDFILE)
+
+
+##
+##  With/without checkings
+##
 
 # SOCKS4 support checking
+#
+SAVE_LIBS="$LIBS"
+SAVE_CFLAGS="$CFLAGS"
+SAVE_LDFLAGS="$LDFLAGS"
 AC_MSG_CHECKING(whether to support SOCKS4)
 AC_ARG_WITH(socks4,
-[  --with-socks4[=PATH]    Compile with SOCKS4 support],
-[ case "$withval" in
-  no)
-    AC_MSG_RESULT(no)
-    ;;
-  *)
-    AC_MSG_RESULT(yes)
-    socks=4
-
-    if test -d "$withval/include"; then
-      CFLAGS="$CFLAGS -I$withval/include"
-    else
-      CFLAGS="$CFLAGS -I$withval"
-    fi
-    if test -d "$withval/lib"; then
-      withval="-L$withval/lib -lsocks"
-    else
-      withval="-L$withval -lsocks"
-    fi
-
-    LIBS="$withval $LIBS"
+  [[  --with-socks4[=DIR]     with SOCKS4 support [search in DIR/lib and DIR/include]]],
+  [
+    case "$withval" in
+      no)
+        AC_MSG_RESULT(no)
+        ;;
+      *)
+        AC_MSG_RESULT(yes)
+        socks=4
+    
+        if test -d "$withval/include"; then
+          CFLAGS="$CFLAGS -I$withval/include"
+        fi
+        if test -d "$withval/lib"; then
+          LDFLAGS="$LDFLAGS -L$withval/lib"
+        fi
+    
+        LIBS="-lsocks $LIBS"
+        ;;
+    esac
 
     AC_TRY_LINK([],
-                [ Rconnect(); ],
-                [],
-                [ AC_MSG_ERROR(Could not find SOCKS4 library.)])
-      ;;
-  esac ],
-  AC_MSG_RESULT(no)
-)   
+      [
+        Rconnect();
+      ], [],
+      [
+        AC_MSG_ERROR(Could not find SOCKS4 library.)
+        LIBS="$SAVE_LIBS"
+        CFLAGS="$SAVE_CFLAGS"
+        LDFLAGS="$SAVE_LDFLAGS"
+      ])
+  ],
+    AC_MSG_RESULT(no)
+  )
 
 # SOCKS5 support checking
+#
+SAVE_LIBS="$LIBS"
+SAVE_CFLAGS="$CFLAGS"
+SAVE_LDFLAGS="$LDFLAGS"
 AC_MSG_CHECKING(whether to support SOCKS5)
 AC_ARG_WITH(socks5,
-[  --with-socks5[=PATH]    Compile with SOCKS5 support],
-[ case "$withval" in
-  no)
-    AC_MSG_RESULT(no)
-    ;;
-  *)
-    AC_MSG_RESULT(yes)
-    socks=5
+  [[  --with-socks5[=DIR]     with SOCKS5 support [search in DIR/lib and DIR/include]]],
+  [
+    case "$withval" in
+      no)
+        AC_MSG_RESULT(no)
+        ;;
+      *)
+        AC_MSG_RESULT(yes)
+        socks=5
 
-    if test -d "$withval/include"; then
-      CFLAGS="$CFLAGS -I$withval/include"
-    else
-      CFLAGS="$CFLAGS -I$withval"
-    fi
-    if test -d "$withval/lib"; then
-      withval="-L$withval/lib -lsocks5"
-    else
-      withval="-L$withval -lsocks5"
-    fi 
+        if test -d "$withval/include"; then
+          CFLAGS="$CFLAGS -I$withval/include"
+        fi
+        if test -d "$withval/lib"; then
+          LDFLAGS="$LDFLAGS -L$withval/lib"
+        fi
 
-    LIBS="$withval $LIBS"
+        LIBS="-lsocks5 $LIBS"
+        ;;
+    esac
 
     AC_TRY_LINK([],
-                [ SOCKSconnect(); ],
-                [],
-                [ AC_MSG_ERROR(Could not find SOCKS5 library.)])
-      ;;
-  esac ],
-  AC_MSG_RESULT(no)
-)   
+      [
+        SOCKSconnect();
+      ], [],
+      [
+        AC_MSG_ERROR(Could not find SOCKS5 library.)
+        LIBS="$SAVE_LIBS"
+        CFLAGS="$SAVE_CFLAGS"
+        LDFLAGS="$SAVE_LDFLAGS"
+      ])
+  ],
+    AC_MSG_RESULT(no)
+  )
 
 if test "x$socks" = "x4"; then
   AC_DEFINE(SOCKS)
@@ -339,84 +582,618 @@ if test "x$socks" = "x5"; then
   AC_DEFINE(Rgethostbyname, SOCKSgethostbyname)
 fi
 
-# GMP Library checking
-AC_MSG_CHECKING(whether to compile GMP)
+# MP library checking. First check whether user wants to use GMP and use
+# it if found. If not or not defined then compile the MPI library in the
+# source tree.
+#
+mp_gmp=false
+SAVE_LIBS="$LIBS"
+SAVE_CFLAGS="$CFLAGS"
+SAVE_LDFLAGS="$LDFLAGS"
+AC_MSG_CHECKING(whether to search for GMP)
 AC_ARG_WITH(gmp,
-[  --with-gmp              Build the GMP in the SILC source tree],
-[ case "${withval}" in
-  yes) 
-    AM_CONDITIONAL(SILC_BUILD_GMP, test x$withval = xyes)
-    AC_MSG_RESULT(yes)
-    ;;
-  *)
-    AC_CHECK_HEADER(gmp.h,
-      AC_CHECK_LIB(gmp, __gmpz_init,
-        AM_CONDITIONAL(SILC_BUILD_GMP, test x$withval = yes)
-        LIBS="$LIBS -L/usr/lib -L/usr/local/lib -lgmp"
-        AC_MSG_RESULT(GMP will not be compiled),
-        AM_CONDITIONAL(SILC_BUILD_GMP, test x$withval != yes)
-        AC_MSG_RESULT(GMP will be compiled)
-      ),
-      AM_CONDITIONAL(SILC_BUILD_GMP, test x$withval != yes)
-      AC_MSG_RESULT(GMP will be compiled)
-    )
-    ;;
-esac ], [
-  AC_CHECK_HEADER(gmp.h,
+  [[  --with-gmp[=DIR]        use GMP instead of MPI [search in DIR/lib and DIR/include]]],
+  [
+    case "$withval" in
+      no)
+        AC_MSG_RESULT(no)
+        ;;
+      *)
+        AC_MSG_RESULT(yes)
+    
+        if test -d "$withval/include"; then
+          CFLAGS="$CFLAGS -I$withval/include"
+        fi
+        if test -d "$withval/lib"; then
+          LDFLAGS="$LDFLAGS -L$withval/lib"
+        fi
+    
+        LIBS="-lgmp $LIBS"
+        ;;
+    esac
+
     AC_CHECK_LIB(gmp, __gmpz_init,
-      build_gmp=false
-      AM_CONDITIONAL(SILC_BUILD_GMP, test x$build_gmp = xtrue)
-      LIBS="$LIBS -L/usr/lib -L/usr/local/lib -lgmp"
-      AC_MSG_RESULT(GMP will not be compiled),
-      build_gmp=true
-      AM_CONDITIONAL(SILC_BUILD_GMP, test x$build_gmp = xtrue)
-      AC_MSG_RESULT(GMP will be compiled)
-    ),
-    build_gmp=true
-    AM_CONDITIONAL(SILC_BUILD_GMP, test x$build_gmp = xtrue)
-    AC_MSG_RESULT(GMP will be compiled)
+      [
+        mp_gmp=true
+        AC_DEFINE(SILC_MP_GMP)
+        AC_MSG_RESULT(Using GMP as a MP library.)
+      ],
+      [
+        LIBS="$SAVE_LIBS"
+        CFLAGS="$SAVE_CFLAGS"
+        LDFLAGS="$SAVE_LDFLAGS"
+      ])
+  ],
+    AC_MSG_RESULT(no)
   )
-])
 
-AC_ARG_WITH(silcd-config-file,
-[  --with-silcd-config-file[=PATH]
-                          Use PATH as default configuration file in SILC
-                          server [/etc/silc/silcd.conf]],
-[ AC_DEFINE_UNQUOTED(SILC_SERVER_CONFIG_FILE, "$withval") ])
+AM_CONDITIONAL(SILC_MP_GMP, test x$mp_gmp = xtrue)
+AM_CONDITIONAL(SILC_MP_NSS_MPI, test x$mp_gmp = xfalse)
+if test x$mp_gmp = xfalse; then
+  AC_DEFINE(SILC_MP_NSS_MPI)
+  AC_MSG_RESULT(Using NSS MPI as a MP library.)
+fi
+
+# iconv support
+#
+check_iconv=true
+has_iconv=false
+SAVE_LIBS="$LIBS"
+SAVE_CFLAGS="$CFLAGS"
+SAVE_LDFLAGS="$LDFLAGS"
+SAVE_CPPFLAGS="$CPPFLAGS"
+AC_MSG_CHECKING(whether to implicit search for libiconv)
+AC_ARG_WITH(iconv,
+  [[  --with-iconv[=DIR]      use libiconv [search in DIR/include and DIR/lib]]],
+  [
+    case "${withval}" in
+      no)
+        AC_MSG_RESULT(no)
+        AC_CHECK_HEADERS(iconv.h,
+          [
+            AC_CHECK_FUNC(iconv, has_iconv=true)
+          ])
+        check_iconv=false
+        ;;
+      *)
+        AC_MSG_RESULT(yes)
+        if test -d $withval/include; then
+          CPPFLAGS="$CPPFLAGS -I$withval/include"
+          CFLAGS="$CFLAGS -I$withval/include"
+        fi
+        if test -d $withval/lib; then
+          LDFLAGS="$LDFLAGS -L$withval/lib"
+        fi
+        ;;
+    esac
+  ],
+  [
+    AC_MSG_RESULT(no)
+    AC_CHECK_HEADERS(iconv.h,
+      [
+        AC_CHECK_FUNCS(iconv,
+          [
+            has_iconv=true
+            check_iconv=false
+          ])
+      ])
+  ])
+
+if test x$check_iconv = xtrue; then
+  AC_MSG_RESULT(starting search...)
+
+  # XXX
+  unset ac_cv_header__iconv_h_ ac_cv_header_iconv_h || true
+
+  AC_CHECK_HEADERS(iconv.h,
+    [
+      LIBS="$LIBS -liconv"
+      AC_MSG_CHECKING(for iconv in -liconv)
+      AC_TRY_LINK(
+        [
+          #include <stdlib.h>
+          #include <iconv.h>
+        ],
+        [
+          iconv_t cd = iconv_open("", "");
+          iconv(cd, NULL, NULL, NULL, NULL);
+          iconv_close(cd);
+        ],
+        [
+          echo "yes"
+          AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+          has_iconv=true
+          check_iconv=false
+        ],
+        [
+          echo "no"
+          LIBS="$SAVE_LIBS"
+          CFLAGS="$SAVE_CFLAGS"
+          LDFLAGS="$SAVE_LDFLAGS"
+          CPPFLAGS="$SAVE_CPPFLAGS"
+        ])
+     ])
+fi
+
+if test x$check_iconv = xtrue; then
+  # search for iconv library..
+  SAVE_LIBS="$LIBS"
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  SAVE_CPPFLAGS="$CPPFLAGS"
+    
+  for dir in `echo "/usr/local /usr/pkg /usr/contrib"`; do
+    if test x$has_iconv = xfalse; then
+      AC_MSG_RESULT(searching in $dir...)
+     
+      if test -d $dir/include; then
+        CPPFLAGS="$CPPFLAGS -I$dir/include"
+        CFLAGS="$CFLAGS -I$dir/include"
+      fi
+      if test -d $dir/lib; then
+        LDFLAGS="$LDFLAGS -L$dir/lib"
+      fi
+    
+      # XXX
+      unset ac_cv_header__iconv_h_ ac_cv_header_iconv_h || true
+      
+      AC_CHECK_HEADERS(iconv.h,
+        [
+          LIBS="$LIBS -liconv"
+          AC_MSG_CHECKING(for iconv in -liconv)
+          AC_TRY_LINK(
+            [
+              #include <stdlib.h>
+              #include <iconv.h>
+            ],
+            [
+              iconv_t cd = iconv_open("", "");
+              iconv(cd, NULL, NULL, NULL, NULL);
+              iconv_close(cd);
+            ],
+            [
+              echo "yes"
+              has_iconv=true 
+              AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.])
+            ],
+            [
+              echo "no"
+              has_iconv=false
+              LIBS="$SAVE_LIBS"    
+              CFLAGS="$SAVE_CFLAGS"
+              LDFLAGS="$SAVE_LDFLAGS"
+              CPPFLAGS="$SAVE_CPPFLAGS"
+            ])
+         ],
+         [
+           CFLAGS="$SAVE_CFLAGS"
+           LDFLAGS="$SAVE_LDFLAGS"
+           CPPFLAGS="$SAVE_CPPFLAGS"
+         ])
+      fi
+    done
+fi
+
+if test x$has_iconv = xtrue; then
+  # (1) Some implementations of iconv won't convert from UTF-8 to UTF-8.
+  # (2) In glibc-2.1.2 and earlier there is a bug that messes up ob and
+  #     obl when args 2 and 3 are 0 (fixed in glibc-2.1.3).
+  #
+  AC_CACHE_CHECK([whether this iconv is good enough], ac_iconv_good,
+    AC_TRY_RUN(
+      [
+        #include <iconv.h>
+        int main() {
+          iconv_t cd;
+        changequote(, )dnl
+          char buf[4];
+        changequote([, ])dnl
+          char *ob;
+          size_t obl;
+          ob = buf, obl = sizeof(buf);
+          return ((cd = iconv_open("UTF-8", "UTF-8")) != (iconv_t)(-1) &&
+                 (iconv(cd, 0, 0, &ob, &obl) ||
+                 !(ob == buf && obl == sizeof(buf)) ||
+                 iconv_close(cd)));
+        }
+      ],
+      [
+        ac_iconv_good=yes
+      ],
+      [
+        ac_iconv_good=no
+      ],
+      [
+        ac_iconv_good=yes
+      ])
+    )
+
+  if test x$ac_iconv_good = xno; then
+    AC_MSG_RESULT(Try using libiconv instead.)
+  fi
+fi
+
+# POSIX threads support
+#
+has_threads=false
+AC_MSG_CHECKING(whether to search for POSIX threads)
+AC_ARG_WITH(pthreads,
+  [[  --with-pthreads[=DIR]   use POSIX threads [search in DIR/include and DIR/lib]]],
+  [ 
+    case "${withval}" in
+      no)
+        check_threads=false
+        ;;
+      *)
+        if test -d $withval/include; then
+          CPPFLAGS="$CPPFLAGS -I$withval/include"
+          CFLAGS="$CFLAGS -I$withval/include"
+        fi
+        if test -d $withval/lib; then
+          LDFLAGS="$LDFLAGS -L$withval/lib"
+        fi
+
+        check_threads=true
+        ;;
+    esac
+  ])
+
+if test x$check_threads = xtrue; then
+  SAVE_LIBS="$LIBS"
+  SAVE_CFLAGS="$CFLAGS"
+  SAVE_LDFLAGS="$LDFLAGS"
+  SAVE_CPPFLAGS="$CPPFLAGS"
+  
+  AC_MSG_RESULT(yes)
+  AC_CHECK_HEADERS(pthread.h,
+    [
+      LIBS="$LIBS -lpthread"
+      AC_CHECK_LIB(pthread, pthread_attr_init, has_threads=true,
+        [
+          # FreeBSD
+          case "${target}" in
+            *-*-freebsd*)
+              LIBS="$SAVE_LIBS -pthread"
+              AC_CHECK_LIB(c_r, pthread_attr_init, has_threads=true, LIBS="$SAVE_LIBS")
+              ;;
+            *)
+              LIBS="$SAVE_LIBS"
+              ;;
+          esac
+        ])
+    ],
+    [
+      # search for pthread library..
+      for dir in `echo "/usr/local /usr/pkg /usr/contrib /usr/pkg/pthreads /usr/local/pthreads"`; do
+        if test x$has_threads = xfalse; then
+          AC_MSG_RESULT(searching in $dir...)
+  
+          if test -d $dir/include; then
+            CPPFLAGS="$CPPFLAGS -I$dir/include"
+            CFLAGS="$CFLAGS -I$dir/include"
+          fi
+          if test -d $dir/lib; then
+            LDFLAGS="$LDFLAGS -L$dir/lib"
+          fi
+
+          # XXX
+          unset ac_cv_header__pthread_h_ ac_cv_header_pthread_h || true
+
+          AC_CHECK_HEADERS(pthread.h,
+            [ 
+              LIBS="$LIBS -lpthread"
+              AC_CHECK_LIB(pthread, pthread_attr_init, has_threads=true,
+                [
+                  has_threads=false
+
+                  LIBS="$SAVE_LIBS"
+                  CFLAGS="$SAVE_CFLAGS"
+                  LDFLAGS="$SAVE_LDFLAGS"
+                  CPPFLAGS="$SAVE_CPPFLAGS"
+                ])
+            ],
+            [
+              CFLAGS="$SAVE_CFLAGS"
+              LDFLAGS="$SAVE_LDFLAGS"
+              CPPFLAGS="$SAVE_CPPFLAGS"
+            ])
+        fi
+      done
+    ])
+else
+  AC_MSG_RESULT(no)
+  has_threads=false
+fi
+
+AM_CONDITIONAL(SILC_THREADS, test x$has_threads = xtrue)
+if test x$has_threads = xtrue; then
+  CFLAGS="$CFLAGS -D_REENTRANT"
+
+  # XXX possibly incomplete
+  case "${target}" in
+    *-*-aix*)
+      CFLAGS="$CFLAGS -D_THREAD_SAFE"
+      if test x"$GCC" = xyes; then
+        CFLAGS="$CFLAGS -mthreads"
+      fi
+      ;;
+    *-*-freebsd*)
+      CFLAGS="$CFLAGS -D_THREAD_SAFE"
+      ;;
+    *-*-sysv5uw7*)  # UnixWare 7
+      if test "$GCC" != "yes"; then
+        CFLAGS="$CFLAGS -Kthread"
+      else
+        CFLAGS="$CFLAGS -pthread"
+      fi
+      ;;
+    *-dg-dgux*)  # DG/UX
+      CFLAGS="$CFLAGS -D_POSIX4A_DRAFT10_SOURCE"
+      ;;
+   esac
+
+  AC_CHECK_FUNC(pthread_create)
+  AC_DEFINE(SILC_HAVE_PTHREAD)
+  AC_DEFINE(SILC_THREADS)
+fi
+
+# Native WIN32 compilation under cygwin
+#
+AC_MSG_CHECKING(whether to compile native WIN32 code)
+AC_ARG_WITH(win32,
+  [  --with-win32            compile native WIN32 code (-mno-cygwin)],
+  [
+    AC_MSG_RESULT(yes)
+    AC_DEFINE(SILC_WIN32)
+    win32_support=true
+    CFLAGS="-mno-cygwin $CFLAGS"
+    LIBS="$LIBS -lwsock32"
+  ],
+  [
+    AC_MSG_RESULT(no)
+  ])
+AM_CONDITIONAL(SILC_WIN32, test x$win32_support = xtrue)
+
+# Native EPOC support (disabled by default)
+#
+AM_CONDITIONAL(SILC_EPOC, test xfalse = xtrue)
 
+# Native BeOS support (disabled by default)
 #
+AM_CONDITIONAL(SILC_BEOS, test xfalse = xtrue)
+
+# Native OS2 support (disabled by default)
+#
+AM_CONDITIONAL(SILC_OS2, test xfalse = xtrue)
+
+# --without-irssi
+#
+without_irssi=false
+AC_MSG_CHECKING(whether to compile Irssi SILC Client)
+AC_ARG_WITH(irssi,
+  [  --without-irssi         compile without Irssi SILC Client],
+  [
+    AC_MSG_RESULT(no)
+    without_irssi=true
+    SILC_DIST_SUBDIRS=`echo $SILC_DIST_SUBDIRS | $sedpath -e 's/irssi//'`
+  ],
+  [
+    AC_MSG_RESULT(yes)
+  ])
+
+# --without-silcd
+#
+without_silcd=false
+AC_MSG_CHECKING(whether to compile SILC Server)
+AC_ARG_WITH(silcd,
+  [  --without-silcd         compile without SILC Server],
+  [
+    AC_MSG_RESULT(no)
+    without_silcd=true
+    SILC_DIST_SUBDIRS=`echo $SILC_DIST_SUBDIRS | $sedpath -e 's/silcd//'`
+  ],
+  [
+    AC_MSG_RESULT(yes)
+  ])
+
+libtoolfix=true
+AC_MSG_CHECKING(whether to do libtoolfix)
+AC_ARG_WITH(libtoolfix,
+  [  --without-libtoolfix     Do not fix libtool, for package builders],
+  [
+    AC_MSG_RESULT(no)
+    libtoolfix=false
+  ],
+  [
+    AC_MSG_RESULT(yes)
+  ])
+
+AC_SUBST(ETCDIR)
+AC_DEFINE_UNQUOTED(SILC_ETCDIR, "$ETCDIR")
+
+
+
+##
+##  Misc
+##
+
 # Other configure scripts
 #
-AC_CONFIG_SUBDIRS(irssi)
-AC_CONFIG_SUBDIRS(lib/dotconf)
-AC_CONFIG_SUBDIRS(lib/silcmath/gmp)
-AC_CONFIG_SUBDIRS(lib/trq)
+if test x$without_irssi = xfalse; then
+  if test "x$silc_dist" = "xsilc-client" ||
+     test "x$silc_dist" = "xsilc-toolkit"; then
+    AC_CONFIG_SUBDIRS(irssi)
+  fi
+fi
+
+if test x$mp_gmp = xfalse; then
+  AC_CONFIG_SUBDIRS(lib/silcmath/mpi)
+fi
+
 #AC_CONFIG_SUBDIRS(lib/zlib)
 
 SILC_TOP_SRCDIR=`pwd`
 AC_SUBST(SILC_TOP_SRCDIR)
+#SILC_INSTALL_PREFIX=$ac_default_prefix
+#AC_SUBST(SILC_INSTALL_PREFIX)
 AC_SUBST(LIBS)
+INCLUDE_DEFINES_INT="include \$(top_srcdir)/Makefile.defines_int"
+AC_SUBST(INCLUDE_DEFINES_INT)
+AC_SUBST(SILC_DIST_SUBDIRS)
+
+#
+# Fix the libtool to support run-time configuration.  This allows us
+# to in run-time specify when to compile shared/static libraries without
+# need to reconfigure the entire libtool.
+#
+if test x$libtoolfix = xtrue; then
+  ./libtoolfix $SILC_TOP_SRCDIR/ltmain.sh
+fi
+AM_CONDITIONAL(SILC_LIBTOOLFIX, test x$libtoolfix = xtrue)
+
 
 #
 # Makefile outputs
 #
-AC_OUTPUT( \
+AC_CONFIG_FILES(
 Makefile
 Makefile.defines
 Makefile.defines_int
-irssi/Makefile.defines
-irssi/Makefile.defines_int
 doc/Makefile
 includes/Makefile
 lib/Makefile
 lib/contrib/Makefile
-lib/silcclient/Makefile
 lib/silccore/Makefile
+lib/silccore/tests/Makefile
 lib/silccrypt/Makefile
+lib/silccrypt/tests/Makefile
 lib/silcmath/Makefile
+lib/silcmath/mpi/Makefile.defines
+lib/silcmath/mpi/Makefile.defines_int
 lib/silcsim/Makefile
-lib/silcsim/modules/Makefile
 lib/silcske/Makefile
 lib/silcutil/Makefile
+lib/silcutil/unix/Makefile
+lib/silcutil/win32/Makefile
+lib/silcutil/beos/Makefile
+lib/silcutil/os2/Makefile
+lib/silcutil/epoc/Makefile
+lib/silcsftp/Makefile
+lib/silcsftp/tests/Makefile
+doc/example_silcd.conf
+includes/silcincludes.h
+)
+
+if test "x$silc_dist" = "xsilc-client" ||
+   test "x$silc_dist" = "xsilc-toolkit"; then
+  AC_CONFIG_FILES(lib/silcclient/Makefile)
+fi
+
+if test x$without_irssi = xfalse ; then
+  if test "x$silc_dist" = "xsilc-client" ||
+     test "x$silc_dist" = "xsilc-toolkit"; then
+    AC_CONFIG_FILES(
+irssi/Makefile.defines
+irssi/Makefile.defines_int
+)
+  fi
+fi
+
+if test x$without_silcd = xfalse ; then
+  if test "x$silc_dist" = "xsilc-server" ||
+     test "x$silc_dist" = "xsilc-toolkit"; then
+    AC_CONFIG_FILES(
+silcd/Makefile
+)
+  fi
+fi
+
+if test "x$silc_dist" = "xsilc-toolkit"; then
+  AC_CONFIG_FILES(
 silc/Makefile
-silcd/Makefile)
+win32/Makefile
+win32/libsilc/Makefile
+win32/libsilcclient/Makefile
+tutorial/Makefile
+tutorial/Makefile.defines
+tutorial/Makefile.defines_int
+)
+fi
+
+AC_OUTPUT
+
+s_bindir=`eval echo $bindir`;s_bindir=`eval echo $s_bindir`
+s_sbindir=`eval echo $sbindir`;s_sbindir=`eval echo $s_sbindir`
+s_mandir=`eval echo $mandir`;s_mandir=`eval echo $s_mandir`
+s_includedir=`eval echo $includedir`;s_includedir=`eval echo $s_includedir`
+
+echo ""
+echo "SILC Configuration Summary:"
+echo "---------------------------"
+echo " Target host ...................: $target"
+echo " Compiler ......................: $CC"
+echo " CFLAGS ........................: $CFLAGS"
+echo " CPPFLAGS ......................: $CPPFLAGS"
+echo " LDFLAGS .......................: $LDFLAGS"
+echo " LIBS ..........................: $LIBS"
+echo ""
+echo " Installation prefix ...........: $prefix"
+echo " bin directory .................: $s_bindir"
+echo " sbin directory ................: $s_sbindir"
+echo " man directory .................: $s_mandir"
+echo " help directory ................: $HELPDIR"
+echo " doc directory .................: $DOCDIR"
+echo " logs directory ................: $LOGSDIR"
+echo " SIM directory .................: $MODULESDIR"
+echo " include directory .............: $s_includedir"
+echo ""
+
+if test "x$silc_dist" = "xsilc-client" ||
+   test "x$silc_dist" = "xsilc-toolkit"; then
+  irssi="yes"
+  if test x$without_irssi = xtrue; then
+    irssi="no"
+  fi
+echo " Compile SILC Client ...........: $irssi"
+fi
+
+if test "x$silc_dist" = "xsilc-server" ||
+   test "x$silc_dist" = "xsilc-toolkit"; then
+  silcd="yes"
+  if test x$without_silcd = xtrue; then
+    silcd="no"
+  fi
+echo " Compile SILC Server ...........: $silcd"
+echo " Server configuration file .....: $summary_silcd_configfile"
+echo " Server PID file ...............: $PIDFILE"
+fi
+
+if test x$sim_support = xfalse; then
+  sim_support="no"
+else
+  sim_support="yes"
+fi
+echo " SIM support ...................: $sim_support"
+echo " IPv6 support ..................: $summary_ipv6"
+echo " Assembler optimizations .......: $summary_asm"
+
+mp="MPI"
+if test x$mp_gmp = xtrue; then
+  mp="GMP"
+fi
+echo " Arithmetic library ............: $mp"
+
+threads="no"
+if test x$has_threads = xtrue; then
+  threads="yes"
+fi
+echo " Multi-threads support .........: $threads"
+echo " Debugging enabled .............: $summary_debug"
+echo " Stack-trace enabled ...........: $summary_stacktrace"
+echo ""
+if test "x$silc_dist" = "xsilc-client"; then
+  echo "Compile the sources with 'make' or 'gmake' command (GNU make is required)."
+else
+  echo "Compile the sources with 'make' or 'gmake' command."
+fi