AC_PREREQ(2.59)

AC_INIT(src/torrent.cpp)
AM_INIT_AUTOMAKE(libtorrent-rasterbar, 0.14)

dnl interface version info
VERSION_INFO_CURRENT=0
VERSION_INFO_REVISION=0
VERSION_INFO_AGE=0

INTERFACE_VERSION_INFO=$VERSION_INFO_CURRENT:$VERSION_INFO_REVISION:$VERSION_INFO_AGE

AC_SUBST(INTERFACE_VERSION_INFO)

# Nowhere in the source is config.h included, so make defines command line arguments
# AM_CONFIG_HEADER(config.h)

AC_PROG_CC

if test -z "$(which $CC)"; then
    AC_MSG_ERROR([Unable to find a working C compiler, giving up.])
fi

AC_PROG_CPP
AC_PROG_CXX

if test -z "$(which $CXX)"; then
    AC_MSG_ERROR([Unable to find a working C++ compiler, giving up.])
fi

AC_CACHE_SAVE
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_LIBTOOL
# AC_PROG_RANLIB is obsolete by AC_PROC_LIBTOOL

AC_SYS_LARGEFILE

dnl Check for pthreads.
ACX_PTHREAD
dnl Apply pthread config.
CC=$PTHREAD_CC
CPPFLAGS="$CPPFLAGS $PTHREAD_CFLAGS"
LIBS="$LIBS $PTHREAD_LIBS"

AM_CONDITIONAL([ENABLE_SHIPPED_ASIO], false)

dnl Check for boost libraries.
AX_BOOST_BASE([1.35],[
   AX_BOOST_SYSTEM
   dnl check that Boost.System was found:
   if test -z "$BOOST_SYSTEM_LIB"; then
      AC_MSG_ERROR([unable to find Boost.System library, currently this is required.])
   fi

   AX_BOOST_ASIO
   dnl check that Boost.Asio was found:
   if test -z "$BOOST_ASIO_LIB"; then
      AC_MSG_ERROR([Unable to find Boost.Asio library, currently this is required.])
   fi
],[
   AX_BOOST_BASE([1.34],[

   dnl the user can choose which Asio library to use
   AC_ARG_WITH([asio],
	AS_HELP_STRING([--with-asio=shipped|system|your_path],
	[Specify the Asio library to use, shipped or system. Default is to use shipped library. You can also specify a path for your system.]),
	[[asio=$withval]],
	[[asio=shipped]]
   )

   dnl Check the value for the --with-asio switch
   AC_MSG_CHECKING([which Asio implementation to use])
   case "$asio" in
	"shipped")
		AC_MSG_RESULT(shipped)
		ASIO_HPP=include/libtorrent/asio.hpp
		ASIO_DIR=include/libtorrent/asio
		AC_CHECK_FILES($ASIO_HPP $ASIO_DIR/ssl/stream.hpp $ASIO_DIR/ip/tcp.hpp,
			enable_shipped_asio=yes,
			AC_MSG_ERROR([libtorrent-rasterbar depends on Asio library but it was not found.])
		)
		;;
	"system")
		AC_MSG_RESULT(system)
		ASIO_HPP=/usr/include/asio.hpp
		ASIO_DIR=/usr/include/asio
		AC_CHECK_FILES($ASIO_HPP $ASIO_DIR/ssl/stream.hpp $ASIO_DIR/ip/tcp.hpp,
			enable_shipped_asio=no,
			AC_MSG_ERROR([libtorrent-rasterbar depends on Asio library but it was not found on your system.])
		)
		;;
	*)
		AC_MSG_RESULT(detect)
		ASIO_HPP=$asio/../asio.hpp
		ASIO_DIR=$asio
		AC_CHECK_FILES($ASIO_HPP $ASIO_DIR/ssl/stream.hpp $ASIO_DIR/ip/tcp.hpp,
			enable_shipped_asio=no,
			AC_MSG_ERROR([libtorrent-rasterbar depends on Asio library but it was not found in the path you specified.])
		)
		;;
    esac
    AM_CONDITIONAL([ENABLE_SHIPPED_ASIO], [test x$enable_shipped_asio = "xyes"])
])
])

