dnl pkg-config-based checks for Orc

dnl specific:
dnl ORC_CHECK([REQUIRED_VERSION])

AC_DEFUN([ORC_CHECK],
[
  ORC_REQ=ifelse([$1], , "0.4.6", [$1])

  AC_ARG_ENABLE(orc,
  AC_HELP_STRING([--enable-orc],[use Orc if installed]),
  [case "${enableval}" in
    auto) enable_orc=auto ;;
    yes) enable_orc=yes ;;
    no)  enable_orc=no ;;
    *) AC_MSG_ERROR(bad value ${enableval} for --enable-orc) ;;
  esac
  ],
  [enable_orc=auto]) dnl Default value

  if test "x$enable_orc" != "xno" ; then
    PKG_CHECK_MODULES(ORC, orc-0.4 >= $ORC_REQ, [
      AC_DEFINE(HAVE_ORC, 1, [Use Orc])
      HAVE_ORC=yes
      if test "x$ORCC" = "x" ; then
        AC_MSG_CHECKING(for usable orcc)
        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
        dnl check whether the orcc found by pkg-config can be run from the build environment
        dnl if this is not the case (e.g. when cross-compiling) fall back to orcc from PATH
        AS_IF([$ORCC --version 1> /dev/null 2> /dev/null], [], [ORCC=`which orcc`])
        AC_MSG_RESULT($ORCC)
      fi
      AC_SUBST(ORCC)
      ORCC_FLAGS="--compat $ORC_REQ"
      AC_SUBST(ORCC_FLAGS)
      AS_IF([test "x$ORCC" = "x"], [HAVE_ORCC=no], [HAVE_ORCC=yes])
    ], [
      if test "x$enable_orc" = "xyes" ; then
        AC_MSG_ERROR([--enable-orc specified, but Orc >= $ORC_REQ not found])
      fi
      AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
      HAVE_ORC=no
      HAVE_ORCC=no
    ])
  else
    AC_DEFINE(DISABLE_ORC, 1, [Disable Orc])
    HAVE_ORC=no
    HAVE_ORCC=no
  fi
  AM_CONDITIONAL(HAVE_ORC, [test "x$HAVE_ORC" = "xyes"])
  AM_CONDITIONAL(HAVE_ORCC, [test "x$HAVE_ORCC" = "xyes"])

]))

AC_DEFUN([ORC_OUTPUT],
[
  if test "$HAVE_ORC" = yes ; then
    printf "configure: *** Orc acceleration enabled.\n"
  else
    if test "x$enable_orc" = "xno" ; then
      printf "configure: *** Orc acceleration disabled by --disable-orc.  Slower code paths\n"
      printf "               will be used.\n"
    else
      printf "configure: *** Orc acceleration disabled.  Requires Orc >= $ORC_REQ, which was\n"
      printf "               not found.  Slower code paths will be used.\n"
    fi
  fi
  printf "\n"
])

