#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.63])
AC_INIT([mod_netconf], [1.0])
AC_CONFIG_SRCDIR([mod_netconf.c])

# Checks for programs.
#AC_PROG_CC
AC_PROG_INSTALL

# Check for rpmbuil
AC_CHECK_PROG(RPMBUILD, rpmbuild, rpmbuild)

RELEASE=1
AC_SUBST(RELEASE)
LIBS="-lnetconf -ljson"

if test "`git show > /dev/null 2>&1;echo $?`" = "0"; then
	RCSID="-DRCSID=\\\"\$(IDGIT)\\\""
	ARCSID="-DARCSID='\\\"\$(IDGIT)\\\"'"
else
	RCSID="-DRCSID=\\\"\$(IDNOGIT)\\\""
	ARCSID="-DARCSID='\\\"\$(IDNOGIT)\\\"'"
fi

REQS="$REQS httpd php json-c"
BUILDREQS="$BUILDREQS json-c-devel httpd-devel"

# Checks for libraries.
# libnetconf
AC_ARG_WITH([libnetconf],
	AC_HELP_STRING([--with-libnetconf=PATH],[Set the path to libnetconf (usually local GIT repository)]),
	[# local copy of libnetconf GIT repo with headers and binaries
	LIBNETCONF_CFLAGS="-I`cd $withval;pwd`"
	LIBNETCONF_LIBS="-L`cd $withval;pwd` -lnetconf"
    LIBNETCONF_WITH=" --with-libnetconf=$withval"],
	[# get info from pkg-config about installed package
	PKG_CHECK_MODULES(LIBNETCONF, libnetconf)
    BUILDREQS="$BUILDREQS ,libnetconf-devel"]
)
CFLAGS="$LIBNETCONF_CFLAGS"
LIBS="$LIBS $LIBNETCONF_LIBS"
AC_SUBST([LIBNETCONF_LIBS])
AC_SUBST([LIBNETCONF_CFLAGS])
AC_SUBST([LIBNETCONF_WITH])
REQS="$REQS , libnetconf"
AC_CHECK_LIB([netconf], [ncds_new],[],AC_MSG_ERROR([libnetconf not found.]))

# Checks for header files.
AC_CHECK_HEADER([libnetconf.h], ,AC_MSG_ERROR([libnetconf.h not found!]))

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_SUBST(RPMBUILD)
if test -z "$RPMBUILD"; then
	AC_MSG_WARN([Due to missing rpmbuild you will not able to generate RPM package.])
fi


AC_ARG_WITH([notifications],
	[AC_HELP_STRING([--without-notifications], [Disable notifications])],
	AS_IF([test "x$with_notifications" == "xno"],[CFLAGS="$CFLAGS"],
	[ CFLAGS="$CFLAGS -DWITH_NOTIFICATIONS "
		LIBS="-lwebsockets $LIBS"
	]),
	[
		CFLAGS="$CFLAGS -DWITH_NOTIFICATIONS "
		LIBS="-lwebsockets $LIBS"
	]
)

AC_ARG_WITH([notifport],
	[AC_HELP_STRING([--with-notifport=PORT], [Set TCP port of websocket notification server.])],
	[CFLAGS="$CFLAGS -DNOTIFICATION_SERVER_PORT=$with_notifport"],
	[CFLAGS="$CFLAGS"]
)

CFLAGS="$CFLAGS -I/usr/include/json"
AC_SUBST(REQS)
AC_SUBST(BUILDREQS)
AC_SUBST(CFLAGS)
AC_SUBST(RCSID)
AC_SUBST(ARCSID)
AC_SUBST(LIBS)

AC_CONFIG_FILES([Makefile])
AC_CONFIG_FILES([mod_netconf.spec])
AC_OUTPUT
