## @id $Id$

##       1         2         3         4         5         6         7         8
## 45678901234567890123456789012345678901234567890123456789012345678901234567890

m4_define(x_least, m4_esyscmd_s(
  LEAST="ERROR-UNDEFINED-REVISION-to-be-built-in-subdirectory-of-svn-checkout"
  for path in . .. ../..; do
    if svn info $path 2>&1 > /dev/null; then
      LEAST=$(LANG= svn info $path | sed -n 's/Last Changed Rev: //p')
      (cd $path && svn2cl)
      break;
    fi
  done
  echo -n $LEAST
))
m4_define(x_bugreport, m4_esyscmd_s(
  head -1 AUTHORS | \
    sed -n 's,.*<\([-_.a-z0-9A-Z]*@[-_.a-z0-9A-Z]*\)>.*,\1,gp'
))

m4_include(ax_check_qt.m4)

AC_ALIAS([AC_DEFINE_DIR], [AX_DEFINE_DIR])
AC_DEFUN([AX_DEFINE_DIR], [
  prefix_NONE=
  exec_prefix_NONE=
  test "x$prefix" = xNONE && prefix_NONE=yes && prefix=$ac_default_prefix
  test "x$exec_prefix" = xNONE && exec_prefix_NONE=yes && exec_prefix=$prefix
dnl In Autoconf 2.60, ${datadir} refers to ${datarootdir}, which in turn
dnl refers to ${prefix}.  Thus we have to use `eval' twice.
  eval ax_define_dir="\"[$]$2\""
  eval ax_define_dir="\"$ax_define_dir\""
  AC_SUBST($1, "$ax_define_dir")
  AC_DEFINE_UNQUOTED($1, "$ax_define_dir", [$3])
  test "$prefix_NONE" && prefix=NONE
  test "$exec_prefix_NONE" && exec_prefix=NONE
])

AC_DEFUN([AX_ADD_MAKEFILE_TARGET_DEP], [
  sh_add_makefile_target_dep() {
    sed -i ':a;/^'${1}':.*\\$/{N;s/\\\n//;ta};s/^'${1}':.*$/& '${2}'/' "${srcdir}/${3}"
    if ! egrep -q "${1}:.* ${2}" "${srcdir}/${3}"; then
        echo "${1}: ${2}" >> "${srcdir}/${3}"
    fi
  }
  sh_add_makefile_target_dep "$1" "$2" "$3"
  if test "$1" != ".PHONY"; then
      sh_add_makefile_target_dep ".PHONY" "$2" "$3"
  fi
])

AC_DEFUN([AX_SUBST], [
  AC_SUBST([$1])
  tmp_var="${$1//$'\n'/\n}"
  AM_CPPFLAGS+=' -D$1='"'${tmp_var//#/\\#}'"
  AC_SUBST(AM_CPPFLAGS)
])

AC_DEFUN([AX_INIT_STANDARD_PROJECT], [
  AM_CPPFLAGS+=" '-DMAKE_STRING(X)=\#X'"
  AX_SUBST(NUMBERS)
  AX_SUBST(HOME)
  README=$(tail -n +3 README)
  AX_SUBST(README)
  _AM_SUBST_NOTMAKE([README])
  DESCRIPTION=$(head -1 README)
  AX_SUBST(DESCRIPTION)
  _AM_SUBST_NOTMAKE([DESCRIPTION])
  AUTHOR=$(head -1 AUTHORS)
  AX_SUBST(AUTHOR)
  _AM_SUBST_NOTMAKE([AUTHOR])
  DISTRO=$(lsb_release -sc)
  AX_SUBST(DISTRO)
  BUILD_NUMBER=${BUILD_NUMBER:-1}
  AX_SUBST(BUILD_NUMBER)
  BUILD_DATE=$(date -R)
  AX_SUBST(BUILD_DATE)
  if test -f "${PROJECT_NAME}-logo.png"; then
     PROJECT_LOGO="${PROJECT_NAME}-logo.png"
  fi
  AX_SUBST(PROJECT_LOGO)
  if test -f "${PROJECT_NAME}-icon.png"; then
     PROJECT_ICON="${PROJECT_NAME}-icon.png"
  fi
  AX_SUBST(PROJECT_ICON)
  AC_CONFIG_FILES([makefile])
  AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-standard-project-targets], [makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-standard-project-targets], [makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-standard-project-targets], [makefile.in])
  test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
EXTRA_DIST = bootstrap.sh
doc_DATA = AUTHORS NEWS README COPYING INSTALL ChangeLog @PACKAGE_NAME@.spec
clean-standard-project-targets:
	-rm -rf \${PACKAGE_NAME}-\${PACKAGE_VERSION}
	-rm \${PACKAGE_TARNAME}-\${PACKAGE_VERSION}.tar.gz
distclean-standard-project-targets:
	-rm -r autom4te.cache
	-rm aclocal.m4 config.guess config.sub configure depcomp compile install-sh ltmain.sh makefile missing mkinstalldirs
maintainer-clean-standard-project-targets:
	-rm makefile.in
#### End: $0
EOF
])

AC_DEFUN([AX_USE_CXX], [
  m4_include(ax_cxx_compile_stdcxx_11.m4)
  AC_LANG(C++)
  AX_CXX_COMPILE_STDCXX_11(noext, optional)
  AC_PROG_CXX
  AC_PROG_CPP

  AC_CONFIG_FILES([src/makefile])
  
  AM_CPPFLAGS+=' -I ${top_srcdir}/src -I ${top_builddir}/src -I ${srcdir} -I ${builddir}'
  AM_LDFLAGS+=' -L ${top_srcdir}/src -L ${top_builddir}/src'

  # Get rid of that stupid -O2 -g opions!
  CXXFLAGS="${CXXFLAGS:-}"

# pass compile flags to make distcheck
  AM_DISTCHECK_CONFIGURE_FLAGS="CXXFLAGS='${CXXFLAGS}' CPPFLAGS='${CPPFLAGS}' CFLAGS='${CFLAGS}' LDFLAGS='${LDFLAGS}'"
  AC_SUBST(AM_DISTCHECK_CONFIGURE_FLAGS)

  AC_ARG_ENABLE(pedantic,
    [AS_HELP_STRING([--enable-pedantic],
                    [enable all warnings and checks, abort on warnings])],
    [have_pedantic="$enableval"; test "$enableval" = "yes" &&  \
       AM_CXXFLAGS="${AM_CXXFLAGS:-} -pedantic-errors -Wall -W -Wfloat-equal -Wundef -Wendif-labels -Wpointer-arith -Wcast-align -Wwrite-strings -Wconversion -Wsign-compare -Wmissing-format-attribute -Wno-multichar -Wpacked -Wredundant-decls -Werror -Wshadow -Wcast-qual -Wno-ctor-dtor-privacy"])
  dnl problem in libs: -Wshadow -Wcast-qual
  dnl auto.hpp: -Wno-ctor-dtor-privacy (removed)
  AM_CONDITIONAL(PEDANTIC, test "$enableval" = "yes")
  if test "$have_pedantic" == "yes"; then
    AC_MSG_NOTICE([Pedantic compile mode enabled!
     - all warnings for GNU g++ are enabled
     - all warnings result in an error
     - doxygen warnings are treated as error too]); fi

  MINGW32=no
  MAC=no
  case $host_os in
    *mingw32*) MINGW32=yes;;
    *darwin* | *rhapsody* | *macosx*) MAC=yes;;
  esac
  AM_CONDITIONAL(MINGW32, test "$MINGW32" = "yes")
  AM_CONDITIONAL(MAC, test "$MAC" = "yes")
  
  AC_SUBST(AM_CXXFLAGS)
  AC_SUBST(AM_CPPFLAGS)
  AC_SUBST(AM_LDFLAGS)
  AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-cxx-targets], [src/makefile.in])
  test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-cxx-targets:
	-rm makefile.in
#### End: $0
EOF
])

AC_DEFUN([AX_USE_CPPUNIT], [
  AM_PATH_CPPUNIT([1.0.0], [have_cppunit="yes"], [have_cppunit="no"])
  # infos and warnings
  if test "$have_cppunit" = "no"; then
    AC_MSG_WARN([Missing cppunit development library!
     - you cannot check the library using "make check"
     - everything else works perfectly]); fi
  AC_CONFIG_FILES([test/makefile])
  AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-test-targets], [test/makefile.in])
  test -f test/makefile.in && cat >> test/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-test-targets:
	-rm makefile.in
#### End: $0
EOF
])

AC_DEFUN([AX_BUILD_EXAMPLES], [
  AC_CONFIG_FILES([examples/makefile])
  AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-example-targets], [examples/makefile.in])
  test -f examples/makefile.in && cat >> examples/makefile.in <<EOF
#### Begin: Appended by $0
maintainer-clean-example-targets:
	-rm makefile.in
#### End: $0
EOF
])

AC_DEFUN([AX_USE_LIBTOOL], [
  # libtool versioning
  LIB_MAJOR=m4_eval(x_major+x_minor)
  LIB_MINOR=x_least
  LIB_LEAST=x_minor
  LIB_VERSION="${LIB_MAJOR}:${LIB_MINOR}:${LIB_LEAST}"
  AM_LDFLAGS="-version-info ${LIB_VERSION}"
  AC_SUBST(AM_LDFLAGS)
  AC_SUBST(LIB_VERSION)
  AC_PROG_LIBTOOL
  AC_CONFIG_FILES([src/${PACKAGE_NAME}.pc])
  AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-libtool-pkg], [src/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-data-am], [src/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([uninstall-data-am], [uninstall-data-libtool-pkg], [src/makefile.in])
  test -f src/makefile.in && cat >> src/makefile.in <<EOF
#### Begin: Appended by $0
install-data-libtool-pkg:
	test -d \$(DESTDIR)\${libdir}/pkgconfig || mkdir -p \$(DESTDIR)\${libdir}/pkgconfig
	chmod -R u+w \$(DESTDIR)\${libdir}/pkgconfig
	cp \${PACKAGE_NAME}.pc \$(DESTDIR)\${libdir}/pkgconfig/
uninstall-data-libtool-pkg:
	-chmod -R u+w \$(DESTDIR)\${libdir}/pkgconfig
	-rm -f \$(DESTDIR)\${libdir}/pkgconfig/\${PACKAGE_NAME}.pc
#### End: $0
EOF
])

AC_DEFUN([AX_USE_DEBIAN_PACKAGING], [
  README_DEB=$(tail -n +3 README | sed -e 's/^$/./g' -e 's/^/ /g')
  AC_SUBST(README_DEB)
  _AM_SUBST_NOTMAKE([README_DEB])
  AC_CONFIG_FILES([debian/changelog debian/control])
  AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-debian-targets], [makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-debian-targets], [makefile.in])
  test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
EXTRA_DIST += debian
clean-debian-targets:
	-rm -rf \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}.{dsc,tar.gz} \${PACKAGE_NAME}_\${PACKAGE_VERSION}~\${DISTRO}.\${BUILD_NUMBER}*.changes \$\$(sed -n 's,Package: \(.*\),\1_${PACKAGE_VERSION}~${DISTRO}.${BUILD_NUMBER}*.deb,p;' debian/control)
deb: distdir
	cd \${PACKAGE_NAME}-\${PACKAGE_VERSION} && ( export CFLAGS="\${CFLAGS}"; export CPPFLAGS="\${CPPFLAGS}"; export  CXXFLAGS="\${CXXFLAGS}"; export LDFLAGS="\${LDFLAGS}"; export DEB_CFLAGS_APPEND="\${CFLAGS}"; export DEB_CPPFLAGS_APPEND="\${CPPFLAGS}"; export  DEB_CXXFLAGS_APPEND="\${CXXFLAGS}"; export  DEB_LDFLAGS_APPEND="\${LDFLAGS}"; dpkg-buildpackage )
distclean-debian-targets:
	-rm debian/changelog debian/control
#### End: $0
EOF
])

AC_DEFUN([AX_USE_RPM_PACKAGING], [
#  m4_include(ax_rpm_rules.m4)
  AC_CONFIG_FILES([${PACKAGE_NAME}.spec])
  #AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-debian-targets], [makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [rpm], [makefile.in])
  test -f makefile.in && cat >> makefile.in <<EOF
#### Begin: Appended by $0
rpm: dist
	rpmbuild -ba --define "_topdir \$(pwd)" --define "_sourcedir \$(pwd)" \${PACKAGE_NAME}.spec
#### End: $0
EOF
])

AC_DEFUN([AX_USE_DOXYGEN], [
  AC_CHECK_PROG(have_doxygen, doxygen, yes, no)
  AC_CHECK_PROG(have_dot, dot, yes, no)
  AC_CHECK_PROG(have_mscgen, mscgen, yes, no)
  PDF_DOC=${PACKAGE_NAME}-${PACKAGE_VERSION}.pdf
  AC_SUBST(PDF_DOC)
  if test "$have_doxygen" = "no"; then
    AC_MSG_WARN([Missing program doxygen!
     - you cannot rebuild the documentation
     - there are precompiled derived files in the distribution]); fi
  if test "$have_dot" = "no"; then
    AC_MSG_WARN([Missing program dot!
     - when you rebild documentation, there are no generated images
     - there are precompiled derived files in the distribution]); fi
  if test "$have_mscgen" = "no"; then
    AC_MSG_WARN([Missing program mscgen!
     - when you rebild documentation, there are no message state charts
     - there are precompiled derived files in the distribution]); fi
  AC_CONFIG_FILES([doc/makefile doc/doxyfile])
  AX_ADD_MAKEFILE_TARGET_DEP([clean-am], [clean-documentation], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([distclean-am], [distclean-documentation], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([maintainer-clean-am], [maintainer-clean-documentation], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([install-data-am], [install-data-documentation], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([uninstall-am], [uninstall-documentation], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([all], [doc], [doc/makefile.in])
  AX_ADD_MAKEFILE_TARGET_DEP([.PHONY], [pdf], [doc/makefile.in])
  test -f doc/makefile.in && cat >> doc/makefile.in <<EOF
#### Begin: Appended by $0
doc: doxyfile
	doxygen doxyfile
@PEDANTIC_TRUE@	test \! -s doxygen.errors

clean-documentation:
	-rm doxygen.errors @PDF_DOC@
distclean-documentation:
	-rm -r html latex
	-rm  @PACKAGE_NAME@.doxytag
maintainer-clean-documentation:
	-rm makefile.in
install-data-documentation:
	test -d \$(DESTDIR)\${docdir} || mkdir -p \$(DESTDIR)\${docdir}
	chmod -R u+w \$(DESTDIR)\${docdir}
	cp -r html \$(DESTDIR)\${docdir}/
uninstall-documentation:
	-chmod -R u+w \$(DESTDIR)\${docdir}
	-rm -rf \$(DESTDIR)\${docdir}/*
#### End: $0
EOF
])

AC_DEFUN([AX_PKG_REQUIRE], [
  PKG_PROG_PKG_CONFIG
  PKG_CHECK_MODULES([$1], [$1], [
    AM_CPPFLAGS+=" ${$1_CFLAGS}"
    AM_CXXFLAGS+=" ${$1_CFLAGS}"
    LIBS+=" ${$1_LIBS}"
  ], [
    AC_MSG_ERROR([Required package $1 not found])
  ])
  AC_SUBST(AM_CPPFLAGS)
  AC_SUBST(AM_CXXFLAGS)
])

AC_DEFUN([AX_PKG_CHECK], [
  PKG_PROG_PKG_CONFIG
  PKG_CHECK_MODULES([$1], [m4_default([$2], [$1])], [
    HAVE_$1=1
    AM_CPPFLAGS+=" ${$1_CFLAGS}"
    AM_CXXFLAGS+=" ${$1_CFLAGS}"
    LIBS+=" ${$1_LIBS}"
  ], [
    HAVE_$1=0
  ])
  AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1)
  AC_SUBST(HAVE_$1)
  AC_SUBST(AM_CPPFLAGS)
  AC_SUBST(AM_CXXFLAGS)
])
