# SYNOPSIS
#
#   Check if a module exists:
#     AX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules])
#
#   Abort if a module does not exist:
#     AX_REQUIRE_QT([qt_prefix], [list-of-qt-modules], [optional-modules])
#
# DESCRIPTIONS
#
#    qt_prefix
#
#      Each call to AX_CHECK_QT should have a different prefix
#      value (with a few exceptions discussed later on). This value,
#      usually provided in uppercase, is used as prefix to the
#      variables holding the compiler flags and libraries reported by
#      pkg-config.
#
#      For instance, if your prefix was to be FOO you'll be provided
#      two variables FOO_CFLAGS and FOO_LIBS.
#
#      This will also be used as message during the configure checks:
#      checking for FOO....
#
#    list-of-modules
#
#      A single call to the macro can check for the presence of one or
#      more qt modules; you'll see later how to make good use of this
#      feature. Each entry in the list can have a version comparison
#      specifier, with the same syntax as the Requires keyword in the
#      data files themselves.
#
#    optional-modules
#
#      Optional list of more, optional modules, e.g. modules that
#      exist only in Qt5, but not in Qt4, such as QtWidgets or
#      QtWebKitWidgets


AC_DEFUN([AX_CXX_QT_TOOL], [
  if test -z "$HAVE_$1"; then
    HAVE_$1=1
    AC_MSG_CHECKING([for $2])
    AC_ARG_VAR([$1], [path to Qt tool $2])
    $1=${$1:-$(${PKG_CONFIG} --variable=$2_location Qt5Core)}
    $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2-qt5}
    $1=${$1:-$(${PKG_CONFIG} --variable=host_bins Qt5Core)/$2}
    $1=${$1:-$(${PKG_CONFIG} --variable=$2_location QtCore)}
    $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2}
    $1=${$1:-$(${PKG_CONFIG} --variable=host_bins QtCore)/$2-qt4}
    if ! which "${$1%% *}" > /dev/null; then
      if which "$2-qt5" > /dev/null; then
        $1=$2-qt5
      elif which "$2" > /dev/null; then
        $1=$2
      elif which "$2-qt4" > /dev/null; then
        $1=$2-qt4
      else
        HAVE_$1=0
        $1=""
      fi
    fi
    AC_SUBST($1)
    AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1)
    if test $HAVE_$1 -eq 1; then
      AC_MSG_RESULT([$$1])
    else
      AC_MSG_RESULT([not found])
    fi
  fi
])

AC_DEFUN([AX_CXX_QT_TOOLS], [
  AX_CXX_QT_TOOL(QMAKE, qmake)
  AX_CXX_QT_TOOL(MOC, moc)
  AX_CXX_QT_TOOL(UIC, uic)
  AX_CXX_QT_TOOL(RCC, rcc)
  AX_CXX_QT_TOOL(LUPDATE, lupdate)
  AX_CXX_QT_TOOL(LRELEASE, lrelease)
])

AC_DEFUN([AX_CHECK_VALID_FLAG], [
  AC_MSG_CHECKING([m4_default([$2], [for valid flag in "$1"])])
  save_cppflags="$CPPFLAGS"
  newflag="no"
  for test_flag in $1; do
    CPPFLAGS+=" ${test_flag}"
    AC_COMPILE_IFELSE([AC_LANG_PROGRAM()], [
      newflag="$test_flag"
      CPPFLAGS="$save_cppflags"
      CPPFLAGS+=" ${test_flag}"
      break;
    ])
    CPPFLAGS="$save_cppflags"
  done
  AC_SUBST(CPPFLAGS)
  AC_MSG_RESULT([$newflag])
])