AC_MSG_NOTICE([BOOST_CPPFLAGS=$BOOST_CPPFLAGS])
AC_MSG_NOTICE([BOOST_LDFLAGS=$BOOST_LDFLAGS])

AX_BOOST_IOSTREAMS
dnl check that Boost.IOStreams was found:
if test -z "$BOOST_IOSTREAMS_LIB"; then
   AC_MSG_ERROR([unable to find Boost.IOStreams library, currently this is required.])
fi

AX_BOOST_DATE_TIME
dnl check that Boost.DateTime was found:
if test -z "$BOOST_DATE_TIME_LIB"; then
   AC_MSG_ERROR([Unable to find Boost.DateTime library, currently this is required.])
fi

AX_BOOST_FILESYSTEM
dnl check that Boost.Filesystem was found:
if test -z "$BOOST_FILESYSTEM_LIB"; then
   AC_MSG_ERROR([Unable to find Boost.Filesystem library, currently this is required.])
fi

AX_BOOST_THREAD
dnl check that Boost.Thread was found:
if test -z "$BOOST_THREAD_LIB"; then
   AC_MSG_ERROR([Unable to find Boost.Thread library, currently this is required.])
fi

AX_BOOST_REGEX
dnl check that Boost.Regex was found:
if test -z "$BOOST_REGEX_LIB"; then
   AC_MSG_RESULT([Unable to find Boost.Regex library, example test_client will not be build.])
   BUILD_TESTCLIENT=no;
fi

AX_BOOST_PROGRAM_OPTIONS
dnl check that Boost.Program_options was found:
if test -z "$BOOST_PROGRAM_OPTIONS_LIB"; then
   AC_MSG_RESULT([Unable to find Boost.Program_options library, example test_client will not be build.])
   BUILD_TESTCLIENT=no;
fi

dnl Apply boost config.
CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS"
LDFLAGS="$LDFLAGS $BOOST_LDFLAGS"

if [[ "x$BUILD_TESTCLIENT" != "xno" ]]; then
	CLIENT_TEST_BIN=client_test;
	AC_SUBST(CLIENT_TEST_BIN)
fi

dnl try different ways of resolving gethostbyname
AC_CHECK_FUNC(gethostbyname, ,
	AC_CHECK_LIB(resolv, gethostbyname, ,
	AC_CHECK_LIB(nsl, gethostbyname, ,
	AC_CHECK_LIB(ws2_32, main, 
	AC_CHECK_LIB(wsock32, main, [LIBS="$LIBS -lws2_32 -lwsock32";] , 
	AC_MSG_ERROR([wsock32 not found. Stopped.])) ,
	AC_MSG_ERROR([gethostbyname not found. Stopped.]))))
)

dnl find out what kind of logging to use
AC_ARG_WITH(
	[logging],
	AS_HELP_STRING([--with-logging=none|default|verbose],[Specify how much logging to use. Default is none.]),
	[[logging=$withval]],
	[[logging=none]]
)

COMPILETIME_OPTIONS=""
dnl Check the value for the --with-logging switch
AC_MSG_CHECKING([what form of logging to use])
case "$logging" in
	"none")
		AC_MSG_RESULT(none)
		;;
	"default")
		AC_MSG_RESULT(default)
		AC_DEFINE(TORRENT_LOGGING,,[define to use some logging])
		COMPILETIME_OPTIONS+="-DTORRENT_LOGGING "
		;;
	"verbose")
		AC_MSG_RESULT(verbose)
		AC_DEFINE(TORRENT_VERBOSE_LOGGING,,[define to use verbose logging])
		COMPILETIME_OPTIONS+="-DTORRENT_VERBOSE_LOGGING "
		;;
	*)
		AC_MSG_RESULT()
		AC_MSG_ERROR([Unknown logging option "$logging". Use either "none", "default" or "verbose".])
		;;
