Add pkgconfig support to libassuan.
This patch is rejected by upstream for the reason below:
They think pkgconfig adds no portability and maintaining them is not worthwhile.

Upstream-Status: Denied
Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Constantin Musca <constantinx.musca@intel.com>

forward ported to 2.4.4
Signed-off-by: Armin Kuster <akuster@mvista.com>

Index: libassuan-2.5.2/src/libassuan.m4
===================================================================
--- libassuan-2.5.2.orig/src/libassuan.m4
+++ libassuan-2.5.2/src/libassuan.m4
@@ -16,27 +16,6 @@ dnl Returns ok set to yes or no.
 dnl
 AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON],
 [ AC_REQUIRE([AC_CANONICAL_HOST])
-  AC_ARG_WITH(libassuan-prefix,
-              AC_HELP_STRING([--with-libassuan-prefix=PFX],
-                             [prefix where LIBASSUAN is installed (optional)]),
-     libassuan_config_prefix="$withval", libassuan_config_prefix="")
-  if test x$libassuan_config_prefix != x ; then
-    if test x${LIBASSUAN_CONFIG+set} != xset ; then
-      LIBASSUAN_CONFIG=$libassuan_config_prefix/bin/libassuan-config
-    fi
-  fi
-
-  use_gpgrt_config=""
-  if test x"${LIBASSUAN_CONFIG}" = x -a x"$GPGRT_CONFIG" != x -a "$GPGRT_CONFIG" != "no"; then
-    if $GPGRT_CONFIG libassuan --exists; then
-      LIBASSUAN_CONFIG="$GPGRT_CONFIG libassuan"
-      AC_MSG_NOTICE([Use gpgrt-config as libassuan-config])
-      use_gpgrt_config=yes
-    fi
-  fi
-  if test -z "$use_gpgrt_config"; then
-    AC_PATH_PROG(LIBASSUAN_CONFIG, libassuan-config, no)
-  fi
 
   tmp=ifelse([$1], ,1:0.9.2,$1)
   if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
@@ -47,58 +26,11 @@ AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON],
     min_libassuan_version="$tmp"
   fi
 
-  AC_MSG_CHECKING(for LIBASSUAN - version >= $min_libassuan_version)
-  ok=no
-  if test "$LIBASSUAN_CONFIG" != "no"; then
-    req_major=`echo $min_libassuan_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\1/'`
-    req_minor=`echo $min_libassuan_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\2/'`
-    req_micro=`echo $min_libassuan_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
-
-    if test -z "$use_gpgrt_config"; then
-      libassuan_config_version=`$LIBASSUAN_CONFIG --version`
-    else
-      libassuan_config_version=`$LIBASSUAN_CONFIG --modversion`
-    fi
-    major=`echo $libassuan_config_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\1/'`
-    minor=`echo $libassuan_config_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'`
-    micro=`echo $libassuan_config_version | \
-               sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
-
-    if test "$major" -gt "$req_major"; then
-        ok=yes
-    else
-        if test "$major" -eq "$req_major"; then
-            if test "$minor" -gt "$req_minor"; then
-               ok=yes
-            else
-               if test "$minor" -eq "$req_minor"; then
-                   if test "$micro" -ge "$req_micro"; then
-                     ok=yes
-                   fi
-               fi
-            fi
-        fi
-    fi
-  fi
-
-  if test $ok = yes; then
-    AC_MSG_RESULT([yes ($libassuan_config_version)])
-  else
-    AC_MSG_RESULT(no)
-  fi
+  PKG_CHECK_MODULES(LIBASSUAN, [libassuan >= $min_libassuan_version], [ok=yes], [ok=no])
 
   if test $ok = yes; then
     if test "$req_libassuan_api" -gt 0 ; then
-      if test -z "$use_gpgrt_config"; then
-        tmp=`$LIBASSUAN_CONFIG --api-version 2>/dev/null || echo 0`
-      else
-        tmp=`$LIBASSUAN_CONFIG --variable=api_version 2>/dev/null || echo 0`
-      fi
+      tmp=`$PKG_CONFIG --variable=api_version libassuan`
       if test "$tmp" -gt 0 ; then
         AC_MSG_CHECKING([LIBASSUAN API version])
         if test "$req_libassuan_api" -eq "$tmp" ; then
@@ -114,9 +46,7 @@ AC_DEFUN([_AM_PATH_LIBASSUAN_COMMON],
   if test $ok = yes; then
     if test x"$host" != x ; then
       if test -z "$use_gpgrt_config"; then
-        libassuan_config_host=`$LIBASSUAN_CONFIG --host 2>/dev/null || echo none`
-      else
-        libassuan_config_host=`$LIBASSUAN_CONFIG --variable=host 2>/dev/null || echo none`
+        libassuan_config_host=`$PKG_CONFIG --variable=host libassuan`
       fi
       if test x"$libassuan_config_host" != xnone ; then
         if test x"$libassuan_config_host" != x"$host" ; then
@@ -158,12 +88,8 @@ dnl
 AC_DEFUN([AM_PATH_LIBASSUAN],
 [ _AM_PATH_LIBASSUAN_COMMON($1)
   if test $ok = yes; then
-    LIBASSUAN_CFLAGS=`$LIBASSUAN_CONFIG --cflags`
-    LIBASSUAN_LIBS=`$LIBASSUAN_CONFIG --libs`
     ifelse([$2], , :, [$2])
   else
-    LIBASSUAN_CFLAGS=""
-    LIBASSUAN_LIBS=""
     ifelse([$3], , :, [$3])
   fi
   AC_SUBST(LIBASSUAN_CFLAGS)