AC_DEFUN([AX_CHECK_QT], [
  qt_modules="$2"
  qt_modules_optional="$3"
  AX_CXX_QT_TOOLS
  HAVE_$1=0
  PKG_PROG_PKG_CONFIG
  PKG_CHECK_MODULES([$1]5, [${qt_modules//Qt/Qt5}], [
    HAVE_$1=1
    AC_DEFINE([HAVE_$1])
    QTDIR=$(${PKG_CONFIG} --variable=prefix Qt5Core)
    QT_PLUGIN_PATH=${QTDIR}/share/qt5/plugins
    CPPFLAGS+=" ${[$1]5_CFLAGS}"
    MOC_FLAGS+=" -DHAVE_$1=1 ${[$1]5_CFLAGS}"
    CXXFLAGS+=" ${[$1]5_CFLAGS}"
    LIBS+=" ${[$1]5_LIBS}"
    PKG_REQUIREMENTS+=" ${qt_modules//Qt/Qt5}"
    if test -n "${qt_modules_optional}"; then
      PKG_CHECK_MODULES([$1]5_OPTIONAL, [${qt_modules_optional//Qt/Qt5}], [
        CPPFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
        MOC_FLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
        CXXFLAGS+=" ${[$1]5_OPTIONAL_CFLAGS}"
        LIBS+=" ${[$1]5_OPTIONAL_LIBS}"
        PKG_REQUIREMENTS+=" ${qt_modules_optional//Qt/Qt5}"
      ], [
        AC_MSG_NOTICE([Not found: ${qt_modules_optional//Qt/Qt5}])
      ])
    fi
  ], [
    PKG_CHECK_MODULES([$1], [${qt_modules}], [
      HAVE_$1=1
      AC_DEFINE([HAVE_$1])
      QTDIR=$(${PKG_CONFIG} --variable=prefix QtCore)
      QT_PLUGIN_PATH=${QTDIR}/share/qt/plugins
      CPPFLAGS+=" ${$1_CFLAGS}"
      MOC_FLAGS+=" -DHAVE_$1=1 ${$1_CFLAGS}"
      CXXFLAGS+=" ${$1_CFLAGS}"
      LIBS+=" ${$1_LIBS}"
      PKG_REQUIREMENTS+=" ${qt_modules}"
      if test -n "$3"; then
        PKG_CHECK_MODULES($1_OPTIONAL, [${qt_modules_optional}], [
          CPPFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
          MOC_FLAGS+=" ${$1_OPTIONAL_CFLAGS}"
          CXXFLAGS+=" ${$1_OPTIONAL_CFLAGS}"
          LIBS+=" ${$1_OPTIONAL_LIBS}"
          PKG_REQUIREMENTS+=" ${qt_modules_optional}"
        ], [
          AC_MSG_NOTICE([Not found: ${qt_modules_optional}])
        ])
      fi
    ], [HAVE_$1=0])
  ])
  AM_CONDITIONAL(HAVE_$1, test $HAVE_$1 -eq 1)
  AX_CHECK_VALID_FLAG([-fPIC -fPIE], [position independent code flag])
  AC_SUBST(QTDIR)
  AC_SUBST(QT_PLUGIN_PATH)
  AC_SUBST(CPPFLAGS)
  AC_SUBST(MOC_FLAGS)
  AC_SUBST(CXXFLAGS)
  AC_SUBST(PKG_REQUIREMENTS)
  AX_ADDITIONAL_QT_RULES_HACK='

LANGUAGE_FILE_BASE ?= translations

ui_%.hxx: %.ui
	$(UIC) -o [$][@] $<

moc_%.cxx: %.hxx
	$(MOC) $(MOC_FLAGS) -o [$][@] $<

qrc_%.cxx: %.qrc
	$(RCC) -o [$][@] -name ${<:%.qrc=%} $<
  AC_SUBST(AX_ADDITIONAL_QT_RULES_HACK)

#%.qrc: %
#	cwd=$$(pwd) && cd $< && $(RCC) -project -o $${cwd}/[$][@]

%.qm: %.ts
	${LRELEASE} $< -qm [$][@]

#%.ts: ${LANGUAGE_FILES}
#	${LUPDATE} -no-obsolete \
#	           -target-language ${@:${LANGUAGE_FILE_BASE}_%.ts=%} \
#	           -ts [$][@] $<

'])

# SYNOPSIS
#
#   AX_CHECK_QT([qt_prefix], [list-of-qt-modules], [optional-modules])
#
# DESCRIPTIONS
#
#    qt_prefix
#
#      Each call to AX_CHECK_QT should have a different prefix
#      value (with a few exceptions discussed later on). This value,
#      usually provided in uppercase, is used as prefix to the
#      variables holding the compiler flags and libraries reported by
#      pkg-config.
#
#      For instance, if your prefix was to be FOO you'll be provided
#      two variables FOO_CFLAGS and FOO_LIBS.
#
#      This will also be used as message during the configure checks:
#      checking for FOO....
#
#    list-of-modules
#
#      A single call to the macro can check for the presence of one or
#      more qt modules; you'll see later how to make good use of this
#      feature. Each entry in the list can have a version comparison
#      specifier, with the same syntax as the Requires keyword in the
#      data files themselves.
#
#    optional-modules
#
#      Optional list of more, optional modules, e.g. modules that
#      exist only in Qt5, but not in Qt4, such as QtWidgets or
#      QtWebKitWidgets

AC_DEFUN([AX_REQUIRE_QT], [
  AX_CHECK_QT([$1], [$2], [$3])
  if ! test "$HAVE_$1" -eq 1; then
     AC_MSG_ERROR([Required Qt modules not found: $2])
  fi
])


#   Omit Qt Keywords
#     AX_QT_NO_KEYWORDS

AC_DEFUN([AX_QT_NO_KEYWORDS], [
  CPPFLAGS+=" -DQT_NO_KEYWORDS"
])