esac

dnl find out what kind of dht-support to use
AC_ARG_WITH(
	[dht],
	AS_HELP_STRING([--with-dht=on|off|logging],[Specify how to use DHT support. Option logging will add extra logging. Default is on.]),
	[[dht=$withval]],
	[[dht=on]]
)
dnl Check the value for the --with-dht switch
AC_MSG_CHECKING([how to use DHT])
case "$dht" in
	"on")
		AC_MSG_RESULT(on)
		;;
	"off")
		AC_MSG_RESULT(off)
		AC_DEFINE(TORRENT_DISABLE_DHT,,[define not to use DHT support])
		COMPILETIME_OPTIONS+="-DTORRENT_DISABLE_DHT "
		;;
	"logging")
		AC_MSG_RESULT(logging)
		AC_DEFINE(TORRENT_DHT_VERBOSE_LOGGING,,[define to use DHT support with extra logging])
		COMPILETIME_OPTIONS+="-DTORRENT_DHT_VERBOSE_LOGGING "
		;;
	*)
		AC_MSG_RESULT()
		AC_MSG_ERROR([Unknown dht option "$dht". Use either "on", "off" or "logging".])
		;;
esac
AM_CONDITIONAL(USE_DHT, test "x$dht" != "xoff")

dnl encryption support.
AC_ARG_WITH(
       [encryption],
       AS_HELP_STRING([--with-encryption=on|off],[Specify how to use encryption support. Default is on.]),
       [[encryption=$withval]],
       [[encryption=on]]
)

dnl Check the value for the --with-encryption switch
AC_MSG_CHECKING([how to use encryption])
case "$encryption" in
       "on")
               AC_MSG_RESULT(on)
               CHECK_SSL()
               AC_DEFINE(TORRENT_USE_OPENSSL,,[define to use openssl with libtorrent-rasterbar])
	       COMPILETIME_OPTIONS+="-DTORRENT_USE_OPENSSL "

               ;;
       "off")
               AC_MSG_RESULT(off)
               AC_DEFINE(TORRENT_DISABLE_ENCRYPTION,,[define not to use encryption support])
	       COMPILETIME_OPTIONS+="-DTORRENT_DISABLE_ENCRYPTION "
               ;;
       *)
               AC_MSG_RESULT()
               AC_MSG_ERROR([Unknown encryption option "$encryption". Use either "on" or "off".])
               ;;
esac
AM_CONDITIONAL(USE_ENCRYPTION, test "x$encryption" != "xoff")

dnl the user can choose which zlib to use
AC_ARG_WITH(
	[zlib],
	AS_HELP_STRING([--with-zlib=shipped|system],[Specify the zlib to use, shipped or system. Default is to autodetect system and fallback to shipped.]),
	[[zlib=$withval]],
	[[zlib=detect]]
)
dnl Check the value for the --with-zlib switch
AC_MSG_CHECKING([which zlib implementation to use])
case "$zlib" in
	"detect")
		AC_MSG_RESULT([autodetect])
		AC_CHECK_LIB(z, main,
			[zlib="system"],
			[zlib="shipped"]
		)
		;;
	"shipped")
		AC_MSG_RESULT(shipped)
		;;
	"system")
		AC_MSG_RESULT(system)
		AC_CHECK_LIB(z, main, ,
			AC_MSG_ERROR([libtorrent-rasterbar depends on zlib but zlib was not found on your system.])
		)
		;;
	"no")
		AC_MSG_RESULT()
		AC_MSG_ERROR([libtorrent-rasterbar depends on zlib, you must specify either "system" or "shipped".])
		;;
	*)
		AC_MSG_RESULT()
		AC_MSG_ERROR([Unknown zlib option "$zlib". Use either "system" or "shipped".])
		;;
esac
if [[ "$zlib" = "shipped" ]]; then
	ZLIB="\$(top_builddir)/zlib/libzlib.la"
	ZLIBDIR="zlib"
	ZLIBINCL="-I\$(top_srcdir)/zlib"
	AC_CONFIG_FILES(zlib/Makefile)
elif [[ "$zlib" = "system" ]]; then
	ZLIB="-lz"
	ZLIBDIR=""
	ZLIBINCL=""
fi

dnl make ZLIB and ZLIBDIR visible to Makefiles
AC_SUBST([ZLIB])
AC_SUBST([ZLIBDIR])
AC_SUBST([ZLIBINCL])

dnl Check whether the examples should be build
AC_ARG_ENABLE(
	[examples],
	AS_HELP_STRING([--enable-examples],[Build the examples. Default is not to build them.]),
	[[examples=$enableval]],
	[[examples=no]]
)
dnl Check the value of the --with-examples switch
AC_MSG_CHECKING([if the examples should be build])
case "$examples" in
	"yes")
		AC_MSG_RESULT(yes)
		EXAMPLESDIR="examples"
		;;
	"no")
		AC_MSG_RESULT(no)
		EXAMPLESDIR=""
		;;
	"")
		AC_MSG_RESULT(yes (default))
		EXAMPLESDIR="examples"
		;;
	*)
		AC_MSG_RESULT()
		AC_MSG_ERROR([Unknown --enable-examples option "$examples". Use either "yes" or "no".])
		;;
esac
dnl make $examples visible to Makefiles
AC_SUBST([EXAMPLESDIR])

dnl Check whether the tests should be build
AC_ARG_ENABLE(
	[tests],
	AS_HELP_STRING([--enable-tests],[Build test files. Default is not to build them.]),
	[[tests=$enableval]],
	[[tests=no]]
)
dnl Check the value of the --with-tests switch
AC_MSG_CHECKING([if test files should be build])
case "$tests" in
	"yes")
		AC_MSG_RESULT(yes)
		TESTSDIR="test"
		;;
	"no")
		AC_MSG_RESULT(no)
		TESTSDIR=""
		;;
	"")
		AC_MSG_RESULT(yes (default))
		TESTSDIR="test"
		;;
	*)
		AC_MSG_RESULT()
		AC_MSG_ERROR([Unknown --enable-tests option "$examples". Use either "yes" or "no".])
		;;
esac
dnl make $examples visible to Makefiles
AC_SUBST([TESTSDIR])

dnl Set some defines if we are building a shared library
if [[ "x$enable_shared" == "xyes" ]]; then
	AC_DEFINE(TORRENT_BUILDING_SHARED,,[Make sure the functions and classes are exported.])
	AC_DEFINE(TORRENT_LINKING_SHARED,,[Make sure the functions and classes are exported.])
fi

dnl want some debugging symbols with that?
AC_ARG_ENABLE(
	[debug],
	AS_HELP_STRING([--enable-debug],[Set compiler flags for debug symbols, default is no debugging.]),
	[case "$enableval" in
		no)
			AC_DEFINE(NDEBUG,,[Define to disable debugging])
			DEBUGFLAGS=""
			COMPILETIME_OPTIONS+="-DNDEBUG "
			;;
		yes)
			DEBUGFLAGS="-g"
			COMPILETIME_OPTIONS+="-DLT_DEBUG "
			;;
		*)
			DEBUGFLAGS="$enableval"
			;;
	esac],
	[DEBUGFLAGS=""
	AC_DEFINE(NDEBUG,,[Define to disable debugging])]
)
AC_SUBST(DEBUGFLAGS)

dnl Compile time options.
AC_SUBST(COMPILETIME_OPTIONS)

AC_CONFIG_FILES(Makefile src/Makefile include/Makefile libtorrent-rasterbar.pc)
if [[ "x$examples" == "xyes" ]]; then
	AC_CONFIG_FILES(examples/Makefile)
fi
if [[ "x$tests" == "xyes"  ]]; then
	AC_CONFIG_FILES(test/Makefile)
fi
AC_OUTPUT
