#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for GStreamer Bad Plug-ins 1.8.0.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
#
#
# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
#
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

# Use a proper internal environment variable to ensure we don't fall
  # into an infinite loop, continuously re-executing ourselves.
  if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then
    _as_can_reexec=no; export _as_can_reexec;
    # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
as_fn_exit 255
  fi
  # We don't want this to propagate to other subprocesses.
          { _as_can_reexec=; unset _as_can_reexec;}
if test "x$CONFIG_SHELL" = x; then
  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '\${1+\"\$@\"}'='\"\$@\"'
  setopt NO_GLOB_SUBST
else
  case \`(set -o) 2>/dev/null\` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi
"
  as_required="as_fn_return () { (exit \$1); }
as_fn_success () { as_fn_return 0; }
as_fn_failure () { as_fn_return 1; }
as_fn_ret_success () { return 0; }
as_fn_ret_failure () { return 1; }

exitcode=0
as_fn_success || { exitcode=1; echo as_fn_success failed.; }
as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :

else
  exitcode=1; echo positional parameters were not saved.
fi
test x\$exitcode = x0 || exit 1
test -x / || exit 1"
  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1

  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
    PATH=/empty FPATH=/empty; export PATH FPATH
    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
test \$(( 1 + 1 )) = 2 || exit 1"
  if (eval "$as_required") 2>/dev/null; then :
  as_have_required=yes
else
  as_have_required=no
fi
  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :

else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_found=false
for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
  as_found=:
  case $as_dir in #(
	 /*)
	   for as_base in sh bash ksh sh5; do
	     # Try only shells that exist, to save several forks.
	     as_shell=$as_dir/$as_base
	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
  CONFIG_SHELL=$as_shell as_have_required=yes
		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
  break 2
fi
fi
	   done;;
       esac
  as_found=false
done
$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
  CONFIG_SHELL=$SHELL as_have_required=yes
fi; }
IFS=$as_save_IFS


      if test "x$CONFIG_SHELL" != x; then :
  export CONFIG_SHELL
             # We cannot yet assume a decent shell, so we have to provide a
# neutralization value for shells without unset; and this also
# works around shells that cannot unset nonexistent variables.
# Preserve -v and -x to the replacement shell.
BASH_ENV=/dev/null
ENV=/dev/null
(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
case $- in # ((((
  *v*x* | *x*v* ) as_opts=-vx ;;
  *v* ) as_opts=-v ;;
  *x* ) as_opts=-x ;;
  * ) as_opts= ;;
esac
exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"}
# Admittedly, this is quite paranoid, since all the known shells bail
# out after a failed `exec'.
$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2
exit 255
fi

    if test x$as_have_required = xno; then :
  $as_echo "$0: This script requires a shell more modern than all"
  $as_echo "$0: the shells that I found on your system."
  if test x${ZSH_VERSION+set} = xset ; then
    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
  else
    $as_echo "$0: Please tell bug-autoconf@gnu.org and
$0: http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer
$0: about your system, including any error possibly output
$0: before this message. Then install a modern shell, or
$0: manually run the script under such a shell if you do
$0: have one."
  fi
  exit 1
fi
fi
fi
SHELL=${CONFIG_SHELL-/bin/sh}
export SHELL
# Unset more variables known to interfere with behavior of common tools.
CLICOLOR_FORCE= GREP_OPTIONS=
unset CLICOLOR_FORCE GREP_OPTIONS

## --------------------- ##
## M4sh Shell Functions. ##
## --------------------- ##
# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset

# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p

# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error

if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits


  as_lineno_1=$LINENO as_lineno_1a=$LINENO
  as_lineno_2=$LINENO as_lineno_2a=$LINENO
  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)
  sed -n '
    p
    /[$]LINENO/=
  ' <$as_myself |
    sed '
      s/[$]LINENO.*/&-/
      t lineno
      b
      :lineno
      N
      :loop
      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
      t loop
      s/-\n.*//
    ' >$as_me.lineno &&
  chmod +x "$as_me.lineno" ||
    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }

  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have
  # already done that, so ensure we don't try to do so again and fall
  # in an infinite loop.  This has already happened in practice.
  _as_can_reexec=no; export _as_can_reexec
  # Don't try to exec as it changes $[0], causing all sort of problems
  # (the dirname of $[0] is not the place where we might find the
  # original and so on.  Autoconf is especially sensitive to this).
  . "./$as_me.lineno"
  # Exit status is that of the last command.
  exit
}

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null

if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi

as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"

SHELL=${CONFIG_SHELL-/bin/sh}


test -n "$DJDIR" || exec 7<&0 </dev/null
exec 6>&1

# Name of the host.
# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
# so uname gets run too.
ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`

#
# Initializations.
#
ac_default_prefix=/usr/local
ac_clean_files=
ac_config_libobj_dir=.
LIBOBJS=
cross_compiling=no
subdirs=
MFLAGS=
MAKEFLAGS=

# Identity of this package.
PACKAGE_NAME='GStreamer Bad Plug-ins'
PACKAGE_TARNAME='gst-plugins-bad'
PACKAGE_VERSION='1.8.0'
PACKAGE_STRING='GStreamer Bad Plug-ins 1.8.0'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''

ac_unique_file="docs/plugins/gst-plugins-bad-plugins-docs.sgml"
# Factoring default headers for most tests.
ac_includes_default="\
#include <stdio.h>
#ifdef HAVE_SYS_TYPES_H
# include <sys/types.h>
#endif
#ifdef HAVE_SYS_STAT_H
# include <sys/stat.h>
#endif
#ifdef STDC_HEADERS
# include <stdlib.h>
# include <stddef.h>
#else
# ifdef HAVE_STDLIB_H
#  include <stdlib.h>
# endif
#endif
#ifdef HAVE_STRING_H
# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
#  include <memory.h>
# endif
# include <string.h>
#endif
#ifdef HAVE_STRINGS_H
# include <strings.h>
#endif
#ifdef HAVE_INTTYPES_H
# include <inttypes.h>
#endif
#ifdef HAVE_STDINT_H
# include <stdint.h>
#endif
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif"

gt_needs=
ac_header_list=
ac_subst_vars='am__EXEEXT_FALSE
am__EXEEXT_TRUE
LTLIBOBJS
LIBOBJS
GST_PLUGIN_LDFLAGS
GST_LIB_LDFLAGS
GST_ALL_LDFLAGS
GST_PLUGINS_BAD_OBJCFLAGS
GST_PLUGINS_BAD_CXXFLAGS
GST_PLUGINS_BAD_CFLAGS
GST_OBJCFLAGS
GST_CXXFLAGS
GST_OPTION_OBJCFLAGS
GST_OPTION_CXXFLAGS
GST_OPTION_CFLAGS
DEPRECATED_CFLAGS
PROFILE_CFLAGS
USE_X265_FALSE
USE_X265_TRUE
X265_LIBS
X265_CFLAGS
USE_HLS_FALSE
USE_HLS_TRUE
OPENSSL_LIBS
OPENSSL_CFLAGS
LIBGCRYPT_LIBS
LIBGCRYPT_CFLAGS
LIBGCRYPT_CONFIG
NETTLE_LIBS
NETTLE_CFLAGS
USE_SNDIO_FALSE
USE_SNDIO_TRUE
SNDIO_LIBS
USE_SPANDSP_FALSE
USE_SPANDSP_TRUE
SPANDSP_LIBS
SPANDSP_CFLAGS
USE_RTMP_FALSE
USE_RTMP_TRUE
RTMP_LIBS
RTMP_CFLAGS
USE_ZBAR_FALSE
USE_ZBAR_TRUE
ZBAR_LIBS
ZBAR_CFLAGS
USE_SCHRO_FALSE
USE_SCHRO_TRUE
SCHRO_LIBS
SCHRO_CFLAGS
USE_SBC_FALSE
USE_SBC_TRUE
SBC_LIBS
SBC_CFLAGS
USE_VDPAU_FALSE
USE_VDPAU_TRUE
VDPAU_LIBS
VDPAU_CFLAGS
USE_ACM_FALSE
USE_ACM_TRUE
ACMMP3DEC_CFLAGS
ACMENC_CFLAGS
USE_WININET_FALSE
USE_WININET_TRUE
USE_DVB_FALSE
USE_DVB_TRUE
USE_XVID_FALSE
USE_XVID_TRUE
XVID_LIBS
USE_GME_FALSE
USE_GME_TRUE
GME_LIBS
USE_SPC_FALSE
USE_SPC_TRUE
SPC_LIBS
USE_SOUNDTOUCH_FALSE
USE_SOUNDTOUCH_TRUE
SOUNDTOUCH_LIBS
SOUNDTOUCH_CFLAGS
USE_SNDFILE_FALSE
USE_SNDFILE_TRUE
SNDFILE_LIBS
SNDFILE_CFLAGS
USE_SMOOTHSTREAMING_FALSE
USE_SMOOTHSTREAMING_TRUE
USE_SDL_FALSE
USE_SDL_TRUE
SDL_CONFIG
USE_WILDMIDI_FALSE
USE_WILDMIDI_TRUE
WILDMIDI_LIBS
WILDMIDI_CFLAGS
HAVE_WILDMIDI
USE_TELETEXTDEC_FALSE
USE_TELETEXTDEC_TRUE
TELETEXTDEC_LIBS
TELETEXTDEC_CFLAGS
USE_TIMIDITY_FALSE
USE_TIMIDITY_TRUE
TIMIDITY_LIBS
TIMIDITY_CFLAGS
USE_LIBVISUAL_FALSE
USE_LIBVISUAL_TRUE
LIBVISUAL_LIBS
LIBVISUAL_CFLAGS
USE_VULKAN_FALSE
USE_VULKAN_TRUE
VULKAN_LIBS
USE_QT_FALSE
USE_QT_TRUE
QT_MAC_LIBS
QT_MAC_CFLAGS
GNUSTL_LIBS
GNUSTL_CFLAGS
QT_ANDROID_LIBS
QT_ANDROID_CFLAGS
QT_WAYLAND_LIBS
QT_WAYLAND_CFLAGS
QT_X11_LIBS
QT_X11_CFLAGS
UIC
RCC
MOC
QT_LIBS
QT_CFLAGS
USE_GTK3_GL_FALSE
USE_GTK3_GL_TRUE
USE_GTK3_FALSE
USE_GTK3_TRUE
GTK3_WAYLAND_LIBS
GTK3_WAYLAND_CFLAGS
GTK3_X11_LIBS
GTK3_X11_CFLAGS
GTK3_GL_LIBS
GTK3_GL_CFLAGS
USE_GL_FALSE
USE_GL_TRUE
USE_RSVG_FALSE
USE_RSVG_TRUE
RSVG_LIBS
RSVG_CFLAGS
USE_PVR_FALSE
USE_PVR_TRUE
PVR_LIBS
PVR_CFLAGS
USE_OPUS_FALSE
USE_OPUS_TRUE
OPUS_LIBS
OPUS_CFLAGS
USE_OPENNI2_FALSE
USE_OPENNI2_TRUE
OPENNI2_LIBS
OPENNI2_CFLAGS
USE_OPENJPEG_FALSE
USE_OPENJPEG_TRUE
OPENJPEG_LIBS
OPENJPEG_CFLAGS
HAVE_OPENJPEG
USE_OPENH264_FALSE
USE_OPENH264_TRUE
OPENH264_LIBS
OPENH264_CFLAGS
USE_OPENEXR_FALSE
USE_OPENEXR_TRUE
OPENEXR_LIBS
OPENEXR_CFLAGS
USE_OPENCV_FALSE
USE_OPENCV_TRUE
OPENCV_PREFIX
OPENCV_LIBS
OPENCV_CFLAGS
USE_OPENAL_FALSE
USE_OPENAL_TRUE
OPENAL_LIBS
OPENAL_CFLAGS
USE_OFA_FALSE
USE_OFA_TRUE
OFA_LIBS
OFA_CFLAGS
USE_NEON_FALSE
USE_NEON_TRUE
NEON_LIBS
NEON_CFLAGS
USE_NAS_FALSE
USE_NAS_TRUE
NAS_LIBS
NAS_CFLAGS
HAVE_NAS
USE_MUSEPACK_FALSE
USE_MUSEPACK_TRUE
MUSEPACK_LIBS
USE_MPLEX_FALSE
USE_MPLEX_TRUE
MPLEX_LDFLAGS
MPLEX_LIBS
MPLEX_CFLAGS
USE_MPEG2ENC_FALSE
USE_MPEG2ENC_TRUE
MPEG2ENC_LIBS
MPEG2ENC_CFLAGS
MJPEG_LIBS
MJPEG_CFLAGS
USE_MIMIC_FALSE
USE_MIMIC_TRUE
MIMIC_LIBS
MIMIC_CFLAGS
USE_MODPLUG_FALSE
USE_MODPLUG_TRUE
MODPLUG_LIBS
MODPLUG_CFLAGS
USE_LINSYS_FALSE
USE_LINSYS_TRUE
USE_DTLS_FALSE
USE_DTLS_TRUE
DTLS_LIBS
DTLS_CFLAGS
USE_SRTP_FALSE
USE_SRTP_TRUE
SRTP_LIBS
SRTP_CFLAGS
HAVE_SRTP
USE_LIBMMS_FALSE
USE_LIBMMS_TRUE
LIBMMS_LIBS
LIBMMS_CFLAGS
USE_LIBDE265_FALSE
USE_LIBDE265_TRUE
LIBDE265_LIBS
LIBDE265_CFLAGS
USE_LV2_FALSE
USE_LV2_TRUE
SLV2_LIBS
SLV2_CFLAGS
USE_LADSPA_FALSE
USE_LADSPA_TRUE
LRDF_LIBS
LRDF_CFLAGS
USE_KATE_FALSE
USE_KATE_TRUE
USE_TIGER_FALSE
USE_TIGER_TRUE
TIGER_LIBS
TIGER_CFLAGS
KATE_LIBS
KATE_CFLAGS
USE_FLUIDSYNTH_FALSE
USE_FLUIDSYNTH_TRUE
FLUIDSYNTH_LIBS
FLUIDSYNTH_CFLAGS
USE_GSM_FALSE
USE_GSM_TRUE
GSM_LIBS
HAVE_GSM
USE_FLITE_FALSE
USE_FLITE_TRUE
FLITE_LIBS
FLITE_CFLAGS
HAVE_FLITE
USE_FBDEV_FALSE
USE_FBDEV_TRUE
USE_FAAD_FALSE
USE_FAAD_TRUE
FAAD_LIBS
HAVE_FAAD
USE_FAAC_FALSE
USE_FAAC_TRUE
FAAC_LIBS
HAVE_FAAC
USE_RESINDVD_FALSE
USE_RESINDVD_TRUE
DVDNAV_LIBS
DVDNAV_CFLAGS
USE_DTS_FALSE
USE_DTS_TRUE
DTS_LIBS
HAVE_DTS
USE_DAALA_FALSE
USE_DAALA_TRUE
DAALA_LIBS
DAALA_CFLAGS
USE_WEBP_FALSE
USE_WEBP_TRUE
WEBP_LIBS
WEBP_CFLAGS
USE_WAYLAND_FALSE
USE_WAYLAND_TRUE
WAYLAND_LIBS
WAYLAND_CFLAGS
wayland_scanner
USE_DIRECTFB_FALSE
USE_DIRECTFB_TRUE
DIRECTFB_LIBS
DIRECTFB_CFLAGS
DECKLINK_OSX_FALSE
DECKLINK_OSX_TRUE
USE_DECKLINK_FALSE
USE_DECKLINK_TRUE
DECKLINK_LIBS
DECKLINK_CXXFLAGS
USE_DC1394_FALSE
USE_DC1394_TRUE
LIBDC1394_LIBS
LIBDC1394_CFLAGS
USE_DASH_FALSE
USE_DASH_TRUE
LIBXML2_LIBS
LIBXML2_CFLAGS
USE_CURL_FALSE
USE_CURL_TRUE
USE_SSH2_FALSE
USE_SSH2_TRUE
SSH2_LIBS
SSH2_CFLAGS
CURL_LIBS
CURL_CFLAGS
USE_CHROMAPRINT_FALSE
USE_CHROMAPRINT_TRUE
CHROMAPRINT_LIBS
CHROMAPRINT_CFLAGS
USE_BZ2_FALSE
USE_BZ2_TRUE
BZ2_LIBS
USE_BS2B_FALSE
USE_BS2B_TRUE
BS2B_LIBS
BS2B_CFLAGS
USE_APEXSINK_FALSE
USE_APEXSINK_TRUE
APEXSINK_LIBS
APEXSINK_CFLAGS
USE_VOAACENC_FALSE
USE_VOAACENC_TRUE
VOAACENC_LIBS
VOAACENC_CFLAGS
USE_VOAMRWBENC_FALSE
USE_VOAMRWBENC_TRUE
VOAMRWBENC_LIBS
VOAMRWBENC_CFLAGS
USE_ASSRENDER_FALSE
USE_ASSRENDER_TRUE
ASSRENDER_LIBS
ASSRENDER_CFLAGS
USE_TINYALSA_FALSE
USE_TINYALSA_TRUE
USE_NVENC_GST_GL_FALSE
USE_NVENC_GST_GL_TRUE
USE_NVENC_FALSE
USE_NVENC_TRUE
NVENCODE_LIBS
NVENCODE_CFLAGS
CUDA_LIBS
CUDA_CFLAGS
GST_PBUTILS_LIBS
GST_PBUTILS_CFLAGS
GST_VIDEO_LIBS
GST_VIDEO_CFLAGS
LIBUDEV_LIBS
LIBUDEV_CFLAGS
USE_UVCH264_FALSE
USE_UVCH264_TRUE
LIBUSB_LIBS
LIBUSB_CFLAGS
G_UDEV_LIBS
G_UDEV_CFLAGS
USE_OPENSLES_FALSE
USE_OPENSLES_TRUE
USE_VCD_FALSE
USE_VCD_TRUE
USE_SHM_FALSE
USE_SHM_TRUE
SHM_LIBS
USE_AVC_FALSE
USE_AVC_TRUE
USE_BLUEZ_FALSE
USE_BLUEZ_TRUE
GDBUS_CODEGEN
GIO_UNIX_LIBS
GIO_UNIX_CFLAGS
BLUEZ5_LIBS
BLUEZ5_CFLAGS
USE_APPLE_MEDIA_FALSE
USE_APPLE_MEDIA_TRUE
USE_ANDROID_MEDIA_FALSE
USE_ANDROID_MEDIA_TRUE
USE_WINKS_FALSE
USE_WINKS_TRUE
HAVE_WINKS
WINKS_LIBS
USE_WINSCREENCAP_FALSE
USE_WINSCREENCAP_TRUE
HAVE_WINSCREENCAP
WINSCREENCAP_LIBS
USE_DIRECT3D_FALSE
USE_DIRECT3D_TRUE
HAVE_DIRECT3D
DIRECT3D_LIBS
USE_WASAPI_FALSE
USE_WASAPI_TRUE
HAVE_WASAPI
WASAPI_LIBS
USE_DIRECTSOUND_FALSE
USE_DIRECTSOUND_TRUE
HAVE_DIRECTSOUND
DIRECTSOUND_LIBS
DIRECTX_LDFLAGS
DIRECTX_CFLAGS
USE_XCB_FALSE
USE_XCB_TRUE
XCB_LIBS
XCB_CFLAGS
HAVE_JPEG_FALSE
HAVE_JPEG_TRUE
HAVE_JPEG
JPEG_LIBS
HAVE_PNG_FALSE
HAVE_PNG_TRUE
HAVE_PNG
LIBPNG_LIBS
LIBPNG_CFLAGS
HAVE_GST_GL_FALSE
HAVE_GST_GL_TRUE
USE_EAGL_FALSE
USE_EAGL_TRUE
USE_EGL_RPI_FALSE
USE_EGL_RPI_TRUE
USE_EGL_MALI_FALSE
USE_EGL_MALI_TRUE
USE_COCOA_FALSE
USE_COCOA_TRUE
USE_WGL_FALSE
USE_WGL_TRUE
USE_EGL_FALSE
USE_EGL_TRUE
USE_GLX_FALSE
USE_GLX_TRUE
USE_GLES2_FALSE
USE_GLES2_TRUE
USE_OPENGL_FALSE
USE_OPENGL_TRUE
HAVE_WINDOW_EAGL_FALSE
HAVE_WINDOW_EAGL_TRUE
HAVE_WINDOW_ANDROID_FALSE
HAVE_WINDOW_ANDROID_TRUE
HAVE_WINDOW_WAYLAND_FALSE
HAVE_WINDOW_WAYLAND_TRUE
HAVE_WINDOW_DISPMANX_FALSE
HAVE_WINDOW_DISPMANX_TRUE
HAVE_WINDOW_WIN32_FALSE
HAVE_WINDOW_WIN32_TRUE
HAVE_WINDOW_COCOA_FALSE
HAVE_WINDOW_COCOA_TRUE
HAVE_WINDOW_X11_FALSE
HAVE_WINDOW_X11_TRUE
USE_GLES2
USE_OPENGL
GL_OBJCFLAGS
GST_ALLOCATORS_LIBS
GST_ALLOCATORS_CFLAGS
WAYLAND_EGL_LIBS
WAYLAND_EGL_CFLAGS
HAVE_EGL
EGL_LIBS
EGL_CFLAGS
HAVE_GLES2
GLES2_LIBS
GLES2_CFLAGS
GL_LIBS
GL_CFLAGS
HAVE_GL
X_LIBS
X_CFLAGS
DCCP_LIBS
WINSOCK2_LIBS
HAVE_VIDEOTOOLBOX_FALSE
HAVE_VIDEOTOOLBOX_TRUE
HAVE_IOS_FALSE
HAVE_IOS_TRUE
HAVE_AVFOUNDATION_FALSE
HAVE_AVFOUNDATION_TRUE
USE_PLUGIN_YADIF_FALSE
USE_PLUGIN_YADIF_TRUE
USE_PLUGIN_Y4M_FALSE
USE_PLUGIN_Y4M_TRUE
USE_PLUGIN_VMNC_FALSE
USE_PLUGIN_VMNC_TRUE
USE_PLUGIN_VIDEOSIGNAL_FALSE
USE_PLUGIN_VIDEOSIGNAL_TRUE
USE_PLUGIN_VIDEOPARSERS_FALSE
USE_PLUGIN_VIDEOPARSERS_TRUE
USE_PLUGIN_VIDEOMEASURE_FALSE
USE_PLUGIN_VIDEOMEASURE_TRUE
USE_PLUGIN_VIDEOFILTERS_FALSE
USE_PLUGIN_VIDEOFILTERS_TRUE
USE_PLUGIN_TTA_FALSE
USE_PLUGIN_TTA_TRUE
USE_PLUGIN_STEREO_FALSE
USE_PLUGIN_STEREO_TRUE
USE_PLUGIN_SUBENC_FALSE
USE_PLUGIN_SUBENC_TRUE
USE_PLUGIN_SPEED_FALSE
USE_PLUGIN_SPEED_TRUE
USE_PLUGIN_SMOOTH_FALSE
USE_PLUGIN_SMOOTH_TRUE
USE_PLUGIN_SIREN_FALSE
USE_PLUGIN_SIREN_TRUE
USE_PLUGIN_SEGMENTCLIP_FALSE
USE_PLUGIN_SEGMENTCLIP_TRUE
USE_PLUGIN_SDP_FALSE
USE_PLUGIN_SDP_TRUE
USE_PLUGIN_SDI_FALSE
USE_PLUGIN_SDI_TRUE
USE_PLUGIN_REMOVESILENCE_FALSE
USE_PLUGIN_REMOVESILENCE_TRUE
USE_PLUGIN_RAWPARSE_FALSE
USE_PLUGIN_RAWPARSE_TRUE
USE_PLUGIN_PNM_FALSE
USE_PLUGIN_PNM_TRUE
USE_PLUGIN_PCAPPARSE_FALSE
USE_PLUGIN_PCAPPARSE_TRUE
USE_PLUGIN_PATCHDETECT_FALSE
USE_PLUGIN_PATCHDETECT_TRUE
USE_PLUGIN_ONVIF_FALSE
USE_PLUGIN_ONVIF_TRUE
USE_PLUGIN_NUVDEMUX_FALSE
USE_PLUGIN_NUVDEMUX_TRUE
USE_PLUGIN_NETSIM_FALSE
USE_PLUGIN_NETSIM_TRUE
USE_PLUGIN_MXF_FALSE
USE_PLUGIN_MXF_TRUE
USE_PLUGIN_MVE_FALSE
USE_PLUGIN_MVE_TRUE
USE_PLUGIN_MPEGPSMUX_FALSE
USE_PLUGIN_MPEGPSMUX_TRUE
USE_PLUGIN_MPEGTSMUX_FALSE
USE_PLUGIN_MPEGTSMUX_TRUE
USE_PLUGIN_MPEGTSDEMUX_FALSE
USE_PLUGIN_MPEGTSDEMUX_TRUE
USE_PLUGIN_MPEGDEMUX_FALSE
USE_PLUGIN_MPEGDEMUX_TRUE
USE_PLUGIN_MIDI_FALSE
USE_PLUGIN_MIDI_TRUE
USE_PLUGIN_LIBRFB_FALSE
USE_PLUGIN_LIBRFB_TRUE
USE_PLUGIN_JPEGFORMAT_FALSE
USE_PLUGIN_JPEGFORMAT_TRUE
USE_PLUGIN_JP2KDECIMATOR_FALSE
USE_PLUGIN_JP2KDECIMATOR_TRUE
USE_PLUGIN_IVTC_FALSE
USE_PLUGIN_IVTC_TRUE
USE_PLUGIN_IVFPARSE_FALSE
USE_PLUGIN_IVFPARSE_TRUE
USE_PLUGIN_INTERLACE_FALSE
USE_PLUGIN_INTERLACE_TRUE
USE_PLUGIN_INTER_FALSE
USE_PLUGIN_INTER_TRUE
USE_PLUGIN_ID3TAG_FALSE
USE_PLUGIN_ID3TAG_TRUE
USE_PLUGIN_HDVPARSE_FALSE
USE_PLUGIN_HDVPARSE_TRUE
USE_PLUGIN_GDP_FALSE
USE_PLUGIN_GDP_TRUE
USE_PLUGIN_GEOMETRICTRANSFORM_FALSE
USE_PLUGIN_GEOMETRICTRANSFORM_TRUE
USE_PLUGIN_GAUDIEFFECTS_FALSE
USE_PLUGIN_GAUDIEFFECTS_TRUE
USE_PLUGIN_FREI0R_FALSE
USE_PLUGIN_FREI0R_TRUE
USE_PLUGIN_FREEVERB_FALSE
USE_PLUGIN_FREEVERB_TRUE
USE_PLUGIN_FIELDANALYSIS_FALSE
USE_PLUGIN_FIELDANALYSIS_TRUE
USE_PLUGIN_FESTIVAL_FALSE
USE_PLUGIN_FESTIVAL_TRUE
USE_PLUGIN_FACEOVERLAY_FALSE
USE_PLUGIN_FACEOVERLAY_TRUE
USE_PLUGIN_DVDSPU_FALSE
USE_PLUGIN_DVDSPU_TRUE
USE_PLUGIN_DVBSUBOVERLAY_FALSE
USE_PLUGIN_DVBSUBOVERLAY_TRUE
USE_PLUGIN_DEBUGUTILS_FALSE
USE_PLUGIN_DEBUGUTILS_TRUE
USE_PLUGIN_DCCP_FALSE
USE_PLUGIN_DCCP_TRUE
USE_PLUGIN_DATAURISRC_FALSE
USE_PLUGIN_DATAURISRC_TRUE
USE_PLUGIN_COLOREFFECTS_FALSE
USE_PLUGIN_COLOREFFECTS_TRUE
USE_PLUGIN_CDXAPARSE_FALSE
USE_PLUGIN_CDXAPARSE_TRUE
USE_PLUGIN_CAMERABIN2_FALSE
USE_PLUGIN_CAMERABIN2_TRUE
USE_PLUGIN_BAYER_FALSE
USE_PLUGIN_BAYER_TRUE
USE_PLUGIN_AUTOCONVERT_FALSE
USE_PLUGIN_AUTOCONVERT_TRUE
USE_PLUGIN_AUDIOVISUALIZERS_FALSE
USE_PLUGIN_AUDIOVISUALIZERS_TRUE
USE_PLUGIN_COMPOSITOR_FALSE
USE_PLUGIN_COMPOSITOR_TRUE
USE_PLUGIN_AUDIOMIXER_FALSE
USE_PLUGIN_AUDIOMIXER_TRUE
USE_PLUGIN_AUDIOFXBAD_FALSE
USE_PLUGIN_AUDIOFXBAD_TRUE
USE_PLUGIN_ASFMUX_FALSE
USE_PLUGIN_ASFMUX_TRUE
USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE
USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE
USE_PLUGIN_AIFF_FALSE
USE_PLUGIN_AIFF_TRUE
USE_PLUGIN_ADPCMENC_FALSE
USE_PLUGIN_ADPCMENC_TRUE
USE_PLUGIN_ADPCMDEC_FALSE
USE_PLUGIN_ADPCMDEC_TRUE
USE_PLUGIN_ACCURIP_FALSE
USE_PLUGIN_ACCURIP_TRUE
DEFAULT_VISUALIZER
DEFAULT_VIDEOSRC
DEFAULT_VIDEOSINK
DEFAULT_AUDIOSRC
DEFAULT_AUDIOSINK
GST_LEVEL_DEFAULT
ERROR_OBJCFLAGS
WARNING_OBJCFLAGS
ERROR_CXXFLAGS
WARNING_CXXFLAGS
ERROR_CFLAGS
WARNING_CFLAGS
WITH_GST_PLAYER_TESTS_FALSE
WITH_GST_PLAYER_TESTS_TRUE
WGET
GST_PLUGIN_BUILD_STATIC_FALSE
GST_PLUGIN_BUILD_STATIC_TRUE
GST_PLUGIN_LIBTOOLFLAGS
plugindir
PLUGINDIR
LIBDIR
GST_LICENSE
HAVE_ORCC_FALSE
HAVE_ORCC_TRUE
HAVE_ORC_FALSE
HAVE_ORC_TRUE
ORCC_FLAGS
ORCC
ORC_LIBS
ORC_CFLAGS
USE_EXIF_FALSE
USE_EXIF_TRUE
EXIF_LIBS
EXIF_CFLAGS
HAVE_X11_FALSE
HAVE_X11_TRUE
HAVE_X11
X11_LIBS
X11_CFLAGS
GMODULE_NO_EXPORT_LIBS
GMODULE_NO_EXPORT_CFLAGS
GMODULE_EXPORT_LIBS
GMODULE_EXPORT_CFLAGS
HAVE_SDL_FALSE
HAVE_SDL_TRUE
SDL_CLUTTER
SDL_LIBS
SDL_CFLAGS
HAVE_GRAPHENE_FALSE
HAVE_GRAPHENE_TRUE
HAVE_GRAPHENE
GRAPHENE_LIBS
GRAPHENE_CFLAGS
HAVE_XCOMPOSITE_FALSE
HAVE_XCOMPOSITE_TRUE
XCOMPOSITE_LIBS
XCOMPOSITE_CFLAGS
HAVE_CLUTTER_X11_FALSE
HAVE_CLUTTER_X11_TRUE
HAVE_CLUTTER_GLX_FALSE
HAVE_CLUTTER_GLX_TRUE
HAVE_CLUTTER_FALSE
HAVE_CLUTTER_TRUE
HAVE_CLUTTER_X11
CLUTTER_X11_LIBS
CLUTTER_X11_CFLAGS
HAVE_CLUTTER_GLX
CLUTTER_GLX_LIBS
CLUTTER_GLX_CFLAGS
HAVE_CLUTTER
CLUTTER_LIBS
CLUTTER_CFLAGS
HAVE_GTK3_FALSE
HAVE_GTK3_TRUE
HAVE_GTK3
GTK_BASE_DIR
GTK_VERSION
GTK3_LIBS
GTK3_CFLAGS
HAVE_GTK_FALSE
HAVE_GTK_TRUE
GTK_LIBS
GTK_CFLAGS
GSTPB_PREFIX
GST_PREFIX
GLIB_PREFIX
GST_PLUGINS_LIBAV_DIR
GST_PLUGINS_LIBAV_LIBS
GST_PLUGINS_LIBAV_CFLAGS
GST_PLUGINS_UGLY_DIR
GST_PLUGINS_UGLY_LIBS
GST_PLUGINS_UGLY_CFLAGS
GST_PLUGINS_GOOD_DIR
GST_PLUGINS_GOOD_LIBS
GST_PLUGINS_GOOD_CFLAGS
GSTPB_PLUGINS_DIR
GST_PLUGINS_BASE_DIR
GST_PLUGINS_BASE_LIBS
GST_PLUGINS_BASE_CFLAGS
HAVE_GST_CHECK_FALSE
HAVE_GST_CHECK_TRUE
GST_NET_LIBS
GST_NET_CFLAGS
GST_CONTROLLER_LIBS
GST_CONTROLLER_CFLAGS
GST_CHECK_LIBS
GST_CHECK_CFLAGS
GST_BASE_LIBS
GST_BASE_CFLAGS
GST_PLUGINS_DIR
GST_TOOLS_DIR
GST_LIBS
GST_CFLAGS
GIO_LDFLAGS
GIO_LIBS
GIO_CFLAGS
GLIB_EXTRA_CFLAGS
GLIB_MKENUMS
GLIB_GENMARSHAL
GLIB_LIBS
GLIB_CFLAGS
GLIB_REQ
HAVE_PTHREAD_H_FALSE
HAVE_PTHREAD_H_TRUE
HAVE_UNISTD_H_FALSE
HAVE_UNISTD_H_TRUE
PTHREAD_CFLAGS
PTHREAD_LIBS
PTHREAD_CC
ax_pthread_config
LIBM
ENABLE_PLUGIN_DOCS_FALSE
ENABLE_PLUGIN_DOCS_TRUE
pkgpyexecdir
pyexecdir
pkgpythondir
pythondir
PYTHON_PLATFORM
PYTHON_EXEC_PREFIX
PYTHON_PREFIX
PYTHON_VERSION
PYTHON
GTK_DOC_USE_LIBTOOL_FALSE
GTK_DOC_USE_LIBTOOL_TRUE
GTK_DOC_BUILD_PDF_FALSE
GTK_DOC_BUILD_PDF_TRUE
GTK_DOC_BUILD_HTML_FALSE
GTK_DOC_BUILD_HTML_TRUE
ENABLE_GTK_DOC_FALSE
ENABLE_GTK_DOC_TRUE
GTKDOC_DEPS_LIBS
GTKDOC_DEPS_CFLAGS
HTML_DIR
GTKDOC_MKPDF
GTKDOC_REBASE
GTKDOC_CHECK
HAVE_INTROSPECTION_FALSE
HAVE_INTROSPECTION_TRUE
INTROSPECTION_INIT
INTROSPECTION_MAKEFILE
INTROSPECTION_LIBS
INTROSPECTION_CFLAGS
INTROSPECTION_TYPELIBDIR
INTROSPECTION_GIRDIR
INTROSPECTION_GENERATE
INTROSPECTION_COMPILER
INTROSPECTION_SCANNER
HAVE_VALGRIND_FALSE
HAVE_VALGRIND_TRUE
VALGRIND_PATH
am__fastdepOBJC_FALSE
am__fastdepOBJC_TRUE
OBJCDEPMODE
ac_ct_OBJC
OBJCFLAGS
OBJC
HAVE_CXX
CXXCPP
am__fastdepCXX_FALSE
am__fastdepCXX_TRUE
CXXDEPMODE
ac_ct_CXX
CXX
HAVE_CPU_CRISV32_FALSE
HAVE_CPU_CRISV32_TRUE
HAVE_CPU_CRIS_FALSE
HAVE_CPU_CRIS_TRUE
HAVE_CPU_X86_64_FALSE
HAVE_CPU_X86_64_TRUE
HAVE_CPU_M68K_FALSE
HAVE_CPU_M68K_TRUE
HAVE_CPU_IA64_FALSE
HAVE_CPU_IA64_TRUE
HAVE_CPU_S390_FALSE
HAVE_CPU_S390_TRUE
HAVE_CPU_MIPS_FALSE
HAVE_CPU_MIPS_TRUE
HAVE_CPU_HPPA_FALSE
HAVE_CPU_HPPA_TRUE
HAVE_CPU_SPARC_FALSE
HAVE_CPU_SPARC_TRUE
HAVE_CPU_ARM_FALSE
HAVE_CPU_ARM_TRUE
HAVE_CPU_ARC_FALSE
HAVE_CPU_ARC_TRUE
HAVE_CPU_ALPHA_FALSE
HAVE_CPU_ALPHA_TRUE
HAVE_CPU_PPC64_FALSE
HAVE_CPU_PPC64_TRUE
HAVE_CPU_PPC_FALSE
HAVE_CPU_PPC_TRUE
HAVE_CPU_I386_FALSE
HAVE_CPU_I386_TRUE
GST_PKG_CONFIG_PATH
BUILD_EXPERIMENTAL_FALSE
BUILD_EXPERIMENTAL_TRUE
USE_EXPERIMENTAL_FALSE
USE_EXPERIMENTAL_TRUE
BUILD_EXTERNAL_FALSE
BUILD_EXTERNAL_TRUE
USE_EXTERNAL_FALSE
USE_EXTERNAL_TRUE
GST_PLUGINS_NONPORTED
GST_PLUGINS_SELECTED
GST_PLUGINS_ALL
GST_PACKAGE_ORIGIN
GST_PACKAGE_NAME
BUILD_EXAMPLES_FALSE
BUILD_EXAMPLES_TRUE
GST_GCOV_ENABLED_FALSE
GST_GCOV_ENABLED_TRUE
CCASFLAGS
FFLAGS
CXXFLAGS
GCOV
GCOV_LIBS
GCOV_CFLAGS
VALGRIND_LIBS
VALGRIND_CFLAGS
PKG_CONFIG
LOCALEDIR
GETTEXT_PACKAGE
POSUB
LTLIBINTL
LIBINTL
INTLLIBS
LTLIBICONV
LIBICONV
INTL_MACOSX_LIBS
XGETTEXT_EXTRA_OPTIONS
MSGMERGE
XGETTEXT_015
XGETTEXT
GMSGFMT_015
MSGFMT_015
GMSGFMT
MSGFMT
GETTEXT_MACRO_VERSION
USE_NLS
ACLOCAL_AMFLAGS
CPP
LT_SYS_LIBRARY_PATH
OTOOL64
OTOOL
LIPO
NMEDIT
DSYMUTIL
MANIFEST_TOOL
RANLIB
ac_ct_AR
AR
LN_S
NM
ac_ct_DUMPBIN
DUMPBIN
LD
FGREP
EGREP
GREP
SED
am__fastdepCC_FALSE
am__fastdepCC_TRUE
CCDEPMODE
am__nodep
AMDEPBACKSLASH
AMDEP_FALSE
AMDEP_TRUE
am__quote
am__include
DEPDIR
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
LIBTOOL
OBJDUMP
DLLTOOL
AS
GST_LT_LDFLAGS
GST_LIBVERSION
GST_AGE
GST_REVISION
GST_CURRENT
GST_API_VERSION
MAINT
MAINTAINER_MODE_FALSE
MAINTAINER_MODE_TRUE
PACKAGE_VERSION_RELEASE
PACKAGE_VERSION_NANO
PACKAGE_VERSION_MICRO
PACKAGE_VERSION_MINOR
PACKAGE_VERSION_MAJOR
AM_BACKSLASH
AM_DEFAULT_VERBOSITY
AM_DEFAULT_V
AM_V
am__untar
am__tar
AMTAR
am__leading_dot
SET_MAKE
AWK
mkdir_p
MKDIR_P
INSTALL_STRIP_PROGRAM
STRIP
install_sh
MAKEINFO
AUTOHEADER
AUTOMAKE
AUTOCONF
ACLOCAL
VERSION
PACKAGE
CYGPATH_W
am__isrc
INSTALL_DATA
INSTALL_SCRIPT
INSTALL_PROGRAM
target_os
target_vendor
target_cpu
target
host_os
host_vendor
host_cpu
host
build_os
build_vendor
build_cpu
build
target_alias
host_alias
build_alias
LIBS
ECHO_T
ECHO_N
ECHO_C
DEFS
mandir
localedir
libdir
psdir
pdfdir
dvidir
htmldir
infodir
docdir
oldincludedir
includedir
runstatedir
localstatedir
sharedstatedir
sysconfdir
datadir
datarootdir
libexecdir
sbindir
bindir
program_transform_name
prefix
exec_prefix
PACKAGE_URL
PACKAGE_BUGREPORT
PACKAGE_STRING
PACKAGE_VERSION
PACKAGE_TARNAME
PACKAGE_NAME
PATH_SEPARATOR
SHELL'
ac_subst_files=''
ac_user_opts='
enable_option_checking
enable_silent_rules
enable_maintainer_mode
enable_static
enable_shared
with_pic
enable_fast_install
with_aix_soname
enable_dependency_tracking
with_gnu_ld
with_sysroot
enable_libtool_lock
with_autoconf
with_autoheader
with_automake
with_aclocal
enable_nls
enable_rpath
with_libiconv_prefix
with_libintl_prefix
enable_fatal_warnings
enable_extra_check
enable_debug
enable_profiling
enable_valgrind
enable_gcov
enable_examples
with_pkg_config_path
with_package_name
with_package_origin
with_plugins
enable_external
enable_experimental
enable_introspection
with_html_dir
enable_gtk_doc
enable_gtk_doc_html
enable_gtk_doc_pdf
enable_gobject_cast_checks
enable_glib_asserts
with_gtk
enable_Bsymbolic
enable_orc
enable_static_plugins
with_player_tests
with_default_audiosink
with_default_audiosrc
with_default_videosink
with_default_videosrc
with_default_visualizer
enable_accurip
enable_adpcmdec
enable_adpcmenc
enable_aiff
enable_videoframe_audiolevel
enable_asfmux
enable_audiofxbad
enable_audiomixer
enable_compositor
enable_audiovisualizers
enable_autoconvert
enable_bayer
enable_camerabin2
enable_cdxaparse
enable_coloreffects
enable_dataurisrc
enable_dccp
enable_debugutils
enable_dvbsuboverlay
enable_dvdspu
enable_faceoverlay
enable_festival
enable_fieldanalysis
enable_freeverb
enable_frei0r
enable_gaudieffects
enable_geometrictransform
enable_gdp
enable_hdvparse
enable_id3tag
enable_inter
enable_interlace
enable_ivfparse
enable_ivtc
enable_jp2kdecimator
enable_jpegformat
enable_librfb
enable_midi
enable_mpegdemux
enable_mpegtsdemux
enable_mpegtsmux
enable_mpegpsmux
enable_mve
enable_mxf
enable_netsim
enable_nuvdemux
enable_onvif
enable_patchdetect
enable_pcapparse
enable_pnm
enable_rawparse
enable_removesilence
enable_sdi
enable_sdp
enable_segmentclip
enable_siren
enable_smooth
enable_speed
enable_subenc
enable_stereo
enable_tta
enable_videofilters
enable_videomeasure
enable_videoparsers
enable_videosignal
enable_vmnc
enable_y4m
enable_yadif
enable_opengl
with_opengl_module_name
enable_gles2
with_gles2_module_name
enable_egl
with_egl_module_name
enable_wgl
enable_glx
enable_cocoa
enable_x11
enable_wayland
enable_dispmanx
with_jpeg_mmx
enable_directsound
enable_wasapi
enable_direct3d
enable_winscreencap
enable_winks
enable_android_media
enable_apple_media
enable_bluez
enable_avc
enable_shm
enable_vcd
enable_opensles
enable_uvch264
enable_nvenc
with_cuda_prefix
enable_tinyalsa
enable_assrender
enable_voamrwbenc
enable_voaacenc
enable_apexsink
enable_bs2b
enable_bz2
enable_chromaprint
enable_curl
enable_dash
enable_dc1394
enable_decklink
enable_directfb
enable_webp
enable_daala
enable_dts
enable_resindvd
enable_faac
enable_faad
enable_fbdev
enable_flite
enable_gsm
enable_fluidsynth
enable_kate
enable_ladspa
enable_lv2
enable_libde265
enable_libmms
enable_srtp
enable_dtls
enable_linsys
enable_modplug
enable_mimic
enable_mpeg2enc
enable_mplex
enable_musepack
enable_nas
enable_neon
enable_ofa
enable_openal
enable_opencv
enable_openexr
enable_openh264
enable_openjpeg
enable_openni2
enable_opus
enable_pvr
with_pvr_external_headers
enable_rsvg
enable_gl
enable_gtk3
enable_qt
enable_vulkan
enable_libvisual
enable_timidity
enable_teletextdec
enable_wildmidi
enable_sdl
with_sdl_prefix
with_sdl_exec_prefix
enable_sdltest
enable_smoothstreaming
enable_sndfile
enable_soundtouch
enable_spc
enable_gme
enable_xvid
enable_dvb
enable_wininet
enable_acm
enable_vdpau
enable_sbc
enable_schro
enable_zbar
enable_rtmp
enable_spandsp
enable_sndio
with_hls_crypto
enable_hls
with_libgcrypt_prefix
enable_x265
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
LT_SYS_LIBRARY_PATH
CPP
PKG_CONFIG
VALGRIND_CFLAGS
VALGRIND_LIBS
CXX
CXXFLAGS
CCC
CXXCPP
OBJC
OBJCFLAGS
GTKDOC_DEPS_CFLAGS
GTKDOC_DEPS_LIBS
PYTHON
GLIB_CFLAGS
GLIB_LIBS
GIO_CFLAGS
GIO_LIBS
GST_CFLAGS
GST_LIBS
GST_BASE_CFLAGS
GST_BASE_LIBS
GST_CHECK_CFLAGS
GST_CHECK_LIBS
GST_CONTROLLER_CFLAGS
GST_CONTROLLER_LIBS
GST_NET_CFLAGS
GST_NET_LIBS
GST_PLUGINS_BASE_CFLAGS
GST_PLUGINS_BASE_LIBS
GST_PLUGINS_GOOD_CFLAGS
GST_PLUGINS_GOOD_LIBS
GST_PLUGINS_UGLY_CFLAGS
GST_PLUGINS_UGLY_LIBS
GST_PLUGINS_LIBAV_CFLAGS
GST_PLUGINS_LIBAV_LIBS
GTK_CFLAGS
GTK_LIBS
GTK3_CFLAGS
GTK3_LIBS
CLUTTER_CFLAGS
CLUTTER_LIBS
CLUTTER_GLX_CFLAGS
CLUTTER_GLX_LIBS
CLUTTER_X11_CFLAGS
CLUTTER_X11_LIBS
XCOMPOSITE_CFLAGS
XCOMPOSITE_LIBS
GRAPHENE_CFLAGS
GRAPHENE_LIBS
SDL_CFLAGS
SDL_LIBS
GMODULE_EXPORT_CFLAGS
GMODULE_EXPORT_LIBS
GMODULE_NO_EXPORT_CFLAGS
GMODULE_NO_EXPORT_LIBS
X11_CFLAGS
X11_LIBS
EXIF_CFLAGS
EXIF_LIBS
ORC_CFLAGS
ORC_LIBS
X_CFLAGS
X_LIBS
GL_CFLAGS
GL_LIBS
GLES2_CFLAGS
GLES2_LIBS
EGL_CFLAGS
EGL_LIBS
WAYLAND_EGL_CFLAGS
WAYLAND_EGL_LIBS
GST_ALLOCATORS_CFLAGS
GST_ALLOCATORS_LIBS
LIBPNG_CFLAGS
LIBPNG_LIBS
XCB_CFLAGS
XCB_LIBS
BLUEZ5_CFLAGS
BLUEZ5_LIBS
GIO_UNIX_CFLAGS
GIO_UNIX_LIBS
G_UDEV_CFLAGS
G_UDEV_LIBS
LIBUSB_CFLAGS
LIBUSB_LIBS
GST_VIDEO_CFLAGS
GST_VIDEO_LIBS
GST_PBUTILS_CFLAGS
GST_PBUTILS_LIBS
CUDA_CFLAGS
CUDA_LIBS
NVENCODE_CFLAGS
NVENCODE_LIBS
ASSRENDER_CFLAGS
ASSRENDER_LIBS
VOAMRWBENC_CFLAGS
VOAMRWBENC_LIBS
VOAACENC_CFLAGS
VOAACENC_LIBS
APEXSINK_CFLAGS
APEXSINK_LIBS
BS2B_CFLAGS
BS2B_LIBS
CHROMAPRINT_CFLAGS
CHROMAPRINT_LIBS
CURL_CFLAGS
CURL_LIBS
SSH2_CFLAGS
SSH2_LIBS
LIBXML2_CFLAGS
LIBXML2_LIBS
LIBDC1394_CFLAGS
LIBDC1394_LIBS
DIRECTFB_CFLAGS
DIRECTFB_LIBS
WAYLAND_CFLAGS
WAYLAND_LIBS
WEBP_CFLAGS
WEBP_LIBS
DAALA_CFLAGS
DAALA_LIBS
DVDNAV_CFLAGS
DVDNAV_LIBS
FLUIDSYNTH_CFLAGS
FLUIDSYNTH_LIBS
KATE_CFLAGS
KATE_LIBS
TIGER_CFLAGS
TIGER_LIBS
LRDF_CFLAGS
LRDF_LIBS
SLV2_CFLAGS
SLV2_LIBS
LIBDE265_CFLAGS
LIBDE265_LIBS
LIBMMS_CFLAGS
LIBMMS_LIBS
SRTP_CFLAGS
SRTP_LIBS
DTLS_CFLAGS
DTLS_LIBS
MODPLUG_CFLAGS
MODPLUG_LIBS
MIMIC_CFLAGS
MIMIC_LIBS
MJPEG_CFLAGS
MJPEG_LIBS
MPEG2ENC_CFLAGS
MPEG2ENC_LIBS
MPLEX_CFLAGS
MPLEX_LIBS
NEON_CFLAGS
NEON_LIBS
OFA_CFLAGS
OFA_LIBS
OPENAL_CFLAGS
OPENAL_LIBS
OPENCV_CFLAGS
OPENCV_LIBS
OPENEXR_CFLAGS
OPENEXR_LIBS
OPENH264_CFLAGS
OPENH264_LIBS
OPENJPEG_CFLAGS
OPENJPEG_LIBS
OPENNI2_CFLAGS
OPENNI2_LIBS
OPUS_CFLAGS
OPUS_LIBS
PVR_CFLAGS
PVR_LIBS
RSVG_CFLAGS
RSVG_LIBS
GTK3_GL_CFLAGS
GTK3_GL_LIBS
GTK3_X11_CFLAGS
GTK3_X11_LIBS
GTK3_WAYLAND_CFLAGS
GTK3_WAYLAND_LIBS
QT_CFLAGS
QT_LIBS
QT_X11_CFLAGS
QT_X11_LIBS
QT_WAYLAND_CFLAGS
QT_WAYLAND_LIBS
QT_ANDROID_CFLAGS
QT_ANDROID_LIBS
GNUSTL_CFLAGS
GNUSTL_LIBS
QT_MAC_CFLAGS
QT_MAC_LIBS
LIBVISUAL_CFLAGS
LIBVISUAL_LIBS
TIMIDITY_CFLAGS
TIMIDITY_LIBS
TELETEXTDEC_CFLAGS
TELETEXTDEC_LIBS
SNDFILE_CFLAGS
SNDFILE_LIBS
SOUNDTOUCH_CFLAGS
SOUNDTOUCH_LIBS
VDPAU_CFLAGS
VDPAU_LIBS
SBC_CFLAGS
SBC_LIBS
SCHRO_CFLAGS
SCHRO_LIBS
ZBAR_CFLAGS
ZBAR_LIBS
RTMP_CFLAGS
RTMP_LIBS
SPANDSP_CFLAGS
SPANDSP_LIBS
NETTLE_CFLAGS
NETTLE_LIBS
OPENSSL_CFLAGS
OPENSSL_LIBS
X265_CFLAGS
X265_LIBS'


# Initialize some variables set by options.
ac_init_help=
ac_init_version=false
ac_unrecognized_opts=
ac_unrecognized_sep=
# The variables have the same names as the options, with
# dashes changed to underlines.
cache_file=/dev/null
exec_prefix=NONE
no_create=
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
verbose=
x_includes=NONE
x_libraries=NONE

# Installation directory options.
# These are left unexpanded so users can "make install exec_prefix=/foo"
# and all the variables that are supposed to be based on exec_prefix
# by default will actually change.
# Use braces instead of parens because sh, perl, etc. also accept them.
# (The list follows the same order as the GNU Coding Standards.)
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datarootdir='${prefix}/share'
datadir='${datarootdir}'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
runstatedir='${localstatedir}/run'
includedir='${prefix}/include'
oldincludedir='/usr/include'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
infodir='${datarootdir}/info'
htmldir='${docdir}'
dvidir='${docdir}'
pdfdir='${docdir}'
psdir='${docdir}'
libdir='${exec_prefix}/lib'
localedir='${datarootdir}/locale'
mandir='${datarootdir}/man'

ac_prev=
ac_dashdash=
for ac_option
do
  # If the previous option needs an argument, assign it.
  if test -n "$ac_prev"; then
    eval $ac_prev=\$ac_option
    ac_prev=
    continue
  fi

  case $ac_option in
  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
  *=)   ac_optarg= ;;
  *)    ac_optarg=yes ;;
  esac

  # Accept the important Cygnus configure options, so we can diagnose typos.

  case $ac_dashdash$ac_option in
  --)
    ac_dashdash=yes ;;

  -bindir | --bindir | --bindi | --bind | --bin | --bi)
    ac_prev=bindir ;;
  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
    bindir=$ac_optarg ;;

  -build | --build | --buil | --bui | --bu)
    ac_prev=build_alias ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build_alias=$ac_optarg ;;

  -cache-file | --cache-file | --cache-fil | --cache-fi \
  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
    ac_prev=cache_file ;;
  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
    cache_file=$ac_optarg ;;

  --config-cache | -C)
    cache_file=config.cache ;;

  -datadir | --datadir | --datadi | --datad)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=*)
    datadir=$ac_optarg ;;

  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
  | --dataroo | --dataro | --datar)
    ac_prev=datarootdir ;;
  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
    datarootdir=$ac_optarg ;;

  -disable-* | --disable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=no ;;

  -docdir | --docdir | --docdi | --doc | --do)
    ac_prev=docdir ;;
  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
    docdir=$ac_optarg ;;

  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
    ac_prev=dvidir ;;
  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
    dvidir=$ac_optarg ;;

  -enable-* | --enable-*)
    ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid feature name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"enable_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval enable_$ac_useropt=\$ac_optarg ;;

  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
  | --exec | --exe | --ex)
    ac_prev=exec_prefix ;;
  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
  | --exec=* | --exe=* | --ex=*)
    exec_prefix=$ac_optarg ;;

  -gas | --gas | --ga | --g)
    # Obsolete; use --with-gas.
    with_gas=yes ;;

  -help | --help | --hel | --he | -h)
    ac_init_help=long ;;
  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
    ac_init_help=recursive ;;
  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
    ac_init_help=short ;;

  -host | --host | --hos | --ho)
    ac_prev=host_alias ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host_alias=$ac_optarg ;;

  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
    ac_prev=htmldir ;;
  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
  | --ht=*)
    htmldir=$ac_optarg ;;

  -includedir | --includedir | --includedi | --included | --include \
  | --includ | --inclu | --incl | --inc)
    ac_prev=includedir ;;
  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
  | --includ=* | --inclu=* | --incl=* | --inc=*)
    includedir=$ac_optarg ;;

  -infodir | --infodir | --infodi | --infod | --info | --inf)
    ac_prev=infodir ;;
  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
    infodir=$ac_optarg ;;

  -libdir | --libdir | --libdi | --libd)
    ac_prev=libdir ;;
  -libdir=* | --libdir=* | --libdi=* | --libd=*)
    libdir=$ac_optarg ;;

  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
  | --libexe | --libex | --libe)
    ac_prev=libexecdir ;;
  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
  | --libexe=* | --libex=* | --libe=*)
    libexecdir=$ac_optarg ;;

  -localedir | --localedir | --localedi | --localed | --locale)
    ac_prev=localedir ;;
  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
    localedir=$ac_optarg ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst | --locals)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
    localstatedir=$ac_optarg ;;

  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
    ac_prev=mandir ;;
  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
    mandir=$ac_optarg ;;

  -nfp | --nfp | --nf)
    # Obsolete; use --without-fp.
    with_fp=no ;;

  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c | -n)
    no_create=yes ;;

  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
    no_recursion=yes ;;

  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
  | --oldin | --oldi | --old | --ol | --o)
    ac_prev=oldincludedir ;;
  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
    oldincludedir=$ac_optarg ;;

  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
    ac_prev=prefix ;;
  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
    prefix=$ac_optarg ;;

  -program-prefix | --program-prefix | --program-prefi | --program-pref \
  | --program-pre | --program-pr | --program-p)
    ac_prev=program_prefix ;;
  -program-prefix=* | --program-prefix=* | --program-prefi=* \
  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
    program_prefix=$ac_optarg ;;

  -program-suffix | --program-suffix | --program-suffi | --program-suff \
  | --program-suf | --program-su | --program-s)
    ac_prev=program_suffix ;;
  -program-suffix=* | --program-suffix=* | --program-suffi=* \
  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
    program_suffix=$ac_optarg ;;

  -program-transform-name | --program-transform-name \
  | --program-transform-nam | --program-transform-na \
  | --program-transform-n | --program-transform- \
  | --program-transform | --program-transfor \
  | --program-transfo | --program-transf \
  | --program-trans | --program-tran \
  | --progr-tra | --program-tr | --program-t)
    ac_prev=program_transform_name ;;
  -program-transform-name=* | --program-transform-name=* \
  | --program-transform-nam=* | --program-transform-na=* \
  | --program-transform-n=* | --program-transform-=* \
  | --program-transform=* | --program-transfor=* \
  | --program-transfo=* | --program-transf=* \
  | --program-trans=* | --program-tran=* \
  | --progr-tra=* | --program-tr=* | --program-t=*)
    program_transform_name=$ac_optarg ;;

  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
    ac_prev=pdfdir ;;
  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
    pdfdir=$ac_optarg ;;

  -psdir | --psdir | --psdi | --psd | --ps)
    ac_prev=psdir ;;
  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
    psdir=$ac_optarg ;;

  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil)
    silent=yes ;;

  -runstatedir | --runstatedir | --runstatedi | --runstated \
  | --runstate | --runstat | --runsta | --runst | --runs \
  | --run | --ru | --r)
    ac_prev=runstatedir ;;
  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
  | --run=* | --ru=* | --r=*)
    runstatedir=$ac_optarg ;;

  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
    ac_prev=sbindir ;;
  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
  | --sbi=* | --sb=*)
    sbindir=$ac_optarg ;;

  -sharedstatedir | --sharedstatedir | --sharedstatedi \
  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
  | --sharedst | --shareds | --shared | --share | --shar \
  | --sha | --sh)
    ac_prev=sharedstatedir ;;
  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
  | --sha=* | --sh=*)
    sharedstatedir=$ac_optarg ;;

  -site | --site | --sit)
    ac_prev=site ;;
  -site=* | --site=* | --sit=*)
    site=$ac_optarg ;;

  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
    ac_prev=srcdir ;;
  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
    srcdir=$ac_optarg ;;

  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
  | --syscon | --sysco | --sysc | --sys | --sy)
    ac_prev=sysconfdir ;;
  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
    sysconfdir=$ac_optarg ;;

  -target | --target | --targe | --targ | --tar | --ta | --t)
    ac_prev=target_alias ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target_alias=$ac_optarg ;;

  -v | -verbose | --verbose | --verbos | --verbo | --verb)
    verbose=yes ;;

  -version | --version | --versio | --versi | --vers | -V)
    ac_init_version=: ;;

  -with-* | --with-*)
    ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=\$ac_optarg ;;

  -without-* | --without-*)
    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
    # Reject names that are not valid shell variable names.
    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
      as_fn_error $? "invalid package name: $ac_useropt"
    ac_useropt_orig=$ac_useropt
    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
    case $ac_user_opts in
      *"
"with_$ac_useropt"
"*) ;;
      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
	 ac_unrecognized_sep=', ';;
    esac
    eval with_$ac_useropt=no ;;

  --x)
    # Obsolete; use --with-x.
    with_x=yes ;;

  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
  | --x-incl | --x-inc | --x-in | --x-i)
    ac_prev=x_includes ;;
  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
    x_includes=$ac_optarg ;;

  -x-libraries | --x-libraries | --x-librarie | --x-librari \
  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
    ac_prev=x_libraries ;;
  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
    x_libraries=$ac_optarg ;;

  -*) as_fn_error $? "unrecognized option: \`$ac_option'
Try \`$0 --help' for more information"
    ;;

  *=*)
    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
    # Reject names that are not valid shell variable names.
    case $ac_envvar in #(
      '' | [0-9]* | *[!_$as_cr_alnum]* )
      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
    esac
    eval $ac_envvar=\$ac_optarg
    export $ac_envvar ;;

  *)
    # FIXME: should be removed in autoconf 3.0.
    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
      $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2
    : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}"
    ;;

  esac
done

if test -n "$ac_prev"; then
  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
  as_fn_error $? "missing argument to $ac_option"
fi

if test -n "$ac_unrecognized_opts"; then
  case $enable_option_checking in
    no) ;;
    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
  esac
fi

# Check all directory arguments for consistency.
for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
		datadir sysconfdir sharedstatedir localstatedir includedir \
		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
		libdir localedir mandir runstatedir
do
  eval ac_val=\$$ac_var
  # Remove trailing slashes.
  case $ac_val in
    */ )
      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
      eval $ac_var=\$ac_val;;
  esac
  # Be sure to have absolute directory names.
  case $ac_val in
    [\\/$]* | ?:[\\/]* )  continue;;
    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
  esac
  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
done

# There might be people who depend on the old broken behavior: `$host'
# used to hold the argument of --host etc.
# FIXME: To remove some day.
build=$build_alias
host=$host_alias
target=$target_alias

# FIXME: To remove some day.
if test "x$host_alias" != x; then
  if test "x$build_alias" = x; then
    cross_compiling=maybe
  elif test "x$build_alias" != "x$host_alias"; then
    cross_compiling=yes
  fi
fi

ac_tool_prefix=
test -n "$host_alias" && ac_tool_prefix=$host_alias-

test "$silent" = yes && exec 6>/dev/null


ac_pwd=`pwd` && test -n "$ac_pwd" &&
ac_ls_di=`ls -di .` &&
ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
  as_fn_error $? "working directory cannot be determined"
test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
  as_fn_error $? "pwd does not report name of working directory"


# Find the source files, if location was not specified.
if test -z "$srcdir"; then
  ac_srcdir_defaulted=yes
  # Try the directory containing this script, then the parent directory.
  ac_confdir=`$as_dirname -- "$as_myself" ||
$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_myself" : 'X\(//\)[^/]' \| \
	 X"$as_myself" : 'X\(//\)$' \| \
	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_myself" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  srcdir=$ac_confdir
  if test ! -r "$srcdir/$ac_unique_file"; then
    srcdir=..
  fi
else
  ac_srcdir_defaulted=no
fi
if test ! -r "$srcdir/$ac_unique_file"; then
  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
fi
ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
ac_abs_confdir=`(
	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
	pwd)`
# When building in place, set srcdir=.
if test "$ac_abs_confdir" = "$ac_pwd"; then
  srcdir=.
fi
# Remove unnecessary trailing slashes from srcdir.
# Double slashes in file names in object file debugging info
# mess up M-x gdb in Emacs.
case $srcdir in
*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
esac
for ac_var in $ac_precious_vars; do
  eval ac_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_env_${ac_var}_value=\$${ac_var}
  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
  eval ac_cv_env_${ac_var}_value=\$${ac_var}
done

#
# Report the --help message.
#
if test "$ac_init_help" = "long"; then
  # Omit some internal or obsolete options to make the list less imposing.
  # This message is too long to be a string in the A/UX 3.1 sh.
  cat <<_ACEOF
\`configure' configures GStreamer Bad Plug-ins 1.8.0 to adapt to many kinds of systems.

Usage: $0 [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print \`checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for \`--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or \`..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]

By default, \`make install' will install all the files in
\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
an installation prefix other than \`$ac_default_prefix' using \`--prefix',
for instance \`--prefix=\$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR            user executables [EPREFIX/bin]
  --sbindir=DIR           system admin executables [EPREFIX/sbin]
  --libexecdir=DIR        program executables [EPREFIX/libexec]
  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]
  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]
  --libdir=DIR            object code libraries [EPREFIX/lib]
  --includedir=DIR        C header files [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc [/usr/include]
  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]
  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]
  --infodir=DIR           info documentation [DATAROOTDIR/info]
  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]
  --mandir=DIR            man documentation [DATAROOTDIR/man]
  --docdir=DIR            documentation root [DATAROOTDIR/doc/gst-plugins-bad]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
  --target=TARGET   configure for building compilers for TARGET [HOST]
_ACEOF
fi

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.8.0:";;
   esac
  cat <<\_ACEOF

Optional Features:
  --disable-option-checking  ignore unrecognized --enable/--with options
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-silent-rules   less verbose build output (undo: "make V=1")
  --disable-silent-rules  verbose build output (undo: "make V=0")
  --disable-maintainer-mode
                          disable make rules and dependencies not useful (and
                          sometimes confusing) to the casual installer
  --enable-static[=PKGS]  build static libraries [default=no]
  --enable-shared[=PKGS]  build shared libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --enable-dependency-tracking
                          do not reject slow dependency extractors
  --disable-dependency-tracking
                          speeds up one-time build
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --disable-nls           do not use Native Language Support
  --disable-rpath         do not hardcode runtime library paths
  --disable-fatal-warnings
                          Don't turn compiler warnings into fatal errors
  --enable-extra-checks   Enable extra runtime checks
  --disable-debug         disable addition of -g debugging info
  --enable-profiling      adds -pg to compiler commandline, for profiling
  --disable-valgrind      disable run-time valgrind detection
  --enable-gcov           compile with coverage profiling instrumentation (gcc
                          only)
  --disable-examples      disable building examples
  --disable-external           disable building of plug-ins with external deps
  --enable-experimental        enable building of experimental plug-ins
  --enable-introspection=[no/auto/yes]
                          Enable introspection for this build
  --enable-gtk-doc        use gtk-doc to build documentation [[default=no]]
  --enable-gtk-doc-html   build documentation in html format [[default=yes]]
  --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
  --enable-gobject-cast-checks=[no/auto/yes]
                          Enable GObject cast checks
  --enable-glib-asserts=[no/yes]
                          Enable GLib assertion
  --disable-Bsymbolic     avoid linking with -Bsymbolic
  --enable-orc            use Orc if installed
  --enable-static-plugins build static plugins [default=no]
  --disable-accurip       disable dependency-less accurip plugin
  --disable-adpcmdec      disable dependency-less adpcmdec plugin
  --disable-adpcmenc      disable dependency-less adpcmenc plugin
  --disable-aiff          disable dependency-less aiff plugin
  --disable-videoframe_audiolevel
                          disable dependency-less videoframe_audiolevel plugin
  --disable-asfmux        disable dependency-less asfmux plugin
  --disable-audiofxbad    disable dependency-less audiofxbad plugin
  --disable-audiomixer    disable dependency-less audiomixer plugin
  --disable-compositor    disable dependency-less compositor plugin
  --disable-audiovisualizers
                          disable dependency-less audiovisualizers plugin
  --disable-autoconvert   disable dependency-less autoconvert plugin
  --disable-bayer         disable dependency-less bayer plugin
  --disable-camerabin2    disable dependency-less camerabin2 plugin
  --disable-cdxaparse     disable dependency-less cdxaparse plugin
  --disable-coloreffects  disable dependency-less coloreffects plugin
  --disable-dataurisrc    disable dependency-less dataurisrc plugin
  --disable-dccp          disable dependency-less dccp plugin
  --disable-debugutils    disable dependency-less debugutils plugin
  --disable-dvbsuboverlay disable dependency-less dvbsuboverlay plugin
  --disable-dvdspu        disable dependency-less dvdspu plugin
  --disable-faceoverlay   disable dependency-less faceoverlay plugin
  --disable-festival      disable dependency-less festival plugin
  --disable-fieldanalysis disable dependency-less fieldanalysis plugin
  --disable-freeverb      disable dependency-less freeverb plugin
  --disable-frei0r        disable dependency-less frei0r plugin
  --disable-gaudieffects  disable dependency-less gaudieffects plugin
  --disable-geometrictransform
                          disable dependency-less geometrictransform plugin
  --disable-gdp           disable dependency-less gdp plugin
  --disable-hdvparse      disable dependency-less hdvparse plugin
  --disable-id3tag        disable dependency-less id3tag plugin
  --disable-inter         disable dependency-less inter plugin
  --disable-interlace     disable dependency-less interlace plugin
  --disable-ivfparse      disable dependency-less ivfparse plugin
  --disable-ivtc          disable dependency-less ivtc plugin
  --disable-jp2kdecimator disable dependency-less jp2kdecimator plugin
  --disable-jpegformat    disable dependency-less jpegformat plugin
  --disable-librfb        disable dependency-less librfb plugin
  --disable-midi          disable dependency-less midi plugin
  --disable-mpegdemux     disable dependency-less mpegdemux plugin
  --disable-mpegtsdemux   disable dependency-less mpegtsdemux plugin
  --disable-mpegtsmux     disable dependency-less mpegtsmux plugin
  --disable-mpegpsmux     disable dependency-less mpegpsmux plugin
  --disable-mve           disable dependency-less mve plugin
  --disable-mxf           disable dependency-less mxf plugin
  --disable-netsim        disable dependency-less netsim plugin
  --disable-nuvdemux      disable dependency-less nuvdemux plugin
  --disable-onvif         disable dependency-less onvif plugin
  --disable-patchdetect   disable dependency-less patchdetect plugin
  --disable-pcapparse     disable dependency-less pcapparse plugin
  --disable-pnm           disable dependency-less pnm plugin
  --disable-rawparse      disable dependency-less rawparse plugin
  --disable-removesilence disable dependency-less removesilence plugin
  --disable-sdi           disable dependency-less sdi plugin
  --disable-sdp           disable dependency-less sdp plugin
  --disable-segmentclip   disable dependency-less segmentclip plugin
  --disable-siren         disable dependency-less siren plugin
  --disable-smooth        disable dependency-less smooth plugin
  --disable-speed         disable dependency-less speed plugin
  --disable-subenc        disable dependency-less subenc plugin
  --disable-stereo        disable dependency-less stereo plugin
  --disable-tta           disable dependency-less tta plugin
  --disable-videofilters  disable dependency-less videofilters plugin
  --disable-videomeasure  disable dependency-less videomeasure plugin
  --disable-videoparsers  disable dependency-less videoparsers plugin
  --disable-videosignal   disable dependency-less videosignal plugin
  --disable-vmnc          disable dependency-less vmnc plugin
  --disable-y4m           disable dependency-less y4m plugin
  --disable-yadif         disable dependency-less yadif plugin
  --enable-opengl         Enable Desktop OpenGL support [default=auto]
  --enable-gles2          Enable OpenGL|ES 2.0 support [default=auto]
  --enable-egl            Enable EGL support [default=auto]
  --enable-wgl            Enable WGL support [default=auto]
  --enable-glx            Enable GLX support [default=auto]
  --enable-cocoa          Enable Cocoa support [default=auto]
  --enable-x11            Enable x11 support [default=auto]
  --enable-wayland        Enable Wayland support (requires EGL) [default=auto]
  --enable-dispmanx        Enable Dispmanx support (requires EGL) [default=auto]
  --disable-directsound        disable DirectSound: directsoundsrc
  --disable-wasapi             disable WASAPI plug-in: wasapi
  --disable-direct3d           disable Direct3D plug-in: direct3dsink
  --disable-winscreencap       disable winscreencap plug-in: winscreencap
  --disable-winks              disable Winks plug-in: winks
  --disable-android_media      disable Android Media: androidmedia
  --disable-apple_media        disable Apple video: applemedia
  --disable-bluez              disable Bluez: bluez
  --disable-avc                disable AVC Video Services: avcsrc
  --disable-shm                disable POSIX shared memory source and sink: shm
  --disable-vcd                disable Video CD: vcdsrc
  --disable-opensles           disable OpenSL ES: opensl
  --disable-uvch264            disable UVC H264: uvch264
  --disable-nvenc              disable NVIDIA Encode API: nvenc
  --disable-tinyalsa           disable tinyalsa: tinyalsa
  --disable-assrender          disable ASS/SSA renderer: assrender
  --disable-voamrwbenc         disable vo-amrwbenc library: vo-amrwbenc
  --disable-voaacenc           disable vo-aacenc library: vo-aacenc
  --disable-apexsink           disable AirPort Express Wireless sink: apexsink
  --disable-bs2b               disable bs2b: bs2b
  --disable-bz2                disable bz2 library: bz2
  --disable-chromaprint        disable chromaprint: chromaprint
  --disable-curl               disable Curl plugin: curl
  --disable-dash               disable DASH plug-in: dash
  --disable-dc1394             disable libdc1394: dc1394
  --disable-decklink           disable decklink: decklink
  --disable-directfb           disable directfb: dfbvideosink
  --disable-wayland            disable wayland sink: wayland
  --disable-webp               disable WebP: webp
  --disable-daala              disable daala: daala
  --disable-dts                disable dts library: dtsdec
  --disable-resindvd           disable resindvd plugin: resindvd
  --disable-faac               disable AAC encoder plug-in: faac
  --disable-faad               disable FAAD2 AAC decoder plug-in: faad
  --disable-fbdev              disable linux framebuffer: fbdevsink
  --disable-flite              disable Flite plugin: flite
  --disable-gsm                disable GSM library: gsmenc gsmdec
  --disable-fluidsynth         disable fluidsynth: fluidsynth
  --disable-kate               disable Kate: kate
  --disable-ladspa             disable ladspa: ladspa
  --disable-lv2                disable lv2: lv2
  --disable-libde265           disable libde265 HEVC/H.265 decoder: libde265
  --disable-libmms             disable mms protocol library: libmms
  --disable-srtp               disable srtp library: srtp
  --disable-dtls               disable DTLS plugin: dtls
  --disable-linsys             disable Linear Systems SDI plugin: linsys
  --disable-modplug            disable modplug: modplug
  --disable-mimic              disable libmimic library: mimic
  --disable-mpeg2enc           disable mpeg2enc: mpeg2enc
  --disable-mplex              disable mplex: mplex
  --disable-musepack           disable musepackdec: musepack
  --disable-nas                disable nas plug-in: nassink
  --disable-neon               disable neon http client plugins: neonhttpsrc
  --disable-ofa                disable ofa plugins: ofa
  --disable-openal             disable OpenAL plugin: openal
  --disable-opencv             disable opencv plugins: opencv
  --disable-openexr            disable openexr library: openexr
  --disable-openh264           disable openh264 library: openh264
  --disable-openjpeg           disable openjpeg library: openjpeg
  --disable-openni2            disable openni2 library: openni2
  --disable-opus               disable opus: opus
  --disable-pvr                disable pvrvideosink: pvr
  --disable-rsvg               disable rsvg decoder: rsvg
  --disable-gl                 disable gl elements: gl
  --disable-gtk3               disable Gtk+ elements: gtk
  --disable-qt                 disable Qt elements: qt
  --disable-vulkan             disable Vulkan elements: vulkan
  --disable-libvisual          disable libvisual visualization library: libvisual
  --disable-timidity           disable timidity midi soft synth plugin: timidity
  --disable-teletextdec        disable Teletext decoder: teletextdec
  --disable-wildmidi           disable wildmidi midi soft synth plugin: wildmidi
  --disable-sdl                disable SDL plug-in: sdlvideosink sdlaudiosink
  --disable-sdltest       do not try to compile and run a test SDL program
  --disable-smoothstreaming    disable Smooth Streaming plug-in: smoothstreaming
  --disable-sndfile            disable sndfile plug-in: sfdec sfenc
  --disable-soundtouch         disable soundtouch plug-in: soundtouch
  --disable-spc                disable spc decoder: spc
  --disable-gme                disable gme decoder: gme
  --disable-xvid               disable xvid plugins: xvid
  --disable-dvb                disable DVB Source: dvb
  --disable-wininet            disable Windows internet library: wininet
  --disable-acm                disable Windows ACM library: acm
  --disable-vdpau              disable VDPAU: vdpau
  --disable-sbc                disable SBC bluetooth audio codec: sbc
  --disable-schro              disable Schroedinger video codec: schro
  --disable-zbar               disable ZBar barcode detector: zbar
  --disable-rtmp               disable rtmp library: rtmp
  --disable-spandsp            disable Spandsp: spandsp
  --disable-sndio              disable sndio audio: sndio
  --disable-hls                disable http live streaming plugin: hls
  --disable-x265               disable x265 plug-in: x265

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
                          both]
  --with-aix-soname=aix|svr4|both
                          shared library versioning (aka "SONAME") variant to
                          provide on AIX, [default=aix].
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-sysroot[=DIR]    Search for dependent libraries within DIR (or the
                          compiler's sysroot if not specified).
  --with-autoconf         use a different autoconf for regeneration of
                          Makefiles
  --with-autoheader       use a different autoheader for regeneration of
                          Makefiles
  --with-automake         use a different automake for regeneration of
                          Makefiles
  --with-aclocal          use a different aclocal for regeneration of
                          Makefiles
  --with-gnu-ld           assume the C compiler uses GNU ld default=no
  --with-libiconv-prefix[=DIR]  search for libiconv in DIR/include and DIR/lib
  --without-libiconv-prefix     don't search for libiconv in includedir and libdir
  --with-libintl-prefix[=DIR]  search for libintl in DIR/include and DIR/lib
  --without-libintl-prefix     don't search for libintl in includedir and libdir
  --with-pkg-config-path  colon-separated list of pkg-config(1) dirs
  --with-package-name     specify package name to use in plugins
  --with-package-origin   specify package origin URL to use in plugins
  --with-plugins          comma-separated list of dependencyless plug-ins to
                          compile
  --with-html-dir=PATH    path to installed docs
  --with-gtk=3.0|2.0      which gtk+ version to compile against (default: 2.0)
  --with-player-tests     Enable GstPlayer tests that need network access
                          (default: no)
  --with-default-audiosink
                          specify default audio sink
  --with-default-audiosrc specify default audio source
  --with-default-videosink
                          specify default video sink
  --with-default-videosrc specify default video source
  --with-default-visualizer
                          specify default visualizer
  --with-opengl-module-name
                          library module name for OpenGL (default: libGL)
  --with-gles2-module-name
                          library module name for GLES2 (default: libGLESv2)
  --with-egl-module-name  library module name for EGL (default: libEGL)
  --with-jpeg-mmx, path to MMX'ified JPEG library
  --with-cuda-prefix      Use the provided prefix for detecting the cuda
                          installation
  --with-pvr-external-headers
                          Use system installed PVR2D headers
  --with-sdl-prefix=PFX   prefix where SDL is installed (optional)
  --with-sdl-exec-prefix=PFX
                          exec prefix where SDL is installed (optional)
  --with-hls-crypto=auto|nettle|libgcrypt|openssl
                          which cryptographic library version to compile
                          against for hls (default: auto)
  --with-libgcrypt-prefix=PFX
                          prefix where LIBGCRYPT is installed (optional)

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  LIBS        libraries to pass to the linker, e.g. -l<library>
  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
              you have headers in a nonstandard directory <include dir>
  LT_SYS_LIBRARY_PATH
              User-defined run-time library search path.
  CPP         C preprocessor
  PKG_CONFIG  path to pkg-config utility
  VALGRIND_CFLAGS
              C compiler flags for VALGRIND, overriding pkg-config
  VALGRIND_LIBS
              linker flags for VALGRIND, overriding pkg-config
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CXXCPP      C++ preprocessor
  OBJC        Objective C compiler command
  OBJCFLAGS   Objective C compiler flags
  GTKDOC_DEPS_CFLAGS
              C compiler flags for GTKDOC_DEPS, overriding pkg-config
  GTKDOC_DEPS_LIBS
              linker flags for GTKDOC_DEPS, overriding pkg-config
  PYTHON      the Python interpreter
  GLIB_CFLAGS C compiler flags for GLIB, overriding pkg-config
  GLIB_LIBS   linker flags for GLIB, overriding pkg-config
  GIO_CFLAGS  C compiler flags for GIO, overriding pkg-config
  GIO_LIBS    linker flags for GIO, overriding pkg-config
  GST_CFLAGS  C compiler flags for GST, overriding pkg-config
  GST_LIBS    linker flags for GST, overriding pkg-config
  GST_BASE_CFLAGS
              C compiler flags for GST_BASE, overriding pkg-config
  GST_BASE_LIBS
              linker flags for GST_BASE, overriding pkg-config
  GST_CHECK_CFLAGS
              C compiler flags for GST_CHECK, overriding pkg-config
  GST_CHECK_LIBS
              linker flags for GST_CHECK, overriding pkg-config
  GST_CONTROLLER_CFLAGS
              C compiler flags for GST_CONTROLLER, overriding pkg-config
  GST_CONTROLLER_LIBS
              linker flags for GST_CONTROLLER, overriding pkg-config
  GST_NET_CFLAGS
              C compiler flags for GST_NET, overriding pkg-config
  GST_NET_LIBS
              linker flags for GST_NET, overriding pkg-config
  GST_PLUGINS_BASE_CFLAGS
              C compiler flags for GST_PLUGINS_BASE, overriding pkg-config
  GST_PLUGINS_BASE_LIBS
              linker flags for GST_PLUGINS_BASE, overriding pkg-config
  GST_PLUGINS_GOOD_CFLAGS
              C compiler flags for GST_PLUGINS_GOOD, overriding pkg-config
  GST_PLUGINS_GOOD_LIBS
              linker flags for GST_PLUGINS_GOOD, overriding pkg-config
  GST_PLUGINS_UGLY_CFLAGS
              C compiler flags for GST_PLUGINS_UGLY, overriding pkg-config
  GST_PLUGINS_UGLY_LIBS
              linker flags for GST_PLUGINS_UGLY, overriding pkg-config
  GST_PLUGINS_LIBAV_CFLAGS
              C compiler flags for GST_PLUGINS_LIBAV, overriding pkg-config
  GST_PLUGINS_LIBAV_LIBS
              linker flags for GST_PLUGINS_LIBAV, overriding pkg-config
  GTK_CFLAGS  C compiler flags for GTK, overriding pkg-config
  GTK_LIBS    linker flags for GTK, overriding pkg-config
  GTK3_CFLAGS C compiler flags for GTK3, overriding pkg-config
  GTK3_LIBS   linker flags for GTK3, overriding pkg-config
  CLUTTER_CFLAGS
              C compiler flags for CLUTTER, overriding pkg-config
  CLUTTER_LIBS
              linker flags for CLUTTER, overriding pkg-config
  CLUTTER_GLX_CFLAGS
              C compiler flags for CLUTTER_GLX, overriding pkg-config
  CLUTTER_GLX_LIBS
              linker flags for CLUTTER_GLX, overriding pkg-config
  CLUTTER_X11_CFLAGS
              C compiler flags for CLUTTER_X11, overriding pkg-config
  CLUTTER_X11_LIBS
              linker flags for CLUTTER_X11, overriding pkg-config
  XCOMPOSITE_CFLAGS
              C compiler flags for XCOMPOSITE, overriding pkg-config
  XCOMPOSITE_LIBS
              linker flags for XCOMPOSITE, overriding pkg-config
  GRAPHENE_CFLAGS
              C compiler flags for GRAPHENE, overriding pkg-config
  GRAPHENE_LIBS
              linker flags for GRAPHENE, overriding pkg-config
  SDL_CFLAGS  C compiler flags for SDL, overriding pkg-config
  SDL_LIBS    linker flags for SDL, overriding pkg-config
  GMODULE_EXPORT_CFLAGS
              C compiler flags for GMODULE_EXPORT, overriding pkg-config
  GMODULE_EXPORT_LIBS
              linker flags for GMODULE_EXPORT, overriding pkg-config
  GMODULE_NO_EXPORT_CFLAGS
              C compiler flags for GMODULE_NO_EXPORT, overriding pkg-config
  GMODULE_NO_EXPORT_LIBS
              linker flags for GMODULE_NO_EXPORT, overriding pkg-config
  X11_CFLAGS  C compiler flags for X11, overriding pkg-config
  X11_LIBS    linker flags for X11, overriding pkg-config
  EXIF_CFLAGS C compiler flags for EXIF, overriding pkg-config
  EXIF_LIBS   linker flags for EXIF, overriding pkg-config
  ORC_CFLAGS  C compiler flags for ORC, overriding pkg-config
  ORC_LIBS    linker flags for ORC, overriding pkg-config
  X_CFLAGS    C compiler flags for X, overriding pkg-config
  X_LIBS      linker flags for X, overriding pkg-config
  GL_CFLAGS   C compiler flags for GL, overriding pkg-config
  GL_LIBS     linker flags for GL, overriding pkg-config
  GLES2_CFLAGS
              C compiler flags for GLES2, overriding pkg-config
  GLES2_LIBS  linker flags for GLES2, overriding pkg-config
  EGL_CFLAGS  C compiler flags for EGL, overriding pkg-config
  EGL_LIBS    linker flags for EGL, overriding pkg-config
  WAYLAND_EGL_CFLAGS
              C compiler flags for WAYLAND_EGL, overriding pkg-config
  WAYLAND_EGL_LIBS
              linker flags for WAYLAND_EGL, overriding pkg-config
  GST_ALLOCATORS_CFLAGS
              C compiler flags for GST_ALLOCATORS, overriding pkg-config
  GST_ALLOCATORS_LIBS
              linker flags for GST_ALLOCATORS, overriding pkg-config
  LIBPNG_CFLAGS
              C compiler flags for LIBPNG, overriding pkg-config
  LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config
  XCB_CFLAGS  C compiler flags for XCB, overriding pkg-config
  XCB_LIBS    linker flags for XCB, overriding pkg-config
  BLUEZ5_CFLAGS
              C compiler flags for BLUEZ5, overriding pkg-config
  BLUEZ5_LIBS linker flags for BLUEZ5, overriding pkg-config
  GIO_UNIX_CFLAGS
              C compiler flags for GIO_UNIX, overriding pkg-config
  GIO_UNIX_LIBS
              linker flags for GIO_UNIX, overriding pkg-config
  G_UDEV_CFLAGS
              C compiler flags for G_UDEV, overriding pkg-config
  G_UDEV_LIBS linker flags for G_UDEV, overriding pkg-config
  LIBUSB_CFLAGS
              C compiler flags for LIBUSB, overriding pkg-config
  LIBUSB_LIBS linker flags for LIBUSB, overriding pkg-config
  GST_VIDEO_CFLAGS
              C compiler flags for GST_VIDEO, overriding pkg-config
  GST_VIDEO_LIBS
              linker flags for GST_VIDEO, overriding pkg-config
  GST_PBUTILS_CFLAGS
              C compiler flags for GST_PBUTILS, overriding pkg-config
  GST_PBUTILS_LIBS
              linker flags for GST_PBUTILS, overriding pkg-config
  CUDA_CFLAGS C compiler flags for CUDA, overriding pkg-config
  CUDA_LIBS   linker flags for CUDA, overriding pkg-config
  NVENCODE_CFLAGS
              C compiler flags for NvEncodeAPI.h
  NVENCODE_LIBS
              linker flags for nvidia-encode
  ASSRENDER_CFLAGS
              C compiler flags for ASSRENDER, overriding pkg-config
  ASSRENDER_LIBS
              linker flags for ASSRENDER, overriding pkg-config
  VOAMRWBENC_CFLAGS
              C compiler flags for VOAMRWBENC, overriding pkg-config
  VOAMRWBENC_LIBS
              linker flags for VOAMRWBENC, overriding pkg-config
  VOAACENC_CFLAGS
              C compiler flags for VOAACENC, overriding pkg-config
  VOAACENC_LIBS
              linker flags for VOAACENC, overriding pkg-config
  APEXSINK_CFLAGS
              C compiler flags for APEXSINK, overriding pkg-config
  APEXSINK_LIBS
              linker flags for APEXSINK, overriding pkg-config
  BS2B_CFLAGS C compiler flags for BS2B, overriding pkg-config
  BS2B_LIBS   linker flags for BS2B, overriding pkg-config
  CHROMAPRINT_CFLAGS
              C compiler flags for CHROMAPRINT, overriding pkg-config
  CHROMAPRINT_LIBS
              linker flags for CHROMAPRINT, overriding pkg-config
  CURL_CFLAGS C compiler flags for CURL, overriding pkg-config
  CURL_LIBS   linker flags for CURL, overriding pkg-config
  SSH2_CFLAGS C compiler flags for SSH2, overriding pkg-config
  SSH2_LIBS   linker flags for SSH2, overriding pkg-config
  LIBXML2_CFLAGS
              C compiler flags for LIBXML2, overriding pkg-config
  LIBXML2_LIBS
              linker flags for LIBXML2, overriding pkg-config
  LIBDC1394_CFLAGS
              C compiler flags for LIBDC1394, overriding pkg-config
  LIBDC1394_LIBS
              linker flags for LIBDC1394, overriding pkg-config
  DIRECTFB_CFLAGS
              C compiler flags for DIRECTFB, overriding pkg-config
  DIRECTFB_LIBS
              linker flags for DIRECTFB, overriding pkg-config
  WAYLAND_CFLAGS
              C compiler flags for WAYLAND, overriding pkg-config
  WAYLAND_LIBS
              linker flags for WAYLAND, overriding pkg-config
  WEBP_CFLAGS C compiler flags for WEBP, overriding pkg-config
  WEBP_LIBS   linker flags for WEBP, overriding pkg-config
  DAALA_CFLAGS
              C compiler flags for DAALA, overriding pkg-config
  DAALA_LIBS  linker flags for DAALA, overriding pkg-config
  DVDNAV_CFLAGS
              C compiler flags for DVDNAV, overriding pkg-config
  DVDNAV_LIBS linker flags for DVDNAV, overriding pkg-config
  FLUIDSYNTH_CFLAGS
              C compiler flags for FLUIDSYNTH, overriding pkg-config
  FLUIDSYNTH_LIBS
              linker flags for FLUIDSYNTH, overriding pkg-config
  KATE_CFLAGS C compiler flags for KATE, overriding pkg-config
  KATE_LIBS   linker flags for KATE, overriding pkg-config
  TIGER_CFLAGS
              C compiler flags for TIGER, overriding pkg-config
  TIGER_LIBS  linker flags for TIGER, overriding pkg-config
  LRDF_CFLAGS C compiler flags for LRDF, overriding pkg-config
  LRDF_LIBS   linker flags for LRDF, overriding pkg-config
  SLV2_CFLAGS C compiler flags for SLV2, overriding pkg-config
  SLV2_LIBS   linker flags for SLV2, overriding pkg-config
  LIBDE265_CFLAGS
              C compiler flags for LIBDE265, overriding pkg-config
  LIBDE265_LIBS
              linker flags for LIBDE265, overriding pkg-config
  LIBMMS_CFLAGS
              C compiler flags for LIBMMS, overriding pkg-config
  LIBMMS_LIBS linker flags for LIBMMS, overriding pkg-config
  SRTP_CFLAGS C compiler flags for SRTP, overriding pkg-config
  SRTP_LIBS   linker flags for SRTP, overriding pkg-config
  DTLS_CFLAGS C compiler flags for DTLS, overriding pkg-config
  DTLS_LIBS   linker flags for DTLS, overriding pkg-config
  MODPLUG_CFLAGS
              C compiler flags for MODPLUG, overriding pkg-config
  MODPLUG_LIBS
              linker flags for MODPLUG, overriding pkg-config
  MIMIC_CFLAGS
              C compiler flags for MIMIC, overriding pkg-config
  MIMIC_LIBS  linker flags for MIMIC, overriding pkg-config
  MJPEG_CFLAGS
              C compiler flags for MJPEG, overriding pkg-config
  MJPEG_LIBS  linker flags for MJPEG, overriding pkg-config
  MPEG2ENC_CFLAGS
              C compiler flags for MPEG2ENC, overriding pkg-config
  MPEG2ENC_LIBS
              linker flags for MPEG2ENC, overriding pkg-config
  MPLEX_CFLAGS
              C compiler flags for MPLEX, overriding pkg-config
  MPLEX_LIBS  linker flags for MPLEX, overriding pkg-config
  NEON_CFLAGS C compiler flags for NEON, overriding pkg-config
  NEON_LIBS   linker flags for NEON, overriding pkg-config
  OFA_CFLAGS  C compiler flags for OFA, overriding pkg-config
  OFA_LIBS    linker flags for OFA, overriding pkg-config
  OPENAL_CFLAGS
              C compiler flags for OPENAL, overriding pkg-config
  OPENAL_LIBS linker flags for OPENAL, overriding pkg-config
  OPENCV_CFLAGS
              C compiler flags for OPENCV, overriding pkg-config
  OPENCV_LIBS linker flags for OPENCV, overriding pkg-config
  OPENEXR_CFLAGS
              C compiler flags for OPENEXR, overriding pkg-config
  OPENEXR_LIBS
              linker flags for OPENEXR, overriding pkg-config
  OPENH264_CFLAGS
              C compiler flags for OPENH264, overriding pkg-config
  OPENH264_LIBS
              linker flags for OPENH264, overriding pkg-config
  OPENJPEG_CFLAGS
              C compiler flags for OPENJPEG, overriding pkg-config
  OPENJPEG_LIBS
              linker flags for OPENJPEG, overriding pkg-config
  OPENNI2_CFLAGS
              C compiler flags for OPENNI2, overriding pkg-config
  OPENNI2_LIBS
              linker flags for OPENNI2, overriding pkg-config
  OPUS_CFLAGS C compiler flags for OPUS, overriding pkg-config
  OPUS_LIBS   linker flags for OPUS, overriding pkg-config
  PVR_CFLAGS  C compiler flags for PVR, overriding pkg-config
  PVR_LIBS    linker flags for PVR, overriding pkg-config
  RSVG_CFLAGS C compiler flags for RSVG, overriding pkg-config
  RSVG_LIBS   linker flags for RSVG, overriding pkg-config
  GTK3_GL_CFLAGS
              C compiler flags for GTK3_GL, overriding pkg-config
  GTK3_GL_LIBS
              linker flags for GTK3_GL, overriding pkg-config
  GTK3_X11_CFLAGS
              C compiler flags for GTK3_X11, overriding pkg-config
  GTK3_X11_LIBS
              linker flags for GTK3_X11, overriding pkg-config
  GTK3_WAYLAND_CFLAGS
              C compiler flags for GTK3_WAYLAND, overriding pkg-config
  GTK3_WAYLAND_LIBS
              linker flags for GTK3_WAYLAND, overriding pkg-config
  QT_CFLAGS   C compiler flags for QT, overriding pkg-config
  QT_LIBS     linker flags for QT, overriding pkg-config
  QT_X11_CFLAGS
              C compiler flags for QT_X11, overriding pkg-config
  QT_X11_LIBS linker flags for QT_X11, overriding pkg-config
  QT_WAYLAND_CFLAGS
              C compiler flags for QT_WAYLAND, overriding pkg-config
  QT_WAYLAND_LIBS
              linker flags for QT_WAYLAND, overriding pkg-config
  QT_ANDROID_CFLAGS
              C compiler flags for QT_ANDROID, overriding pkg-config
  QT_ANDROID_LIBS
              linker flags for QT_ANDROID, overriding pkg-config
  GNUSTL_CFLAGS
              C compiler flags for GNUSTL, overriding pkg-config
  GNUSTL_LIBS linker flags for GNUSTL, overriding pkg-config
  QT_MAC_CFLAGS
              C compiler flags for QT_MAC, overriding pkg-config
  QT_MAC_LIBS linker flags for QT_MAC, overriding pkg-config
  LIBVISUAL_CFLAGS
              C compiler flags for LIBVISUAL, overriding pkg-config
  LIBVISUAL_LIBS
              linker flags for LIBVISUAL, overriding pkg-config
  TIMIDITY_CFLAGS
              C compiler flags for TIMIDITY, overriding pkg-config
  TIMIDITY_LIBS
              linker flags for TIMIDITY, overriding pkg-config
  TELETEXTDEC_CFLAGS
              C compiler flags for TELETEXTDEC, overriding pkg-config
  TELETEXTDEC_LIBS
              linker flags for TELETEXTDEC, overriding pkg-config
  SNDFILE_CFLAGS
              C compiler flags for SNDFILE, overriding pkg-config
  SNDFILE_LIBS
              linker flags for SNDFILE, overriding pkg-config
  SOUNDTOUCH_CFLAGS
              C compiler flags for SOUNDTOUCH, overriding pkg-config
  SOUNDTOUCH_LIBS
              linker flags for SOUNDTOUCH, overriding pkg-config
  VDPAU_CFLAGS
              C compiler flags for VDPAU, overriding pkg-config
  VDPAU_LIBS  linker flags for VDPAU, overriding pkg-config
  SBC_CFLAGS  C compiler flags for SBC, overriding pkg-config
  SBC_LIBS    linker flags for SBC, overriding pkg-config
  SCHRO_CFLAGS
              C compiler flags for SCHRO, overriding pkg-config
  SCHRO_LIBS  linker flags for SCHRO, overriding pkg-config
  ZBAR_CFLAGS C compiler flags for ZBAR, overriding pkg-config
  ZBAR_LIBS   linker flags for ZBAR, overriding pkg-config
  RTMP_CFLAGS C compiler flags for RTMP, overriding pkg-config
  RTMP_LIBS   linker flags for RTMP, overriding pkg-config
  SPANDSP_CFLAGS
              C compiler flags for SPANDSP, overriding pkg-config
  SPANDSP_LIBS
              linker flags for SPANDSP, overriding pkg-config
  NETTLE_CFLAGS
              C compiler flags for NETTLE, overriding pkg-config
  NETTLE_LIBS linker flags for NETTLE, overriding pkg-config
  OPENSSL_CFLAGS
              C compiler flags for OPENSSL, overriding pkg-config
  OPENSSL_LIBS
              linker flags for OPENSSL, overriding pkg-config
  X265_CFLAGS C compiler flags for X265, overriding pkg-config
  X265_LIBS   linker flags for X265, overriding pkg-config

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
_ACEOF
ac_status=$?
fi

if test "$ac_init_help" = "recursive"; then
  # If there are subdirs, report their specific --help.
  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
    test -d "$ac_dir" ||
      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } ||
      continue
    ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix

    cd "$ac_dir" || { ac_status=$?; continue; }
    # Check for guested configure.
    if test -f "$ac_srcdir/configure.gnu"; then
      echo &&
      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
    elif test -f "$ac_srcdir/configure"; then
      echo &&
      $SHELL "$ac_srcdir/configure" --help=recursive
    else
      $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
    fi || ac_status=$?
    cd "$ac_pwd" || { ac_status=$?; break; }
  done
fi

test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
  cat <<\_ACEOF
GStreamer Bad Plug-ins configure 1.8.0
generated by GNU Autoconf 2.69

Copyright (C) 2012 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
_ACEOF
  exit
fi

## ------------------------ ##
## Autoconf initialization. ##
## ------------------------ ##

# ac_fn_c_try_compile LINENO
# --------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_compile

# ac_fn_c_try_link LINENO
# -----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 test -x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_link

# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists and can be compiled using the include files in
# INCLUDES, setting the cache variable VAR accordingly.
ac_fn_c_check_header_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_compile

# ac_fn_c_try_cpp LINENO
# ----------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_c_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } > conftest.i && {
	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_cpp

# ac_fn_c_try_run LINENO
# ----------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_c_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  ac_retval=0
else
  $as_echo "$as_me: program exited with status $ac_status" >&5
       $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_try_run

# ac_fn_c_check_func LINENO FUNC VAR
# ----------------------------------
# Tests whether FUNC exists, setting the cache variable VAR accordingly
ac_fn_c_check_func ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
#define $2 innocuous_$2

/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $2 (); below.
    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
    <limits.h> exists even on freestanding compilers.  */

#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif

#undef $2

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char $2 ();
/* The GNU C library defines this for functions which it implements
    to always fail with ENOSYS.  Some functions are actually named
    something starting with __ and the normal name is an alias.  */
#if defined __stub_$2 || defined __stub___$2
choke me
#endif

int
main ()
{
return $2 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_func

# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES
# ---------------------------------------------
# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
# accordingly.
ac_fn_c_check_decl ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  as_decl_name=`echo $2|sed 's/ *(.*//'`
  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
#ifndef $as_decl_name
#ifdef __cplusplus
  (void) $as_decl_use;
#else
  (void) $as_decl_name;
#endif
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_decl

# ac_fn_cxx_try_compile LINENO
# ----------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_compile

# ac_fn_cxx_try_cpp LINENO
# ------------------------
# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_cpp ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_cpp conftest.$ac_ext"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } > conftest.i && {
	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

    ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_cpp

# ac_fn_cxx_try_link LINENO
# -------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded.
ac_fn_cxx_try_link ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext conftest$ac_exeext
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_cxx_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 test -x conftest$ac_exeext
       }; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
  # interfere with the next link command; also delete a directory that is
  # left behind by Apple's compiler.  We do this before executing the actions.
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_link

# ac_fn_objc_try_compile LINENO
# -----------------------------
# Try to compile conftest.$ac_ext, and return whether this succeeded.
ac_fn_objc_try_compile ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  rm -f conftest.$ac_objext
  if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    grep -v '^ *+' conftest.err >conftest.er1
    cat conftest.er1 >&5
    mv -f conftest.er1 conftest.err
  fi
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && {
	 test -z "$ac_objc_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest.$ac_objext; then :
  ac_retval=0
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	ac_retval=1
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_objc_try_compile

# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES
# -------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_c_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if eval \${$3+:} false; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## ------------------------------------------------------------------------ ##
## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer ##
## ------------------------------------------------------------------------ ##"
     ) | sed "s/^/$as_me: WARNING:     /" >&2
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_mongrel

# ac_fn_c_check_type LINENO TYPE VAR INCLUDES
# -------------------------------------------
# Tests whether TYPE exists after having included INCLUDES, setting cache
# variable VAR accordingly.
ac_fn_c_check_type ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=no"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof ($2))
	 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
if (sizeof (($2)))
	    return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  eval "$3=yes"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_type

# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES
# --------------------------------------------
# Tries to find the compile-time value of EXPR in a program that includes
# INCLUDES, setting VAR accordingly. Returns whether the value could be
# computed
ac_fn_c_compute_int ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if test "$cross_compiling" = yes; then
    # Depending upon the size, compute the lo and hi bounds.
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=0 ac_mid=0
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid; break
else
  as_fn_arith $ac_mid + 1 && ac_lo=$as_val
			if test $ac_lo -le $ac_mid; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) < 0)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=-1 ac_mid=-1
  while :; do
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) >= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_lo=$ac_mid; break
else
  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val
			if test $ac_mid -le $ac_hi; then
			  ac_lo= ac_hi=
			  break
			fi
			as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  done
else
  ac_lo= ac_hi=
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
# Binary search between lo and hi bounds.
while test "x$ac_lo" != "x$ac_hi"; do
  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
int
main ()
{
static int test_array [1 - 2 * !(($2) <= $ac_mid)];
test_array [0] = 0;
return test_array [0];

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_hi=$ac_mid
else
  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
done
case $ac_lo in #((
?*) eval "$3=\$ac_lo"; ac_retval=0 ;;
'') ac_retval=1 ;;
esac
  else
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
static long int longval () { return $2; }
static unsigned long int ulongval () { return $2; }
#include <stdio.h>
#include <stdlib.h>
int
main ()
{

  FILE *f = fopen ("conftest.val", "w");
  if (! f)
    return 1;
  if (($2) < 0)
    {
      long int i = longval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%ld", i);
    }
  else
    {
      unsigned long int i = ulongval ();
      if (i != ($2))
	return 1;
      fprintf (f, "%lu", i);
    }
  /* Do not output a trailing newline, as this causes \r\n confusion
     on some platforms.  */
  return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  echo >>conftest.val; read $3 <conftest.val; ac_retval=0
else
  ac_retval=1
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
rm -f conftest.val

  fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_c_compute_int

# ac_fn_c_check_header_preproc LINENO HEADER VAR
# ----------------------------------------------
# Tests whether HEADER is present, setting the cache variable VAR accordingly.
ac_fn_c_check_header_preproc ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  eval "$3=yes"
else
  eval "$3=no"
fi
rm -f conftest.err conftest.i conftest.$ac_ext
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_c_check_header_preproc

# ac_fn_cxx_check_header_mongrel LINENO HEADER VAR INCLUDES
# ---------------------------------------------------------
# Tests whether HEADER exists, giving a warning if it cannot be compiled using
# the include files in INCLUDES and setting the cache variable VAR
# accordingly.
ac_fn_cxx_check_header_mongrel ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if eval \${$3+:} false; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
else
  # Is the header compilable?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5
$as_echo_n "checking $2 usability... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$4
#include <$2>
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_header_compiler=yes
else
  ac_header_compiler=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5
$as_echo "$ac_header_compiler" >&6; }

# Is the header present?
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5
$as_echo_n "checking $2 presence... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <$2>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  ac_header_preproc=yes
else
  ac_header_preproc=no
fi
rm -f conftest.err conftest.i conftest.$ac_ext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5
$as_echo "$ac_header_preproc" >&6; }

# So?  What about this header?
case $ac_header_compiler:$ac_header_preproc:$ac_cxx_preproc_warn_flag in #((
  yes:no: )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5
$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
    ;;
  no:yes:* )
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5
$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?" >&5
$as_echo "$as_me: WARNING: $2:     check for missing prerequisite headers?" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5
$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&5
$as_echo "$as_me: WARNING: $2:     section \"Present But Cannot Be Compiled\"" >&2;}
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5
$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;}
( $as_echo "## ------------------------------------------------------------------------ ##
## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer ##
## ------------------------------------------------------------------------ ##"
     ) | sed "s/^/$as_me: WARNING:     /" >&2
    ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
$as_echo_n "checking for $2... " >&6; }
if eval \${$3+:} false; then :
  $as_echo_n "(cached) " >&6
else
  eval "$3=\$ac_header_compiler"
fi
eval ac_res=\$$3
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
fi
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno

} # ac_fn_cxx_check_header_mongrel

# ac_fn_cxx_try_run LINENO
# ------------------------
# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
# that executables *can* be run.
ac_fn_cxx_try_run ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then :
  ac_retval=0
else
  $as_echo "$as_me: program exited with status $ac_status" >&5
       $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

       ac_retval=$ac_status
fi
  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
  as_fn_set_status $ac_retval

} # ac_fn_cxx_try_run
cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.

It was created by GStreamer Bad Plug-ins $as_me 1.8.0, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  $ $0 $@

_ACEOF
exec 5>>config.log
{
cat <<_ASUNAME
## --------- ##
## Platform. ##
## --------- ##

hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
uname -m = `(uname -m) 2>/dev/null || echo unknown`
uname -r = `(uname -r) 2>/dev/null || echo unknown`
uname -s = `(uname -s) 2>/dev/null || echo unknown`
uname -v = `(uname -v) 2>/dev/null || echo unknown`

/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`

/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`

_ASUNAME

as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    $as_echo "PATH: $as_dir"
  done
IFS=$as_save_IFS

} >&5

cat >&5 <<_ACEOF


## ----------- ##
## Core tests. ##
## ----------- ##

_ACEOF


# Keep a trace of the command line.
# Strip out --no-create and --no-recursion so they do not pile up.
# Strip out --silent because we don't want to record it for future runs.
# Also quote any args containing shell meta-characters.
# Make two passes to allow for proper duplicate-argument suppression.
ac_configure_args=
ac_configure_args0=
ac_configure_args1=
ac_must_keep_next=false
for ac_pass in 1 2
do
  for ac_arg
  do
    case $ac_arg in
    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
    | -silent | --silent | --silen | --sile | --sil)
      continue ;;
    *\'*)
      ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    case $ac_pass in
    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
    2)
      as_fn_append ac_configure_args1 " '$ac_arg'"
      if test $ac_must_keep_next = true; then
	ac_must_keep_next=false # Got value, back to normal.
      else
	case $ac_arg in
	  *=* | --config-cache | -C | -disable-* | --disable-* \
	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
	  | -with-* | --with-* | -without-* | --without-* | --x)
	    case "$ac_configure_args0 " in
	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
	    esac
	    ;;
	  -* ) ac_must_keep_next=true ;;
	esac
      fi
      as_fn_append ac_configure_args " '$ac_arg'"
      ;;
    esac
  done
done
{ ac_configure_args0=; unset ac_configure_args0;}
{ ac_configure_args1=; unset ac_configure_args1;}

# When interrupted or exit'd, cleanup temporary files, and complete
# config.log.  We remove comments because anyway the quotes in there
# would cause problems or look ugly.
# WARNING: Use '\'' to represent an apostrophe within the trap.
# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
trap 'exit_status=$?
  # Save into config.log some information that might help in debugging.
  {
    echo

    $as_echo "## ---------------- ##
## Cache variables. ##
## ---------------- ##"
    echo
    # The following way of writing the cache mishandles newlines in values,
(
  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done
  (set) 2>&1 |
    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      sed -n \
	"s/'\''/'\''\\\\'\'''\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
      ;; #(
    *)
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
)
    echo

    $as_echo "## ----------------- ##
## Output variables. ##
## ----------------- ##"
    echo
    for ac_var in $ac_subst_vars
    do
      eval ac_val=\$$ac_var
      case $ac_val in
      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
      esac
      $as_echo "$ac_var='\''$ac_val'\''"
    done | sort
    echo

    if test -n "$ac_subst_files"; then
      $as_echo "## ------------------- ##
## File substitutions. ##
## ------------------- ##"
      echo
      for ac_var in $ac_subst_files
      do
	eval ac_val=\$$ac_var
	case $ac_val in
	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
	esac
	$as_echo "$ac_var='\''$ac_val'\''"
      done | sort
      echo
    fi

    if test -s confdefs.h; then
      $as_echo "## ----------- ##
## confdefs.h. ##
## ----------- ##"
      echo
      cat confdefs.h
      echo
    fi
    test "$ac_signal" != 0 &&
      $as_echo "$as_me: caught signal $ac_signal"
    $as_echo "$as_me: exit $exit_status"
  } >&5
  rm -f core *.core core.conftest.* &&
    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
    exit $exit_status
' 0
for ac_signal in 1 2 13 15; do
  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal
done
ac_signal=0

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -f -r conftest* confdefs.h

$as_echo "/* confdefs.h */" > confdefs.h

# Predefined preprocessor variables.

cat >>confdefs.h <<_ACEOF
#define PACKAGE_NAME "$PACKAGE_NAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_VERSION "$PACKAGE_VERSION"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_STRING "$PACKAGE_STRING"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
_ACEOF

cat >>confdefs.h <<_ACEOF
#define PACKAGE_URL "$PACKAGE_URL"
_ACEOF


# Let the site file select an alternate cache file if it wants to.
# Prefer an explicitly selected file to automatically selected ones.
ac_site_file1=NONE
ac_site_file2=NONE
if test -n "$CONFIG_SITE"; then
  # We do not want a PATH search for config.site.
  case $CONFIG_SITE in #((
    -*)  ac_site_file1=./$CONFIG_SITE;;
    */*) ac_site_file1=$CONFIG_SITE;;
    *)   ac_site_file1=./$CONFIG_SITE;;
  esac
elif test "x$prefix" != xNONE; then
  ac_site_file1=$prefix/share/config.site
  ac_site_file2=$prefix/etc/config.site
else
  ac_site_file1=$ac_default_prefix/share/config.site
  ac_site_file2=$ac_default_prefix/etc/config.site
fi
for ac_site_file in "$ac_site_file1" "$ac_site_file2"
do
  test "x$ac_site_file" = xNONE && continue
  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
$as_echo "$as_me: loading site script $ac_site_file" >&6;}
    sed 's/^/| /' "$ac_site_file" >&5
    . "$ac_site_file" \
      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "failed to load site script $ac_site_file
See \`config.log' for more details" "$LINENO" 5; }
  fi
done

if test -r "$cache_file"; then
  # Some versions of bash will fail to source /dev/null (special files
  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.
  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
$as_echo "$as_me: loading cache $cache_file" >&6;}
    case $cache_file in
      [\\/]* | ?:[\\/]* ) . "$cache_file";;
      *)                      . "./$cache_file";;
    esac
  fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
$as_echo "$as_me: creating cache $cache_file" >&6;}
  >$cache_file
fi

gt_needs="$gt_needs "
as_fn_append ac_header_list " stdlib.h"
as_fn_append ac_header_list " unistd.h"
as_fn_append ac_header_list " sys/param.h"
# Check that the precious variables saved in the cache have kept the same
# value.
ac_cache_corrupted=false
for ac_var in $ac_precious_vars; do
  eval ac_old_set=\$ac_cv_env_${ac_var}_set
  eval ac_new_set=\$ac_env_${ac_var}_set
  eval ac_old_val=\$ac_cv_env_${ac_var}_value
  eval ac_new_val=\$ac_env_${ac_var}_value
  case $ac_old_set,$ac_new_set in
    set,)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,set)
      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
      ac_cache_corrupted=: ;;
    ,);;
    *)
      if test "x$ac_old_val" != "x$ac_new_val"; then
	# differences in whitespace do not lead to failure.
	ac_old_val_w=`echo x $ac_old_val`
	ac_new_val_w=`echo x $ac_new_val`
	if test "$ac_old_val_w" != "$ac_new_val_w"; then
	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
	  ac_cache_corrupted=:
	else
	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
	  eval $ac_var=\$ac_old_val
	fi
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
      fi;;
  esac
  # Pass precious variables to config.status.
  if test "$ac_new_set" = set; then
    case $ac_new_val in
    *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
    *) ac_arg=$ac_var=$ac_new_val ;;
    esac
    case " $ac_configure_args " in
      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
    esac
  fi
done
if $ac_cache_corrupted; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
fi
## -------------------- ##
## Main body of script. ##
## -------------------- ##

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
  if test -f "$ac_dir/install-sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install-sh -c"
    break
  elif test -f "$ac_dir/install.sh"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/install.sh -c"
    break
  elif test -f "$ac_dir/shtool"; then
    ac_aux_dir=$ac_dir
    ac_install_sh="$ac_aux_dir/shtool install -c"
    break
  fi
done
if test -z "$ac_aux_dir"; then
  as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5
fi

# These three variables are undocumented and unsupported,
# and are intended to be withdrawn in a future Autoconf release.
# They can cause serious problems if a builder's source tree is in a directory
# whose full name contains unusual characters.
ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.


# Make sure we can run config.sub.
$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
$as_echo_n "checking build system type... " >&6; }
if ${ac_cv_build+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_build_alias=$build_alias
test "x$ac_build_alias" = x &&
  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
test "x$ac_build_alias" = x &&
  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
$as_echo "$ac_cv_build" >&6; }
case $ac_cv_build in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
esac
build=$ac_cv_build
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_build
shift
build_cpu=$1
build_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
build_os=$*
IFS=$ac_save_IFS
case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
$as_echo_n "checking host system type... " >&6; }
if ${ac_cv_host+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$host_alias" = x; then
  ac_cv_host=$ac_cv_build
else
  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
$as_echo "$ac_cv_host" >&6; }
case $ac_cv_host in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
esac
host=$ac_cv_host
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_host
shift
host_cpu=$1
host_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
host_os=$*
IFS=$ac_save_IFS
case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5
$as_echo_n "checking target system type... " >&6; }
if ${ac_cv_target+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$target_alias" = x; then
  ac_cv_target=$ac_cv_host
else
  ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` ||
    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5
$as_echo "$ac_cv_target" >&6; }
case $ac_cv_target in
*-*-*) ;;
*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5;;
esac
target=$ac_cv_target
ac_save_IFS=$IFS; IFS='-'
set x $ac_cv_target
shift
target_cpu=$1
target_vendor=$2
shift; shift
# Remember, the first character of IFS is used to create $*,
# except with old shells:
target_os=$*
IFS=$ac_save_IFS
case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac


# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
test -n "$target_alias" &&
  test "$program_prefix$program_suffix$program_transform_name" = \
    NONENONEs,x,x, &&
  program_prefix=${target_alias}-




am__api_version='1.15'

# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AmigaOS /C/install, which installs bootblocks on floppy discs
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# OS/2's system install, which has a completely different semantic
# ./install, which can be erroneously created by make from ./install.sh.
# Reject install programs that cannot install multiple files.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
$as_echo_n "checking for a BSD-compatible install... " >&6; }
if test -z "$INSTALL"; then
if ${ac_cv_path_install+:} false; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    # Account for people who put trailing slashes in PATH elements.
case $as_dir/ in #((
  ./ | .// | /[cC]/* | \
  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
  ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \
  /usr/ucb/* ) ;;
  *)
    # OSF1 and SCO ODT 3.0 have their own names for install.
    # Don't use installbsd from OSF since it installs stuff as root
    # by default.
    for ac_prog in ginstall scoinst install; do
      for ac_exec_ext in '' $ac_executable_extensions; do
	if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then
	  if test $ac_prog = install &&
	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  elif test $ac_prog = install &&
	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
	    # program-specific install script used by HP pwplus--don't use.
	    :
	  else
	    rm -rf conftest.one conftest.two conftest.dir
	    echo one > conftest.one
	    echo two > conftest.two
	    mkdir conftest.dir
	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
	      test -s conftest.one && test -s conftest.two &&
	      test -s conftest.dir/conftest.one &&
	      test -s conftest.dir/conftest.two
	    then
	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
	      break 3
	    fi
	  fi
	fi
      done
    done
    ;;
esac

  done
IFS=$as_save_IFS

rm -rf conftest.one conftest.two conftest.dir

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL=$ac_cv_path_install
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    INSTALL=$ac_install_sh
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
$as_echo "$INSTALL" >&6; }

# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
# It thinks the first close brace ends the variable substitution.
test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'

test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'

test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
$as_echo_n "checking whether build environment is sane... " >&6; }
# Reject unsafe characters in $srcdir or the absolute working directory
# name.  Accept space and tab only in the latter.
am_lf='
'
case `pwd` in
  *[\\\"\#\$\&\'\`$am_lf]*)
    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
esac
case $srcdir in
  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
    as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;;
esac

# Do 'set' in a subshell so we don't clobber the current shell's
# arguments.  Must try -L first in case configure is actually a
# symlink; some systems play weird games with the mod time of symlinks
# (eg FreeBSD returns the mod time of the symlink's containing
# directory).
if (
   am_has_slept=no
   for am_try in 1 2; do
     echo "timestamp, slept: $am_has_slept" > conftest.file
     set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null`
     if test "$*" = "X"; then
	# -L didn't work.
	set X `ls -t "$srcdir/configure" conftest.file`
     fi
     if test "$*" != "X $srcdir/configure conftest.file" \
	&& test "$*" != "X conftest.file $srcdir/configure"; then

	# If neither matched, then we have a broken ls.  This can happen
	# if, for instance, CONFIG_SHELL is bash and it inherits a
	# broken ls alias from the environment.  This has actually
	# happened.  Such a system could not be considered "sane".
	as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
  alias in your environment" "$LINENO" 5
     fi
     if test "$2" = conftest.file || test $am_try -eq 2; then
       break
     fi
     # Just in case.
     sleep 1
     am_has_slept=yes
   done
   test "$2" = conftest.file
   )
then
   # Ok.
   :
else
   as_fn_error $? "newly created file is older than distributed files!
Check your system clock" "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
# If we didn't sleep, we still need to ensure time stamps of config.status and
# generated files are strictly newer.
am_sleep_pid=
if grep 'slept: no' conftest.file >/dev/null 2>&1; then
  ( sleep 1 ) &
  am_sleep_pid=$!
fi

rm -f conftest.file

test "$program_prefix" != NONE &&
  program_transform_name="s&^&$program_prefix&;$program_transform_name"
# Use a double $ so make ignores it.
test "$program_suffix" != NONE &&
  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
# Double any \ or $.
# By default was `s,x,x', remove it if useless.
ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`

# Expand $ac_aux_dir to an absolute path.
am_aux_dir=`cd "$ac_aux_dir" && pwd`

if test x"${MISSING+set}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
  *)
    MISSING="\${SHELL} $am_aux_dir/missing" ;;
  esac
fi
# Use eval to expand $SHELL
if eval "$MISSING --is-lightweight"; then
  am_missing_run="$MISSING "
else
  am_missing_run=
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5
$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;}
fi

if test x"${install_sh+set}" != xset; then
  case $am_aux_dir in
  *\ * | *\	*)
    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
  *)
    install_sh="\${SHELL} $am_aux_dir/install-sh"
  esac
fi

# Installed binaries are usually stripped using 'strip' when the user
# run "make install-strip".  However 'strip' might not be the right
# tool to use in cross-compilation environments, therefore Automake
# will honor the 'STRIP' environment variable to overrule this program.
if test "$cross_compiling" != no; then
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_STRIP"; then
  ac_ct_STRIP=$STRIP
  # Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_STRIP"; then
  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_STRIP="strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_STRIP" = x; then
    STRIP=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    STRIP=$ac_ct_STRIP
  fi
else
  STRIP="$ac_cv_prog_STRIP"
fi

fi
INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
if test -z "$MKDIR_P"; then
  if ${ac_cv_path_mkdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in mkdir gmkdir; do
	 for ac_exec_ext in '' $ac_executable_extensions; do
	   as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue
	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
	     'mkdir (GNU coreutils) '* | \
	     'mkdir (coreutils) '* | \
	     'mkdir (fileutils) '4.1*)
	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
	       break 3;;
	   esac
	 done
       done
  done
IFS=$as_save_IFS

fi

  test -d ./--version && rmdir ./--version
  if test "${ac_cv_path_mkdir+set}" = set; then
    MKDIR_P="$ac_cv_path_mkdir -p"
  else
    # As a last resort, use the slow shell script.  Don't cache a
    # value for MKDIR_P within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the value is a relative name.
    MKDIR_P="$ac_install_sh -d"
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
$as_echo "$MKDIR_P" >&6; }

for ac_prog in gawk mawk nawk awk
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AWK+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AWK"; then
  ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_AWK="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AWK=$ac_cv_prog_AWK
if test -n "$AWK"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
$as_echo "$AWK" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$AWK" && break
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
set x ${MAKE-make}
ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat >conftest.make <<\_ACEOF
SHELL = /bin/sh
all:
	@echo '@@@%%%=$(MAKE)=@@@%%%'
_ACEOF
# GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
case `${MAKE-make} -f conftest.make 2>/dev/null` in
  *@@@%%%=?*=@@@%%%*)
    eval ac_cv_prog_make_${ac_make}_set=yes;;
  *)
    eval ac_cv_prog_make_${ac_make}_set=no;;
esac
rm -f conftest.make
fi
if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
  SET_MAKE=
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  SET_MAKE="MAKE=${MAKE-make}"
fi

rm -rf .tst 2>/dev/null
mkdir .tst 2>/dev/null
if test -d .tst; then
  am__leading_dot=.
else
  am__leading_dot=_
fi
rmdir .tst 2>/dev/null

# Check whether --enable-silent-rules was given.
if test "${enable_silent_rules+set}" = set; then :
  enableval=$enable_silent_rules;
fi

case $enable_silent_rules in # (((
  yes) AM_DEFAULT_VERBOSITY=0;;
   no) AM_DEFAULT_VERBOSITY=1;;
    *) AM_DEFAULT_VERBOSITY=1;;
esac
am_make=${MAKE-make}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
if ${am_cv_make_support_nested_variables+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if $as_echo 'TRUE=$(BAR$(V))
BAR0=false
BAR1=true
V=1
am__doit:
	@$(TRUE)
.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
  am_cv_make_support_nested_variables=yes
else
  am_cv_make_support_nested_variables=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
$as_echo "$am_cv_make_support_nested_variables" >&6; }
if test $am_cv_make_support_nested_variables = yes; then
    AM_V='$(V)'
  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
else
  AM_V=$AM_DEFAULT_VERBOSITY
  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
fi
AM_BACKSLASH='\'

if test "`cd $srcdir && pwd`" != "`pwd`"; then
  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
  # is not polluted with repeated "-I."
  am__isrc=' -I$(srcdir)'
  # test to see if srcdir already configured
  if test -f $srcdir/config.status; then
    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
  fi
fi

# test whether we have cygpath
if test -z "$CYGPATH_W"; then
  if (cygpath --version) >/dev/null 2>/dev/null; then
    CYGPATH_W='cygpath -w'
  else
    CYGPATH_W=echo
  fi
fi


# Define the identity of the package.
 PACKAGE='gst-plugins-bad'
 VERSION='1.8.0'


cat >>confdefs.h <<_ACEOF
#define PACKAGE "$PACKAGE"
_ACEOF


cat >>confdefs.h <<_ACEOF
#define VERSION "$VERSION"
_ACEOF

# Some tools Automake needs.

ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}


AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}


AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}


AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}


MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}

# For better backward compatibility.  To be removed once Automake 1.9.x
# dies out for good.  For more background, see:
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>
# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>
mkdir_p='$(MKDIR_P)'

# We need awk for the "check" target (and possibly the TAP driver).  The
# system "awk" is bad on some platforms.
# Always define AMTAR for backward compatibility.  Yes, it's still used
# in the wild :-(  We should find a proper way to deprecate it ...
AMTAR='$${TAR-tar}'


# We'll loop over all known methods to create a tar archive until one works.
_am_tools='gnutar plaintar pax cpio none'

# The POSIX 1988 'ustar' format is defined with fixed-size fields.
      # There is notably a 21 bits limit for the UID and the GID.  In fact,
      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343
      # and bug#13588).
      am_max_uid=2097151 # 2^21 - 1
      am_max_gid=$am_max_uid
      # The $UID and $GID variables are not portable, so we need to resort
      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls
      # below are definitely unexpected, so allow the users to see them
      # (that is, avoid stderr redirection).
      am_uid=`id -u || echo unknown`
      am_gid=`id -g || echo unknown`
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5
$as_echo_n "checking whether UID '$am_uid' is supported by ustar format... " >&6; }
      if test $am_uid -le $am_max_uid; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
      else
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
         _am_tools=none
      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5
$as_echo_n "checking whether GID '$am_gid' is supported by ustar format... " >&6; }
      if test $am_gid -le $am_max_gid; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
        _am_tools=none
      fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5
$as_echo_n "checking how to create a ustar tar archive... " >&6; }

  # Go ahead even if we have the value already cached.  We do so because we
  # need to set the values for the 'am__tar' and 'am__untar' variables.
  _am_tools=${am_cv_prog_tar_ustar-$_am_tools}

  for _am_tool in $_am_tools; do
    case $_am_tool in
    gnutar)
      for _am_tar in tar gnutar gtar; do
        { echo "$as_me:$LINENO: $_am_tar --version" >&5
   ($_am_tar --version) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } && break
      done
      am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"'
      am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"'
      am__untar="$_am_tar -xf -"
      ;;
    plaintar)
      # Must skip GNU tar: if it does not support --format= it doesn't create
      # ustar tarball either.
      (tar --version) >/dev/null 2>&1 && continue
      am__tar='tar chf - "$$tardir"'
      am__tar_='tar chf - "$tardir"'
      am__untar='tar xf -'
      ;;
    pax)
      am__tar='pax -L -x ustar -w "$$tardir"'
      am__tar_='pax -L -x ustar -w "$tardir"'
      am__untar='pax -r'
      ;;
    cpio)
      am__tar='find "$$tardir" -print | cpio -o -H ustar -L'
      am__tar_='find "$tardir" -print | cpio -o -H ustar -L'
      am__untar='cpio -i -H ustar -d'
      ;;
    none)
      am__tar=false
      am__tar_=false
      am__untar=false
      ;;
    esac

    # If the value was cached, stop now.  We just wanted to have am__tar
    # and am__untar set.
    test -n "${am_cv_prog_tar_ustar}" && break

    # tar/untar a dummy directory, and stop if the command works.
    rm -rf conftest.dir
    mkdir conftest.dir
    echo GrepMe > conftest.dir/file
    { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5
   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
    rm -rf conftest.dir
    if test -s conftest.tar; then
      { echo "$as_me:$LINENO: $am__untar <conftest.tar" >&5
   ($am__untar <conftest.tar) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
      { echo "$as_me:$LINENO: cat conftest.dir/file" >&5
   (cat conftest.dir/file) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); }
      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
    fi
  done
  rm -rf conftest.dir

  if ${am_cv_prog_tar_ustar+:} false; then :
  $as_echo_n "(cached) " >&6
else
  am_cv_prog_tar_ustar=$_am_tool
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5
$as_echo "$am_cv_prog_tar_ustar" >&6; }






# POSIX will say in a future version that running "rm -f" with no argument
# is OK; and we want to be able to make that assumption in our Makefile
# recipes.  So use an aggressive probe to check that the usage we want is
# actually supported "in the wild" to an acceptable degree.
# See automake bug#10828.
# To make any issue more visible, cause the running configure to be aborted
# by default if the 'rm' program in use doesn't match our expectations; the
# user can still override this though.
if rm -f && rm -fr && rm -rf; then : OK; else
  cat >&2 <<'END'
Oops!

Your 'rm' program seems unable to run without file operands specified
on the command line, even when the '-f' option is present.  This is contrary
to the behaviour of most rm programs out there, and not conforming with
the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>

Please tell bug-automake@gnu.org about your system, including the value
of your $PATH and any error possibly output before this message.  This
can help us improve future automake versions.

END
  if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
    echo 'Configuration will proceed anyway, since you have set the' >&2
    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
    echo >&2
  else
    cat >&2 <<'END'
Aborting the configuration process, to ensure you take notice of the issue.

You can download and install GNU coreutils to get an 'rm' implementation
that behaves properly: <http://www.gnu.org/software/coreutils/>.

If you want to complete the configuration process using your problematic
'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
to "yes", and re-run configure.

END
    as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
  fi
fi



  PACKAGE_VERSION_MAJOR=$(echo 1.8.0 | cut -d'.' -f1)
  PACKAGE_VERSION_MINOR=$(echo 1.8.0 | cut -d'.' -f2)
  PACKAGE_VERSION_MICRO=$(echo 1.8.0 | cut -d'.' -f3)







  { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }

  NANO=$(echo 1.8.0 | cut -d'.' -f4)

  if test x"$NANO" = x || test "x$NANO" = "x0" ; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
$as_echo "0 (release)" >&6; }
    NANO=0
    PACKAGE_VERSION_RELEASE=1
    GST_GIT="no"
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NANO" >&5
$as_echo "$NANO" >&6; }
    PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S`
    if test "x$NANO" != "x1" ; then
       GST_GIT="no"
    else
       GST_GIT="yes"
    fi
  fi
  PACKAGE_VERSION_NANO=$NANO






ac_config_headers="$ac_config_headers config.h"



{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
    # Check whether --enable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then :
  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval
else
  USE_MAINTAINER_MODE=yes
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE" >&5
$as_echo "$USE_MAINTAINER_MODE" >&6; }
   if test $USE_MAINTAINER_MODE = yes; then
  MAINTAINER_MODE_TRUE=
  MAINTAINER_MODE_FALSE='#'
else
  MAINTAINER_MODE_TRUE='#'
  MAINTAINER_MODE_FALSE=
fi

  MAINT=$MAINTAINER_MODE_TRUE





# Check whether --enable-silent-rules was given.
if test "${enable_silent_rules+set}" = set; then :
  enableval=$enable_silent_rules;
fi

case $enable_silent_rules in # (((
  yes) AM_DEFAULT_VERBOSITY=0;;
   no) AM_DEFAULT_VERBOSITY=1;;
    *) AM_DEFAULT_VERBOSITY=0;;
esac
am_make=${MAKE-make}
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5
$as_echo_n "checking whether $am_make supports nested variables... " >&6; }
if ${am_cv_make_support_nested_variables+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if $as_echo 'TRUE=$(BAR$(V))
BAR0=false
BAR1=true
V=1
am__doit:
	@$(TRUE)
.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then
  am_cv_make_support_nested_variables=yes
else
  am_cv_make_support_nested_variables=no
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5
$as_echo "$am_cv_make_support_nested_variables" >&6; }
if test $am_cv_make_support_nested_variables = yes; then
    AM_V='$(V)'
  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'
else
  AM_V=$AM_DEFAULT_VERBOSITY
  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY
fi
AM_BACKSLASH='\'




GST_API_VERSION=1.0


cat >>confdefs.h <<_ACEOF
#define GST_API_VERSION "$GST_API_VERSION"
_ACEOF



        case $host_os in
  cygwin* | mingw*)
    lt_cv_deplibs_check_method=pass_all
    ;;
  esac


case `pwd` in
  *\ * | *\	*)
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
esac



macro_version='2.4.6'
macro_revision='2.4.6'













ltmain=$ac_aux_dir/ltmain.sh

# Backslashify metacharacters that are still active within
# double-quoted strings.
sed_quote_subst='s/\(["`$\\]\)/\\\1/g'

# Same as above, but do not quote variable references.
double_quote_subst='s/\(["`\\]\)/\\\1/g'

# Sed substitution to delay expansion of an escaped shell variable in a
# double_quote_subst'ed string.
delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'

# Sed substitution to delay expansion of an escaped single quote.
delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'

# Sed substitution to avoid accidental globbing in evaled expressions
no_glob_subst='s/\*/\\\*/g'

ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
$as_echo_n "checking how to print strings... " >&6; }
# Test print first, because it will be a builtin if present.
if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='print -r --'
elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
  ECHO='printf %s\n'
else
  # Use this function as a fallback that always works.
  func_fallback_echo ()
  {
    eval 'cat <<_LTECHO_EOF
$1
_LTECHO_EOF'
  }
  ECHO='func_fallback_echo'
fi

# func_echo_all arg...
# Invoke $ECHO with all args, space-separated.
func_echo_all ()
{
    $ECHO ""
}

case $ECHO in
  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
$as_echo "printf" >&6; } ;;
  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
$as_echo "print -r" >&6; } ;;
  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
$as_echo "cat" >&6; } ;;
esac














DEPDIR="${am__leading_dot}deps"

ac_config_commands="$ac_config_commands depfiles"


am_make=${MAKE-make}
cat > confinc << 'END'
am__doit:
	@echo this is the am__doit target
.PHONY: am__doit
END
# If we don't find an include directive, just comment out the code.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
$as_echo_n "checking for style of include used by $am_make... " >&6; }
am__include="#"
am__quote=
_am_result=none
# First try GNU make style include.
echo "include confinc" > confmf
# Ignore all kinds of additional output from 'make'.
case `$am_make -s -f confmf 2> /dev/null` in #(
*the\ am__doit\ target*)
  am__include=include
  am__quote=
  _am_result=GNU
  ;;
esac
# Now try BSD make style include.
if test "$am__include" = "#"; then
   echo '.include "confinc"' > confmf
   case `$am_make -s -f confmf 2> /dev/null` in #(
   *the\ am__doit\ target*)
     am__include=.include
     am__quote="\""
     _am_result=BSD
     ;;
   esac
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
$as_echo "$_am_result" >&6; }
rm -f confinc confmf

# Check whether --enable-dependency-tracking was given.
if test "${enable_dependency_tracking+set}" = set; then :
  enableval=$enable_dependency_tracking;
fi

if test "x$enable_dependency_tracking" != xno; then
  am_depcomp="$ac_aux_dir/depcomp"
  AMDEPBACKSLASH='\'
  am__nodep='_no'
fi
 if test "x$enable_dependency_tracking" != xno; then
  AMDEP_TRUE=
  AMDEP_FALSE='#'
else
  AMDEP_TRUE='#'
  AMDEP_FALSE=
fi


ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
  fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi


test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out"
# Try to create an executable without -o first, disregard a.out.
# It will help us diagnose broken compilers, and finding out an intuition
# of exeext.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
$as_echo_n "checking whether the C compiler works... " >&6; }
ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`

# The possible output files:
ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"

ac_rmfiles=
for ac_file in $ac_files
do
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
  esac
done
rm -f $ac_rmfiles

if { { ac_try="$ac_link_default"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link_default") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
# in a Makefile.  We should not override ac_cv_exeext if it was cached,
# so that the user can short-circuit this test for compilers unknown to
# Autoconf.
for ac_file in $ac_files ''
do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )
	;;
    [ab].out )
	# We found the default executable, but exeext='' is most
	# certainly right.
	break;;
    *.* )
	if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
	then :; else
	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	fi
	# We set ac_cv_exeext here because the later test for it is not
	# safe: cross compilers may not add the suffix if given an `-o'
	# argument, so we may need to know it at that point already.
	# Even if this section looks crufty: it has the advantage of
	# actually working.
	break;;
    * )
	break;;
  esac
done
test "$ac_cv_exeext" = no && ac_cv_exeext=

else
  ac_file=''
fi
if test -z "$ac_file"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
$as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "C compiler cannot create executables
See \`config.log' for more details" "$LINENO" 5; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
$as_echo_n "checking for C compiler default output file name... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
$as_echo "$ac_file" >&6; }
ac_exeext=$ac_cv_exeext

rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
$as_echo_n "checking for suffix of executables... " >&6; }
if { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  # If both `conftest.exe' and `conftest' are `present' (well, observable)
# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
# work properly (i.e., refer to `conftest.exe'), while it won't with
# `rm'.
for ac_file in conftest.exe conftest conftest.*; do
  test -f "$ac_file" || continue
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;
    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
	  break;;
    * ) break;;
  esac
done
else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of executables: cannot compile and link
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest conftest$ac_cv_exeext
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
$as_echo "$ac_cv_exeext" >&6; }

rm -f conftest.$ac_ext
EXEEXT=$ac_cv_exeext
ac_exeext=$EXEEXT
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdio.h>
int
main ()
{
FILE *f = fopen ("conftest.out", "w");
 return ferror (f) || fclose (f) != 0;

  ;
  return 0;
}
_ACEOF
ac_clean_files="$ac_clean_files conftest.out"
# Check that the compiler produces executables we can run.  If not, either
# the compiler is broken, or we cross compile.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
$as_echo_n "checking whether we are cross compiling... " >&6; }
if test "$cross_compiling" != yes; then
  { { ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_link") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
  if { ac_try='./conftest$ac_cv_exeext'
  { { case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_try") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }; then
    cross_compiling=no
  else
    if test "$cross_compiling" = maybe; then
	cross_compiling=yes
    else
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run C compiled programs.
If you meant to cross compile, use \`--host'.
See \`config.log' for more details" "$LINENO" 5; }
    fi
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
$as_echo "$cross_compiling" >&6; }

rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
ac_clean_files=$ac_clean_files_save
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
$as_echo_n "checking for suffix of object files... " >&6; }
if ${ac_cv_objext+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
rm -f conftest.o conftest.obj
if { { ac_try="$ac_compile"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compile") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then :
  for ac_file in conftest.o conftest.obj conftest.*; do
  test -f "$ac_file" || continue;
  case $ac_file in
    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;
    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
       break;;
  esac
done
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot compute suffix of object files: cannot compile
See \`config.log' for more details" "$LINENO" 5; }
fi
rm -f conftest.$ac_cv_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
$as_echo "$ac_cv_objext" >&6; }
OBJEXT=$ac_cv_objext
ac_objext=$OBJEXT
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
else
  CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdio.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c89"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
if ${am_cv_prog_cc_c_o+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
  # Make sure it works both with $CC and with simple cc.
  # Following AC_PROG_CC_C_O, we do the test twice because some
  # compilers refuse to overwrite an existing .o file with -o,
  # though they will create one.
  am_cv_prog_cc_c_o=yes
  for am_i in 1 2; do
    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } \
         && test -f conftest2.$ac_objext; then
      : OK
    else
      am_cv_prog_cc_c_o=no
      break
    fi
  done
  rm -f core conftest*
  unset am_i
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
$as_echo "$am_cv_prog_cc_c_o" >&6; }
if test "$am_cv_prog_cc_c_o" != yes; then
   # Losing compiler, so override with the script.
   # FIXME: It is wrong to rewrite CC.
   # But if we don't then we get into trouble of one sort or another.
   # A longer-term fix would be to have automake use am__CC in this case,
   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
   CC="$am_aux_dir/compile $CC"
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


depcc="$CC"   am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CC_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CC_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CC_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CC_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
  am__fastdepCC_TRUE=
  am__fastdepCC_FALSE='#'
else
  am__fastdepCC_TRUE='#'
  am__fastdepCC_FALSE=
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if ${ac_cv_path_SED+:} false; then :
  $as_echo_n "(cached) " >&6
else
            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
     for ac_i in 1 2 3 4 5 6 7; do
       ac_script="$ac_script$as_nl$ac_script"
     done
     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
     { ac_script=; unset ac_script;}
     if test -z "$SED"; then
  ac_path_SED_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in sed gsed; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
  # Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo '' >> "conftest.nl"
    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_SED_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_SED="$ac_path_SED"
      ac_path_SED_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_SED_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_SED"; then
    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
  fi
else
  ac_cv_path_SED=$SED
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
 SED="$ac_cv_path_SED"
  rm -f conftest.sed

test -z "$SED" && SED=sed
Xsed="$SED -e 1s/^X//"











{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
if ${ac_cv_path_GREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$GREP"; then
  ac_path_GREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in grep ggrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_GREP" || continue
# Check for GNU ac_path_GREP and select it if it is found.
  # Check for GNU $ac_path_GREP
case `"$ac_path_GREP" --version 2>&1` in
*GNU*)
  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'GREP' >> "conftest.nl"
    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_GREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_GREP="$ac_path_GREP"
      ac_path_GREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_GREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_GREP"; then
    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_GREP=$GREP
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
$as_echo "$ac_cv_path_GREP" >&6; }
 GREP="$ac_cv_path_GREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
$as_echo_n "checking for egrep... " >&6; }
if ${ac_cv_path_EGREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
   then ac_cv_path_EGREP="$GREP -E"
   else
     if test -z "$EGREP"; then
  ac_path_EGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in egrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_EGREP" || continue
# Check for GNU ac_path_EGREP and select it if it is found.
  # Check for GNU $ac_path_EGREP
case `"$ac_path_EGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'EGREP' >> "conftest.nl"
    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_EGREP="$ac_path_EGREP"
      ac_path_EGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_EGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_EGREP"; then
    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_EGREP=$EGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
$as_echo "$ac_cv_path_EGREP" >&6; }
 EGREP="$ac_cv_path_EGREP"


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
$as_echo_n "checking for fgrep... " >&6; }
if ${ac_cv_path_FGREP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
   then ac_cv_path_FGREP="$GREP -F"
   else
     if test -z "$FGREP"; then
  ac_path_FGREP_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in fgrep; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_FGREP" || continue
# Check for GNU ac_path_FGREP and select it if it is found.
  # Check for GNU $ac_path_FGREP
case `"$ac_path_FGREP" --version 2>&1` in
*GNU*)
  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo 'FGREP' >> "conftest.nl"
    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_FGREP="$ac_path_FGREP"
      ac_path_FGREP_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_FGREP_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_FGREP"; then
    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
  fi
else
  ac_cv_path_FGREP=$FGREP
fi

   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
$as_echo "$ac_cv_path_FGREP" >&6; }
 FGREP="$ac_cv_path_FGREP"


test -z "$GREP" && GREP=grep



















# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

ac_prog=ld
if test yes = "$GCC"; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return, which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | ?:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the pathname of ld
      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD=$ac_prog
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test yes = "$with_gnu_ld"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if ${lt_cv_path_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
  for ac_dir in $PATH; do
    IFS=$lt_save_ifs
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      lt_cv_path_LD=$ac_dir/$ac_prog
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some variants of GNU ld only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
      *GNU* | *'with BFD'*)
	test no != "$with_gnu_ld" && break
	;;
      *)
	test yes != "$with_gnu_ld" && break
	;;
      esac
    fi
  done
  IFS=$lt_save_ifs
else
  lt_cv_path_LD=$LD # Let the user override the test with a path.
fi
fi

LD=$lt_cv_path_LD
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${lt_cv_prog_gnu_ld+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  lt_cv_prog_gnu_ld=yes
  ;;
*)
  lt_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
if ${lt_cv_path_NM+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$NM"; then
  # Let the user override the test.
  lt_cv_path_NM=$NM
else
  lt_nm_to_check=${ac_tool_prefix}nm
  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
    lt_nm_to_check="$lt_nm_to_check nm"
  fi
  for lt_tmp_nm in $lt_nm_to_check; do
    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
      IFS=$lt_save_ifs
      test -z "$ac_dir" && ac_dir=.
      tmp_nm=$ac_dir/$lt_tmp_nm
      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
	# Check to see if the nm accepts a BSD-compat flag.
	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
	#   nm: unknown option "B" ignored
	# Tru64's nm complains that /dev/null is an invalid object file
	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
	case $build_os in
	mingw*) lt_bad_file=conftest.nm/nofile ;;
	*) lt_bad_file=/dev/null ;;
	esac
	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
	*$lt_bad_file* | *'Invalid file or object type'*)
	  lt_cv_path_NM="$tmp_nm -B"
	  break 2
	  ;;
	*)
	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
	  */dev/null*)
	    lt_cv_path_NM="$tmp_nm -p"
	    break 2
	    ;;
	  *)
	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
	    continue # so that we can try to find one that supports BSD flags
	    ;;
	  esac
	  ;;
	esac
      fi
    done
    IFS=$lt_save_ifs
  done
  : ${lt_cv_path_NM=no}
fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
$as_echo "$lt_cv_path_NM" >&6; }
if test no != "$lt_cv_path_NM"; then
  NM=$lt_cv_path_NM
else
  # Didn't find any BSD compatible name lister, look for dumpbin.
  if test -n "$DUMPBIN"; then :
    # Let the user override the test.
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in dumpbin "link -dump"
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DUMPBIN+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DUMPBIN"; then
  ac_cv_prog_DUMPBIN="$DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DUMPBIN="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DUMPBIN=$ac_cv_prog_DUMPBIN
if test -n "$DUMPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
$as_echo "$DUMPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$DUMPBIN" && break
  done
fi
if test -z "$DUMPBIN"; then
  ac_ct_DUMPBIN=$DUMPBIN
  for ac_prog in dumpbin "link -dump"
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DUMPBIN"; then
  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_DUMPBIN="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
if test -n "$ac_ct_DUMPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
$as_echo "$ac_ct_DUMPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_DUMPBIN" && break
done

  if test "x$ac_ct_DUMPBIN" = x; then
    DUMPBIN=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DUMPBIN=$ac_ct_DUMPBIN
  fi
fi

    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
    *COFF*)
      DUMPBIN="$DUMPBIN -symbols -headers"
      ;;
    *)
      DUMPBIN=:
      ;;
    esac
  fi

  if test : != "$DUMPBIN"; then
    NM=$DUMPBIN
  fi
fi
test -z "$NM" && NM=nm






{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
$as_echo_n "checking the name lister ($NM) interface... " >&6; }
if ${lt_cv_nm_interface+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_nm_interface="BSD nm"
  echo "int some_variable = 0;" > conftest.$ac_ext
  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
  (eval "$ac_compile" 2>conftest.err)
  cat conftest.err >&5
  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
  cat conftest.err >&5
  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
  cat conftest.out >&5
  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
    lt_cv_nm_interface="MS dumpbin"
  fi
  rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
$as_echo "$lt_cv_nm_interface" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
$as_echo_n "checking whether ln -s works... " >&6; }
LN_S=$as_ln_s
if test "$LN_S" = "ln -s"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
$as_echo "no, using $LN_S" >&6; }
fi

# find the maximum length of command line arguments
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
$as_echo_n "checking the maximum length of command line arguments... " >&6; }
if ${lt_cv_sys_max_cmd_len+:} false; then :
  $as_echo_n "(cached) " >&6
else
    i=0
  teststring=ABCD

  case $build_os in
  msdosdjgpp*)
    # On DJGPP, this test can blow up pretty badly due to problems in libc
    # (any single argument exceeding 2000 bytes causes a buffer overrun
    # during glob expansion).  Even if it were fixed, the result of this
    # check would be larger than it should be.
    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
    ;;

  gnu*)
    # Under GNU Hurd, this test is not required because there is
    # no limit to the length of command line arguments.
    # Libtool will interpret -1 as no limit whatsoever
    lt_cv_sys_max_cmd_len=-1;
    ;;

  cygwin* | mingw* | cegcc*)
    # On Win9x/ME, this test blows up -- it succeeds, but takes
    # about 5 minutes as the teststring grows exponentially.
    # Worse, since 9x/ME are not pre-emptively multitasking,
    # you end up with a "frozen" computer, even though with patience
    # the test eventually succeeds (with a max line length of 256k).
    # Instead, let's just punt: use the minimum linelength reported by
    # all of the supported platforms: 8192 (on NT/2K/XP).
    lt_cv_sys_max_cmd_len=8192;
    ;;

  mint*)
    # On MiNT this can take a long time and run out of memory.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  amigaos*)
    # On AmigaOS with pdksh, this test takes hours, literally.
    # So we just punt and use a minimum line length of 8192.
    lt_cv_sys_max_cmd_len=8192;
    ;;

  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
    # This has been around since 386BSD, at least.  Likely further.
    if test -x /sbin/sysctl; then
      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
    elif test -x /usr/sbin/sysctl; then
      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
    else
      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
    fi
    # And add a safety zone
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    ;;

  interix*)
    # We know the value 262144 and hardcode it with a safety zone (like BSD)
    lt_cv_sys_max_cmd_len=196608
    ;;

  os2*)
    # The test takes a long time on OS/2.
    lt_cv_sys_max_cmd_len=8192
    ;;

  osf*)
    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
    # nice to cause kernel panics so lets avoid the loop below.
    # First set a reasonable default.
    lt_cv_sys_max_cmd_len=16384
    #
    if test -x /sbin/sysconfig; then
      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
        *1*) lt_cv_sys_max_cmd_len=-1 ;;
      esac
    fi
    ;;
  sco3.2v5*)
    lt_cv_sys_max_cmd_len=102400
    ;;
  sysv5* | sco5v6* | sysv4.2uw2*)
    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
    if test -n "$kargmax"; then
      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
    else
      lt_cv_sys_max_cmd_len=32768
    fi
    ;;
  *)
    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
    if test -n "$lt_cv_sys_max_cmd_len" && \
       test undefined != "$lt_cv_sys_max_cmd_len"; then
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
    else
      # Make teststring a little bigger before we do anything with it.
      # a 1K string should be a reasonable start.
      for i in 1 2 3 4 5 6 7 8; do
        teststring=$teststring$teststring
      done
      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
      # If test is not a shell built-in, we'll probably end up computing a
      # maximum length that is only half of the actual maximum length, but
      # we can't tell.
      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
	      test 17 != "$i" # 1/2 MB should be enough
      do
        i=`expr $i + 1`
        teststring=$teststring$teststring
      done
      # Only check the string length outside the loop.
      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
      teststring=
      # Add a significant safety factor because C++ compilers can tack on
      # massive amounts of additional arguments before passing them to the
      # linker.  It appears as though 1/2 is a usable value.
      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
    fi
    ;;
  esac

fi

if test -n "$lt_cv_sys_max_cmd_len"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
$as_echo "none" >&6; }
fi
max_cmd_len=$lt_cv_sys_max_cmd_len






: ${CP="cp -f"}
: ${MV="mv -f"}
: ${RM="rm -f"}

if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
  lt_unset=unset
else
  lt_unset=false
fi





# test EBCDIC or ASCII
case `echo X|tr X '\101'` in
 A) # ASCII based system
    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
  lt_SP2NL='tr \040 \012'
  lt_NL2SP='tr \015\012 \040\040'
  ;;
 *) # EBCDIC based system
  lt_SP2NL='tr \100 \n'
  lt_NL2SP='tr \r\n \100\100'
  ;;
esac









{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
if ${lt_cv_to_host_file_cmd+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $host in
  *-*-mingw* )
    case $build in
      *-*-mingw* ) # actually msys
        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
        ;;
      *-*-cygwin* )
        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
        ;;
      * ) # otherwise, assume *nix
        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
        ;;
    esac
    ;;
  *-*-cygwin* )
    case $build in
      *-*-mingw* ) # actually msys
        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
        ;;
      *-*-cygwin* )
        lt_cv_to_host_file_cmd=func_convert_file_noop
        ;;
      * ) # otherwise, assume *nix
        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
        ;;
    esac
    ;;
  * ) # unhandled hosts (and "normal" native builds)
    lt_cv_to_host_file_cmd=func_convert_file_noop
    ;;
esac

fi

to_host_file_cmd=$lt_cv_to_host_file_cmd
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
$as_echo "$lt_cv_to_host_file_cmd" >&6; }





{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
if ${lt_cv_to_tool_file_cmd+:} false; then :
  $as_echo_n "(cached) " >&6
else
  #assume ordinary cross tools, or native build.
lt_cv_to_tool_file_cmd=func_convert_file_noop
case $host in
  *-*-mingw* )
    case $build in
      *-*-mingw* ) # actually msys
        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
        ;;
    esac
    ;;
esac

fi

to_tool_file_cmd=$lt_cv_to_tool_file_cmd
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
$as_echo "$lt_cv_to_tool_file_cmd" >&6; }





{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
$as_echo_n "checking for $LD option to reload object files... " >&6; }
if ${lt_cv_ld_reload_flag+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_reload_flag='-r'
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
$as_echo "$lt_cv_ld_reload_flag" >&6; }
reload_flag=$lt_cv_ld_reload_flag
case $reload_flag in
"" | " "*) ;;
*) reload_flag=" $reload_flag" ;;
esac
reload_cmds='$LD$reload_flag -o $output$reload_objs'
case $host_os in
  cygwin* | mingw* | pw32* | cegcc*)
    if test yes != "$GCC"; then
      reload_cmds=false
    fi
    ;;
  darwin*)
    if test yes = "$GCC"; then
      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
    else
      reload_cmds='$LD$reload_flag -o $output$reload_objs'
    fi
    ;;
esac









if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OBJDUMP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OBJDUMP"; then
  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
$as_echo "$OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OBJDUMP"; then
  ac_ct_OBJDUMP=$OBJDUMP
  # Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OBJDUMP"; then
  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_OBJDUMP="objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
$as_echo "$ac_ct_OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OBJDUMP" = x; then
    OBJDUMP="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OBJDUMP=$ac_ct_OBJDUMP
  fi
else
  OBJDUMP="$ac_cv_prog_OBJDUMP"
fi

test -z "$OBJDUMP" && OBJDUMP=objdump






{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
$as_echo_n "checking how to recognize dependent libraries... " >&6; }
if ${lt_cv_deplibs_check_method+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_file_magic_cmd='$MAGIC_CMD'
lt_cv_file_magic_test_file=
lt_cv_deplibs_check_method='unknown'
# Need to set the preceding variable on all platforms that support
# interlibrary dependencies.
# 'none' -- dependencies not supported.
# 'unknown' -- same as none, but documents that we really don't know.
# 'pass_all' -- all dependencies passed with no checks.
# 'test_compile' -- check by making test program.
# 'file_magic [[regex]]' -- check by looking for files in library path
# that responds to the $file_magic_cmd with a given extended regex.
# If you have 'file' or equivalent on your system and you're not sure
# whether 'pass_all' will *always* work, you probably want this one.

case $host_os in
aix[4-9]*)
  lt_cv_deplibs_check_method=pass_all
  ;;

beos*)
  lt_cv_deplibs_check_method=pass_all
  ;;

bsdi[45]*)
  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
  lt_cv_file_magic_cmd='/usr/bin/file -L'
  lt_cv_file_magic_test_file=/shlib/libc.so
  ;;

cygwin*)
  # func_win32_libid is a shell function defined in ltmain.sh
  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
  lt_cv_file_magic_cmd='func_win32_libid'
  ;;

mingw* | pw32*)
  # Base MSYS/MinGW do not provide the 'file' command needed by
  # func_win32_libid shell function, so use a weaker test based on 'objdump',
  # unless we find 'file', for example because we are cross-compiling.
  if ( file / ) >/dev/null 2>&1; then
    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
    lt_cv_file_magic_cmd='func_win32_libid'
  else
    # Keep this pattern in sync with the one in func_win32_libid.
    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
    lt_cv_file_magic_cmd='$OBJDUMP -f'
  fi
  ;;

cegcc*)
  # use the weaker test based on 'objdump'. See mingw*.
  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
  lt_cv_file_magic_cmd='$OBJDUMP -f'
  ;;

darwin* | rhapsody*)
  lt_cv_deplibs_check_method=pass_all
  ;;

freebsd* | dragonfly*)
  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
    case $host_cpu in
    i*86 )
      # Not sure whether the presence of OpenBSD here was a mistake.
      # Let's accept both of them until this is cleared up.
      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
      lt_cv_file_magic_cmd=/usr/bin/file
      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
      ;;
    esac
  else
    lt_cv_deplibs_check_method=pass_all
  fi
  ;;

haiku*)
  lt_cv_deplibs_check_method=pass_all
  ;;

hpux10.20* | hpux11*)
  lt_cv_file_magic_cmd=/usr/bin/file
  case $host_cpu in
  ia64*)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
    ;;
  hppa*64*)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
    ;;
  *)
    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
    lt_cv_file_magic_test_file=/usr/lib/libc.sl
    ;;
  esac
  ;;

interix[3-9]*)
  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
  ;;

irix5* | irix6* | nonstopux*)
  case $LD in
  *-32|*"-32 ") libmagic=32-bit;;
  *-n32|*"-n32 ") libmagic=N32;;
  *-64|*"-64 ") libmagic=64-bit;;
  *) libmagic=never-match;;
  esac
  lt_cv_deplibs_check_method=pass_all
  ;;

# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
  lt_cv_deplibs_check_method=pass_all
  ;;

netbsd* | netbsdelf*-gnu)
  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
  else
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
  fi
  ;;

newos6*)
  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
  lt_cv_file_magic_cmd=/usr/bin/file
  lt_cv_file_magic_test_file=/usr/lib/libnls.so
  ;;

*nto* | *qnx*)
  lt_cv_deplibs_check_method=pass_all
  ;;

openbsd* | bitrig*)
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
  else
    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
  fi
  ;;

osf3* | osf4* | osf5*)
  lt_cv_deplibs_check_method=pass_all
  ;;

rdos*)
  lt_cv_deplibs_check_method=pass_all
  ;;

solaris*)
  lt_cv_deplibs_check_method=pass_all
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  lt_cv_deplibs_check_method=pass_all
  ;;

sysv4 | sysv4.3*)
  case $host_vendor in
  motorola)
    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
    ;;
  ncr)
    lt_cv_deplibs_check_method=pass_all
    ;;
  sequent)
    lt_cv_file_magic_cmd='/bin/file'
    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
    ;;
  sni)
    lt_cv_file_magic_cmd='/bin/file'
    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
    lt_cv_file_magic_test_file=/lib/libc.so
    ;;
  siemens)
    lt_cv_deplibs_check_method=pass_all
    ;;
  pc)
    lt_cv_deplibs_check_method=pass_all
    ;;
  esac
  ;;

tpf*)
  lt_cv_deplibs_check_method=pass_all
  ;;
os2*)
  lt_cv_deplibs_check_method=pass_all
  ;;
esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
$as_echo "$lt_cv_deplibs_check_method" >&6; }

file_magic_glob=
want_nocaseglob=no
if test "$build" = "$host"; then
  case $host_os in
  mingw* | pw32*)
    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
      want_nocaseglob=yes
    else
      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
    fi
    ;;
  esac
fi

file_magic_cmd=$lt_cv_file_magic_cmd
deplibs_check_method=$lt_cv_deplibs_check_method
test -z "$deplibs_check_method" && deplibs_check_method=unknown






















if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DLLTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DLLTOOL"; then
  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
$as_echo "$DLLTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_DLLTOOL"; then
  ac_ct_DLLTOOL=$DLLTOOL
  # Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DLLTOOL"; then
  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
$as_echo "$ac_ct_DLLTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_DLLTOOL" = x; then
    DLLTOOL="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DLLTOOL=$ac_ct_DLLTOOL
  fi
else
  DLLTOOL="$ac_cv_prog_DLLTOOL"
fi

test -z "$DLLTOOL" && DLLTOOL=dlltool







{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_sharedlib_from_linklib_cmd='unknown'

case $host_os in
cygwin* | mingw* | pw32* | cegcc*)
  # two different shell functions defined in ltmain.sh;
  # decide which one to use based on capabilities of $DLLTOOL
  case `$DLLTOOL --help 2>&1` in
  *--identify-strict*)
    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
    ;;
  *)
    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
    ;;
  esac
  ;;
*)
  # fallback: assume linklib IS sharedlib
  lt_cv_sharedlib_from_linklib_cmd=$ECHO
  ;;
esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO








if test -n "$ac_tool_prefix"; then
  for ac_prog in ar
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AR+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_AR="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AR=$ac_cv_prog_AR
if test -n "$AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
$as_echo "$AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$AR" && break
  done
fi
if test -z "$AR"; then
  ac_ct_AR=$AR
  for ac_prog in ar
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_AR+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AR"; then
  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_AR="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AR=$ac_cv_prog_ac_ct_AR
if test -n "$ac_ct_AR"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
$as_echo "$ac_ct_AR" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_AR" && break
done

  if test "x$ac_ct_AR" = x; then
    AR="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AR=$ac_ct_AR
  fi
fi

: ${AR=ar}
: ${AR_FLAGS=cru}











{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
$as_echo_n "checking for archiver @FILE support... " >&6; }
if ${lt_cv_ar_at_file+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ar_at_file=no
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  echo conftest.$ac_objext > conftest.lst
      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
  (eval $lt_ar_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
      if test 0 -eq "$ac_status"; then
	# Ensure the archiver fails upon bogus file names.
	rm -f conftest.$ac_objext libconftest.a
	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
  (eval $lt_ar_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
	if test 0 -ne "$ac_status"; then
          lt_cv_ar_at_file=@
        fi
      fi
      rm -f conftest.* libconftest.a

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
$as_echo "$lt_cv_ar_at_file" >&6; }

if test no = "$lt_cv_ar_at_file"; then
  archiver_list_spec=
else
  archiver_list_spec=$lt_cv_ar_at_file
fi







if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
set dummy ${ac_tool_prefix}strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
STRIP=$ac_cv_prog_STRIP
if test -n "$STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
$as_echo "$STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_STRIP"; then
  ac_ct_STRIP=$STRIP
  # Extract the first word of "strip", so it can be a program name with args.
set dummy strip; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_STRIP"; then
  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_STRIP="strip"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
if test -n "$ac_ct_STRIP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
$as_echo "$ac_ct_STRIP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_STRIP" = x; then
    STRIP=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    STRIP=$ac_ct_STRIP
  fi
else
  STRIP="$ac_cv_prog_STRIP"
fi

test -z "$STRIP" && STRIP=:






if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
set dummy ${ac_tool_prefix}ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
RANLIB=$ac_cv_prog_RANLIB
if test -n "$RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
$as_echo "$RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_RANLIB"; then
  ac_ct_RANLIB=$RANLIB
  # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_RANLIB"; then
  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_RANLIB="ranlib"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
if test -n "$ac_ct_RANLIB"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
$as_echo "$ac_ct_RANLIB" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_RANLIB" = x; then
    RANLIB=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    RANLIB=$ac_ct_RANLIB
  fi
else
  RANLIB="$ac_cv_prog_RANLIB"
fi

test -z "$RANLIB" && RANLIB=:






# Determine commands to create old-style static archives.
old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
old_postinstall_cmds='chmod 644 $oldlib'
old_postuninstall_cmds=

if test -n "$RANLIB"; then
  case $host_os in
  bitrig* | openbsd*)
    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
    ;;
  *)
    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
    ;;
  esac
  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
fi

case $host_os in
  darwin*)
    lock_old_archive_extraction=yes ;;
  *)
    lock_old_archive_extraction=no ;;
esac







































# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC


# Check for command to grab the raw symbol name followed by C symbol from nm.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
if ${lt_cv_sys_global_symbol_pipe+:} false; then :
  $as_echo_n "(cached) " >&6
else

# These are sane defaults that work on at least a few old systems.
# [They come from Ultrix.  What could be older than Ultrix?!! ;)]

# Character class describing NM global symbol codes.
symcode='[BCDEGRST]'

# Regexp to match symbols that can be accessed directly from C.
sympat='\([_A-Za-z][_A-Za-z0-9]*\)'

# Define system-specific variables.
case $host_os in
aix*)
  symcode='[BCDT]'
  ;;
cygwin* | mingw* | pw32* | cegcc*)
  symcode='[ABCDGISTW]'
  ;;
hpux*)
  if test ia64 = "$host_cpu"; then
    symcode='[ABCDEGRST]'
  fi
  ;;
irix* | nonstopux*)
  symcode='[BCDEGRST]'
  ;;
osf*)
  symcode='[BCDEGQRST]'
  ;;
solaris*)
  symcode='[BDRT]'
  ;;
sco3.2v5*)
  symcode='[DT]'
  ;;
sysv4.2uw2*)
  symcode='[DT]'
  ;;
sysv5* | sco5v6* | unixware* | OpenUNIX*)
  symcode='[ABDT]'
  ;;
sysv4)
  symcode='[DFNSTU]'
  ;;
esac

# If we're using GNU nm, then use its standard symbol codes.
case `$NM -V 2>&1` in
*GNU* | *'with BFD'*)
  symcode='[ABCDGIRSTW]' ;;
esac

if test "$lt_cv_nm_interface" = "MS dumpbin"; then
  # Gets list of data symbols to import.
  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
  # Adjust the below global symbol transforms to fixup imported variables.
  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
  lt_c_name_lib_hook="\
  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
else
  # Disable hooks by default.
  lt_cv_sys_global_symbol_to_import=
  lt_cdecl_hook=
  lt_c_name_hook=
  lt_c_name_lib_hook=
fi

# Transform an extracted symbol line into a proper C declaration.
# Some systems (esp. on ia64) link data and code symbols differently,
# so use this general approach.
lt_cv_sys_global_symbol_to_cdecl="sed -n"\
$lt_cdecl_hook\
" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"

# Transform an extracted symbol line into symbol name and symbol address
lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
$lt_c_name_hook\
" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"

# Transform an extracted symbol line into symbol name with lib prefix and
# symbol address.
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
$lt_c_name_lib_hook\
" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"

# Handle CRLF in mingw tool chain
opt_cr=
case $build_os in
mingw*)
  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
  ;;
esac

# Try without a prefix underscore, then with it.
for ac_symprfx in "" "_"; do

  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
  symxfrm="\\1 $ac_symprfx\\2 \\2"

  # Write the raw and C identifiers.
  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
    # Fake it for dumpbin and say T for any non-static function,
    # D for any global variable and I for any imported variable.
    # Also find C++ and __fastcall symbols from MSVC++,
    # which start with @ or ?.
    lt_cv_sys_global_symbol_pipe="$AWK '"\
"     {last_section=section; section=\$ 3};"\
"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
"     \$ 0!~/External *\|/{next};"\
"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
"     {if(hide[section]) next};"\
"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
"     ' prfx=^$ac_symprfx"
  else
    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
  fi
  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"

  # Check to see that the pipe works correctly.
  pipe_works=no

  rm -f conftest*
  cat > conftest.$ac_ext <<_LT_EOF
#ifdef __cplusplus
extern "C" {
#endif
char nm_test_var;
void nm_test_func(void);
void nm_test_func(void){}
#ifdef __cplusplus
}
#endif
int main(){nm_test_var='a';nm_test_func();return(0);}
_LT_EOF

  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    # Now try to grab the symbols.
    nlist=conftest.nm
    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s "$nlist"; then
      # Try sorting and uniquifying the output.
      if sort "$nlist" | uniq > "$nlist"T; then
	mv -f "$nlist"T "$nlist"
      else
	rm -f "$nlist"T
      fi

      # Make sure that we snagged all the symbols we need.
      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
	  cat <<_LT_EOF > conftest.$ac_ext
/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
/* DATA imports from DLLs on WIN32 can't be const, because runtime
   relocations are performed -- see ld's documentation on pseudo-relocs.  */
# define LT_DLSYM_CONST
#elif defined __osf__
/* This system does not cope well with relocations in const data.  */
# define LT_DLSYM_CONST
#else
# define LT_DLSYM_CONST const
#endif

#ifdef __cplusplus
extern "C" {
#endif

_LT_EOF
	  # Now generate the symbol file.
	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'

	  cat <<_LT_EOF >> conftest.$ac_ext

/* The mapping between symbol names and symbols.  */
LT_DLSYM_CONST struct {
  const char *name;
  void       *address;
}
lt__PROGRAM__LTX_preloaded_symbols[] =
{
  { "@PROGRAM@", (void *) 0 },
_LT_EOF
	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
	  cat <<\_LT_EOF >> conftest.$ac_ext
  {0, (void *) 0}
};

/* This works around a problem in FreeBSD linker */
#ifdef FREEBSD_WORKAROUND
static const void *lt_preloaded_setup() {
  return lt__PROGRAM__LTX_preloaded_symbols;
}
#endif

#ifdef __cplusplus
}
#endif
_LT_EOF
	  # Now try linking the two files.
	  mv conftest.$ac_objext conftstm.$ac_objext
	  lt_globsym_save_LIBS=$LIBS
	  lt_globsym_save_CFLAGS=$CFLAGS
	  LIBS=conftstm.$ac_objext
	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s conftest$ac_exeext; then
	    pipe_works=yes
	  fi
	  LIBS=$lt_globsym_save_LIBS
	  CFLAGS=$lt_globsym_save_CFLAGS
	else
	  echo "cannot find nm_test_func in $nlist" >&5
	fi
      else
	echo "cannot find nm_test_var in $nlist" >&5
      fi
    else
      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
    fi
  else
    echo "$progname: failed program was:" >&5
    cat conftest.$ac_ext >&5
  fi
  rm -rf conftest* conftst*

  # Do not use the global_symbol_pipe unless it works.
  if test yes = "$pipe_works"; then
    break
  else
    lt_cv_sys_global_symbol_pipe=
  fi
done

fi

if test -z "$lt_cv_sys_global_symbol_pipe"; then
  lt_cv_sys_global_symbol_to_cdecl=
fi
if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
$as_echo "failed" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
$as_echo "ok" >&6; }
fi

# Response file support.
if test "$lt_cv_nm_interface" = "MS dumpbin"; then
  nm_file_list_spec='@'
elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
  nm_file_list_spec='@'
fi





































{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
$as_echo_n "checking for sysroot... " >&6; }

# Check whether --with-sysroot was given.
if test "${with_sysroot+set}" = set; then :
  withval=$with_sysroot;
else
  with_sysroot=no
fi


lt_sysroot=
case $with_sysroot in #(
 yes)
   if test yes = "$GCC"; then
     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
   fi
   ;; #(
 /*)
   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
   ;; #(
 no|'')
   ;; #(
 *)
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_sysroot" >&5
$as_echo "$with_sysroot" >&6; }
   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
   ;;
esac

 { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
$as_echo "${lt_sysroot:-no}" >&6; }





{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a working dd" >&5
$as_echo_n "checking for a working dd... " >&6; }
if ${ac_cv_path_lt_DD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
: ${lt_DD:=$DD}
if test -z "$lt_DD"; then
  ac_path_lt_DD_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in dd; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_lt_DD="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_lt_DD" || continue
if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
  cmp -s conftest.i conftest.out \
  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
fi
      $ac_path_lt_DD_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_lt_DD"; then
    :
  fi
else
  ac_cv_path_lt_DD=$lt_DD
fi

rm -f conftest.i conftest2.i conftest.out
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_lt_DD" >&5
$as_echo "$ac_cv_path_lt_DD" >&6; }


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to truncate binary pipes" >&5
$as_echo_n "checking how to truncate binary pipes... " >&6; }
if ${lt_cv_truncate_bin+:} false; then :
  $as_echo_n "(cached) " >&6
else
  printf 0123456789abcdef0123456789abcdef >conftest.i
cat conftest.i conftest.i >conftest2.i
lt_cv_truncate_bin=
if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
  cmp -s conftest.i conftest.out \
  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
fi
rm -f conftest.i conftest2.i conftest.out
test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_truncate_bin" >&5
$as_echo "$lt_cv_truncate_bin" >&6; }







# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
    for cc_temp in $*""; do
      case $cc_temp in
        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
        \-*) ;;
        *) break;;
      esac
    done
    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}

# Check whether --enable-libtool-lock was given.
if test "${enable_libtool_lock+set}" = set; then :
  enableval=$enable_libtool_lock;
fi

test no = "$enable_libtool_lock" || enable_libtool_lock=yes

# Some flags need to be propagated to the compiler or linker for good
# libtool support.
case $host in
ia64-*-hpux*)
  # Find out what ABI is being produced by ac_compile, and set mode
  # options accordingly.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.$ac_objext` in
      *ELF-32*)
	HPUX_IA64_MODE=32
	;;
      *ELF-64*)
	HPUX_IA64_MODE=64
	;;
    esac
  fi
  rm -rf conftest*
  ;;
*-*-irix6*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    if test yes = "$lt_cv_prog_gnu_ld"; then
      case `/usr/bin/file conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -melf32bsmip"
	  ;;
	*N32*)
	  LD="${LD-ld} -melf32bmipn32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -melf64bmip"
	;;
      esac
    else
      case `/usr/bin/file conftest.$ac_objext` in
	*32-bit*)
	  LD="${LD-ld} -32"
	  ;;
	*N32*)
	  LD="${LD-ld} -n32"
	  ;;
	*64-bit*)
	  LD="${LD-ld} -64"
	  ;;
      esac
    fi
  fi
  rm -rf conftest*
  ;;

mips64*-*linux*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    emul=elf
    case `/usr/bin/file conftest.$ac_objext` in
      *32-bit*)
	emul="${emul}32"
	;;
      *64-bit*)
	emul="${emul}64"
	;;
    esac
    case `/usr/bin/file conftest.$ac_objext` in
      *MSB*)
	emul="${emul}btsmip"
	;;
      *LSB*)
	emul="${emul}ltsmip"
	;;
    esac
    case `/usr/bin/file conftest.$ac_objext` in
      *N32*)
	emul="${emul}n32"
	;;
    esac
    LD="${LD-ld} -m $emul"
  fi
  rm -rf conftest*
  ;;

x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.  Note that the listed cases only cover the
  # situations where additional linker options are needed (such as when
  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
  # vice versa); the common cases where no linker options are needed do
  # not appear in the list.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.o` in
      *32-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_i386_fbsd"
	    ;;
	  x86_64-*linux*)
	    case `/usr/bin/file conftest.o` in
	      *x86-64*)
		LD="${LD-ld} -m elf32_x86_64"
		;;
	      *)
		LD="${LD-ld} -m elf_i386"
		;;
	    esac
	    ;;
	  powerpc64le-*linux*)
	    LD="${LD-ld} -m elf32lppclinux"
	    ;;
	  powerpc64-*linux*)
	    LD="${LD-ld} -m elf32ppclinux"
	    ;;
	  s390x-*linux*)
	    LD="${LD-ld} -m elf_s390"
	    ;;
	  sparc64-*linux*)
	    LD="${LD-ld} -m elf32_sparc"
	    ;;
	esac
	;;
      *64-bit*)
	case $host in
	  x86_64-*kfreebsd*-gnu)
	    LD="${LD-ld} -m elf_x86_64_fbsd"
	    ;;
	  x86_64-*linux*)
	    LD="${LD-ld} -m elf_x86_64"
	    ;;
	  powerpcle-*linux*)
	    LD="${LD-ld} -m elf64lppc"
	    ;;
	  powerpc-*linux*)
	    LD="${LD-ld} -m elf64ppc"
	    ;;
	  s390*-*linux*|s390*-*tpf*)
	    LD="${LD-ld} -m elf64_s390"
	    ;;
	  sparc*-*linux*)
	    LD="${LD-ld} -m elf64_sparc"
	    ;;
	esac
	;;
    esac
  fi
  rm -rf conftest*
  ;;

*-*-sco3.2v5*)
  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
  SAVE_CFLAGS=$CFLAGS
  CFLAGS="$CFLAGS -belf"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
if ${lt_cv_cc_needs_belf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  lt_cv_cc_needs_belf=yes
else
  lt_cv_cc_needs_belf=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
$as_echo "$lt_cv_cc_needs_belf" >&6; }
  if test yes != "$lt_cv_cc_needs_belf"; then
    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
    CFLAGS=$SAVE_CFLAGS
  fi
  ;;
*-*solaris*)
  # Find out what ABI is being produced by ac_compile, and set linker
  # options accordingly.
  echo 'int i;' > conftest.$ac_ext
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
    case `/usr/bin/file conftest.o` in
    *64-bit*)
      case $lt_cv_prog_gnu_ld in
      yes*)
        case $host in
        i?86-*-solaris*|x86_64-*-solaris*)
          LD="${LD-ld} -m elf_x86_64"
          ;;
        sparc*-*-solaris*)
          LD="${LD-ld} -m elf64_sparc"
          ;;
        esac
        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
          LD=${LD-ld}_sol2
        fi
        ;;
      *)
	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
	  LD="${LD-ld} -64"
	fi
	;;
      esac
      ;;
    esac
  fi
  rm -rf conftest*
  ;;
esac

need_locks=$enable_libtool_lock

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
set dummy ${ac_tool_prefix}mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$MANIFEST_TOOL"; then
  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_MANIFEST_TOOL="${ac_tool_prefix}mt"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
if test -n "$MANIFEST_TOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
$as_echo "$MANIFEST_TOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
  # Extract the first word of "mt", so it can be a program name with args.
set dummy mt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_MANIFEST_TOOL"; then
  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_MANIFEST_TOOL="mt"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
if test -n "$ac_ct_MANIFEST_TOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_MANIFEST_TOOL" = x; then
    MANIFEST_TOOL=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
  fi
else
  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
fi

test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
if ${lt_cv_path_mainfest_tool+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_path_mainfest_tool=no
  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
  cat conftest.err >&5
  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
    lt_cv_path_mainfest_tool=yes
  fi
  rm -f conftest*
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
$as_echo "$lt_cv_path_mainfest_tool" >&6; }
if test yes != "$lt_cv_path_mainfest_tool"; then
  MANIFEST_TOOL=:
fi






  case $host_os in
    rhapsody* | darwin*)
    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DSYMUTIL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DSYMUTIL"; then
  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DSYMUTIL=$ac_cv_prog_DSYMUTIL
if test -n "$DSYMUTIL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
$as_echo "$DSYMUTIL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_DSYMUTIL"; then
  ac_ct_DSYMUTIL=$DSYMUTIL
  # Extract the first word of "dsymutil", so it can be a program name with args.
set dummy dsymutil; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DSYMUTIL"; then
  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_DSYMUTIL="dsymutil"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
if test -n "$ac_ct_DSYMUTIL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
$as_echo "$ac_ct_DSYMUTIL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_DSYMUTIL" = x; then
    DSYMUTIL=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DSYMUTIL=$ac_ct_DSYMUTIL
  fi
else
  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
set dummy ${ac_tool_prefix}nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_NMEDIT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$NMEDIT"; then
  ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
NMEDIT=$ac_cv_prog_NMEDIT
if test -n "$NMEDIT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
$as_echo "$NMEDIT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_NMEDIT"; then
  ac_ct_NMEDIT=$NMEDIT
  # Extract the first word of "nmedit", so it can be a program name with args.
set dummy nmedit; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_NMEDIT"; then
  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_NMEDIT="nmedit"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
if test -n "$ac_ct_NMEDIT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
$as_echo "$ac_ct_NMEDIT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_NMEDIT" = x; then
    NMEDIT=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    NMEDIT=$ac_ct_NMEDIT
  fi
else
  NMEDIT="$ac_cv_prog_NMEDIT"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
set dummy ${ac_tool_prefix}lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_LIPO+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LIPO"; then
  ac_cv_prog_LIPO="$LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_LIPO="${ac_tool_prefix}lipo"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
LIPO=$ac_cv_prog_LIPO
if test -n "$LIPO"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
$as_echo "$LIPO" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_LIPO"; then
  ac_ct_LIPO=$LIPO
  # Extract the first word of "lipo", so it can be a program name with args.
set dummy lipo; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_LIPO"; then
  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_LIPO="lipo"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
if test -n "$ac_ct_LIPO"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
$as_echo "$ac_ct_LIPO" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_LIPO" = x; then
    LIPO=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LIPO=$ac_ct_LIPO
  fi
else
  LIPO="$ac_cv_prog_LIPO"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OTOOL"; then
  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_OTOOL="${ac_tool_prefix}otool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OTOOL=$ac_cv_prog_OTOOL
if test -n "$OTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
$as_echo "$OTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OTOOL"; then
  ac_ct_OTOOL=$OTOOL
  # Extract the first word of "otool", so it can be a program name with args.
set dummy otool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OTOOL"; then
  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_OTOOL="otool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
if test -n "$ac_ct_OTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
$as_echo "$ac_ct_OTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OTOOL" = x; then
    OTOOL=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OTOOL=$ac_ct_OTOOL
  fi
else
  OTOOL="$ac_cv_prog_OTOOL"
fi

    if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
set dummy ${ac_tool_prefix}otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OTOOL64+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OTOOL64"; then
  ac_cv_prog_OTOOL64="$OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_OTOOL64="${ac_tool_prefix}otool64"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OTOOL64=$ac_cv_prog_OTOOL64
if test -n "$OTOOL64"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
$as_echo "$OTOOL64" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OTOOL64"; then
  ac_ct_OTOOL64=$OTOOL64
  # Extract the first word of "otool64", so it can be a program name with args.
set dummy otool64; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OTOOL64"; then
  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_OTOOL64="otool64"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
if test -n "$ac_ct_OTOOL64"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
$as_echo "$ac_ct_OTOOL64" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OTOOL64" = x; then
    OTOOL64=":"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OTOOL64=$ac_ct_OTOOL64
  fi
else
  OTOOL64="$ac_cv_prog_OTOOL64"
fi



























    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
$as_echo_n "checking for -single_module linker flag... " >&6; }
if ${lt_cv_apple_cc_single_mod+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_apple_cc_single_mod=no
      if test -z "$LT_MULTI_MODULE"; then
	# By default we will add the -single_module flag. You can override
	# by either setting the environment variable LT_MULTI_MODULE
	# non-empty at configure time, or by adding -multi_module to the
	# link flags.
	rm -rf libconftest.dylib*
	echo "int foo(void){return 1;}" > conftest.c
	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
-dynamiclib -Wl,-single_module conftest.c" >&5
	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
        _lt_result=$?
	# If there is a non-empty error log, and "single_module"
	# appears in it, assume the flag caused a linker warning
        if test -s conftest.err && $GREP single_module conftest.err; then
	  cat conftest.err >&5
	# Otherwise, if the output was created with a 0 exit code from
	# the compiler, it worked.
	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
	  lt_cv_apple_cc_single_mod=yes
	else
	  cat conftest.err >&5
	fi
	rm -rf libconftest.dylib*
	rm -f conftest.*
      fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
$as_echo "$lt_cv_apple_cc_single_mod" >&6; }

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
if ${lt_cv_ld_exported_symbols_list+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_exported_symbols_list=no
      save_LDFLAGS=$LDFLAGS
      echo "_main" > conftest.sym
      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  lt_cv_ld_exported_symbols_list=yes
else
  lt_cv_ld_exported_symbols_list=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
	LDFLAGS=$save_LDFLAGS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
$as_echo_n "checking for -force_load linker flag... " >&6; }
if ${lt_cv_ld_force_load+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_ld_force_load=no
      cat > conftest.c << _LT_EOF
int forced_loaded() { return 2;}
_LT_EOF
      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
      echo "$AR cru libconftest.a conftest.o" >&5
      $AR cru libconftest.a conftest.o 2>&5
      echo "$RANLIB libconftest.a" >&5
      $RANLIB libconftest.a 2>&5
      cat > conftest.c << _LT_EOF
int main() { return 0;}
_LT_EOF
      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
      _lt_result=$?
      if test -s conftest.err && $GREP force_load conftest.err; then
	cat conftest.err >&5
      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
	lt_cv_ld_force_load=yes
      else
	cat conftest.err >&5
      fi
        rm -f conftest.err libconftest.a conftest conftest.c
        rm -rf conftest.dSYM

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
$as_echo "$lt_cv_ld_force_load" >&6; }
    case $host_os in
    rhapsody* | darwin1.[012])
      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
    darwin1.*)
      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
    darwin*) # darwin 5.x on
      # if running on 10.5 or later, the deployment target defaults
      # to the OS version, if on x86, and 10.4, the deployment
      # target defaults to 10.4. Don't you love it?
      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
	10.[012][,.]*)
	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
	10.*)
	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
      esac
    ;;
  esac
    if test yes = "$lt_cv_apple_cc_single_mod"; then
      _lt_dar_single_mod='$single_module'
    fi
    if test yes = "$lt_cv_ld_exported_symbols_list"; then
      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
    else
      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
    fi
    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
      _lt_dsymutil='~$DSYMUTIL $lib || :'
    else
      _lt_dsymutil=
    fi
    ;;
  esac

# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
#       string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
#       string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
#       "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
#       VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
    case x$2 in
    x)
        ;;
    *:)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
        ;;
    x:*)
        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    *::*)
        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
        ;;
    *)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    esac
}

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
$as_echo_n "checking how to run the C preprocessor... " >&6; }
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
  if ${ac_cv_prog_CPP+:} false; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CPP needs to be expanded
    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CPP=$CPP

fi
  CPP=$ac_cv_prog_CPP
else
  ac_cv_prog_CPP=$CPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
$as_echo "$CPP" >&6; }
ac_preproc_ok=false
for ac_c_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
$as_echo_n "checking for ANSI C header files... " >&6; }
if ${ac_cv_header_stdc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stdc=yes
else
  ac_cv_header_stdc=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "memchr" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>

_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "free" >/dev/null 2>&1; then :

else
  ac_cv_header_stdc=no
fi
rm -f conftest*

fi

if test $ac_cv_header_stdc = yes; then
  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
  if test "$cross_compiling" = yes; then :
  :
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ctype.h>
#include <stdlib.h>
#if ((' ' & 0x0FF) == 0x020)
# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#else
# define ISLOWER(c) \
		   (('a' <= (c) && (c) <= 'i') \
		     || ('j' <= (c) && (c) <= 'r') \
		     || ('s' <= (c) && (c) <= 'z'))
# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
#endif

#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
int
main ()
{
  int i;
  for (i = 0; i < 256; i++)
    if (XOR (islower (i), ISLOWER (i))
	|| toupper (i) != TOUPPER (i))
      return 2;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  ac_cv_header_stdc=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
$as_echo "$ac_cv_header_stdc" >&6; }
if test $ac_cv_header_stdc = yes; then

$as_echo "#define STDC_HEADERS 1" >>confdefs.h

fi

# On IRIX 5.3, sys/types and inttypes.h are conflicting.
for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
		  inttypes.h stdint.h unistd.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done


for ac_header in dlfcn.h
do :
  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
"
if test "x$ac_cv_header_dlfcn_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DLFCN_H 1
_ACEOF

fi

done


  GST_CURRENT=800
  GST_REVISION=0
  GST_AGE=800
  GST_LIBVERSION=800:0:800





  GST_LT_LDFLAGS="$GST_LT_LDFLAGS -version-info $GST_LIBVERSION"
  if test ! -z ""
  then
    GST_LT_LDFLAGS="$GST_LT_LDFLAGS -release "
  fi







# Set options
enable_dlopen=yes
enable_win32_dll=yes

case $host in
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args.
set dummy ${ac_tool_prefix}as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_AS+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$AS"; then
  ac_cv_prog_AS="$AS" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_AS="${ac_tool_prefix}as"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
AS=$ac_cv_prog_AS
if test -n "$AS"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AS" >&5
$as_echo "$AS" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_AS"; then
  ac_ct_AS=$AS
  # Extract the first word of "as", so it can be a program name with args.
set dummy as; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_AS+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_AS"; then
  ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_AS="as"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_AS=$ac_cv_prog_ac_ct_AS
if test -n "$ac_ct_AS"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS" >&5
$as_echo "$ac_ct_AS" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_AS" = x; then
    AS="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    AS=$ac_ct_AS
  fi
else
  AS="$ac_cv_prog_AS"
fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
set dummy ${ac_tool_prefix}dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_DLLTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$DLLTOOL"; then
  ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
DLLTOOL=$ac_cv_prog_DLLTOOL
if test -n "$DLLTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
$as_echo "$DLLTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_DLLTOOL"; then
  ac_ct_DLLTOOL=$DLLTOOL
  # Extract the first word of "dlltool", so it can be a program name with args.
set dummy dlltool; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_DLLTOOL"; then
  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_DLLTOOL="dlltool"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
if test -n "$ac_ct_DLLTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
$as_echo "$ac_ct_DLLTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_DLLTOOL" = x; then
    DLLTOOL="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    DLLTOOL=$ac_ct_DLLTOOL
  fi
else
  DLLTOOL="$ac_cv_prog_DLLTOOL"
fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
set dummy ${ac_tool_prefix}objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OBJDUMP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OBJDUMP"; then
  ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OBJDUMP=$ac_cv_prog_OBJDUMP
if test -n "$OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
$as_echo "$OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_OBJDUMP"; then
  ac_ct_OBJDUMP=$OBJDUMP
  # Extract the first word of "objdump", so it can be a program name with args.
set dummy objdump; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OBJDUMP"; then
  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_OBJDUMP="objdump"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
if test -n "$ac_ct_OBJDUMP"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
$as_echo "$ac_ct_OBJDUMP" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_OBJDUMP" = x; then
    OBJDUMP="false"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OBJDUMP=$ac_ct_OBJDUMP
  fi
else
  OBJDUMP="$ac_cv_prog_OBJDUMP"
fi

  ;;
esac

test -z "$AS" && AS=as





test -z "$DLLTOOL" && DLLTOOL=dlltool





test -z "$OBJDUMP" && OBJDUMP=objdump




# Check whether --enable-static was given.
if test "${enable_static+set}" = set; then :
  enableval=$enable_static; p=${PACKAGE-default}
    case $enableval in
    yes) enable_static=yes ;;
    no) enable_static=no ;;
    *)
     enable_static=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
      for pkg in $enableval; do
	IFS=$lt_save_ifs
	if test "X$pkg" = "X$p"; then
	  enable_static=yes
	fi
      done
      IFS=$lt_save_ifs
      ;;
    esac
else
  enable_static=no
fi












            # Check whether --enable-shared was given.
if test "${enable_shared+set}" = set; then :
  enableval=$enable_shared; p=${PACKAGE-default}
    case $enableval in
    yes) enable_shared=yes ;;
    no) enable_shared=no ;;
    *)
      enable_shared=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
      for pkg in $enableval; do
	IFS=$lt_save_ifs
	if test "X$pkg" = "X$p"; then
	  enable_shared=yes
	fi
      done
      IFS=$lt_save_ifs
      ;;
    esac
else
  enable_shared=yes
fi











# Check whether --with-pic was given.
if test "${with_pic+set}" = set; then :
  withval=$with_pic; lt_p=${PACKAGE-default}
    case $withval in
    yes|no) pic_mode=$withval ;;
    *)
      pic_mode=default
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
      for lt_pkg in $withval; do
	IFS=$lt_save_ifs
	if test "X$lt_pkg" = "X$lt_p"; then
	  pic_mode=yes
	fi
      done
      IFS=$lt_save_ifs
      ;;
    esac
else
  pic_mode=default
fi








  # Check whether --enable-fast-install was given.
if test "${enable_fast_install+set}" = set; then :
  enableval=$enable_fast_install; p=${PACKAGE-default}
    case $enableval in
    yes) enable_fast_install=yes ;;
    no) enable_fast_install=no ;;
    *)
      enable_fast_install=no
      # Look at the argument we got.  We use all the common list separators.
      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
      for pkg in $enableval; do
	IFS=$lt_save_ifs
	if test "X$pkg" = "X$p"; then
	  enable_fast_install=yes
	fi
      done
      IFS=$lt_save_ifs
      ;;
    esac
else
  enable_fast_install=yes
fi








  shared_archive_member_spec=
case $host,$enable_shared in
power*-*-aix[5-9]*,yes)
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which variant of shared library versioning to provide" >&5
$as_echo_n "checking which variant of shared library versioning to provide... " >&6; }

# Check whether --with-aix-soname was given.
if test "${with_aix_soname+set}" = set; then :
  withval=$with_aix_soname; case $withval in
    aix|svr4|both)
      ;;
    *)
      as_fn_error $? "Unknown argument to --with-aix-soname" "$LINENO" 5
      ;;
    esac
    lt_cv_with_aix_soname=$with_aix_soname
else
  if ${lt_cv_with_aix_soname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_with_aix_soname=aix
fi

    with_aix_soname=$lt_cv_with_aix_soname
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_aix_soname" >&5
$as_echo "$with_aix_soname" >&6; }
  if test aix != "$with_aix_soname"; then
    # For the AIX way of multilib, we name the shared archive member
    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
    # the AIX toolchain works better with OBJECT_MODE set (default 32).
    if test 64 = "${OBJECT_MODE-32}"; then
      shared_archive_member_spec=shr_64
    else
      shared_archive_member_spec=shr
    fi
  fi
  ;;
*)
  with_aix_soname=aix
  ;;
esac










# This can be used to rebuild libtool when needed
LIBTOOL_DEPS=$ltmain

# Always use our own libtool.
LIBTOOL='$(SHELL) $(top_builddir)/libtool'






























test -z "$LN_S" && LN_S="ln -s"














if test -n "${ZSH_VERSION+set}"; then
   setopt NO_GLOB_SUBST
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
$as_echo_n "checking for objdir... " >&6; }
if ${lt_cv_objdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  rm -f .libs 2>/dev/null
mkdir .libs 2>/dev/null
if test -d .libs; then
  lt_cv_objdir=.libs
else
  # MS-DOS does not allow filenames that begin with a dot.
  lt_cv_objdir=_libs
fi
rmdir .libs 2>/dev/null
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
$as_echo "$lt_cv_objdir" >&6; }
objdir=$lt_cv_objdir





cat >>confdefs.h <<_ACEOF
#define LT_OBJDIR "$lt_cv_objdir/"
_ACEOF




case $host_os in
aix3*)
  # AIX sometimes has problems with the GCC collect2 program.  For some
  # reason, if we set the COLLECT_NAMES environment variable, the problems
  # vanish in a puff of smoke.
  if test set != "${COLLECT_NAMES+set}"; then
    COLLECT_NAMES=
    export COLLECT_NAMES
  fi
  ;;
esac

# Global variables:
ofile=libtool
can_build_shared=yes

# All known linkers require a '.a' archive for static linking (except MSVC,
# which needs '.lib').
libext=a

with_gnu_ld=$lt_cv_prog_gnu_ld

old_CC=$CC
old_CFLAGS=$CFLAGS

# Set sane defaults for various variables
test -z "$CC" && CC=cc
test -z "$LTCC" && LTCC=$CC
test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
test -z "$LD" && LD=ld
test -z "$ac_objext" && ac_objext=o

func_cc_basename $compiler
cc_basename=$func_cc_basename_result


# Only perform the check for file, if the check method requires it
test -z "$MAGIC_CMD" && MAGIC_CMD=file
case $deplibs_check_method in
file_magic*)
  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
if ${lt_cv_path_MAGIC_CMD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $MAGIC_CMD in
[\\/*] |  ?:[\\/]*)
  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
  ;;
*)
  lt_save_MAGIC_CMD=$MAGIC_CMD
  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
  for ac_dir in $ac_dummy; do
    IFS=$lt_save_ifs
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/${ac_tool_prefix}file"; then
      lt_cv_path_MAGIC_CMD=$ac_dir/"${ac_tool_prefix}file"
      if test -n "$file_magic_test_file"; then
	case $deplibs_check_method in
	"file_magic "*)
	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
	    $EGREP "$file_magic_regex" > /dev/null; then
	    :
	  else
	    cat <<_LT_EOF 1>&2

*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such.  This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem.  Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org

_LT_EOF
	  fi ;;
	esac
      fi
      break
    fi
  done
  IFS=$lt_save_ifs
  MAGIC_CMD=$lt_save_MAGIC_CMD
  ;;
esac
fi

MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi





if test -z "$lt_cv_path_MAGIC_CMD"; then
  if test -n "$ac_tool_prefix"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
$as_echo_n "checking for file... " >&6; }
if ${lt_cv_path_MAGIC_CMD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $MAGIC_CMD in
[\\/*] |  ?:[\\/]*)
  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
  ;;
*)
  lt_save_MAGIC_CMD=$MAGIC_CMD
  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
  for ac_dir in $ac_dummy; do
    IFS=$lt_save_ifs
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/file"; then
      lt_cv_path_MAGIC_CMD=$ac_dir/"file"
      if test -n "$file_magic_test_file"; then
	case $deplibs_check_method in
	"file_magic "*)
	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
	    $EGREP "$file_magic_regex" > /dev/null; then
	    :
	  else
	    cat <<_LT_EOF 1>&2

*** Warning: the command libtool uses to detect shared libraries,
*** $file_magic_cmd, produces output that libtool cannot recognize.
*** The result is that libtool may fail to recognize shared libraries
*** as such.  This will affect the creation of libtool libraries that
*** depend on shared libraries, but programs linked with such libtool
*** libraries will work regardless of this problem.  Nevertheless, you
*** may want to report the problem to your system manager and/or to
*** bug-libtool@gnu.org

_LT_EOF
	  fi ;;
	esac
      fi
      break
    fi
  done
  IFS=$lt_save_ifs
  MAGIC_CMD=$lt_save_MAGIC_CMD
  ;;
esac
fi

MAGIC_CMD=$lt_cv_path_MAGIC_CMD
if test -n "$MAGIC_CMD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
$as_echo "$MAGIC_CMD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  else
    MAGIC_CMD=:
  fi
fi

  fi
  ;;
esac

# Use C for the default configuration in the libtool script

lt_save_CC=$CC
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


# Source file extension for C test sources.
ac_ext=c

# Object file extension for compiled C test sources.
objext=o
objext=$objext

# Code to be used in simple compile tests
lt_simple_compile_test_code="int some_variable = 0;"

# Code to be used in simple link tests
lt_simple_link_test_code='int main(){return(0);}'







# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC

# Save the default compiler, since it gets overwritten when the other
# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
compiler_DEFAULT=$CC

# save warnings/boilerplate of simple test code
ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*

ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*


## CAVEAT EMPTOR:
## There is no encapsulation within the following macros, do not change
## the running order or otherwise move them around unless you know exactly
## what you are doing...
if test -n "$compiler"; then

lt_prog_compiler_no_builtin_flag=

if test yes = "$GCC"; then
  case $cc_basename in
  nvcc*)
    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
  *)
    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
  esac

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_rtti_exceptions=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="-fno-rtti -fno-exceptions"  ## exclude from sc_useless_quotes_in_assignment
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_rtti_exceptions=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }

if test yes = "$lt_cv_prog_compiler_rtti_exceptions"; then
    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
else
    :
fi

fi






  lt_prog_compiler_wl=
lt_prog_compiler_pic=
lt_prog_compiler_static=


  if test yes = "$GCC"; then
    lt_prog_compiler_wl='-Wl,'
    lt_prog_compiler_static='-static'

    case $host_os in
      aix*)
      # All AIX code is PIC.
      if test ia64 = "$host_cpu"; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static='-Bstatic'
      fi
      lt_prog_compiler_pic='-fPIC'
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            lt_prog_compiler_pic='-fPIC'
        ;;
      m68k)
            # FIXME: we need at least 68020 code to build shared libraries, but
            # adding the '-m68020' flag to GCC prevents building anything better,
            # like '-m68040'.
            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
        ;;
      esac
      ;;

    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
      # PIC is the default for these OSes.
      ;;

    mingw* | cygwin* | pw32* | os2* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      # Although the cygwin gcc ignores -fPIC, still need this for old-style
      # (--disable-auto-import) libraries
      lt_prog_compiler_pic='-DDLL_EXPORT'
      case $host_os in
      os2*)
	lt_prog_compiler_static='$wl-static'
	;;
      esac
      ;;

    darwin* | rhapsody*)
      # PIC is the default on this platform
      # Common symbols not allowed in MH_DYLIB files
      lt_prog_compiler_pic='-fno-common'
      ;;

    haiku*)
      # PIC is the default for Haiku.
      # The "-static" flag exists, but is broken.
      lt_prog_compiler_static=
      ;;

    hpux*)
      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
      # sets the default TLS model and affects inlining.
      case $host_cpu in
      hppa*64*)
	# +Z the default
	;;
      *)
	lt_prog_compiler_pic='-fPIC'
	;;
      esac
      ;;

    interix[3-9]*)
      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
      # Instead, we relocate shared libraries at runtime.
      ;;

    msdosdjgpp*)
      # Just because we use GCC doesn't mean we suddenly get shared libraries
      # on systems that don't support them.
      lt_prog_compiler_can_build_shared=no
      enable_shared=no
      ;;

    *nto* | *qnx*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic='-fPIC -shared'
      ;;

    sysv4*MP*)
      if test -d /usr/nec; then
	lt_prog_compiler_pic=-Kconform_pic
      fi
      ;;

    *)
      lt_prog_compiler_pic='-fPIC'
      ;;
    esac

    case $cc_basename in
    nvcc*) # Cuda Compiler Driver 2.2
      lt_prog_compiler_wl='-Xlinker '
      if test -n "$lt_prog_compiler_pic"; then
        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
      fi
      ;;
    esac
  else
    # PORTME Check for flag to pass linker flags through the system compiler.
    case $host_os in
    aix*)
      lt_prog_compiler_wl='-Wl,'
      if test ia64 = "$host_cpu"; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static='-Bstatic'
      else
	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
      fi
      ;;

    darwin* | rhapsody*)
      # PIC is the default on this platform
      # Common symbols not allowed in MH_DYLIB files
      lt_prog_compiler_pic='-fno-common'
      case $cc_basename in
      nagfor*)
        # NAG Fortran compiler
        lt_prog_compiler_wl='-Wl,-Wl,,'
        lt_prog_compiler_pic='-PIC'
        lt_prog_compiler_static='-Bstatic'
        ;;
      esac
      ;;

    mingw* | cygwin* | pw32* | os2* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      lt_prog_compiler_pic='-DDLL_EXPORT'
      case $host_os in
      os2*)
	lt_prog_compiler_static='$wl-static'
	;;
      esac
      ;;

    hpux9* | hpux10* | hpux11*)
      lt_prog_compiler_wl='-Wl,'
      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
      # not for PA HP-UX.
      case $host_cpu in
      hppa*64*|ia64*)
	# +Z the default
	;;
      *)
	lt_prog_compiler_pic='+Z'
	;;
      esac
      # Is there a better lt_prog_compiler_static that works with the bundled CC?
      lt_prog_compiler_static='$wl-a ${wl}archive'
      ;;

    irix5* | irix6* | nonstopux*)
      lt_prog_compiler_wl='-Wl,'
      # PIC (with -KPIC) is the default.
      lt_prog_compiler_static='-non_shared'
      ;;

    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
      case $cc_basename in
      # old Intel for x86_64, which still supported -KPIC.
      ecc*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-KPIC'
	lt_prog_compiler_static='-static'
        ;;
      # icc used to be incompatible with GCC.
      # ICC 10 doesn't accept -KPIC any more.
      icc* | ifort*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-fPIC'
	lt_prog_compiler_static='-static'
        ;;
      # Lahey Fortran 8.1.
      lf95*)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='--shared'
	lt_prog_compiler_static='--static'
	;;
      nagfor*)
	# NAG Fortran compiler
	lt_prog_compiler_wl='-Wl,-Wl,,'
	lt_prog_compiler_pic='-PIC'
	lt_prog_compiler_static='-Bstatic'
	;;
      tcc*)
	# Fabrice Bellard et al's Tiny C Compiler
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-fPIC'
	lt_prog_compiler_static='-static'
	;;
      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
        # Portland Group compilers (*not* the Pentium gcc compiler,
	# which looks to be a dead project)
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-fpic'
	lt_prog_compiler_static='-Bstatic'
        ;;
      ccc*)
        lt_prog_compiler_wl='-Wl,'
        # All Alpha code is PIC.
        lt_prog_compiler_static='-non_shared'
        ;;
      xl* | bgxl* | bgf* | mpixl*)
	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
	lt_prog_compiler_wl='-Wl,'
	lt_prog_compiler_pic='-qpic'
	lt_prog_compiler_static='-qstaticlink'
	;;
      *)
	case `$CC -V 2>&1 | sed 5q` in
	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
	  lt_prog_compiler_pic='-KPIC'
	  lt_prog_compiler_static='-Bstatic'
	  lt_prog_compiler_wl=''
	  ;;
	*Sun\ F* | *Sun*Fortran*)
	  lt_prog_compiler_pic='-KPIC'
	  lt_prog_compiler_static='-Bstatic'
	  lt_prog_compiler_wl='-Qoption ld '
	  ;;
	*Sun\ C*)
	  # Sun C 5.9
	  lt_prog_compiler_pic='-KPIC'
	  lt_prog_compiler_static='-Bstatic'
	  lt_prog_compiler_wl='-Wl,'
	  ;;
        *Intel*\ [CF]*Compiler*)
	  lt_prog_compiler_wl='-Wl,'
	  lt_prog_compiler_pic='-fPIC'
	  lt_prog_compiler_static='-static'
	  ;;
	*Portland\ Group*)
	  lt_prog_compiler_wl='-Wl,'
	  lt_prog_compiler_pic='-fpic'
	  lt_prog_compiler_static='-Bstatic'
	  ;;
	esac
	;;
      esac
      ;;

    newsos6)
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    *nto* | *qnx*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic='-fPIC -shared'
      ;;

    osf3* | osf4* | osf5*)
      lt_prog_compiler_wl='-Wl,'
      # All OSF/1 code is PIC.
      lt_prog_compiler_static='-non_shared'
      ;;

    rdos*)
      lt_prog_compiler_static='-non_shared'
      ;;

    solaris*)
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      case $cc_basename in
      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
	lt_prog_compiler_wl='-Qoption ld ';;
      *)
	lt_prog_compiler_wl='-Wl,';;
      esac
      ;;

    sunos4*)
      lt_prog_compiler_wl='-Qoption ld '
      lt_prog_compiler_pic='-PIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    sysv4 | sysv4.2uw2* | sysv4.3*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    sysv4*MP*)
      if test -d /usr/nec; then
	lt_prog_compiler_pic='-Kconform_pic'
	lt_prog_compiler_static='-Bstatic'
      fi
      ;;

    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_pic='-KPIC'
      lt_prog_compiler_static='-Bstatic'
      ;;

    unicos*)
      lt_prog_compiler_wl='-Wl,'
      lt_prog_compiler_can_build_shared=no
      ;;

    uts4*)
      lt_prog_compiler_pic='-pic'
      lt_prog_compiler_static='-Bstatic'
      ;;

    *)
      lt_prog_compiler_can_build_shared=no
      ;;
    esac
  fi

case $host_os in
  # For platforms that do not support PIC, -DPIC is meaningless:
  *djgpp*)
    lt_prog_compiler_pic=
    ;;
  *)
    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
    ;;
esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
if ${lt_cv_prog_compiler_pic+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
$as_echo "$lt_cv_prog_compiler_pic" >&6; }
lt_prog_compiler_pic=$lt_cv_prog_compiler_pic

#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
if ${lt_cv_prog_compiler_pic_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic_works=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"  ## exclude from sc_useless_quotes_in_assignment
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_pic_works=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }

if test yes = "$lt_cv_prog_compiler_pic_works"; then
    case $lt_prog_compiler_pic in
     "" | " "*) ;;
     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
     esac
else
    lt_prog_compiler_pic=
     lt_prog_compiler_can_build_shared=no
fi

fi











#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if ${lt_cv_prog_compiler_static_works+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_static_works=no
   save_LDFLAGS=$LDFLAGS
   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler_static_works=yes
       fi
     else
       lt_cv_prog_compiler_static_works=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS=$save_LDFLAGS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
$as_echo "$lt_cv_prog_compiler_static_works" >&6; }

if test yes = "$lt_cv_prog_compiler_static_works"; then
    :
else
    lt_prog_compiler_static=
fi







  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
$as_echo "$lt_cv_prog_compiler_c_o" >&6; }




hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o" && test no != "$need_locks"; then
  # do not overwrite the value of need_locks provided by the user
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
  hard_links=yes
  $RM conftest*
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  touch conftest.a
  ln conftest.a conftest.b 2>&5 || hard_links=no
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
  if test no = "$hard_links"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
    need_locks=warn
  fi
else
  need_locks=no
fi






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }

  runpath_var=
  allow_undefined_flag=
  always_export_symbols=no
  archive_cmds=
  archive_expsym_cmds=
  compiler_needs_object=no
  enable_shared_with_static_runtimes=no
  export_dynamic_flag_spec=
  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
  hardcode_automatic=no
  hardcode_direct=no
  hardcode_direct_absolute=no
  hardcode_libdir_flag_spec=
  hardcode_libdir_separator=
  hardcode_minus_L=no
  hardcode_shlibpath_var=unsupported
  inherit_rpath=no
  link_all_deplibs=unknown
  module_cmds=
  module_expsym_cmds=
  old_archive_from_new_cmds=
  old_archive_from_expsyms_cmds=
  thread_safe_flag_spec=
  whole_archive_flag_spec=
  # include_expsyms should be a list of space-separated symbols to be *always*
  # included in the symbol list
  include_expsyms=
  # exclude_expsyms can be an extended regexp of symbols to exclude
  # it will be wrapped by ' (' and ')$', so one must not match beginning or
  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
  # as well as any symbol that contains 'd'.
  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
  # platforms (ab)use it in PIC code, but their linkers get confused if
  # the symbol is explicitly referenced.  Since portable code cannot
  # rely on this symbol name, it's probably fine to never include it in
  # preloaded symbol tables.
  # Exclude shared library initialization/finalization symbols.
  extract_expsyms_cmds=

  case $host_os in
  cygwin* | mingw* | pw32* | cegcc*)
    # FIXME: the MSVC++ port hasn't been tested in a loooong time
    # When not using gcc, we currently assume that we are using
    # Microsoft Visual C++.
    if test yes != "$GCC"; then
      with_gnu_ld=no
    fi
    ;;
  interix*)
    # we just hope/assume this is gcc and not c89 (= MSVC++)
    with_gnu_ld=yes
    ;;
  openbsd* | bitrig*)
    with_gnu_ld=no
    ;;
  linux* | k*bsd*-gnu | gnu*)
    link_all_deplibs=no
    ;;
  esac

  ld_shlibs=yes

  # On some targets, GNU ld is compatible enough with the native linker
  # that we're better off using the native interface for both.
  lt_use_gnu_ld_interface=no
  if test yes = "$with_gnu_ld"; then
    case $host_os in
      aix*)
	# The AIX port of GNU ld has always aspired to compatibility
	# with the native linker.  However, as the warning in the GNU ld
	# block says, versions before 2.19.5* couldn't really create working
	# shared libraries, regardless of the interface used.
	case `$LD -v 2>&1` in
	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
	  *)
	    lt_use_gnu_ld_interface=yes
	    ;;
	esac
	;;
      *)
	lt_use_gnu_ld_interface=yes
	;;
    esac
  fi

  if test yes = "$lt_use_gnu_ld_interface"; then
    # If archive_cmds runs LD, not CC, wlarc should be empty
    wlarc='$wl'

    # Set some defaults for GNU ld with shared library support. These
    # are reset later if shared libraries are not supported. Putting them
    # here allows them to be overridden if necessary.
    runpath_var=LD_RUN_PATH
    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
    export_dynamic_flag_spec='$wl--export-dynamic'
    # ancient GNU ld didn't support --whole-archive et. al.
    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
      whole_archive_flag_spec=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
    else
      whole_archive_flag_spec=
    fi
    supports_anon_versioning=no
    case `$LD -v | $SED -e 's/(^)\+)\s\+//' 2>&1` in
      *GNU\ gold*) supports_anon_versioning=yes ;;
      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
      *\ 2.11.*) ;; # other 2.11 versions
      *) supports_anon_versioning=yes ;;
    esac

    # See if GNU ld supports shared libraries.
    case $host_os in
    aix[3-9]*)
      # On AIX/PPC, the GNU linker is very broken
      if test ia64 != "$host_cpu"; then
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: the GNU linker, at least up to release 2.19, is reported
*** to be unable to reliably create shared libraries on AIX.
*** Therefore, libtool is disabling shared libraries support.  If you
*** really care for shared libraries, you may want to install binutils
*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
*** You will then need to restart the configuration process.

_LT_EOF
      fi
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
            archive_expsym_cmds=''
        ;;
      m68k)
            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
            hardcode_libdir_flag_spec='-L$libdir'
            hardcode_minus_L=yes
        ;;
      esac
      ;;

    beos*)
      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	allow_undefined_flag=unsupported
	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
	# support --undefined.  This deserves some investigation.  FIXME
	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
      else
	ld_shlibs=no
      fi
      ;;

    cygwin* | mingw* | pw32* | cegcc*)
      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
      # as there is no search path for DLLs.
      hardcode_libdir_flag_spec='-L$libdir'
      export_dynamic_flag_spec='$wl--export-all-symbols'
      allow_undefined_flag=unsupported
      always_export_symbols=no
      enable_shared_with_static_runtimes=yes
      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'

      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
	# If the export-symbols file already is a .def file, use it as
	# is; otherwise, prepend EXPORTS...
	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
          cp $export_symbols $output_objdir/$soname.def;
        else
          echo EXPORTS > $output_objdir/$soname.def;
          cat $export_symbols >> $output_objdir/$soname.def;
        fi~
        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
      else
	ld_shlibs=no
      fi
      ;;

    haiku*)
      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
      link_all_deplibs=yes
      ;;

    os2*)
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_minus_L=yes
      allow_undefined_flag=unsupported
      shrext_cmds=.dll
      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	$ECHO EXPORTS >> $output_objdir/$libname.def~
	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	emximp -o $lib $output_objdir/$libname.def'
      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	$ECHO EXPORTS >> $output_objdir/$libname.def~
	prefix_cmds="$SED"~
	if test EXPORTS = "`$SED 1q $export_symbols`"; then
	  prefix_cmds="$prefix_cmds -e 1d";
	fi~
	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	emximp -o $lib $output_objdir/$libname.def'
      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
      enable_shared_with_static_runtimes=yes
      ;;

    interix[3-9]*)
      hardcode_direct=no
      hardcode_shlibpath_var=no
      hardcode_libdir_flag_spec='$wl-rpath,$libdir'
      export_dynamic_flag_spec='$wl-E'
      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
      # Instead, shared libraries are loaded at an image base (0x10000000 by
      # default) and relocated if they conflict, which is a slow very memory
      # consuming and fragmenting process.  To avoid this, we pick a random,
      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
      archive_expsym_cmds='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
      ;;

    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
      tmp_diet=no
      if test linux-dietlibc = "$host_os"; then
	case $cc_basename in
	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
	esac
      fi
      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
	 && test no = "$tmp_diet"
      then
	tmp_addflag=' $pic_flag'
	tmp_sharedflag='-shared'
	case $cc_basename,$host_cpu in
        pgcc*)				# Portland Group C compiler
	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
	  tmp_addflag=' $pic_flag'
	  ;;
	pgf77* | pgf90* | pgf95* | pgfortran*)
					# Portland Group f77 and f90 compilers
	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
	  tmp_addflag=' $pic_flag -Mnomain' ;;
	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
	  tmp_addflag=' -i_dynamic' ;;
	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
	  tmp_addflag=' -i_dynamic -nofor_main' ;;
	ifc* | ifort*)			# Intel Fortran compiler
	  tmp_addflag=' -nofor_main' ;;
	lf95*)				# Lahey Fortran 8.1
	  whole_archive_flag_spec=
	  tmp_sharedflag='--shared' ;;
        nagfor*)                        # NAGFOR 5.3
          tmp_sharedflag='-Wl,-shared' ;;
	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
	  tmp_sharedflag='-qmkshrobj'
	  tmp_addflag= ;;
	nvcc*)	# Cuda Compiler Driver 2.2
	  whole_archive_flag_spec='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
	  compiler_needs_object=yes
	  ;;
	esac
	case `$CC -V 2>&1 | sed 5q` in
	*Sun\ C*)			# Sun C 5.9
	  whole_archive_flag_spec='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
	  compiler_needs_object=yes
	  tmp_sharedflag='-G' ;;
	*Sun\ F*)			# Sun Fortran 8.3
	  tmp_sharedflag='-G' ;;
	esac
	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'

        if test yes = "$supports_anon_versioning"; then
          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
            echo "local: *; };" >> $output_objdir/$libname.ver~
            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
        fi

	case $cc_basename in
	tcc*)
	  export_dynamic_flag_spec='-rdynamic'
	  ;;
	xlf* | bgf* | bgxlf* | mpixlf*)
	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
	  hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
	  if test yes = "$supports_anon_versioning"; then
	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
              echo "local: *; };" >> $output_objdir/$libname.ver~
              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
	  fi
	  ;;
	esac
      else
        ld_shlibs=no
      fi
      ;;

    netbsd* | netbsdelf*-gnu)
      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
	wlarc=
      else
	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
      fi
      ;;

    solaris*)
      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: The releases 2.8.* of the GNU linker cannot reliably
*** create shared libraries on Solaris systems.  Therefore, libtool
*** is disabling shared libraries support.  We urge you to upgrade GNU
*** binutils to release 2.9.1 or newer.  Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.

_LT_EOF
      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
      else
	ld_shlibs=no
      fi
      ;;

    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
      case `$LD -v 2>&1` in
        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
	ld_shlibs=no
	cat <<_LT_EOF 1>&2

*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
*** reliably create shared libraries on SCO systems.  Therefore, libtool
*** is disabling shared libraries support.  We urge you to upgrade GNU
*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
*** your PATH or compiler configuration so that the native linker is
*** used, and then restart.

_LT_EOF
	;;
	*)
	  # For security reasons, it is highly recommended that you always
	  # use absolute paths for naming shared libraries, and exclude the
	  # DT_RUNPATH tag from executables and libraries.  But doing so
	  # requires that you compile everything twice, which is a pain.
	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	    hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
	  else
	    ld_shlibs=no
	  fi
	;;
      esac
      ;;

    sunos4*)
      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
      wlarc=
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    *)
      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
      else
	ld_shlibs=no
      fi
      ;;
    esac

    if test no = "$ld_shlibs"; then
      runpath_var=
      hardcode_libdir_flag_spec=
      export_dynamic_flag_spec=
      whole_archive_flag_spec=
    fi
  else
    # PORTME fill in a description of your system's linker (not GNU ld)
    case $host_os in
    aix3*)
      allow_undefined_flag=unsupported
      always_export_symbols=yes
      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
      # Note: this linker hardcodes the directories in LIBPATH if there
      # are no directories specified by -L.
      hardcode_minus_L=yes
      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
	# Neither direct hardcoding nor static linking is supported with a
	# broken collect2.
	hardcode_direct=unsupported
      fi
      ;;

    aix[4-9]*)
      if test ia64 = "$host_cpu"; then
	# On IA64, the linker does run time linking by default, so we don't
	# have to do anything special.
	aix_use_runtimelinking=no
	exp_sym_flag='-Bexport'
	no_entry_flag=
      else
	# If we're using GNU nm, then we don't want the "-C" option.
	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
	# Without the "-l" option, or with the "-B" option, AIX nm treats
	# weak defined symbols like other global defined symbols, whereas
	# GNU nm marks them as "W".
	# While the 'weak' keyword is ignored in the Export File, we need
	# it in the Import File for the 'aix-soname' feature, so we have
	# to replace the "-B" option with "-P" for AIX nm.
	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
	else
	  export_symbols_cmds='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
	fi
	aix_use_runtimelinking=no

	# Test if we are trying to use run time linking or normal
	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
	# have runtime linking enabled, and use it for executables.
	# For shared libraries, we enable/disable runtime linking
	# depending on the kind of the shared library created -
	# when "with_aix_soname,aix_use_runtimelinking" is:
	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
	# "aix,yes"  lib.so          shared, rtl:yes, for executables
	#            lib.a           static archive
	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
	#            lib.a(lib.so.V) shared, rtl:no,  for executables
	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
	#            lib.a(lib.so.V) shared, rtl:no
	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
	#            lib.a           static archive
	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
	  for ld_flag in $LDFLAGS; do
	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
	    aix_use_runtimelinking=yes
	    break
	  fi
	  done
	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
	    # so we don't have lib.a shared libs to link our executables.
	    # We have to force runtime linking in this case.
	    aix_use_runtimelinking=yes
	    LDFLAGS="$LDFLAGS -Wl,-brtl"
	  fi
	  ;;
	esac

	exp_sym_flag='-bexport'
	no_entry_flag='-bnoentry'
      fi

      # When large executables or shared objects are built, AIX ld can
      # have problems creating the table of contents.  If linking a library
      # or program results in "error TOC overflow" add -mminimal-toc to
      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.

      archive_cmds=''
      hardcode_direct=yes
      hardcode_direct_absolute=yes
      hardcode_libdir_separator=':'
      link_all_deplibs=yes
      file_list_spec='$wl-f,'
      case $with_aix_soname,$aix_use_runtimelinking in
      aix,*) ;; # traditional, no import file
      svr4,* | *,yes) # use import file
	# The Import File defines what to hardcode.
	hardcode_direct=no
	hardcode_direct_absolute=no
	;;
      esac

      if test yes = "$GCC"; then
	case $host_os in aix4.[012]|aix4.[012].*)
	# We only want to do this on AIX 4.2 and lower, the check
	# below for broken collect2 doesn't work under 4.3+
	  collect2name=`$CC -print-prog-name=collect2`
	  if test -f "$collect2name" &&
	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
	  then
	  # We have reworked collect2
	  :
	  else
	  # We have old collect2
	  hardcode_direct=unsupported
	  # It fails to find uninstalled libraries when the uninstalled
	  # path is not listed in the libpath.  Setting hardcode_minus_L
	  # to unsupported forces relinking
	  hardcode_minus_L=yes
	  hardcode_libdir_flag_spec='-L$libdir'
	  hardcode_libdir_separator=
	  fi
	  ;;
	esac
	shared_flag='-shared'
	if test yes = "$aix_use_runtimelinking"; then
	  shared_flag="$shared_flag "'$wl-G'
	fi
	# Need to ensure runtime linking is disabled for the traditional
	# shared library, or the linker may eventually find shared libraries
	# /with/ Import File - we do not want to mix them.
	shared_flag_aix='-shared'
	shared_flag_svr4='-shared $wl-G'
      else
	# not using gcc
	if test ia64 = "$host_cpu"; then
	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
	# chokes on -Wl,-G. The following line is correct:
	  shared_flag='-G'
	else
	  if test yes = "$aix_use_runtimelinking"; then
	    shared_flag='$wl-G'
	  else
	    shared_flag='$wl-bM:SRE'
	  fi
	  shared_flag_aix='$wl-bM:SRE'
	  shared_flag_svr4='$wl-G'
	fi
      fi

      export_dynamic_flag_spec='$wl-bexpall'
      # It seems that -bexpall does not export symbols beginning with
      # underscore (_), so it is better to generate a list of symbols to export.
      always_export_symbols=yes
      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
	# Warning - without using the other runtime loading flags (-brtl),
	# -berok will link without error, but may produce a broken library.
	allow_undefined_flag='-berok'
        # Determine the default libpath from the value encoded in an
        # empty executable.
        if test set = "${lt_cv_aix_libpath+set}"; then
  aix_libpath=$lt_cv_aix_libpath
else
  if ${lt_cv_aix_libpath_+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

  lt_aix_libpath_sed='
      /Import File Strings/,/^$/ {
	  /^0/ {
	      s/^0  *\([^ ]*\) *$/\1/
	      p
	  }
      }'
  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  # Check for a 64-bit object if we didn't find anything.
  if test -z "$lt_cv_aix_libpath_"; then
    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  if test -z "$lt_cv_aix_libpath_"; then
    lt_cv_aix_libpath_=/usr/lib:/lib
  fi

fi

  aix_libpath=$lt_cv_aix_libpath_
fi

        hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
      else
	if test ia64 = "$host_cpu"; then
	  hardcode_libdir_flag_spec='$wl-R $libdir:/usr/lib:/lib'
	  allow_undefined_flag="-z nodefs"
	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
	else
	 # Determine the default libpath from the value encoded in an
	 # empty executable.
	 if test set = "${lt_cv_aix_libpath+set}"; then
  aix_libpath=$lt_cv_aix_libpath
else
  if ${lt_cv_aix_libpath_+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

  lt_aix_libpath_sed='
      /Import File Strings/,/^$/ {
	  /^0/ {
	      s/^0  *\([^ ]*\) *$/\1/
	      p
	  }
      }'
  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  # Check for a 64-bit object if we didn't find anything.
  if test -z "$lt_cv_aix_libpath_"; then
    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  if test -z "$lt_cv_aix_libpath_"; then
    lt_cv_aix_libpath_=/usr/lib:/lib
  fi

fi

  aix_libpath=$lt_cv_aix_libpath_
fi

	 hardcode_libdir_flag_spec='$wl-blibpath:$libdir:'"$aix_libpath"
	  # Warning - without using the other run time loading flags,
	  # -berok will link without error, but may produce a broken library.
	  no_undefined_flag=' $wl-bernotok'
	  allow_undefined_flag=' $wl-berok'
	  if test yes = "$with_gnu_ld"; then
	    # We only use this code for GNU lds that support --whole-archive.
	    whole_archive_flag_spec='$wl--whole-archive$convenience $wl--no-whole-archive'
	  else
	    # Exported symbols can be pulled into shared objects from archives
	    whole_archive_flag_spec='$convenience'
	  fi
	  archive_cmds_need_lc=yes
	  archive_expsym_cmds='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
	  # -brtl affects multiple linker settings, -berok does not and is overridden later
	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
	  if test svr4 != "$with_aix_soname"; then
	    # This is similar to how AIX traditionally builds its shared libraries.
	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
	  fi
	  if test aix != "$with_aix_soname"; then
	    archive_expsym_cmds="$archive_expsym_cmds"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
	  else
	    # used by -dlpreopen to get the symbols
	    archive_expsym_cmds="$archive_expsym_cmds"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
	  fi
	  archive_expsym_cmds="$archive_expsym_cmds"'~$RM -r $output_objdir/$realname.d'
	fi
      fi
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
            archive_expsym_cmds=''
        ;;
      m68k)
            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
            hardcode_libdir_flag_spec='-L$libdir'
            hardcode_minus_L=yes
        ;;
      esac
      ;;

    bsdi[45]*)
      export_dynamic_flag_spec=-rdynamic
      ;;

    cygwin* | mingw* | pw32* | cegcc*)
      # When not using gcc, we currently assume that we are using
      # Microsoft Visual C++.
      # hardcode_libdir_flag_spec is actually meaningless, as there is
      # no search path for DLLs.
      case $cc_basename in
      cl*)
	# Native MSVC
	hardcode_libdir_flag_spec=' '
	allow_undefined_flag=unsupported
	always_export_symbols=yes
	file_list_spec='@'
	# Tell ltmain to make .lib files, not .a files.
	libext=lib
	# Tell ltmain to make .dll files, not .so files.
	shrext_cmds=.dll
	# FIXME: Setting linknames here is a bad hack.
	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
	archive_expsym_cmds='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
            cp "$export_symbols" "$output_objdir/$soname.def";
            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
          else
            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
          fi~
          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
          linknames='
	# The linker will not automatically build a static lib if we build a DLL.
	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
	enable_shared_with_static_runtimes=yes
	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
	# Don't use ranlib
	old_postinstall_cmds='chmod 644 $oldlib'
	postlink_cmds='lt_outputfile="@OUTPUT@"~
          lt_tool_outputfile="@TOOL_OUTPUT@"~
          case $lt_outputfile in
            *.exe|*.EXE) ;;
            *)
              lt_outputfile=$lt_outputfile.exe
              lt_tool_outputfile=$lt_tool_outputfile.exe
              ;;
          esac~
          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
            $RM "$lt_outputfile.manifest";
          fi'
	;;
      *)
	# Assume MSVC wrapper
	hardcode_libdir_flag_spec=' '
	allow_undefined_flag=unsupported
	# Tell ltmain to make .lib files, not .a files.
	libext=lib
	# Tell ltmain to make .dll files, not .so files.
	shrext_cmds=.dll
	# FIXME: Setting linknames here is a bad hack.
	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
	# The linker will automatically build a .lib file if we build a DLL.
	old_archive_from_new_cmds='true'
	# FIXME: Should let the user specify the lib program.
	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
	enable_shared_with_static_runtimes=yes
	;;
      esac
      ;;

    darwin* | rhapsody*)


  archive_cmds_need_lc=no
  hardcode_direct=no
  hardcode_automatic=yes
  hardcode_shlibpath_var=unsupported
  if test yes = "$lt_cv_ld_force_load"; then
    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'

  else
    whole_archive_flag_spec=''
  fi
  link_all_deplibs=yes
  allow_undefined_flag=$_lt_dar_allow_undefined
  case $cc_basename in
     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
     *) _lt_dar_can_shared=$GCC ;;
  esac
  if test yes = "$_lt_dar_can_shared"; then
    output_verbose_link_cmd=func_echo_all
    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
    archive_expsym_cmds="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
    module_expsym_cmds="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"

  else
  ld_shlibs=no
  fi

      ;;

    dgux*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_shlibpath_var=no
      ;;

    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
    # support.  Future versions do this automatically, but an explicit c++rt0.o
    # does not break anything, and helps significantly (at the cost of a little
    # extra space).
    freebsd2.2*)
      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
    freebsd2.*)
      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
      hardcode_direct=yes
      hardcode_minus_L=yes
      hardcode_shlibpath_var=no
      ;;

    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
    freebsd* | dragonfly*)
      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    hpux9*)
      if test yes = "$GCC"; then
	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
      else
	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
      fi
      hardcode_libdir_flag_spec='$wl+b $wl$libdir'
      hardcode_libdir_separator=:
      hardcode_direct=yes

      # hardcode_minus_L: Not really in the search PATH,
      # but as the default location of the library.
      hardcode_minus_L=yes
      export_dynamic_flag_spec='$wl-E'
      ;;

    hpux10*)
      if test yes,no = "$GCC,$with_gnu_ld"; then
	archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
      fi
      if test no = "$with_gnu_ld"; then
	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
	hardcode_libdir_separator=:
	hardcode_direct=yes
	hardcode_direct_absolute=yes
	export_dynamic_flag_spec='$wl-E'
	# hardcode_minus_L: Not really in the search PATH,
	# but as the default location of the library.
	hardcode_minus_L=yes
      fi
      ;;

    hpux11*)
      if test yes,no = "$GCC,$with_gnu_ld"; then
	case $host_cpu in
	hppa*64*)
	  archive_cmds='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	ia64*)
	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)
	  archive_cmds='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	esac
      else
	case $host_cpu in
	hppa*64*)
	  archive_cmds='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	ia64*)
	  archive_cmds='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)

	  # Older versions of the 11.00 compiler do not understand -b yet
	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
$as_echo_n "checking if $CC understands -b... " >&6; }
if ${lt_cv_prog_compiler__b+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler__b=no
   save_LDFLAGS=$LDFLAGS
   LDFLAGS="$LDFLAGS -b"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler__b=yes
       fi
     else
       lt_cv_prog_compiler__b=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS=$save_LDFLAGS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
$as_echo "$lt_cv_prog_compiler__b" >&6; }

if test yes = "$lt_cv_prog_compiler__b"; then
    archive_cmds='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
else
    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
fi

	  ;;
	esac
      fi
      if test no = "$with_gnu_ld"; then
	hardcode_libdir_flag_spec='$wl+b $wl$libdir'
	hardcode_libdir_separator=:

	case $host_cpu in
	hppa*64*|ia64*)
	  hardcode_direct=no
	  hardcode_shlibpath_var=no
	  ;;
	*)
	  hardcode_direct=yes
	  hardcode_direct_absolute=yes
	  export_dynamic_flag_spec='$wl-E'

	  # hardcode_minus_L: Not really in the search PATH,
	  # but as the default location of the library.
	  hardcode_minus_L=yes
	  ;;
	esac
      fi
      ;;

    irix5* | irix6* | nonstopux*)
      if test yes = "$GCC"; then
	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
	# Try to use the -exported_symbol ld option, if it does not
	# work, assume that -exports_file does not work either and
	# implicitly export all symbols.
	# This should be the same for all languages, so no per-tag cache variable.
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
if ${lt_cv_irix_exported_symbol+:} false; then :
  $as_echo_n "(cached) " >&6
else
  save_LDFLAGS=$LDFLAGS
	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo (void) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  lt_cv_irix_exported_symbol=yes
else
  lt_cv_irix_exported_symbol=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
           LDFLAGS=$save_LDFLAGS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
$as_echo "$lt_cv_irix_exported_symbol" >&6; }
	if test yes = "$lt_cv_irix_exported_symbol"; then
          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
	fi
	link_all_deplibs=no
      else
	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
      hardcode_libdir_separator=:
      inherit_rpath=yes
      link_all_deplibs=yes
      ;;

    linux*)
      case $cc_basename in
      tcc*)
	# Fabrice Bellard et al's Tiny C Compiler
	ld_shlibs=yes
	archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
	;;
      esac
      ;;

    netbsd* | netbsdelf*-gnu)
      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
      else
	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
      fi
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_direct=yes
      hardcode_shlibpath_var=no
      ;;

    newsos6)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_direct=yes
      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
      hardcode_libdir_separator=:
      hardcode_shlibpath_var=no
      ;;

    *nto* | *qnx*)
      ;;

    openbsd* | bitrig*)
      if test -f /usr/libexec/ld.so; then
	hardcode_direct=yes
	hardcode_shlibpath_var=no
	hardcode_direct_absolute=yes
	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
	  export_dynamic_flag_spec='$wl-E'
	else
	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
	  hardcode_libdir_flag_spec='$wl-rpath,$libdir'
	fi
      else
	ld_shlibs=no
      fi
      ;;

    os2*)
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_minus_L=yes
      allow_undefined_flag=unsupported
      shrext_cmds=.dll
      archive_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	$ECHO EXPORTS >> $output_objdir/$libname.def~
	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	emximp -o $lib $output_objdir/$libname.def'
      archive_expsym_cmds='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	$ECHO EXPORTS >> $output_objdir/$libname.def~
	prefix_cmds="$SED"~
	if test EXPORTS = "`$SED 1q $export_symbols`"; then
	  prefix_cmds="$prefix_cmds -e 1d";
	fi~
	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	emximp -o $lib $output_objdir/$libname.def'
      old_archive_From_new_cmds='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
      enable_shared_with_static_runtimes=yes
      ;;

    osf3*)
      if test yes = "$GCC"; then
	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
      else
	allow_undefined_flag=' -expect_unresolved \*'
	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
      hardcode_libdir_separator=:
      ;;

    osf4* | osf5*)	# as osf3* with the addition of -msym flag
      if test yes = "$GCC"; then
	allow_undefined_flag=' $wl-expect_unresolved $wl\*'
	archive_cmds='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
	hardcode_libdir_flag_spec='$wl-rpath $wl$libdir'
      else
	allow_undefined_flag=' -expect_unresolved \*'
	archive_cmds='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'

	# Both c and cxx compiler support -rpath directly
	hardcode_libdir_flag_spec='-rpath $libdir'
      fi
      archive_cmds_need_lc='no'
      hardcode_libdir_separator=:
      ;;

    solaris*)
      no_undefined_flag=' -z defs'
      if test yes = "$GCC"; then
	wlarc='$wl'
	archive_cmds='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
      else
	case `$CC -V 2>&1` in
	*"Compilers 5.0"*)
	  wlarc=''
	  archive_cmds='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
	  ;;
	*)
	  wlarc='$wl'
	  archive_cmds='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
	  ;;
	esac
      fi
      hardcode_libdir_flag_spec='-R$libdir'
      hardcode_shlibpath_var=no
      case $host_os in
      solaris2.[0-5] | solaris2.[0-5].*) ;;
      *)
	# The compiler driver will combine and reorder linker options,
	# but understands '-z linker_flag'.  GCC discards it without '$wl',
	# but is careful enough not to reorder.
	# Supported since Solaris 2.6 (maybe 2.5.1?)
	if test yes = "$GCC"; then
	  whole_archive_flag_spec='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
	else
	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
	fi
	;;
      esac
      link_all_deplibs=yes
      ;;

    sunos4*)
      if test sequent = "$host_vendor"; then
	# Use $CC to link under sequent, because it throws in some extra .o
	# files that make .init and .fini sections work.
	archive_cmds='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
      fi
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_direct=yes
      hardcode_minus_L=yes
      hardcode_shlibpath_var=no
      ;;

    sysv4)
      case $host_vendor in
	sni)
	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  hardcode_direct=yes # is this really true???
	;;
	siemens)
	  ## LD is ld it makes a PLAMLIB
	  ## CC just makes a GrossModule.
	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
	  reload_cmds='$CC -r -o $output$reload_objs'
	  hardcode_direct=no
        ;;
	motorola)
	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
	;;
      esac
      runpath_var='LD_RUN_PATH'
      hardcode_shlibpath_var=no
      ;;

    sysv4.3*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_shlibpath_var=no
      export_dynamic_flag_spec='-Bexport'
      ;;

    sysv4*MP*)
      if test -d /usr/nec; then
	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
	hardcode_shlibpath_var=no
	runpath_var=LD_RUN_PATH
	hardcode_runpath_var=yes
	ld_shlibs=yes
      fi
      ;;

    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
      no_undefined_flag='$wl-z,text'
      archive_cmds_need_lc=no
      hardcode_shlibpath_var=no
      runpath_var='LD_RUN_PATH'

      if test yes = "$GCC"; then
	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      fi
      ;;

    sysv5* | sco3.2v5* | sco5v6*)
      # Note: We CANNOT use -z defs as we might desire, because we do not
      # link with -lc, and that would cause any symbols used from libc to
      # always be unresolved, which means just about no library would
      # ever link correctly.  If we're not using GNU ld we use -z text
      # though, which does catch some bad symbols but isn't as heavy-handed
      # as -z defs.
      no_undefined_flag='$wl-z,text'
      allow_undefined_flag='$wl-z,nodefs'
      archive_cmds_need_lc=no
      hardcode_shlibpath_var=no
      hardcode_libdir_flag_spec='$wl-R,$libdir'
      hardcode_libdir_separator=':'
      link_all_deplibs=yes
      export_dynamic_flag_spec='$wl-Bexport'
      runpath_var='LD_RUN_PATH'

      if test yes = "$GCC"; then
	archive_cmds='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      else
	archive_cmds='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	archive_expsym_cmds='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
      fi
      ;;

    uts4*)
      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
      hardcode_libdir_flag_spec='-L$libdir'
      hardcode_shlibpath_var=no
      ;;

    *)
      ld_shlibs=no
      ;;
    esac

    if test sni = "$host_vendor"; then
      case $host in
      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
	export_dynamic_flag_spec='$wl-Blargedynsym'
	;;
      esac
    fi
  fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
$as_echo "$ld_shlibs" >&6; }
test no = "$ld_shlibs" && can_build_shared=no

with_gnu_ld=$with_gnu_ld















#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc" in
x|xyes)
  # Assume -lc should be added
  archive_cmds_need_lc=yes

  if test yes,yes = "$GCC,$enable_shared"; then
    case $archive_cmds in
    *'~'*)
      # FIXME: we may have to deal with multi-command sequences.
      ;;
    '$CC '*)
      # Test whether the compiler implicitly links with -lc since on some
      # systems, -lgcc has to come before -lc. If gcc already passes -lc
      # to ld, don't add -lc before -lgcc.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if ${lt_cv_archive_cmds_need_lc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  $RM conftest*
	echo "$lt_simple_compile_test_code" > conftest.$ac_ext

	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } 2>conftest.err; then
	  soname=conftest
	  lib=conftest
	  libobjs=conftest.$ac_objext
	  deplibs=
	  wl=$lt_prog_compiler_wl
	  pic_flag=$lt_prog_compiler_pic
	  compiler_flags=-v
	  linker_flags=-v
	  verstring=
	  output_objdir=.
	  libname=conftest
	  lt_save_allow_undefined_flag=$allow_undefined_flag
	  allow_undefined_flag=
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
	  then
	    lt_cv_archive_cmds_need_lc=no
	  else
	    lt_cv_archive_cmds_need_lc=yes
	  fi
	  allow_undefined_flag=$lt_save_allow_undefined_flag
	else
	  cat conftest.err 1>&5
	fi
	$RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
      ;;
    esac
  fi
  ;;
esac
























































































































































  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }

if test yes = "$GCC"; then
  case $host_os in
    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
    *) lt_awk_arg='/^libraries:/' ;;
  esac
  case $host_os in
    mingw* | cegcc*) lt_sed_strip_eq='s|=\([A-Za-z]:\)|\1|g' ;;
    *) lt_sed_strip_eq='s|=/|/|g' ;;
  esac
  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
  case $lt_search_path_spec in
  *\;*)
    # if the path contains ";" then we assume it to be the separator
    # otherwise default to the standard path separator (i.e. ":") - it is
    # assumed that no part of a normal pathname contains ";" but that should
    # okay in the real world where ";" in dirpaths is itself problematic.
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
    ;;
  *)
    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
    ;;
  esac
  # Ok, now we have the path, separated by spaces, we can step through it
  # and add multilib dir if necessary...
  lt_tmp_lt_search_path_spec=
  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
  # ...but if some path component already ends with the multilib dir we assume
  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
  case "$lt_multi_os_dir; $lt_search_path_spec " in
  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
    lt_multi_os_dir=
    ;;
  esac
  for lt_sys_path in $lt_search_path_spec; do
    if test -d "$lt_sys_path$lt_multi_os_dir"; then
      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
    elif test -n "$lt_multi_os_dir"; then
      test -d "$lt_sys_path" && \
	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
    fi
  done
  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
BEGIN {RS = " "; FS = "/|\n";} {
  lt_foo = "";
  lt_count = 0;
  for (lt_i = NF; lt_i > 0; lt_i--) {
    if ($lt_i != "" && $lt_i != ".") {
      if ($lt_i == "..") {
        lt_count++;
      } else {
        if (lt_count == 0) {
          lt_foo = "/" $lt_i lt_foo;
        } else {
          lt_count--;
        }
      }
    }
  }
  if (lt_foo != "") { lt_freq[lt_foo]++; }
  if (lt_freq[lt_foo] == 1) { print lt_foo; }
}'`
  # AWK program above erroneously prepends '/' to C:/dos/paths
  # for these hosts.
  case $host_os in
    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
      $SED 's|/\([A-Za-z]:\)|\1|g'` ;;
  esac
  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
else
  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
fi
library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no

# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown



case $host_os in
aix3*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
  shlibpath_var=LIBPATH

  # AIX 3 has no versioning support, so we append a major version to the name.
  soname_spec='$libname$release$shared_ext$major'
  ;;

aix[4-9]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  hardcode_into_libs=yes
  if test ia64 = "$host_cpu"; then
    # AIX 5 supports IA64
    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
    shlibpath_var=LD_LIBRARY_PATH
  else
    # With GCC up to 2.95.x, collect2 would create an import file
    # for dependence libraries.  The import file would start with
    # the line '#! .'.  This would cause the generated library to
    # depend on '.', always an invalid library.  This was fixed in
    # development snapshots of GCC prior to 3.0.
    case $host_os in
      aix4 | aix4.[01] | aix4.[01].*)
      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
	   echo ' yes '
	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
	:
      else
	can_build_shared=no
      fi
      ;;
    esac
    # Using Import Files as archive members, it is possible to support
    # filename-based versioning of shared library archives on AIX. While
    # this would work for both with and without runtime linking, it will
    # prevent static linking of such archives. So we do filename-based
    # shared library versioning with .so extension only, which is used
    # when both runtime linking and shared linking is enabled.
    # Unfortunately, runtime linking may impact performance, so we do
    # not want this to be the default eventually. Also, we use the
    # versioned .so libs for executables only if there is the -brtl
    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
    # To allow for filename-based versioning support, we need to create
    # libNAME.so.V as an archive file, containing:
    # *) an Import File, referring to the versioned filename of the
    #    archive as well as the shared archive member, telling the
    #    bitwidth (32 or 64) of that shared object, and providing the
    #    list of exported symbols of that shared object, eventually
    #    decorated with the 'weak' keyword
    # *) the shared object with the F_LOADONLY flag set, to really avoid
    #    it being seen by the linker.
    # At run time we better use the real file rather than another symlink,
    # but for link time we create the symlink libNAME.so -> libNAME.so.V

    case $with_aix_soname,$aix_use_runtimelinking in
    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
    # soname into executable. Probably we can add versioning support to
    # collect2, so additional links can be useful in future.
    aix,yes) # traditional libtool
      dynamic_linker='AIX unversionable lib.so'
      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
      # instead of lib<name>.a to let people know that these are not
      # typical AIX shared libraries.
      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
      ;;
    aix,no) # traditional AIX only
      dynamic_linker='AIX lib.a(lib.so.V)'
      # We preserve .a as extension for shared libraries through AIX4.2
      # and later when we are not doing run time linking.
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      ;;
    svr4,*) # full svr4 only
      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,yes) # both, prefer svr4
      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # unpreferred sharedlib libNAME.a needs extra handling
      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,no) # both, prefer aix
      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
      ;;
    esac
    shlibpath_var=LIBPATH
  fi
  ;;

amigaos*)
  case $host_cpu in
  powerpc)
    # Since July 2007 AmigaOS4 officially supports .so libraries.
    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    ;;
  m68k)
    library_names_spec='$libname.ixlibrary $libname.a'
    # Create ${libname}_ixlibrary.a entries in /sys/libs.
    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
    ;;
  esac
  ;;

beos*)
  library_names_spec='$libname$shared_ext'
  dynamic_linker="$host_os ld.so"
  shlibpath_var=LIBRARY_PATH
  ;;

bsdi[45]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
  # the default ld.so.conf also contains /usr/contrib/lib and
  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
  # libtool to hard-code these into programs
  ;;

cygwin* | mingw* | pw32* | cegcc*)
  version_type=windows
  shrext_cmds=.dll
  need_version=no
  need_lib_prefix=no

  case $GCC,$cc_basename in
  yes,*)
    # gcc
    library_names_spec='$libname.dll.a'
    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \$file`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname~
      chmod a+x \$dldir/$dlname~
      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
      fi'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes

    case $host_os in
    cygwin*)
      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'

      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
      ;;
    mingw* | cegcc*)
      # MinGW DLLs use traditional 'lib' prefix
      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
      ;;
    pw32*)
      # pw32 DLLs use 'pw' prefix rather than 'lib'
      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
      ;;
    esac
    dynamic_linker='Win32 ld.exe'
    ;;

  *,cl*)
    # Native MSVC
    libname_spec='$name'
    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
    library_names_spec='$libname.dll.lib'

    case $build_os in
    mingw*)
      sys_lib_search_path_spec=
      lt_save_ifs=$IFS
      IFS=';'
      for lt_path in $LIB
      do
        IFS=$lt_save_ifs
        # Let DOS variable expansion print the short 8.3 style file name.
        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
      done
      IFS=$lt_save_ifs
      # Convert to MSYS style.
      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
      ;;
    cygwin*)
      # Convert to unix form, then to dos form, then back to unix form
      # but this time dos style (no spaces!) so that the unix form looks
      # like /cygdrive/c/PROGRA~1:/cygdr...
      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
      ;;
    *)
      sys_lib_search_path_spec=$LIB
      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
        # It is most probably a Windows format PATH.
        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
      else
        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
      fi
      # FIXME: find the short name or the path components, as spaces are
      # common. (e.g. "Program Files" -> "PROGRA~1")
      ;;
    esac

    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \$file`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes
    dynamic_linker='Win32 link.exe'
    ;;

  *)
    # Assume MSVC wrapper
    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
    dynamic_linker='Win32 ld.exe'
    ;;
  esac
  # FIXME: first we should search . and the directory the executable is in
  shlibpath_var=PATH
  ;;

darwin* | rhapsody*)
  dynamic_linker="$host_os dyld"
  version_type=darwin
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
  soname_spec='$libname$release$major$shared_ext'
  shlibpath_overrides_runpath=yes
  shlibpath_var=DYLD_LIBRARY_PATH
  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'

  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
  ;;

dgux*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

freebsd* | dragonfly*)
  # DragonFly does not have aout.  When/if they implement a new
  # versioning mechanism, adjust this.
  if test -x /usr/bin/objformat; then
    objformat=`/usr/bin/objformat`
  else
    case $host_os in
    freebsd[23].*) objformat=aout ;;
    *) objformat=elf ;;
    esac
  fi
  version_type=freebsd-$objformat
  case $version_type in
    freebsd-elf*)
      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
      soname_spec='$libname$release$shared_ext$major'
      need_version=no
      need_lib_prefix=no
      ;;
    freebsd-*)
      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
      need_version=yes
      ;;
  esac
  shlibpath_var=LD_LIBRARY_PATH
  case $host_os in
  freebsd2.*)
    shlibpath_overrides_runpath=yes
    ;;
  freebsd3.[01]* | freebsdelf3.[01]*)
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
    shlibpath_overrides_runpath=no
    hardcode_into_libs=yes
    ;;
  *) # from 4.6 on, and DragonFly
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  esac
  ;;

haiku*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  dynamic_linker="$host_os runtime_loader"
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LIBRARY_PATH
  shlibpath_overrides_runpath=no
  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
  hardcode_into_libs=yes
  ;;

hpux9* | hpux10* | hpux11*)
  # Give a soname corresponding to the major version so that dld.sl refuses to
  # link against other versions.
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  case $host_cpu in
  ia64*)
    shrext_cmds='.so'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.so"
    shlibpath_var=LD_LIBRARY_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    if test 32 = "$HPUX_IA64_MODE"; then
      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
    else
      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
    fi
    ;;
  hppa*64*)
    shrext_cmds='.sl'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  *)
    shrext_cmds='.sl'
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=SHLIB_PATH
    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    ;;
  esac
  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
  postinstall_cmds='chmod 555 $lib'
  # or fails outright, so override atomically:
  install_override_mode=555
  ;;

interix[3-9]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

irix5* | irix6* | nonstopux*)
  case $host_os in
    nonstopux*) version_type=nonstopux ;;
    *)
	if test yes = "$lt_cv_prog_gnu_ld"; then
		version_type=linux # correct to gnu/linux during the next big refactor
	else
		version_type=irix
	fi ;;
  esac
  need_lib_prefix=no
  need_version=no
  soname_spec='$libname$release$shared_ext$major'
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
  case $host_os in
  irix5* | nonstopux*)
    libsuff= shlibsuff=
    ;;
  *)
    case $LD in # libtool.m4 will add one of these switches to LD
    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
      libsuff= shlibsuff= libmagic=32-bit;;
    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
      libsuff=32 shlibsuff=N32 libmagic=N32;;
    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
      libsuff=64 shlibsuff=64 libmagic=64-bit;;
    *) libsuff= shlibsuff= libmagic=never-match;;
    esac
    ;;
  esac
  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
  shlibpath_overrides_runpath=no
  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
  hardcode_into_libs=yes
  ;;

# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
  dynamic_linker=no
  ;;

linux*android*)
  version_type=none # Android doesn't support versioned libraries.
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext'
  soname_spec='$libname$release$shared_ext'
  finish_cmds=
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  dynamic_linker='Android linker'
  # Don't embed -rpath directories since the linker doesn't support them.
  hardcode_libdir_flag_spec='-L$libdir'
  ;;

# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no

  # Some binutils ld are patched to set DT_RUNPATH
  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_shlibpath_overrides_runpath=no
    save_LDFLAGS=$LDFLAGS
    save_libdir=$libdir
    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
  lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LDFLAGS=$save_LDFLAGS
    libdir=$save_libdir

fi

  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  # Ideally, we could use ldconfig to report *all* directores which are
  # searched for libraries, however this is still not possible.  Aside from not
  # being certain /sbin/ldconfig is available, command
  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
  # even though it is searched at run-time.  Try to do the best guess by
  # appending ld.so.conf contents (and includes) to the search path.
  if test -f /etc/ld.so.conf; then
    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
  fi

  # We used to test for /lib/ld.so.1 and disable shared libraries on
  # powerpc, because MkLinux only supported shared libraries with the
  # GNU dynamic linker.  Since this was broken with cross compilers,
  # most powerpc-linux boxes support dynamic linking these days and
  # people can always --disable-shared, the test was removed, and we
  # assume the GNU/Linux dynamic linker is in use.
  dynamic_linker='GNU/Linux ld.so'
  ;;

netbsdelf*-gnu)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='NetBSD ld.elf_so'
  ;;

netbsd*)
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
    dynamic_linker='NetBSD (a.out) ld.so'
  else
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    dynamic_linker='NetBSD ld.elf_so'
  fi
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  ;;

newsos6)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

*nto* | *qnx*)
  version_type=qnx
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='ldqnx.so'
  ;;

openbsd* | bitrig*)
  version_type=sunos
  sys_lib_dlsearch_path_spec=/usr/lib
  need_lib_prefix=no
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
    need_version=no
  else
    need_version=yes
  fi
  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

os2*)
  libname_spec='$name'
  version_type=windows
  shrext_cmds=.dll
  need_version=no
  need_lib_prefix=no
  # OS/2 can only load a DLL with a base name of 8 characters or less.
  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
    v=$($ECHO $release$versuffix | tr -d .-);
    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
    $ECHO $n$v`$shared_ext'
  library_names_spec='${libname}_dll.$libext'
  dynamic_linker='OS/2 ld.exe'
  shlibpath_var=BEGINLIBPATH
  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
  postinstall_cmds='base_file=`basename \$file`~
    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
    dldir=$destdir/`dirname \$dlpath`~
    test -d \$dldir || mkdir -p \$dldir~
    $install_prog $dir/$dlname \$dldir/$dlname~
    chmod a+x \$dldir/$dlname~
    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
    fi'
  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
    dlpath=$dir/\$dldll~
    $RM \$dlpath'
  ;;

osf3* | osf4* | osf5*)
  version_type=osf
  need_lib_prefix=no
  need_version=no
  soname_spec='$libname$release$shared_ext$major'
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
  ;;

rdos*)
  dynamic_linker=no
  ;;

solaris*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  # ldd complains unless libraries are executable
  postinstall_cmds='chmod +x $lib'
  ;;

sunos4*)
  version_type=sunos
  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  if test yes = "$with_gnu_ld"; then
    need_lib_prefix=no
  fi
  need_version=yes
  ;;

sysv4 | sysv4.3*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  case $host_vendor in
    sni)
      shlibpath_overrides_runpath=no
      need_lib_prefix=no
      runpath_var=LD_RUN_PATH
      ;;
    siemens)
      need_lib_prefix=no
      ;;
    motorola)
      need_lib_prefix=no
      need_version=no
      shlibpath_overrides_runpath=no
      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
      ;;
  esac
  ;;

sysv4*MP*)
  if test -d /usr/nec; then
    version_type=linux # correct to gnu/linux during the next big refactor
    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
    soname_spec='$libname$shared_ext.$major'
    shlibpath_var=LD_LIBRARY_PATH
  fi
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  version_type=sco
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  if test yes = "$with_gnu_ld"; then
    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
  else
    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
    case $host_os in
      sco3.2v5*)
        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
	;;
    esac
  fi
  sys_lib_dlsearch_path_spec='/usr/lib'
  ;;

tpf*)
  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

uts4*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

*)
  dynamic_linker=no
  ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no

variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test yes = "$GCC"; then
  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi

if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi

if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi

# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec

# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"

# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH

































































































  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action=
if test -n "$hardcode_libdir_flag_spec" ||
   test -n "$runpath_var" ||
   test yes = "$hardcode_automatic"; then

  # We can hardcode non-existent directories.
  if test no != "$hardcode_direct" &&
     # If the only mechanism to avoid hardcoding is shlibpath_var, we
     # have to relink, otherwise we might link with an installed library
     # when we should be linking with a yet-to-be-installed one
     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, )" &&
     test no != "$hardcode_minus_L"; then
    # Linking always hardcodes the temporary library directory.
    hardcode_action=relink
  else
    # We can link without hardcoding, and we can hardcode nonexisting dirs.
    hardcode_action=immediate
  fi
else
  # We cannot hardcode anything, or else we can only hardcode existing
  # directories.
  hardcode_action=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
$as_echo "$hardcode_action" >&6; }

if test relink = "$hardcode_action" ||
   test yes = "$inherit_rpath"; then
  # Fast installation is not supported
  enable_fast_install=no
elif test yes = "$shlibpath_overrides_runpath" ||
     test no = "$enable_shared"; then
  # Fast installation is not necessary
  enable_fast_install=needless
fi






  if test yes != "$enable_dlopen"; then
  enable_dlopen=unknown
  enable_dlopen_self=unknown
  enable_dlopen_self_static=unknown
else
  lt_cv_dlopen=no
  lt_cv_dlopen_libs=

  case $host_os in
  beos*)
    lt_cv_dlopen=load_add_on
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes
    ;;

  mingw* | pw32* | cegcc*)
    lt_cv_dlopen=LoadLibrary
    lt_cv_dlopen_libs=
    ;;

  cygwin*)
    lt_cv_dlopen=dlopen
    lt_cv_dlopen_libs=
    ;;

  darwin*)
    # if libdl is installed we need to link against it
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else

    lt_cv_dlopen=dyld
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=yes

fi

    ;;

  tpf*)
    # Don't try to run any link tests for TPF.  We know it's impossible
    # because TPF is a cross-compiler, and we know how we open DSOs.
    lt_cv_dlopen=dlopen
    lt_cv_dlopen_libs=
    lt_cv_dlopen_self=no
    ;;

  *)
    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
if test "x$ac_cv_func_shl_load" = xyes; then :
  lt_cv_dlopen=shl_load
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
$as_echo_n "checking for shl_load in -ldld... " >&6; }
if ${ac_cv_lib_dld_shl_load+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char shl_load ();
int
main ()
{
return shl_load ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dld_shl_load=yes
else
  ac_cv_lib_dld_shl_load=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
  lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld
else
  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
if test "x$ac_cv_func_dlopen" = xyes; then :
  lt_cv_dlopen=dlopen
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
$as_echo_n "checking for dlopen in -lsvld... " >&6; }
if ${ac_cv_lib_svld_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsvld  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_svld_dlopen=yes
else
  ac_cv_lib_svld_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
  lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
$as_echo_n "checking for dld_link in -ldld... " >&6; }
if ${ac_cv_lib_dld_dld_link+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldld  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dld_link ();
int
main ()
{
return dld_link ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dld_dld_link=yes
else
  ac_cv_lib_dld_dld_link=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
  lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld
fi


fi


fi


fi


fi


fi

    ;;
  esac

  if test no = "$lt_cv_dlopen"; then
    enable_dlopen=no
  else
    enable_dlopen=yes
  fi

  case $lt_cv_dlopen in
  dlopen)
    save_CPPFLAGS=$CPPFLAGS
    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"

    save_LDFLAGS=$LDFLAGS
    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"

    save_LIBS=$LIBS
    LIBS="$lt_cv_dlopen_libs $LIBS"

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
$as_echo_n "checking whether a program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self+:} false; then :
  $as_echo_n "(cached) " >&6
else
  	  if test yes = "$cross_compiling"; then :
  lt_cv_dlopen_self=cross
else
  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
  lt_status=$lt_dlunknown
  cat > conftest.$ac_ext <<_LT_EOF
#line $LINENO "configure"
#include "confdefs.h"

#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif

#include <stdio.h>

#ifdef RTLD_GLOBAL
#  define LT_DLGLOBAL		RTLD_GLOBAL
#else
#  ifdef DL_GLOBAL
#    define LT_DLGLOBAL		DL_GLOBAL
#  else
#    define LT_DLGLOBAL		0
#  endif
#endif

/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
   find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
#  ifdef RTLD_LAZY
#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
#  else
#    ifdef DL_LAZY
#      define LT_DLLAZY_OR_NOW		DL_LAZY
#    else
#      ifdef RTLD_NOW
#        define LT_DLLAZY_OR_NOW	RTLD_NOW
#      else
#        ifdef DL_NOW
#          define LT_DLLAZY_OR_NOW	DL_NOW
#        else
#          define LT_DLLAZY_OR_NOW	0
#        endif
#      endif
#    endif
#  endif
#endif

/* When -fvisibility=hidden is used, assume the code has been annotated
   correspondingly for the symbols needed.  */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif

int fnord () { return 42; }
int main ()
{
  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
  int status = $lt_dlunknown;

  if (self)
    {
      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
      else
        {
	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
          else puts (dlerror ());
	}
      /* dlclose (self); */
    }
  else
    puts (dlerror ());

  return status;
}
_LT_EOF
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
    (./conftest; exit; ) >&5 2>/dev/null
    lt_status=$?
    case x$lt_status in
      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
    esac
  else :
    # compilation failed
    lt_cv_dlopen_self=no
  fi
fi
rm -fr conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
$as_echo "$lt_cv_dlopen_self" >&6; }

    if test yes = "$lt_cv_dlopen_self"; then
      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
if ${lt_cv_dlopen_self_static+:} false; then :
  $as_echo_n "(cached) " >&6
else
  	  if test yes = "$cross_compiling"; then :
  lt_cv_dlopen_self_static=cross
else
  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
  lt_status=$lt_dlunknown
  cat > conftest.$ac_ext <<_LT_EOF
#line $LINENO "configure"
#include "confdefs.h"

#if HAVE_DLFCN_H
#include <dlfcn.h>
#endif

#include <stdio.h>

#ifdef RTLD_GLOBAL
#  define LT_DLGLOBAL		RTLD_GLOBAL
#else
#  ifdef DL_GLOBAL
#    define LT_DLGLOBAL		DL_GLOBAL
#  else
#    define LT_DLGLOBAL		0
#  endif
#endif

/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
   find out it does not work in some platform. */
#ifndef LT_DLLAZY_OR_NOW
#  ifdef RTLD_LAZY
#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
#  else
#    ifdef DL_LAZY
#      define LT_DLLAZY_OR_NOW		DL_LAZY
#    else
#      ifdef RTLD_NOW
#        define LT_DLLAZY_OR_NOW	RTLD_NOW
#      else
#        ifdef DL_NOW
#          define LT_DLLAZY_OR_NOW	DL_NOW
#        else
#          define LT_DLLAZY_OR_NOW	0
#        endif
#      endif
#    endif
#  endif
#endif

/* When -fvisibility=hidden is used, assume the code has been annotated
   correspondingly for the symbols needed.  */
#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
int fnord () __attribute__((visibility("default")));
#endif

int fnord () { return 42; }
int main ()
{
  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
  int status = $lt_dlunknown;

  if (self)
    {
      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
      else
        {
	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
          else puts (dlerror ());
	}
      /* dlclose (self); */
    }
  else
    puts (dlerror ());

  return status;
}
_LT_EOF
  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
  (eval $ac_link) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } && test -s "conftest$ac_exeext" 2>/dev/null; then
    (./conftest; exit; ) >&5 2>/dev/null
    lt_status=$?
    case x$lt_status in
      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
    esac
  else :
    # compilation failed
    lt_cv_dlopen_self_static=no
  fi
fi
rm -fr conftest*


fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
$as_echo "$lt_cv_dlopen_self_static" >&6; }
    fi

    CPPFLAGS=$save_CPPFLAGS
    LDFLAGS=$save_LDFLAGS
    LIBS=$save_LIBS
    ;;
  esac

  case $lt_cv_dlopen_self in
  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
  *) enable_dlopen_self=unknown ;;
  esac

  case $lt_cv_dlopen_self_static in
  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
  *) enable_dlopen_self_static=unknown ;;
  esac
fi

















striplib=
old_striplib=
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
$as_echo_n "checking whether stripping libraries is possible... " >&6; }
if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
# FIXME - insert some real tests, host_os isn't really good enough
  case $host_os in
  darwin*)
    if test -n "$STRIP"; then
      striplib="$STRIP -x"
      old_striplib="$STRIP -S"
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
    fi
    ;;
  *)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
    ;;
  esac
fi












  # Report what library types will actually be built
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
$as_echo_n "checking if libtool supports shared libraries... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
$as_echo "$can_build_shared" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
$as_echo_n "checking whether to build shared libraries... " >&6; }
  test no = "$can_build_shared" && enable_shared=no

  # On AIX, shared libraries and static libraries use the same namespace, and
  # are all built from PIC.
  case $host_os in
  aix3*)
    test yes = "$enable_shared" && enable_static=no
    if test -n "$RANLIB"; then
      archive_cmds="$archive_cmds~\$RANLIB \$lib"
      postinstall_cmds='$RANLIB $lib'
    fi
    ;;

  aix[4-9]*)
    if test ia64 != "$host_cpu"; then
      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
      yes,aix,yes) ;;			# shared object as lib.so file only
      yes,svr4,*) ;;			# shared object as lib.so archive member only
      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
      esac
    fi
    ;;
  esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
$as_echo "$enable_shared" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
$as_echo_n "checking whether to build static libraries... " >&6; }
  # Make sure either enable_shared or enable_static is yes.
  test yes = "$enable_shared" || enable_static=yes
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
$as_echo "$enable_static" >&6; }




fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

CC=$lt_save_CC















        ac_config_commands="$ac_config_commands libtool"




# Only expand once:




GST_REQ=1.8.0
GSTPB_REQ=1.8.0




# Check whether --with-autoconf was given.
if test "${with_autoconf+set}" = set; then :
  withval=$with_autoconf;
      unset AUTOCONF

AUTOCONF=${AUTOCONF-"${am_missing_run}${withval}"}

      { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOCONF as autoconf" >&5
$as_echo "$as_me: Using $AUTOCONF as autoconf" >&6;}

fi



# Check whether --with-autoheader was given.
if test "${with_autoheader+set}" = set; then :
  withval=$with_autoheader;
      unset AUTOHEADER

AUTOHEADER=${AUTOHEADER-"${am_missing_run}${withval}"}

      { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOHEADER as autoheader" >&5
$as_echo "$as_me: Using $AUTOHEADER as autoheader" >&6;}

fi



# Check whether --with-automake was given.
if test "${with_automake+set}" = set; then :
  withval=$with_automake;
      unset AUTOMAKE

AUTOMAKE=${AUTOMAKE-"${am_missing_run}${withval}"}

      { $as_echo "$as_me:${as_lineno-$LINENO}: Using $AUTOMAKE as automake" >&5
$as_echo "$as_me: Using $AUTOMAKE as automake" >&6;}

fi



# Check whether --with-aclocal was given.
if test "${with_aclocal+set}" = set; then :
  withval=$with_aclocal;
      unset ACLOCAL

ACLOCAL=${ACLOCAL-"${am_missing_run}${withval}"}

      { $as_echo "$as_me:${as_lineno-$LINENO}: Using $ACLOCAL as aclocal" >&5
$as_echo "$as_me: Using $ACLOCAL as aclocal" >&6;}

fi



ACLOCAL_AMFLAGS="-I m4 -I common/m4"




mkdir_p="$MKDIR_P"
case $mkdir_p in
  [\\/$]* | ?:[\\/]*) ;;
  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
esac


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether NLS is requested" >&5
$as_echo_n "checking whether NLS is requested... " >&6; }
    # Check whether --enable-nls was given.
if test "${enable_nls+set}" = set; then :
  enableval=$enable_nls; USE_NLS=$enableval
else
  USE_NLS=yes
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
$as_echo "$USE_NLS" >&6; }




      GETTEXT_MACRO_VERSION=0.17




# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "msgfmt", so it can be a program name with args.
set dummy msgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGFMT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$MSGFMT" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --statistics /dev/null >&5 2>&1 &&
     (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
            ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":"
    ;;
esac
fi
MSGFMT="$ac_cv_path_MSGFMT"
if test "$MSGFMT" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGFMT" >&5
$as_echo "$MSGFMT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  # Extract the first word of "gmsgfmt", so it can be a program name with args.
set dummy gmsgfmt; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GMSGFMT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GMSGFMT in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
  ;;
esac
fi
GMSGFMT=$ac_cv_path_GMSGFMT
if test -n "$GMSGFMT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GMSGFMT" >&5
$as_echo "$GMSGFMT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi



    case `$MSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) MSGFMT_015=: ;;
    *) MSGFMT_015=$MSGFMT ;;
  esac

  case `$GMSGFMT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) GMSGFMT_015=: ;;
    *) GMSGFMT_015=$GMSGFMT ;;
  esac



# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "xgettext", so it can be a program name with args.
set dummy xgettext; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_XGETTEXT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$XGETTEXT" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >&5 2>&1 &&
     (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then
            ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":"
    ;;
esac
fi
XGETTEXT="$ac_cv_path_XGETTEXT"
if test "$XGETTEXT" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $XGETTEXT" >&5
$as_echo "$XGETTEXT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

    rm -f messages.po

    case `$XGETTEXT --version | sed 1q | sed -e 's,^[^0-9]*,,'` in
    '' | 0.[0-9] | 0.[0-9].* | 0.1[0-4] | 0.1[0-4].*) XGETTEXT_015=: ;;
    *) XGETTEXT_015=$XGETTEXT ;;
  esac



# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi

# Find out how to test for executable files. Don't use a zero-byte file,
# as systems may use methods other than mode bits to determine executability.
cat >conf$$.file <<_ASEOF
#! /bin/sh
exit 0
_ASEOF
chmod +x conf$$.file
if test -x conf$$.file >/dev/null 2>&1; then
  ac_executable_p="test -x"
else
  ac_executable_p="test -f"
fi
rm -f conf$$.file

# Extract the first word of "msgmerge", so it can be a program name with args.
set dummy msgmerge; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MSGMERGE+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case "$MSGMERGE" in
  [\\/]* | ?:[\\/]*)
    ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
    ;;
  *)
    ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR
    for ac_dir in $PATH; do
      IFS="$ac_save_IFS"
      test -z "$ac_dir" && ac_dir=.
      for ac_exec_ext in '' $ac_executable_extensions; do
        if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then
          echo "$as_me: trying $ac_dir/$ac_word..." >&5
          if $ac_dir/$ac_word --update -q /dev/null /dev/null >&5 2>&1; then
            ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext"
            break 2
          fi
        fi
      done
    done
    IFS="$ac_save_IFS"
  test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":"
    ;;
esac
fi
MSGMERGE="$ac_cv_path_MSGMERGE"
if test "$MSGMERGE" != ":"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSGMERGE" >&5
$as_echo "$MSGMERGE" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


        test -n "$localedir" || localedir='${datadir}/locale'


    test -n "${XGETTEXT_EXTRA_OPTIONS+set}" || XGETTEXT_EXTRA_OPTIONS=


  ac_config_commands="$ac_config_commands po-directories"



      if test "X$prefix" = "XNONE"; then
    acl_final_prefix="$ac_default_prefix"
  else
    acl_final_prefix="$prefix"
  fi
  if test "X$exec_prefix" = "XNONE"; then
    acl_final_exec_prefix='${prefix}'
  else
    acl_final_exec_prefix="$exec_prefix"
  fi
  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  eval acl_final_exec_prefix=\"$acl_final_exec_prefix\"
  prefix="$acl_save_prefix"


# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

# Prepare PATH_SEPARATOR.
# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  echo "#! /bin/sh" >conf$$.sh
  echo  "exit 0"   >>conf$$.sh
  chmod +x conf$$.sh
  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
    PATH_SEPARATOR=';'
  else
    PATH_SEPARATOR=:
  fi
  rm -f conf$$.sh
fi
ac_prog=ld
if test "$GCC" = yes; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by GCC" >&5
$as_echo_n "checking for ld used by GCC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | [A-Za-z]:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the path of ld
      ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'`
      while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD="$ac_prog"
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test "$with_gnu_ld" = yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if ${acl_cv_path_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}"
  for ac_dir in $PATH; do
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      acl_cv_path_LD="$ac_dir/$ac_prog"
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some GNU ld's only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in
      *GNU* | *'with BFD'*)
	test "$with_gnu_ld" != no && break ;;
      *)
	test "$with_gnu_ld" != yes && break ;;
      esac
    fi
  done
  IFS="$ac_save_ifs"
else
  acl_cv_path_LD="$LD" # Let the user override the test with a path.
fi
fi

LD="$acl_cv_path_LD"
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${acl_cv_prog_gnu_ld+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU ld's only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  acl_cv_prog_gnu_ld=yes ;;
*)
  acl_cv_prog_gnu_ld=no ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_prog_gnu_ld" >&5
$as_echo "$acl_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$acl_cv_prog_gnu_ld




                                                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shared library run path origin" >&5
$as_echo_n "checking for shared library run path origin... " >&6; }
if ${acl_cv_rpath+:} false; then :
  $as_echo_n "(cached) " >&6
else

    CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \
    ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh
    . ./conftest.sh
    rm -f ./conftest.sh
    acl_cv_rpath=done

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $acl_cv_rpath" >&5
$as_echo "$acl_cv_rpath" >&6; }
  wl="$acl_cv_wl"
  acl_libext="$acl_cv_libext"
  acl_shlibext="$acl_cv_shlibext"
  acl_libname_spec="$acl_cv_libname_spec"
  acl_library_names_spec="$acl_cv_library_names_spec"
  acl_hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec"
  acl_hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator"
  acl_hardcode_direct="$acl_cv_hardcode_direct"
  acl_hardcode_minus_L="$acl_cv_hardcode_minus_L"
    # Check whether --enable-rpath was given.
if test "${enable_rpath+set}" = set; then :
  enableval=$enable_rpath; :
else
  enable_rpath=yes
fi



                  acl_libdirstem=lib
  searchpath=`(LC_ALL=C $CC -print-search-dirs) 2>/dev/null | sed -n -e 's,^libraries: ,,p' | sed -e 's,^=,,'`
  if test -n "$searchpath"; then
    acl_save_IFS="${IFS= 	}"; IFS=":"
    for searchdir in $searchpath; do
      if test -d "$searchdir"; then
        case "$searchdir" in
          */lib64/ | */lib64 ) acl_libdirstem=lib64 ;;
          *) searchdir=`cd "$searchdir" && pwd`
             case "$searchdir" in
               */lib64 ) acl_libdirstem=lib64 ;;
             esac ;;
        esac
      fi
    done
    IFS="$acl_save_IFS"
  fi









    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libiconv-prefix was given.
if test "${with_libiconv_prefix+set}" = set; then :
  withval=$with_libiconv_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/$acl_libdirstem"
      fi
    fi

fi

      LIBICONV=
  LTLIBICONV=
  INCICONV=
  LIBICONV_PREFIX=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='iconv '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
          if test -n "$acl_shlibext"; then
            shrext=".$acl_shlibext"             # typically: shrext=.so
          else
            shrext=
          fi
          if test $use_additional = yes; then
            dir="$additional_libdir"
                                    if test -n "$acl_shlibext"; then
              if test -f "$dir/$libname$shrext"; then
                found_dir="$dir"
                found_so="$dir/$libname$shrext"
              else
                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                  ver=`(cd "$dir" && \
                        for f in "$libname$shrext".*; do echo "$f"; done \
                        | sed -e "s,^$libname$shrext\\\\.,," \
                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                        | sed 1q ) 2>/dev/null`
                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
                    found_dir="$dir"
                    found_so="$dir/$libname$shrext.$ver"
                  fi
                else
                  eval library_names=\"$acl_library_names_spec\"
                  for f in $library_names; do
                    if test -f "$dir/$f"; then
                      found_dir="$dir"
                      found_so="$dir/$f"
                      break
                    fi
                  done
                fi
              fi
            fi
                        if test "X$found_dir" = "X"; then
              if test -f "$dir/$libname.$acl_libext"; then
                found_dir="$dir"
                found_a="$dir/$libname.$acl_libext"
              fi
            fi
            if test "X$found_dir" != "X"; then
              if test -f "$dir/$libname.la"; then
                found_la="$dir/$libname.la"
              fi
            fi
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                                    if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext"; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$acl_hardcode_direct" = yes; then
                                                      LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                else
                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir"
                    fi
                    if test "$acl_hardcode_minus_L" != no; then
                                                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so"
                    else
                                                                                                                                                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a"
              else
                                                LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */$acl_libdirstem | */$acl_libdirstem/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
                LIBICONV_PREFIX="$basedir"
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
                      haveit=
                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBICONV; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBICONV="${LIBICONV}${LIBICONV:+ }$dep"
                    LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name"
            LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$acl_hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$acl_hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$acl_hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBICONV="${LIBICONV}${LIBICONV:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir"
    done
  fi

























    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFPreferencesCopyAppValue" >&5
$as_echo_n "checking for CFPreferencesCopyAppValue... " >&6; }
if ${gt_cv_func_CFPreferencesCopyAppValue+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_LIBS="$LIBS"
     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <CoreFoundation/CFPreferences.h>
int
main ()
{
CFPreferencesCopyAppValue(NULL, NULL)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gt_cv_func_CFPreferencesCopyAppValue=yes
else
  gt_cv_func_CFPreferencesCopyAppValue=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     LIBS="$gt_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFPreferencesCopyAppValue" >&5
$as_echo "$gt_cv_func_CFPreferencesCopyAppValue" >&6; }
  if test $gt_cv_func_CFPreferencesCopyAppValue = yes; then

$as_echo "#define HAVE_CFPREFERENCESCOPYAPPVALUE 1" >>confdefs.h

  fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CFLocaleCopyCurrent" >&5
$as_echo_n "checking for CFLocaleCopyCurrent... " >&6; }
if ${gt_cv_func_CFLocaleCopyCurrent+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_LIBS="$LIBS"
     LIBS="$LIBS -Wl,-framework -Wl,CoreFoundation"
     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <CoreFoundation/CFLocale.h>
int
main ()
{
CFLocaleCopyCurrent();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  gt_cv_func_CFLocaleCopyCurrent=yes
else
  gt_cv_func_CFLocaleCopyCurrent=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
     LIBS="$gt_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_cv_func_CFLocaleCopyCurrent" >&5
$as_echo "$gt_cv_func_CFLocaleCopyCurrent" >&6; }
  if test $gt_cv_func_CFLocaleCopyCurrent = yes; then

$as_echo "#define HAVE_CFLOCALECOPYCURRENT 1" >>confdefs.h

  fi
  INTL_MACOSX_LIBS=
  if test $gt_cv_func_CFPreferencesCopyAppValue = yes || test $gt_cv_func_CFLocaleCopyCurrent = yes; then
    INTL_MACOSX_LIBS="-Wl,-framework -Wl,CoreFoundation"
  fi






  LIBINTL=
  LTLIBINTL=
  POSUB=

    case " $gt_needs " in
    *" need-formatstring-macros "*) gt_api_version=3 ;;
    *" need-ngettext "*) gt_api_version=2 ;;
    *) gt_api_version=1 ;;
  esac
  gt_func_gnugettext_libc="gt_cv_func_gnugettext${gt_api_version}_libc"
  gt_func_gnugettext_libintl="gt_cv_func_gnugettext${gt_api_version}_libintl"

    if test "$USE_NLS" = "yes"; then
    gt_use_preinstalled_gnugettext=no


        if test $gt_api_version -ge 3; then
          gt_revision_test_code='
#ifndef __GNU_GETTEXT_SUPPORTED_REVISION
#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1)
#endif
typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1];
'
        else
          gt_revision_test_code=
        fi
        if test $gt_api_version -ge 2; then
          gt_expression_test_code=' + * ngettext ("", "", 0)'
        else
          gt_expression_test_code=
        fi

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libc" >&5
$as_echo_n "checking for GNU gettext in libc... " >&6; }
if eval \${$gt_func_gnugettext_libc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern int *_nl_domain_bindings;
int
main ()
{
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_domain_bindings
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$gt_func_gnugettext_libc=yes"
else
  eval "$gt_func_gnugettext_libc=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
eval ac_res=\$$gt_func_gnugettext_libc
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }

        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" != "yes"; }; then





          am_save_CPPFLAGS="$CPPFLAGS"

  for element in $INCICONV; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for iconv" >&5
$as_echo_n "checking for iconv... " >&6; }
if ${am_cv_func_iconv+:} false; then :
  $as_echo_n "(cached) " >&6
else

    am_cv_func_iconv="no, consider installing GNU libiconv"
    am_cv_lib_iconv=no
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
       iconv(cd,NULL,NULL,NULL,NULL);
       iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    if test "$am_cv_func_iconv" != yes; then
      am_save_LIBS="$LIBS"
      LIBS="$LIBS $LIBICONV"
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdlib.h>
#include <iconv.h>
int
main ()
{
iconv_t cd = iconv_open("","");
         iconv(cd,NULL,NULL,NULL,NULL);
         iconv_close(cd);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  am_cv_lib_iconv=yes
        am_cv_func_iconv=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      LIBS="$am_save_LIBS"
    fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv" >&5
$as_echo "$am_cv_func_iconv" >&6; }
  if test "$am_cv_func_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working iconv" >&5
$as_echo_n "checking for working iconv... " >&6; }
if ${am_cv_func_iconv_works+:} false; then :
  $as_echo_n "(cached) " >&6
else

            am_save_LIBS="$LIBS"
      if test $am_cv_lib_iconv = yes; then
        LIBS="$LIBS $LIBICONV"
      fi
      if test "$cross_compiling" = yes; then :
  case "$host_os" in
           aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
           *)            am_cv_func_iconv_works="guessing yes" ;;
         esac
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <iconv.h>
#include <string.h>
int main ()
{
  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
     returns.  */
  {
    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
    if (cd_utf8_to_88591 != (iconv_t)(-1))
      {
        static const char input[] = "\342\202\254"; /* EURO SIGN */
        char buf[10];
        const char *inptr = input;
        size_t inbytesleft = strlen (input);
        char *outptr = buf;
        size_t outbytesleft = sizeof (buf);
        size_t res = iconv (cd_utf8_to_88591,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if (res == 0)
          return 1;
      }
  }
#if 0 /* This bug could be worked around by the caller.  */
  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
  {
    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
    if (cd_88591_to_utf8 != (iconv_t)(-1))
      {
        static const char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
        char buf[50];
        const char *inptr = input;
        size_t inbytesleft = strlen (input);
        char *outptr = buf;
        size_t outbytesleft = sizeof (buf);
        size_t res = iconv (cd_88591_to_utf8,
                            (char **) &inptr, &inbytesleft,
                            &outptr, &outbytesleft);
        if ((int)res > 0)
          return 1;
      }
  }
#endif
  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
     provided.  */
  if (/* Try standardized names.  */
      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
      /* Try IRIX, OSF/1 names.  */
      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
      /* Try AIX names.  */
      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
      /* Try HP-UX names.  */
      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
    return 1;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  am_cv_func_iconv_works=yes
else
  am_cv_func_iconv_works=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

      LIBS="$am_save_LIBS"

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_func_iconv_works" >&5
$as_echo "$am_cv_func_iconv_works" >&6; }
    case "$am_cv_func_iconv_works" in
      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
      *)   am_func_iconv=yes ;;
    esac
  else
    am_func_iconv=no am_cv_lib_iconv=no
  fi
  if test "$am_func_iconv" = yes; then

$as_echo "#define HAVE_ICONV 1" >>confdefs.h

  fi
  if test "$am_cv_lib_iconv" = yes; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libiconv" >&5
$as_echo_n "checking how to link with libiconv... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBICONV" >&5
$as_echo "$LIBICONV" >&6; }
  else
            CPPFLAGS="$am_save_CPPFLAGS"
    LIBICONV=
    LTLIBICONV=
  fi








    use_additional=yes

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

    eval additional_includedir=\"$includedir\"
    eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"


# Check whether --with-libintl-prefix was given.
if test "${with_libintl_prefix+set}" = set; then :
  withval=$with_libintl_prefix;
    if test "X$withval" = "Xno"; then
      use_additional=no
    else
      if test "X$withval" = "X"; then

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"

          eval additional_includedir=\"$includedir\"
          eval additional_libdir=\"$libdir\"

  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      else
        additional_includedir="$withval/include"
        additional_libdir="$withval/$acl_libdirstem"
      fi
    fi

fi

      LIBINTL=
  LTLIBINTL=
  INCINTL=
  LIBINTL_PREFIX=
  rpathdirs=
  ltrpathdirs=
  names_already_handled=
  names_next_round='intl '
  while test -n "$names_next_round"; do
    names_this_round="$names_next_round"
    names_next_round=
    for name in $names_this_round; do
      already_handled=
      for n in $names_already_handled; do
        if test "$n" = "$name"; then
          already_handled=yes
          break
        fi
      done
      if test -z "$already_handled"; then
        names_already_handled="$names_already_handled $name"
                        uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'`
        eval value=\"\$HAVE_LIB$uppername\"
        if test -n "$value"; then
          if test "$value" = yes; then
            eval value=\"\$LIB$uppername\"
            test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value"
            eval value=\"\$LTLIB$uppername\"
            test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value"
          else
                                    :
          fi
        else
                              found_dir=
          found_la=
          found_so=
          found_a=
          eval libname=\"$acl_libname_spec\"    # typically: libname=lib$name
          if test -n "$acl_shlibext"; then
            shrext=".$acl_shlibext"             # typically: shrext=.so
          else
            shrext=
          fi
          if test $use_additional = yes; then
            dir="$additional_libdir"
                                    if test -n "$acl_shlibext"; then
              if test -f "$dir/$libname$shrext"; then
                found_dir="$dir"
                found_so="$dir/$libname$shrext"
              else
                if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                  ver=`(cd "$dir" && \
                        for f in "$libname$shrext".*; do echo "$f"; done \
                        | sed -e "s,^$libname$shrext\\\\.,," \
                        | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                        | sed 1q ) 2>/dev/null`
                  if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
                    found_dir="$dir"
                    found_so="$dir/$libname$shrext.$ver"
                  fi
                else
                  eval library_names=\"$acl_library_names_spec\"
                  for f in $library_names; do
                    if test -f "$dir/$f"; then
                      found_dir="$dir"
                      found_so="$dir/$f"
                      break
                    fi
                  done
                fi
              fi
            fi
                        if test "X$found_dir" = "X"; then
              if test -f "$dir/$libname.$acl_libext"; then
                found_dir="$dir"
                found_a="$dir/$libname.$acl_libext"
              fi
            fi
            if test "X$found_dir" != "X"; then
              if test -f "$dir/$libname.la"; then
                found_la="$dir/$libname.la"
              fi
            fi
          fi
          if test "X$found_dir" = "X"; then
            for x in $LDFLAGS $LTLIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

              case "$x" in
                -L*)
                  dir=`echo "X$x" | sed -e 's/^X-L//'`
                                    if test -n "$acl_shlibext"; then
                    if test -f "$dir/$libname$shrext"; then
                      found_dir="$dir"
                      found_so="$dir/$libname$shrext"
                    else
                      if test "$acl_library_names_spec" = '$libname$shrext$versuffix'; then
                        ver=`(cd "$dir" && \
                              for f in "$libname$shrext".*; do echo "$f"; done \
                              | sed -e "s,^$libname$shrext\\\\.,," \
                              | sort -t '.' -n -r -k1,1 -k2,2 -k3,3 -k4,4 -k5,5 \
                              | sed 1q ) 2>/dev/null`
                        if test -n "$ver" && test -f "$dir/$libname$shrext.$ver"; then
                          found_dir="$dir"
                          found_so="$dir/$libname$shrext.$ver"
                        fi
                      else
                        eval library_names=\"$acl_library_names_spec\"
                        for f in $library_names; do
                          if test -f "$dir/$f"; then
                            found_dir="$dir"
                            found_so="$dir/$f"
                            break
                          fi
                        done
                      fi
                    fi
                  fi
                                    if test "X$found_dir" = "X"; then
                    if test -f "$dir/$libname.$acl_libext"; then
                      found_dir="$dir"
                      found_a="$dir/$libname.$acl_libext"
                    fi
                  fi
                  if test "X$found_dir" != "X"; then
                    if test -f "$dir/$libname.la"; then
                      found_la="$dir/$libname.la"
                    fi
                  fi
                  ;;
              esac
              if test "X$found_dir" != "X"; then
                break
              fi
            done
          fi
          if test "X$found_dir" != "X"; then
                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name"
            if test "X$found_so" != "X"; then
                                                        if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/$acl_libdirstem"; then
                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
              else
                                                                                haveit=
                for x in $ltrpathdirs; do
                  if test "X$x" = "X$found_dir"; then
                    haveit=yes
                    break
                  fi
                done
                if test -z "$haveit"; then
                  ltrpathdirs="$ltrpathdirs $found_dir"
                fi
                                if test "$acl_hardcode_direct" = yes; then
                                                      LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                else
                  if test -n "$acl_hardcode_libdir_flag_spec" && test "$acl_hardcode_minus_L" = no; then
                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                                                            haveit=
                    for x in $rpathdirs; do
                      if test "X$x" = "X$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      rpathdirs="$rpathdirs $found_dir"
                    fi
                  else
                                                                                haveit=
                    for x in $LDFLAGS $LIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                      if test "X$x" = "X-L$found_dir"; then
                        haveit=yes
                        break
                      fi
                    done
                    if test -z "$haveit"; then
                      LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir"
                    fi
                    if test "$acl_hardcode_minus_L" != no; then
                                                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so"
                    else
                                                                                                                                                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
                    fi
                  fi
                fi
              fi
            else
              if test "X$found_a" != "X"; then
                                LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a"
              else
                                                LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name"
              fi
            fi
                        additional_includedir=
            case "$found_dir" in
              */$acl_libdirstem | */$acl_libdirstem/)
                basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e "s,/$acl_libdirstem/"'*$,,'`
                LIBINTL_PREFIX="$basedir"
                additional_includedir="$basedir/include"
                ;;
            esac
            if test "X$additional_includedir" != "X"; then
                                                                                                                if test "X$additional_includedir" != "X/usr/include"; then
                haveit=
                if test "X$additional_includedir" = "X/usr/local/include"; then
                  if test -n "$GCC"; then
                    case $host_os in
                      linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                    esac
                  fi
                fi
                if test -z "$haveit"; then
                  for x in $CPPFLAGS $INCINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                    if test "X$x" = "X-I$additional_includedir"; then
                      haveit=yes
                      break
                    fi
                  done
                  if test -z "$haveit"; then
                    if test -d "$additional_includedir"; then
                                            INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir"
                    fi
                  fi
                fi
              fi
            fi
                        if test -n "$found_la"; then
                                                        save_libdir="$libdir"
              case "$found_la" in
                */* | *\\*) . "$found_la" ;;
                *) . "./$found_la" ;;
              esac
              libdir="$save_libdir"
                            for dep in $dependency_libs; do
                case "$dep" in
                  -L*)
                    additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'`
                                                                                                                                                                if test "X$additional_libdir" != "X/usr/$acl_libdirstem"; then
                      haveit=
                      if test "X$additional_libdir" = "X/usr/local/$acl_libdirstem"; then
                        if test -n "$GCC"; then
                          case $host_os in
                            linux* | gnu* | k*bsd*-gnu) haveit=yes;;
                          esac
                        fi
                      fi
                      if test -z "$haveit"; then
                        haveit=
                        for x in $LDFLAGS $LIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir"
                          fi
                        fi
                        haveit=
                        for x in $LDFLAGS $LTLIBINTL; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

                          if test "X$x" = "X-L$additional_libdir"; then
                            haveit=yes
                            break
                          fi
                        done
                        if test -z "$haveit"; then
                          if test -d "$additional_libdir"; then
                                                        LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir"
                          fi
                        fi
                      fi
                    fi
                    ;;
                  -R*)
                    dir=`echo "X$dep" | sed -e 's/^X-R//'`
                    if test "$enable_rpath" != no; then
                                                                  haveit=
                      for x in $rpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        rpathdirs="$rpathdirs $dir"
                      fi
                                                                  haveit=
                      for x in $ltrpathdirs; do
                        if test "X$x" = "X$dir"; then
                          haveit=yes
                          break
                        fi
                      done
                      if test -z "$haveit"; then
                        ltrpathdirs="$ltrpathdirs $dir"
                      fi
                    fi
                    ;;
                  -l*)
                                        names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'`
                    ;;
                  *.la)
                                                                                names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'`
                    ;;
                  *)
                                        LIBINTL="${LIBINTL}${LIBINTL:+ }$dep"
                    LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep"
                    ;;
                esac
              done
            fi
          else
                                                            LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name"
            LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name"
          fi
        fi
      fi
    done
  done
  if test "X$rpathdirs" != "X"; then
    if test -n "$acl_hardcode_libdir_separator"; then
                        alldirs=
      for found_dir in $rpathdirs; do
        alldirs="${alldirs}${alldirs:+$acl_hardcode_libdir_separator}$found_dir"
      done
            acl_save_libdir="$libdir"
      libdir="$alldirs"
      eval flag=\"$acl_hardcode_libdir_flag_spec\"
      libdir="$acl_save_libdir"
      LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
    else
            for found_dir in $rpathdirs; do
        acl_save_libdir="$libdir"
        libdir="$found_dir"
        eval flag=\"$acl_hardcode_libdir_flag_spec\"
        libdir="$acl_save_libdir"
        LIBINTL="${LIBINTL}${LIBINTL:+ }$flag"
      done
    fi
  fi
  if test "X$ltrpathdirs" != "X"; then
            for found_dir in $ltrpathdirs; do
      LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir"
    done
  fi

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU gettext in libintl" >&5
$as_echo_n "checking for GNU gettext in libintl... " >&6; }
if eval \${$gt_func_gnugettext_libintl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  gt_save_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS="$CPPFLAGS $INCINTL"
            gt_save_LIBS="$LIBS"
            LIBS="$LIBS $LIBINTL"
                        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
const char *_nl_expand_alias (const char *);
int
main ()
{
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$gt_func_gnugettext_libintl=yes"
else
  eval "$gt_func_gnugettext_libintl=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
                        if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" != yes; } && test -n "$LIBICONV"; then
              LIBS="$LIBS $LIBICONV"
              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <libintl.h>
$gt_revision_test_code
extern int _nl_msg_cat_cntr;
extern
#ifdef __cplusplus
"C"
#endif
const char *_nl_expand_alias (const char *);
int
main ()
{
bindtextdomain ("", "");
return * gettext ("")$gt_expression_test_code + _nl_msg_cat_cntr + *_nl_expand_alias ("")
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIBINTL="$LIBINTL $LIBICONV"
                LTLIBINTL="$LTLIBINTL $LTLIBICONV"
                eval "$gt_func_gnugettext_libintl=yes"

fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
            fi
            CPPFLAGS="$gt_save_CPPFLAGS"
            LIBS="$gt_save_LIBS"
fi
eval ac_res=\$$gt_func_gnugettext_libintl
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
        fi

                                        if { eval "gt_val=\$$gt_func_gnugettext_libc"; test "$gt_val" = "yes"; } \
           || { { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; } \
                && test "$PACKAGE" != gettext-runtime \
                && test "$PACKAGE" != gettext-tools; }; then
          gt_use_preinstalled_gnugettext=yes
        else
                    LIBINTL=
          LTLIBINTL=
          INCINTL=
        fi



    if test -n "$INTL_MACOSX_LIBS"; then
      if test "$gt_use_preinstalled_gnugettext" = "yes" \
         || test "$nls_cv_use_gnu_gettext" = "yes"; then
                LIBINTL="$LIBINTL $INTL_MACOSX_LIBS"
        LTLIBINTL="$LTLIBINTL $INTL_MACOSX_LIBS"
      fi
    fi

    if test "$gt_use_preinstalled_gnugettext" = "yes" \
       || test "$nls_cv_use_gnu_gettext" = "yes"; then

$as_echo "#define ENABLE_NLS 1" >>confdefs.h

    else
      USE_NLS=no
    fi
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to use NLS" >&5
$as_echo_n "checking whether to use NLS... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $USE_NLS" >&5
$as_echo "$USE_NLS" >&6; }
  if test "$USE_NLS" = "yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking where the gettext function comes from" >&5
$as_echo_n "checking where the gettext function comes from... " >&6; }
    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
        gt_source="external libintl"
      else
        gt_source="libc"
      fi
    else
      gt_source="included intl directory"
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gt_source" >&5
$as_echo "$gt_source" >&6; }
  fi

  if test "$USE_NLS" = "yes"; then

    if test "$gt_use_preinstalled_gnugettext" = "yes"; then
      if { eval "gt_val=\$$gt_func_gnugettext_libintl"; test "$gt_val" = "yes"; }; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to link with libintl" >&5
$as_echo_n "checking how to link with libintl... " >&6; }
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBINTL" >&5
$as_echo "$LIBINTL" >&6; }

  for element in $INCINTL; do
    haveit=
    for x in $CPPFLAGS; do

  acl_save_prefix="$prefix"
  prefix="$acl_final_prefix"
  acl_save_exec_prefix="$exec_prefix"
  exec_prefix="$acl_final_exec_prefix"
  eval x=\"$x\"
  exec_prefix="$acl_save_exec_prefix"
  prefix="$acl_save_prefix"

      if test "X$x" = "X$element"; then
        haveit=yes
        break
      fi
    done
    if test -z "$haveit"; then
      CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element"
    fi
  done

      fi


$as_echo "#define HAVE_GETTEXT 1" >>confdefs.h


$as_echo "#define HAVE_DCGETTEXT 1" >>confdefs.h

    fi

        POSUB=po
  fi



    INTLLIBS="$LIBINTL"







  if test "$USE_NLS" = "yes"; then
    GETTEXT_PACKAGE=gst-plugins-bad-$GST_API_VERSION
  else
    GETTEXT_PACKAGE=NULL
  fi


cat >>confdefs.h <<_ACEOF
#define GETTEXT_PACKAGE "$GETTEXT_PACKAGE"
_ACEOF


    if test -e "${srcdir}/po/Makevars"; then
    if ! grep -e "gst-plugins-bad-$GST_API_VERSION" "${srcdir}/po/Makevars"; then
      as_fn_error $? "DOMAIN in po/Makevars does not match GETTEXT_PACKAGE gst-plugins-bad-$GST_API_VERSION" "$LINENO" 5
    fi
  fi


  EXP_VAR=LOCALEDIR
  FROM_VAR=$datadir/locale

    prefix_save=$prefix
  exec_prefix_save=$exec_prefix

    if test "x$prefix" = "xNONE"; then
    prefix="$ac_default_prefix"
  fi
    if test "x$exec_prefix" = "xNONE"; then
    exec_prefix=$prefix
  fi

  full_var="$FROM_VAR"
    while true; do
    new_full_var="`eval echo $full_var`"
    if test "x$new_full_var" = "x$full_var"; then break; fi
    full_var=$new_full_var
  done

    full_var=$new_full_var
  LOCALEDIR="$full_var"


    prefix=$prefix_save
  exec_prefix=$exec_prefix_save


cat >>confdefs.h <<_ACEOF
#define LOCALEDIR "$LOCALEDIR"
_ACEOF





  # Check whether --enable-fatal-warnings was given.
if test "${enable_fatal_warnings+set}" = set; then :
  enableval=$enable_fatal_warnings;
      case "${enableval}" in
        yes) FATAL_WARNINGS=yes ;;
        no)  FATAL_WARNINGS=no ;;
        *)   as_fn_error $? "bad value ${enableval} for --disable-fatal-warnings" "$LINENO" 5 ;;
      esac

else

      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
        FATAL_WARNINGS=yes
      else
        FATAL_WARNINGS=no
      fi

fi



  # Check whether --enable-extra-check was given.
if test "${enable_extra_check+set}" = set; then :
  enableval=$enable_extra_check;
      case "${enableval}" in
        yes) EXTRA_CHECKS=yes ;;
        no)  EXTRA_CHECKS=no ;;
        *)   as_fn_error $? "bad value ${enableval} for --enable-extra-checks" "$LINENO" 5 ;;
      esac

else

      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
        EXTRA_CHECKS=yes
      else
        EXTRA_CHECKS=no
      fi

fi


    if test "x$EXTRA_CHECKS" = "xyes"; then

$as_echo "#define GST_ENABLE_EXTRA_CHECKS 1" >>confdefs.h

    fi



    # Check whether --enable-debug was given.
if test "${enable_debug+set}" = set; then :
  enableval=$enable_debug;
      case "${enableval}" in
        yes) USE_DEBUG=yes ;;
        no)  USE_DEBUG=no ;;
        *)   as_fn_error $? "bad value ${enableval} for --enable-debug" "$LINENO" 5 ;;
      esac

else
  USE_DEBUG=yes
fi


  # Check whether --enable-profiling was given.
if test "${enable_profiling+set}" = set; then :
  enableval=$enable_profiling;
      case "${enableval}" in
        yes) USE_PROFILING=yes ;;
        no)  USE_PROFILING=no ;;
        *)   as_fn_error $? "bad value ${enableval} for --enable-profiling" "$LINENO" 5 ;;
      esac

else
  USE_PROFILING=no
fi



if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
	if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PKG_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PKG_CONFIG=$ac_cv_path_PKG_CONFIG
if test -n "$PKG_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5
$as_echo "$PKG_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_PKG_CONFIG"; then
  ac_pt_PKG_CONFIG=$PKG_CONFIG
  # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_PKG_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_PKG_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG
if test -n "$ac_pt_PKG_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5
$as_echo "$ac_pt_PKG_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_PKG_CONFIG" = x; then
    PKG_CONFIG=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    PKG_CONFIG=$ac_pt_PKG_CONFIG
  fi
else
  PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
fi

fi
if test -n "$PKG_CONFIG"; then
	_pkg_min_version=0.9.0
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5
$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; }
	if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	else
		{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
		PKG_CONFIG=""
	fi

fi

    # Check whether --enable-valgrind was given.
if test "${enable_valgrind+set}" = set; then :
  enableval=$enable_valgrind;
      case "${enableval}" in
        yes) USE_VALGRIND="$USE_DEBUG" ;;
        no)  USE_VALGRIND=no ;;
        *)   as_fn_error $? "bad value ${enableval} for --enable-valgrind" "$LINENO" 5 ;;
      esac

else
  USE_VALGRIND="$USE_DEBUG"
fi
   VALGRIND_REQ="3.0"
  if test "x$USE_VALGRIND" = xyes; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VALGRIND" >&5
$as_echo_n "checking for VALGRIND... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$VALGRIND_CFLAGS"; then
        pkg_cv_VALGRIND_CFLAGS="$VALGRIND_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VALGRIND_CFLAGS=`$PKG_CONFIG --cflags "valgrind >= $VALGRIND_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$VALGRIND_LIBS"; then
        pkg_cv_VALGRIND_LIBS="$VALGRIND_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"valgrind >= \$VALGRIND_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "valgrind >= $VALGRIND_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VALGRIND_LIBS=`$PKG_CONFIG --libs "valgrind >= $VALGRIND_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"`
        else
	        VALGRIND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "valgrind >= $VALGRIND_REQ"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$VALGRIND_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                USE_VALGRIND="no"
elif test $pkg_failed = untried; then
	USE_VALGRIND="no"
else
	VALGRIND_CFLAGS=$pkg_cv_VALGRIND_CFLAGS
	VALGRIND_LIBS=$pkg_cv_VALGRIND_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	USE_VALGRIND="yes"
fi
  fi
  if test "x$USE_VALGRIND" = xyes; then

$as_echo "#define HAVE_VALGRIND 1" >>confdefs.h

    { $as_echo "$as_me:${as_lineno-$LINENO}: Using extra code paths for valgrind" >&5
$as_echo "$as_me: Using extra code paths for valgrind" >&6;}
  fi


  # Check whether --enable-gcov was given.
if test "${enable_gcov+set}" = set; then :
  enableval=$enable_gcov; enable_gcov=$enableval
else
  enable_gcov=no
fi

  if test x$enable_gcov = xyes ; then
    if test "x$GCC" != "xyes"
    then
      as_fn_error $? "gcov only works if gcc is used" "$LINENO" 5
    fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-fprofile-arcs\"" >&5
$as_echo_n "checking to see if compiler understands \"-fprofile-arcs\"... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS "-fprofile-arcs""

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs"
    true
  else
    true
    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands \"-ftest-coverage\"" >&5
$as_echo_n "checking to see if compiler understands \"-ftest-coverage\"... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS "-ftest-coverage""

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage"
    true
  else
    true
    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }

        GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[0-9]*//g'`
                GCOV_LIBS=-lgcov


    GCOV=`echo $CC | sed s/gcc/gcov/g`


    GST_GCOV_ENABLED=yes

cat >>confdefs.h <<_ACEOF
#define GST_GCOV_ENABLED 1
_ACEOF

        if test "x$GST_GCOV_ENABLED" = "xyes"
    then
      CFLAGS="$CFLAGS -O0"

      CXXFLAGS="$CXXFLAGS -O0"

      FFLAGS="$FFLAGS -O0"

      CCASFLAGS="$CCASFLAGS -O0"

      { $as_echo "$as_me:${as_lineno-$LINENO}: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&5
$as_echo "$as_me: gcov enabled, setting CFLAGS and friends to $CFLAGS" >&6;}
    fi
  fi
   if test x$enable_gcov = xyes; then
  GST_GCOV_ENABLED_TRUE=
  GST_GCOV_ENABLED_FALSE='#'
else
  GST_GCOV_ENABLED_TRUE='#'
  GST_GCOV_ENABLED_FALSE=
fi




  # Check whether --enable-examples was given.
if test "${enable_examples+set}" = set; then :
  enableval=$enable_examples;
        case "${enableval}" in
          yes) BUILD_EXAMPLES=yes ;;
          no)  BUILD_EXAMPLES=no ;;
          *)   as_fn_error $? "bad value ${enableval} for --disable-examples" "$LINENO" 5 ;;
        esac

else
  BUILD_EXAMPLES=yes
fi
    if test "x$BUILD_EXAMPLES" = "xyes"; then
  BUILD_EXAMPLES_TRUE=
  BUILD_EXAMPLES_FALSE='#'
else
  BUILD_EXAMPLES_TRUE='#'
  BUILD_EXAMPLES_FALSE=
fi





# Check whether --with-pkg-config-path was given.
if test "${with_pkg_config_path+set}" = set; then :
  withval=$with_pkg_config_path;
       export PKG_CONFIG_PATH=${withval}
       { $as_echo "$as_me:${as_lineno-$LINENO}: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&5
$as_echo "$as_me: Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH" >&6;}

fi




# Check whether --with-package-name was given.
if test "${with_package_name+set}" = set; then :
  withval=$with_package_name;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-package-name" "$LINENO" 5 ;;
        *)   GST_PACKAGE_NAME="${withval}" ;;
      esac

else

      P=
      if test "x$P" = "x"
      then
        P=$PACKAGE_NAME
      fi

      if test "x$PACKAGE_VERSION_NANO" = "x0"
      then
        GST_PACKAGE_NAME="$P source release"
      else
        if test "x$PACKAGE_VERSION_NANO" = "x1"
        then
          GST_PACKAGE_NAME="$P git"
        else
          GST_PACKAGE_NAME="$P prerelease"
        fi
      fi


fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_NAME as package name" >&5
$as_echo "$as_me: Using $GST_PACKAGE_NAME as package name" >&6;}

cat >>confdefs.h <<_ACEOF
#define GST_PACKAGE_NAME "$GST_PACKAGE_NAME"
_ACEOF





# Check whether --with-package-origin was given.
if test "${with_package_origin+set}" = set; then :
  withval=$with_package_origin;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-package-origin" "$LINENO" 5 ;;
        *)   GST_PACKAGE_ORIGIN="${withval}" ;;
      esac

else
  GST_PACKAGE_ORIGIN="Unknown package origin"
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $GST_PACKAGE_ORIGIN as package origin" >&5
$as_echo "$as_me: Using $GST_PACKAGE_ORIGIN as package origin" >&6;}

cat >>confdefs.h <<_ACEOF
#define GST_PACKAGE_ORIGIN "$GST_PACKAGE_ORIGIN"
_ACEOF






# Check whether --with-plugins was given.
if test "${with_plugins+set}" = set; then :
  withval=$with_plugins; WITH_PLUGINS=$withval
else
  WITH_PLUGINS=
fi


  GST_PLUGINS_ALL=""
  GST_PLUGINS_SELECTED=""
  GST_PLUGINS_NONPORTED=""







  echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of plug-ins with external deps ***" >&5
$as_echo "$as_me: *** checking feature: building of plug-ins with external deps ***" >&6;}
if test "x" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins:  ***" >&5
$as_echo "$as_me: *** for plug-ins:  ***" >&6;}
fi
NOUSE=
if test "x$USE_EXTERNAL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-external was given.
if test "${enable_external+set}" = set; then :
  enableval=$enable_external;  case "${enableval}" in
      yes) USE_EXTERNAL=yes;;
      no) USE_EXTERNAL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-external" "$LINENO" 5 ;;
    esac
else
   USE_EXTERNAL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_EXTERNAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***  pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: ***  pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " EXTERNAL " > /dev/null; then
  USE_EXTERNAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***  not ported" >&5
$as_echo "$as_me: WARNING: ***  not ported" >&2;}
fi


if test x$USE_EXTERNAL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_EXTERNAL=no
    HAVE_EXTERNAL=yes

  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_EXTERNAL = xno; then
    USE_EXTERNAL=no
  else
    :
  fi
fi
if test x$USE_EXTERNAL = xyes; then

      { $as_echo "$as_me:${as_lineno-$LINENO}: building external plug-ins" >&5
$as_echo "$as_me: building external plug-ins" >&6;}
      BUILD_EXTERNAL="yes"

  if test "x" != "x"; then
    GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_EXTERNAL /**/" >>confdefs.h

else
  :
  if test "x" != "x"; then
    GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO"
  fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: all plug-ins with external dependencies will not be built" >&5
$as_echo "$as_me: WARNING: all plug-ins with external dependencies will not be built" >&2;}
      BUILD_EXTERNAL="no"

fi
 if test x$USE_EXTERNAL = xyes; then
  USE_EXTERNAL_TRUE=
  USE_EXTERNAL_FALSE='#'
else
  USE_EXTERNAL_TRUE='#'
  USE_EXTERNAL_FALSE=
fi


  # make BUILD_EXTERNAL available to Makefile.am
   if test "x$BUILD_EXTERNAL" = "xyes"; then
  BUILD_EXTERNAL_TRUE=
  BUILD_EXTERNAL_FALSE='#'
else
  BUILD_EXTERNAL_TRUE='#'
  BUILD_EXTERNAL_FALSE=
fi




  echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: building of experimental plug-ins ***" >&5
$as_echo "$as_me: *** checking feature: building of experimental plug-ins ***" >&6;}
if test "x" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins:  ***" >&5
$as_echo "$as_me: *** for plug-ins:  ***" >&6;}
fi
NOUSE=
if test "x$USE_EXPERIMENTAL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-experimental was given.
if test "${enable_experimental+set}" = set; then :
  enableval=$enable_experimental;  case "${enableval}" in
      yes) USE_EXPERIMENTAL=yes;;
      no) USE_EXPERIMENTAL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-experimental" "$LINENO" 5 ;;
    esac
else
   USE_EXPERIMENTAL=no
fi

if test "x$NOUSE" = "xyes"; then
  USE_EXPERIMENTAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***  pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: ***  pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " EXPERIMENTAL " > /dev/null; then
  USE_EXPERIMENTAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: ***  not ported" >&5
$as_echo "$as_me: WARNING: ***  not ported" >&2;}
fi


if test x$USE_EXPERIMENTAL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_EXPERIMENTAL=no
    HAVE_EXPERIMENTAL=yes

  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_EXPERIMENTAL = xno; then
    USE_EXPERIMENTAL=no
  else
    :
  fi
fi
if test x$USE_EXPERIMENTAL = xyes; then

      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: building experimental plug-ins" >&5
$as_echo "$as_me: WARNING: building experimental plug-ins" >&2;}
      BUILD_EXPERIMENTAL="yes"

  if test "x" != "x"; then
    GST_PLUGINS_YES="\t\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_EXPERIMENTAL /**/" >>confdefs.h

else
  :
  if test "x" != "x"; then
    GST_PLUGINS_NO="\t\n$GST_PLUGINS_NO"
  fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: not building experimental plug-ins" >&5
$as_echo "$as_me: not building experimental plug-ins" >&6;}
      BUILD_EXPERIMENTAL="no"

fi
 if test x$USE_EXPERIMENTAL = xyes; then
  USE_EXPERIMENTAL_TRUE=
  USE_EXPERIMENTAL_FALSE='#'
else
  USE_EXPERIMENTAL_TRUE='#'
  USE_EXPERIMENTAL_FALSE=
fi


  # make BUILD_EXPERIMENTAL available to Makefile.am
   if test "x$BUILD_EXPERIMENTAL" = "xyes"; then
  BUILD_EXPERIMENTAL_TRUE=
  BUILD_EXPERIMENTAL_FALSE='#'
else
  BUILD_EXPERIMENTAL_TRUE='#'
  BUILD_EXPERIMENTAL_FALSE=
fi




  GST_PKG_CONFIG_PATH="\$(top_builddir)/pkgconfig"
  if test "x$PKG_CONFIG_PATH" != "x"; then
    GST_PKG_CONFIG_PATH="$GST_PKG_CONFIG_PATH:$PKG_CONFIG_PATH"
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH" >&5
$as_echo "$as_me: Using GST_PKG_CONFIG_PATH = $GST_PKG_CONFIG_PATH" >&6;}





  case $host_os in
    rhapsody*)

cat >>confdefs.h <<_ACEOF
#define GST_EXTRA_MODULE_SUFFIX ".dylib"
_ACEOF

      ;;
    darwin*)

cat >>confdefs.h <<_ACEOF
#define GST_EXTRA_MODULE_SUFFIX ".dylib"
_ACEOF


cat >>confdefs.h <<_ACEOF
#define HAVE_OSX 1
_ACEOF

      ;;
    cygwin*)

cat >>confdefs.h <<_ACEOF
#define GST_HAVE_UNSAFE_FORK 1
_ACEOF

      ;;
    mingw* | msvc* | mks*)

cat >>confdefs.h <<_ACEOF
#define HAVE_WIN32 1
_ACEOF


                              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
 return __MSVCRT_VERSION__;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

            #if __MSVCRT_VERSION__ < 0x0601
            #error "MSVCRT too old"
            #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

            { $as_echo "$as_me:${as_lineno-$LINENO}: MSVCRT version looks ok" >&5
$as_echo "$as_me: MSVCRT version looks ok" >&6;}

else

            as_fn_error $? "MSVCRT version too old, need at least WinXP SP2" "$LINENO" 5

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

else

        { $as_echo "$as_me:${as_lineno-$LINENO}: Setting MSVCRT version to 0x0601" >&5
$as_echo "$as_me: Setting MSVCRT version to 0x0601" >&6;}

cat >>confdefs.h <<_ACEOF
#define __MSVCRT_VERSION__ 0x0601
_ACEOF


fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      ;;
     *)
      ;;
  esac




    case "x${target_cpu}" in
    xi?86 | xk? | xi?86_64)
      case $target_os in
         solaris*)
            ac_fn_c_check_decl "$LINENO" "__i386" "ac_cv_have_decl___i386" "$ac_includes_default"
if test "x$ac_cv_have_decl___i386" = xyes; then :
  I386_ABI="yes"
else
  I386_ABI="no"
fi

            ac_fn_c_check_decl "$LINENO" "__amd64" "ac_cv_have_decl___amd64" "$ac_includes_default"
if test "x$ac_cv_have_decl___amd64" = xyes; then :
  AMD64_ABI="yes"
else
  AMD64_ABI="no"
fi


            if test "x$I386_ABI" = "xyes" ; then
               HAVE_CPU_I386=yes

$as_echo "#define HAVE_CPU_I386 1" >>confdefs.h

            fi
            if test "x$AMD64_ABI" = "xyes" ; then
                HAVE_CPU_X86_64=yes

$as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h

            fi
            ;;
         *)
            HAVE_CPU_I386=yes

$as_echo "#define HAVE_CPU_I386 1" >>confdefs.h


                                    case "x${target_cpu}" in
              xi386 | xi486) ;;
            *)

$as_echo "#define HAVE_RDTSC 1" >>confdefs.h
 ;;
            esac
            ;;
      esac
      ;;
    xpowerpc)
      HAVE_CPU_PPC=yes

$as_echo "#define HAVE_CPU_PPC 1" >>confdefs.h
 ;;
    xpowerpc64)
      HAVE_CPU_PPC64=yes

$as_echo "#define HAVE_CPU_PPC64 1" >>confdefs.h
 ;;
    xalpha*)
      HAVE_CPU_ALPHA=yes

$as_echo "#define HAVE_CPU_ALPHA 1" >>confdefs.h
 ;;
    xarc*)
      HAVE_CPU_ARC=yes

$as_echo "#define HAVE_CPU_ARC 1" >>confdefs.h
 ;;
    xarm*)
      HAVE_CPU_ARM=yes

$as_echo "#define HAVE_CPU_ARM 1" >>confdefs.h
 ;;
    xaarch64*)
      HAVE_CPU_AARCH64=yes

$as_echo "#define HAVE_CPU_AARCH64 1" >>confdefs.h
 ;;
    xsparc*)
      HAVE_CPU_SPARC=yes

$as_echo "#define HAVE_CPU_SPARC 1" >>confdefs.h
 ;;
    xmips*)
      HAVE_CPU_MIPS=yes

$as_echo "#define HAVE_CPU_MIPS 1" >>confdefs.h
 ;;
    xhppa*)
      HAVE_CPU_HPPA=yes

$as_echo "#define HAVE_CPU_HPPA 1" >>confdefs.h
 ;;
    xs390*)
      HAVE_CPU_S390=yes

$as_echo "#define HAVE_CPU_S390 1" >>confdefs.h
 ;;
    xia64*)
      HAVE_CPU_IA64=yes

$as_echo "#define HAVE_CPU_IA64 1" >>confdefs.h
 ;;
    xm68k*)
      HAVE_CPU_M68K=yes

$as_echo "#define HAVE_CPU_M68K 1" >>confdefs.h
 ;;
    xx86_64)
      HAVE_CPU_X86_64=yes

$as_echo "#define HAVE_CPU_X86_64 1" >>confdefs.h
 ;;
    xcris)
      HAVE_CPU_CRIS=yes

$as_echo "#define HAVE_CPU_CRIS 1" >>confdefs.h
 ;;
    xcrisv32)
      HAVE_CPU_CRISV32=yes

$as_echo "#define HAVE_CPU_CRISV32 1" >>confdefs.h
 ;;
  esac

     { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
if ${ac_cv_c_bigendian+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
	     #include <sys/param.h>

int
main ()
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
		#include <sys/param.h>

int
main ()
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes; then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		extern int foo;

int
main ()
{
return use_ascii (foo) == use_ebcdic (foo);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_bigendian=no
else
  ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
$as_echo "$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in #(
   yes)
     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
   no)
      ;; #(
   universal)

$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     as_fn_error $? "unknown endianness
 presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
 esac


   if test "x$HAVE_CPU_I386" = "xyes"; then
  HAVE_CPU_I386_TRUE=
  HAVE_CPU_I386_FALSE='#'
else
  HAVE_CPU_I386_TRUE='#'
  HAVE_CPU_I386_FALSE=
fi

   if test "x$HAVE_CPU_PPC" = "xyes"; then
  HAVE_CPU_PPC_TRUE=
  HAVE_CPU_PPC_FALSE='#'
else
  HAVE_CPU_PPC_TRUE='#'
  HAVE_CPU_PPC_FALSE=
fi

   if test "x$HAVE_CPU_PPC64" = "xyes"; then
  HAVE_CPU_PPC64_TRUE=
  HAVE_CPU_PPC64_FALSE='#'
else
  HAVE_CPU_PPC64_TRUE='#'
  HAVE_CPU_PPC64_FALSE=
fi

   if test "x$HAVE_CPU_ALPHA" = "xyes"; then
  HAVE_CPU_ALPHA_TRUE=
  HAVE_CPU_ALPHA_FALSE='#'
else
  HAVE_CPU_ALPHA_TRUE='#'
  HAVE_CPU_ALPHA_FALSE=
fi

   if test "x$HAVE_CPU_ARC" = "xyes"; then
  HAVE_CPU_ARC_TRUE=
  HAVE_CPU_ARC_FALSE='#'
else
  HAVE_CPU_ARC_TRUE='#'
  HAVE_CPU_ARC_FALSE=
fi

   if test "x$HAVE_CPU_ARM" = "xyes"; then
  HAVE_CPU_ARM_TRUE=
  HAVE_CPU_ARM_FALSE='#'
else
  HAVE_CPU_ARM_TRUE='#'
  HAVE_CPU_ARM_FALSE=
fi

   if test "x$HAVE_CPU_SPARC" = "xyes"; then
  HAVE_CPU_SPARC_TRUE=
  HAVE_CPU_SPARC_FALSE='#'
else
  HAVE_CPU_SPARC_TRUE='#'
  HAVE_CPU_SPARC_FALSE=
fi

   if test "x$HAVE_CPU_HPPA" = "xyes"; then
  HAVE_CPU_HPPA_TRUE=
  HAVE_CPU_HPPA_FALSE='#'
else
  HAVE_CPU_HPPA_TRUE='#'
  HAVE_CPU_HPPA_FALSE=
fi

   if test "x$HAVE_CPU_MIPS" = "xyes"; then
  HAVE_CPU_MIPS_TRUE=
  HAVE_CPU_MIPS_FALSE='#'
else
  HAVE_CPU_MIPS_TRUE='#'
  HAVE_CPU_MIPS_FALSE=
fi

   if test "x$HAVE_CPU_S390" = "xyes"; then
  HAVE_CPU_S390_TRUE=
  HAVE_CPU_S390_FALSE='#'
else
  HAVE_CPU_S390_TRUE='#'
  HAVE_CPU_S390_FALSE=
fi

   if test "x$HAVE_CPU_IA64" = "xyes"; then
  HAVE_CPU_IA64_TRUE=
  HAVE_CPU_IA64_FALSE='#'
else
  HAVE_CPU_IA64_TRUE='#'
  HAVE_CPU_IA64_FALSE=
fi

   if test "x$HAVE_CPU_M68K" = "xyes"; then
  HAVE_CPU_M68K_TRUE=
  HAVE_CPU_M68K_FALSE='#'
else
  HAVE_CPU_M68K_TRUE='#'
  HAVE_CPU_M68K_FALSE=
fi

   if test "x$HAVE_CPU_X86_64" = "xyes"; then
  HAVE_CPU_X86_64_TRUE=
  HAVE_CPU_X86_64_FALSE='#'
else
  HAVE_CPU_X86_64_TRUE='#'
  HAVE_CPU_X86_64_FALSE=
fi

   if test "x$HAVE_CPU_CRIS" = "xyes"; then
  HAVE_CPU_CRIS_TRUE=
  HAVE_CPU_CRIS_FALSE='#'
else
  HAVE_CPU_CRIS_TRUE='#'
  HAVE_CPU_CRIS_FALSE=
fi

   if test "x$HAVE_CPU_CRISV32" = "xyes"; then
  HAVE_CPU_CRISV32_TRUE=
  HAVE_CPU_CRISV32_FALSE='#'
else
  HAVE_CPU_CRISV32_TRUE='#'
  HAVE_CPU_CRISV32_FALSE=
fi



cat >>confdefs.h <<_ACEOF
#define HOST_CPU "$host_cpu"
_ACEOF


cat >>confdefs.h <<_ACEOF
#define TARGET_CPU "$target_cpu"
_ACEOF



 { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian" >&5
$as_echo_n "checking whether byte ordering is bigendian... " >&6; }
if ${ac_cv_c_bigendian+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_bigendian=unknown
    # See if we're dealing with a universal compiler.
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __APPLE_CC__
	       not a universal capable compiler
	     #endif
	     typedef int dummy;

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

	# Check for potential -arch flags.  It is not universal unless
	# there are at least two -arch flags with different values.
	ac_arch=
	ac_prev=
	for ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do
	 if test -n "$ac_prev"; then
	   case $ac_word in
	     i?86 | x86_64 | ppc | ppc64)
	       if test -z "$ac_arch" || test "$ac_arch" = "$ac_word"; then
		 ac_arch=$ac_word
	       else
		 ac_cv_c_bigendian=universal
		 break
	       fi
	       ;;
	   esac
	   ac_prev=
	 elif test "x$ac_word" = "x-arch"; then
	   ac_prev=arch
	 fi
       done
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    if test $ac_cv_c_bigendian = unknown; then
      # See if sys/param.h defines the BYTE_ORDER macro.
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
	     #include <sys/param.h>

int
main ()
{
#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \
		     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \
		     && LITTLE_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
		#include <sys/param.h>

int
main ()
{
#if BYTE_ORDER != BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)
	      bogus endian macros
	     #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  # It does; now see whether it defined to _BIG_ENDIAN or not.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <limits.h>

int
main ()
{
#ifndef _BIG_ENDIAN
		 not big endian
		#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_bigendian=yes
else
  ac_cv_c_bigendian=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
    fi
    if test $ac_cv_c_bigendian = unknown; then
      # Compile a test program.
      if test "$cross_compiling" = yes; then :
  # Try to guess by grepping values from an object file.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
short int ascii_mm[] =
		  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };
		short int ascii_ii[] =
		  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };
		int use_ascii (int i) {
		  return ascii_mm[i] + ascii_ii[i];
		}
		short int ebcdic_ii[] =
		  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };
		short int ebcdic_mm[] =
		  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };
		int use_ebcdic (int i) {
		  return ebcdic_mm[i] + ebcdic_ii[i];
		}
		extern int foo;

int
main ()
{
return use_ascii (foo) == use_ebcdic (foo);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then
	      ac_cv_c_bigendian=yes
	    fi
	    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then
	      if test "$ac_cv_c_bigendian" = unknown; then
		ac_cv_c_bigendian=no
	      else
		# finding both strings is unlikely to happen, but who knows?
		ac_cv_c_bigendian=unknown
	      fi
	    fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
int
main ()
{

	     /* Are we little or big endian?  From Harbison&Steele.  */
	     union
	     {
	       long int l;
	       char c[sizeof (long int)];
	     } u;
	     u.l = 1;
	     return u.c[sizeof (long int) - 1] == 1;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_bigendian=no
else
  ac_cv_c_bigendian=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian" >&5
$as_echo "$ac_cv_c_bigendian" >&6; }
 case $ac_cv_c_bigendian in #(
   yes)
     $as_echo "#define WORDS_BIGENDIAN 1" >>confdefs.h
;; #(
   no)
      ;; #(
   universal)

$as_echo "#define AC_APPLE_UNIVERSAL_BUILD 1" >>confdefs.h

     ;; #(
   *)
     as_fn_error $? "unknown endianness
 presetting ac_cv_c_bigendian=no (or yes) will help" "$LINENO" 5 ;;
 esac



ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CC"; then
  ac_ct_CC=$CC
  # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="gcc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
else
  CC="$ac_cv_prog_CC"
fi

if test -z "$CC"; then
          if test -n "$ac_tool_prefix"; then
    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
set dummy ${ac_tool_prefix}cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="${ac_tool_prefix}cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  fi
fi
if test -z "$CC"; then
  # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  ac_prog_rejected=no
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
       ac_prog_rejected=yes
       continue
     fi
    ac_cv_prog_CC="cc"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

if test $ac_prog_rejected = yes; then
  # We found a bogon in the path, so make sure we never use it.
  set dummy $ac_cv_prog_CC
  shift
  if test $# != 0; then
    # We chose a different compiler from the bogus one.
    # However, it has the same basename, so the bogon will be chosen
    # first if we set CC to just the basename; use the full file name.
    shift
    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
  fi
fi
fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$CC"; then
  if test -n "$ac_tool_prefix"; then
  for ac_prog in cl.exe
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CC=$ac_cv_prog_CC
if test -n "$CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
$as_echo "$CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CC" && break
  done
fi
if test -z "$CC"; then
  ac_ct_CC=$CC
  for ac_prog in cl.exe
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CC"; then
  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CC=$ac_cv_prog_ac_ct_CC
if test -n "$ac_ct_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
$as_echo "$ac_ct_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CC" && break
done

  if test "x$ac_ct_CC" = x; then
    CC=""
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CC=$ac_ct_CC
  fi
fi

fi


test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "no acceptable C compiler found in \$PATH
See \`config.log' for more details" "$LINENO" 5; }

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
if ${ac_cv_c_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_c_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
$as_echo "$ac_cv_c_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GCC=yes
else
  GCC=
fi
ac_test_CFLAGS=${CFLAGS+set}
ac_save_CFLAGS=$CFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
$as_echo_n "checking whether $CC accepts -g... " >&6; }
if ${ac_cv_prog_cc_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_c_werror_flag=$ac_c_werror_flag
   ac_c_werror_flag=yes
   ac_cv_prog_cc_g=no
   CFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
else
  CFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

else
  ac_c_werror_flag=$ac_save_c_werror_flag
	 CFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_c_werror_flag=$ac_save_c_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
$as_echo "$ac_cv_prog_cc_g" >&6; }
if test "$ac_test_CFLAGS" = set; then
  CFLAGS=$ac_save_CFLAGS
elif test $ac_cv_prog_cc_g = yes; then
  if test "$GCC" = yes; then
    CFLAGS="-g -O2"
  else
    CFLAGS="-g"
  fi
else
  if test "$GCC" = yes; then
    CFLAGS="-O2"
  else
    CFLAGS=
  fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdio.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c89"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :

fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
if ${am_cv_prog_cc_c_o+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
  # Make sure it works both with $CC and with simple cc.
  # Following AC_PROG_CC_C_O, we do the test twice because some
  # compilers refuse to overwrite an existing .o file with -o,
  # though they will create one.
  am_cv_prog_cc_c_o=yes
  for am_i in 1 2; do
    if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
   ac_status=$?
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   (exit $ac_status); } \
         && test -f conftest2.$ac_objext; then
      : OK
    else
      am_cv_prog_cc_c_o=no
      break
    fi
  done
  rm -f core conftest*
  unset am_i
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
$as_echo "$am_cv_prog_cc_c_o" >&6; }
if test "$am_cv_prog_cc_c_o" != yes; then
   # Losing compiler, so override with the script.
   # FIXME: It is wrong to rewrite CC.
   # But if we don't then we get into trouble of one sort or another.
   # A longer-term fix would be to have automake use am__CC in this case,
   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
   CC="$am_aux_dir/compile $CC"
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


depcc="$CC"   am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CC_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CC_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CC_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CC_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; }
CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
  am__fastdepCC_TRUE=
  am__fastdepCC_FALSE='#'
else
  am__fastdepCC_TRUE='#'
  am__fastdepCC_FALSE=
fi


   case $ac_cv_prog_cc_stdc in #(
  no) :
    ac_cv_prog_cc_c99=no; ac_cv_prog_cc_c89=no ;; #(
  *) :
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99" >&5
$as_echo_n "checking for $CC option to accept ISO C99... " >&6; }
if ${ac_cv_prog_cc_c99+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c99=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdbool.h>
#include <stdlib.h>
#include <wchar.h>
#include <stdio.h>

// Check varargs macros.  These examples are taken from C99 6.10.3.5.
#define debug(...) fprintf (stderr, __VA_ARGS__)
#define showlist(...) puts (#__VA_ARGS__)
#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))
static void
test_varargs_macros (void)
{
  int x = 1234;
  int y = 5678;
  debug ("Flag");
  debug ("X = %d\n", x);
  showlist (The first, second, and third items.);
  report (x>y, "x is %d but y is %d", x, y);
}

// Check long long types.
#define BIG64 18446744073709551615ull
#define BIG32 4294967295ul
#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)
#if !BIG_OK
  your preprocessor is broken;
#endif
#if BIG_OK
#else
  your preprocessor is broken;
#endif
static long long int bignum = -9223372036854775807LL;
static unsigned long long int ubignum = BIG64;

struct incomplete_array
{
  int datasize;
  double data[];
};

struct named_init {
  int number;
  const wchar_t *name;
  double average;
};

typedef const char *ccp;

static inline int
test_restrict (ccp restrict text)
{
  // See if C++-style comments work.
  // Iterate through items via the restricted pointer.
  // Also check for declarations in for loops.
  for (unsigned int i = 0; *(text+i) != '\0'; ++i)
    continue;
  return 0;
}

// Check varargs and va_copy.
static void
test_varargs (const char *format, ...)
{
  va_list args;
  va_start (args, format);
  va_list args_copy;
  va_copy (args_copy, args);

  const char *str;
  int number;
  float fnumber;

  while (*format)
    {
      switch (*format++)
	{
	case 's': // string
	  str = va_arg (args_copy, const char *);
	  break;
	case 'd': // int
	  number = va_arg (args_copy, int);
	  break;
	case 'f': // float
	  fnumber = va_arg (args_copy, double);
	  break;
	default:
	  break;
	}
    }
  va_end (args_copy);
  va_end (args);
}

int
main ()
{

  // Check bool.
  _Bool success = false;

  // Check restrict.
  if (test_restrict ("String literal") == 0)
    success = true;
  char *restrict newvar = "Another string";

  // Check varargs.
  test_varargs ("s, d' f .", "string", 65, 34.234);
  test_varargs_macros ();

  // Check flexible array members.
  struct incomplete_array *ia =
    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));
  ia->datasize = 10;
  for (int i = 0; i < ia->datasize; ++i)
    ia->data[i] = i * 1.234;

  // Check named initializers.
  struct named_init ni = {
    .number = 34,
    .name = L"Test wide string",
    .average = 543.34343,
  };

  ni.number = 58;

  int dynamic_array[ni.number];
  dynamic_array[ni.number - 1] = 543;

  // work around unused variable warnings
  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'
	  || dynamic_array[ni.number - 1] != 543);

  ;
  return 0;
}
_ACEOF
for ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c99=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c99" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c99" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c99"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99" >&5
$as_echo "$ac_cv_prog_cc_c99" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c99" != xno; then :
  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c99
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
if ${ac_cv_prog_cc_c89+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_prog_cc_c89=no
ac_save_CC=$CC
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
#include <stdio.h>
struct stat;
/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
struct buf { int x; };
FILE * (*rcsopen) (struct buf *, struct stat *, int);
static char *e (p, i)
     char **p;
     int i;
{
  return p[i];
}
static char *f (char * (*g) (char **, int), char **p, ...)
{
  char *s;
  va_list v;
  va_start (v,p);
  s = g (p, va_arg (v,int));
  va_end (v);
  return s;
}

/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
   function prototypes and stuff, but not '\xHH' hex character constants.
   These don't provoke an error unfortunately, instead are silently treated
   as 'x'.  The following induces an error, until -std is added to get
   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
   array size at least.  It's necessary to write '\x00'==0 to get something
   that's true only with -std.  */
int osf4_cc_array ['\x00' == 0 ? 1 : -1];

/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
   inside strings and character constants.  */
#define FOO(x) 'x'
int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];

int test (int i, double x);
struct s1 {int (*f) (int a);};
struct s2 {int (*f) (double a);};
int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
int argc;
char **argv;
int
main ()
{
return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
  ;
  return 0;
}
_ACEOF
for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
do
  CC="$ac_save_CC $ac_arg"
  if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_prog_cc_c89=$ac_arg
fi
rm -f core conftest.err conftest.$ac_objext
  test "x$ac_cv_prog_cc_c89" != "xno" && break
done
rm -f conftest.$ac_ext
CC=$ac_save_CC

fi
# AC_CACHE_VAL
case "x$ac_cv_prog_cc_c89" in
  x)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;;
  xno)
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;;
  *)
    CC="$CC $ac_cv_prog_cc_c89"
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
esac
if test "x$ac_cv_prog_cc_c89" != xno; then :
  ac_cv_prog_cc_stdc=$ac_cv_prog_cc_c89
else
  ac_cv_prog_cc_stdc=no
fi

fi
 ;;
esac
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO Standard C" >&5
$as_echo_n "checking for $CC option to accept ISO Standard C... " >&6; }
  if ${ac_cv_prog_cc_stdc+:} false; then :
  $as_echo_n "(cached) " >&6
fi

  case $ac_cv_prog_cc_stdc in #(
  no) :
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
$as_echo "unsupported" >&6; } ;; #(
  '') :
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
$as_echo "none needed" >&6; } ;; #(
  *) :
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_stdc" >&5
$as_echo "$ac_cv_prog_cc_stdc" >&6; } ;;
esac


ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -z "$CXX"; then
  if test -n "$CCC"; then
    CXX=$CCC
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
$as_echo "$CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CXX="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
$as_echo "$ac_ct_CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CXX" && break
done

  if test "x$ac_ct_CXX" = x; then
    CXX="g++"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_ct_CXX
  fi
fi

  fi
fi
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
if ${ac_cv_cxx_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GXX=yes
else
  GXX=
fi
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
if ${ac_cv_prog_cxx_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
   ac_cxx_werror_flag=yes
   ac_cv_prog_cxx_g=no
   CXXFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
else
  CXXFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
	 CXXFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
$as_echo "$ac_cv_prog_cxx_g" >&6; }
if test "$ac_test_CXXFLAGS" = set; then
  CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
  if test "$GXX" = yes; then
    CXXFLAGS="-g -O2"
  else
    CXXFLAGS="-g"
  fi
else
  if test "$GXX" = yes; then
    CXXFLAGS="-O2"
  else
    CXXFLAGS=
  fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

depcc="$CXX"  am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CXX_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CXX_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CXX_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
  am__fastdepCXX_TRUE=
  am__fastdepCXX_FALSE='#'
else
  am__fastdepCXX_TRUE='#'
  am__fastdepCXX_FALSE=
fi




func_stripname_cnf ()
{
  case $2 in
  .*) func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%\\\\$2\$%%"`;;
  *)  func_stripname_result=`$ECHO "$3" | $SED "s%^$1%%; s%$2\$%%"`;;
  esac
} # func_stripname_cnf

      if test -n "$CXX" && ( test no != "$CXX" &&
    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
    (test g++ != "$CXX"))); then
  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
if test -z "$CXXCPP"; then
  if ${ac_cv_prog_CXXCPP+:} false; then :
  $as_echo_n "(cached) " >&6
else
      # Double quotes because CXXCPP needs to be expanded
    for CXXCPP in "$CXX -E" "/lib/cpp"
    do
      ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :
  break
fi

    done
    ac_cv_prog_CXXCPP=$CXXCPP

fi
  CXXCPP=$ac_cv_prog_CXXCPP
else
  ac_cv_prog_CXXCPP=$CXXCPP
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
$as_echo "$CXXCPP" >&6; }
ac_preproc_ok=false
for ac_cxx_preproc_warn_flag in '' yes
do
  # Use a header file that comes with gcc, so configuring glibc
  # with a fresh cross-compiler works.
  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
  # <limits.h> exists even on freestanding compilers.
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp. "Syntax error" is here to catch this case.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef __STDC__
# include <limits.h>
#else
# include <assert.h>
#endif
		     Syntax error
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :

else
  # Broken: fails on valid input.
continue
fi
rm -f conftest.err conftest.i conftest.$ac_ext

  # OK, works on sane cases.  Now check whether nonexistent headers
  # can be detected and how.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <ac_nonexistent.h>
_ACEOF
if ac_fn_cxx_try_cpp "$LINENO"; then :
  # Broken: success on invalid input.
continue
else
  # Passes both tests.
ac_preproc_ok=:
break
fi
rm -f conftest.err conftest.i conftest.$ac_ext

done
# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
rm -f conftest.i conftest.err conftest.$ac_ext
if $ac_preproc_ok; then :

else
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
See \`config.log' for more details" "$LINENO" 5; }
fi

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

else
  _lt_caught_CXX_error=yes
fi

ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

archive_cmds_need_lc_CXX=no
allow_undefined_flag_CXX=
always_export_symbols_CXX=no
archive_expsym_cmds_CXX=
compiler_needs_object_CXX=no
export_dynamic_flag_spec_CXX=
hardcode_direct_CXX=no
hardcode_direct_absolute_CXX=no
hardcode_libdir_flag_spec_CXX=
hardcode_libdir_separator_CXX=
hardcode_minus_L_CXX=no
hardcode_shlibpath_var_CXX=unsupported
hardcode_automatic_CXX=no
inherit_rpath_CXX=no
module_cmds_CXX=
module_expsym_cmds_CXX=
link_all_deplibs_CXX=unknown
old_archive_cmds_CXX=$old_archive_cmds
reload_flag_CXX=$reload_flag
reload_cmds_CXX=$reload_cmds
no_undefined_flag_CXX=
whole_archive_flag_spec_CXX=
enable_shared_with_static_runtimes_CXX=no

# Source file extension for C++ test sources.
ac_ext=cpp

# Object file extension for compiled C++ test sources.
objext=o
objext_CXX=$objext

# No sense in running all these tests if we already determined that
# the CXX compiler isn't working.  Some variables (like enable_shared)
# are currently assumed to apply to all compilers on this platform,
# and will be corrupted by setting them based on a non-working compiler.
if test yes != "$_lt_caught_CXX_error"; then
  # Code to be used in simple compile tests
  lt_simple_compile_test_code="int some_variable = 0;"

  # Code to be used in simple link tests
  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'

  # ltmain only uses $CC for tagged configurations so make sure $CC is set.






# If no C compiler was specified, use CC.
LTCC=${LTCC-"$CC"}

# If no C compiler flags were specified, use CFLAGS.
LTCFLAGS=${LTCFLAGS-"$CFLAGS"}

# Allow CC to be a program name with arguments.
compiler=$CC


  # save warnings/boilerplate of simple test code
  ac_outfile=conftest.$ac_objext
echo "$lt_simple_compile_test_code" >conftest.$ac_ext
eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_compiler_boilerplate=`cat conftest.err`
$RM conftest*

  ac_outfile=conftest.$ac_objext
echo "$lt_simple_link_test_code" >conftest.$ac_ext
eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
_lt_linker_boilerplate=`cat conftest.err`
$RM -r conftest*


  # Allow CC to be a program name with arguments.
  lt_save_CC=$CC
  lt_save_CFLAGS=$CFLAGS
  lt_save_LD=$LD
  lt_save_GCC=$GCC
  GCC=$GXX
  lt_save_with_gnu_ld=$with_gnu_ld
  lt_save_path_LD=$lt_cv_path_LD
  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
  else
    $as_unset lt_cv_prog_gnu_ld
  fi
  if test -n "${lt_cv_path_LDCXX+set}"; then
    lt_cv_path_LD=$lt_cv_path_LDCXX
  else
    $as_unset lt_cv_path_LD
  fi
  test -z "${LDCXX+set}" || LD=$LDCXX
  CC=${CXX-"c++"}
  CFLAGS=$CXXFLAGS
  compiler=$CC
  compiler_CXX=$CC
  func_cc_basename $compiler
cc_basename=$func_cc_basename_result


  if test -n "$compiler"; then
    # We don't want -fno-exception when compiling C++ code, so set the
    # no_builtin_flag separately
    if test yes = "$GXX"; then
      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
    else
      lt_prog_compiler_no_builtin_flag_CXX=
    fi

    if test yes = "$GXX"; then
      # Set up default GNU C++ configuration



# Check whether --with-gnu-ld was given.
if test "${with_gnu_ld+set}" = set; then :
  withval=$with_gnu_ld; test no = "$withval" || with_gnu_ld=yes
else
  with_gnu_ld=no
fi

ac_prog=ld
if test yes = "$GCC"; then
  # Check if gcc -print-prog-name=ld gives a path.
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
$as_echo_n "checking for ld used by $CC... " >&6; }
  case $host in
  *-*-mingw*)
    # gcc leaves a trailing carriage return, which upsets mingw
    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
  *)
    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
  esac
  case $ac_prog in
    # Accept absolute paths.
    [\\/]* | ?:[\\/]*)
      re_direlt='/[^/][^/]*/\.\./'
      # Canonicalize the pathname of ld
      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
      done
      test -z "$LD" && LD=$ac_prog
      ;;
  "")
    # If it fails, then pretend we aren't using GCC.
    ac_prog=ld
    ;;
  *)
    # If it is relative, then search for the first ld in PATH.
    with_gnu_ld=unknown
    ;;
  esac
elif test yes = "$with_gnu_ld"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
$as_echo_n "checking for GNU ld... " >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
$as_echo_n "checking for non-GNU ld... " >&6; }
fi
if ${lt_cv_path_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$LD"; then
  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
  for ac_dir in $PATH; do
    IFS=$lt_save_ifs
    test -z "$ac_dir" && ac_dir=.
    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
      lt_cv_path_LD=$ac_dir/$ac_prog
      # Check to see if the program is GNU ld.  I'd rather use --version,
      # but apparently some variants of GNU ld only accept -v.
      # Break only if it was the GNU/non-GNU ld that we prefer.
      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
      *GNU* | *'with BFD'*)
	test no != "$with_gnu_ld" && break
	;;
      *)
	test yes != "$with_gnu_ld" && break
	;;
      esac
    fi
  done
  IFS=$lt_save_ifs
else
  lt_cv_path_LD=$LD # Let the user override the test with a path.
fi
fi

LD=$lt_cv_path_LD
if test -n "$LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
$as_echo "$LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
if ${lt_cv_prog_gnu_ld+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # I'd rather use --version here, but apparently some GNU lds only accept -v.
case `$LD -v 2>&1 </dev/null` in
*GNU* | *'with BFD'*)
  lt_cv_prog_gnu_ld=yes
  ;;
*)
  lt_cv_prog_gnu_ld=no
  ;;
esac
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
$as_echo "$lt_cv_prog_gnu_ld" >&6; }
with_gnu_ld=$lt_cv_prog_gnu_ld







      # Check if GNU C++ uses GNU ld as the underlying linker, since the
      # archiving commands below assume that GNU ld is being used.
      if test yes = "$with_gnu_ld"; then
        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'

        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
        export_dynamic_flag_spec_CXX='$wl--export-dynamic'

        # If archive_cmds runs LD, not CC, wlarc should be empty
        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
        #     investigate it a little bit more. (MM)
        wlarc='$wl'

        # ancient GNU ld didn't support --whole-archive et. al.
        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
	  $GREP 'no-whole-archive' > /dev/null; then
          whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
        else
          whole_archive_flag_spec_CXX=
        fi
      else
        with_gnu_ld=no
        wlarc=

        # A generic and very simple default shared library creation
        # command for GNU C++ for the case where it uses the native
        # linker, instead of GNU ld.  If possible, this setting should
        # overridden to take advantage of the native linker features on
        # the platform it is being used on.
        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
      fi

      # Commands to make compiler produce verbose output that lists
      # what "hidden" libraries, object files and flags are used when
      # linking a shared library.
      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'

    else
      GXX=no
      with_gnu_ld=no
      wlarc=
    fi

    # PORTME: fill in a description of your system's C++ link characteristics
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
    ld_shlibs_CXX=yes
    case $host_os in
      aix3*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;
      aix[4-9]*)
        if test ia64 = "$host_cpu"; then
          # On IA64, the linker does run time linking by default, so we don't
          # have to do anything special.
          aix_use_runtimelinking=no
          exp_sym_flag='-Bexport'
          no_entry_flag=
        else
          aix_use_runtimelinking=no

          # Test if we are trying to use run time linking or normal
          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
          # have runtime linking enabled, and use it for executables.
          # For shared libraries, we enable/disable runtime linking
          # depending on the kind of the shared library created -
          # when "with_aix_soname,aix_use_runtimelinking" is:
          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
          # "aix,yes"  lib.so          shared, rtl:yes, for executables
          #            lib.a           static archive
          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
          #            lib.a(lib.so.V) shared, rtl:no,  for executables
          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
          #            lib.a(lib.so.V) shared, rtl:no
          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
          #            lib.a           static archive
          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
	    for ld_flag in $LDFLAGS; do
	      case $ld_flag in
	      *-brtl*)
	        aix_use_runtimelinking=yes
	        break
	        ;;
	      esac
	    done
	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
	      # so we don't have lib.a shared libs to link our executables.
	      # We have to force runtime linking in this case.
	      aix_use_runtimelinking=yes
	      LDFLAGS="$LDFLAGS -Wl,-brtl"
	    fi
	    ;;
          esac

          exp_sym_flag='-bexport'
          no_entry_flag='-bnoentry'
        fi

        # When large executables or shared objects are built, AIX ld can
        # have problems creating the table of contents.  If linking a library
        # or program results in "error TOC overflow" add -mminimal-toc to
        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.

        archive_cmds_CXX=''
        hardcode_direct_CXX=yes
        hardcode_direct_absolute_CXX=yes
        hardcode_libdir_separator_CXX=':'
        link_all_deplibs_CXX=yes
        file_list_spec_CXX='$wl-f,'
        case $with_aix_soname,$aix_use_runtimelinking in
        aix,*) ;;	# no import file
        svr4,* | *,yes) # use import file
          # The Import File defines what to hardcode.
          hardcode_direct_CXX=no
          hardcode_direct_absolute_CXX=no
          ;;
        esac

        if test yes = "$GXX"; then
          case $host_os in aix4.[012]|aix4.[012].*)
          # We only want to do this on AIX 4.2 and lower, the check
          # below for broken collect2 doesn't work under 4.3+
	  collect2name=`$CC -print-prog-name=collect2`
	  if test -f "$collect2name" &&
	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
	  then
	    # We have reworked collect2
	    :
	  else
	    # We have old collect2
	    hardcode_direct_CXX=unsupported
	    # It fails to find uninstalled libraries when the uninstalled
	    # path is not listed in the libpath.  Setting hardcode_minus_L
	    # to unsupported forces relinking
	    hardcode_minus_L_CXX=yes
	    hardcode_libdir_flag_spec_CXX='-L$libdir'
	    hardcode_libdir_separator_CXX=
	  fi
          esac
          shared_flag='-shared'
	  if test yes = "$aix_use_runtimelinking"; then
	    shared_flag=$shared_flag' $wl-G'
	  fi
	  # Need to ensure runtime linking is disabled for the traditional
	  # shared library, or the linker may eventually find shared libraries
	  # /with/ Import File - we do not want to mix them.
	  shared_flag_aix='-shared'
	  shared_flag_svr4='-shared $wl-G'
        else
          # not using gcc
          if test ia64 = "$host_cpu"; then
	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
	  # chokes on -Wl,-G. The following line is correct:
	  shared_flag='-G'
          else
	    if test yes = "$aix_use_runtimelinking"; then
	      shared_flag='$wl-G'
	    else
	      shared_flag='$wl-bM:SRE'
	    fi
	    shared_flag_aix='$wl-bM:SRE'
	    shared_flag_svr4='$wl-G'
          fi
        fi

        export_dynamic_flag_spec_CXX='$wl-bexpall'
        # It seems that -bexpall does not export symbols beginning with
        # underscore (_), so it is better to generate a list of symbols to
	# export.
        always_export_symbols_CXX=yes
	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
          # Warning - without using the other runtime loading flags (-brtl),
          # -berok will link without error, but may produce a broken library.
          # The "-G" linker flag allows undefined symbols.
          no_undefined_flag_CXX='-bernotok'
          # Determine the default libpath from the value encoded in an empty
          # executable.
          if test set = "${lt_cv_aix_libpath+set}"; then
  aix_libpath=$lt_cv_aix_libpath
else
  if ${lt_cv_aix_libpath__CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :

  lt_aix_libpath_sed='
      /Import File Strings/,/^$/ {
	  /^0/ {
	      s/^0  *\([^ ]*\) *$/\1/
	      p
	  }
      }'
  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  # Check for a 64-bit object if we didn't find anything.
  if test -z "$lt_cv_aix_libpath__CXX"; then
    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  if test -z "$lt_cv_aix_libpath__CXX"; then
    lt_cv_aix_libpath__CXX=/usr/lib:/lib
  fi

fi

  aix_libpath=$lt_cv_aix_libpath__CXX
fi

          hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"

          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
        else
          if test ia64 = "$host_cpu"; then
	    hardcode_libdir_flag_spec_CXX='$wl-R $libdir:/usr/lib:/lib'
	    allow_undefined_flag_CXX="-z nodefs"
	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
          else
	    # Determine the default libpath from the value encoded in an
	    # empty executable.
	    if test set = "${lt_cv_aix_libpath+set}"; then
  aix_libpath=$lt_cv_aix_libpath
else
  if ${lt_cv_aix_libpath__CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :

  lt_aix_libpath_sed='
      /Import File Strings/,/^$/ {
	  /^0/ {
	      s/^0  *\([^ ]*\) *$/\1/
	      p
	  }
      }'
  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  # Check for a 64-bit object if we didn't find anything.
  if test -z "$lt_cv_aix_libpath__CXX"; then
    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
  fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  if test -z "$lt_cv_aix_libpath__CXX"; then
    lt_cv_aix_libpath__CXX=/usr/lib:/lib
  fi

fi

  aix_libpath=$lt_cv_aix_libpath__CXX
fi

	    hardcode_libdir_flag_spec_CXX='$wl-blibpath:$libdir:'"$aix_libpath"
	    # Warning - without using the other run time loading flags,
	    # -berok will link without error, but may produce a broken library.
	    no_undefined_flag_CXX=' $wl-bernotok'
	    allow_undefined_flag_CXX=' $wl-berok'
	    if test yes = "$with_gnu_ld"; then
	      # We only use this code for GNU lds that support --whole-archive.
	      whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
	    else
	      # Exported symbols can be pulled into shared objects from archives
	      whole_archive_flag_spec_CXX='$convenience'
	    fi
	    archive_cmds_need_lc_CXX=yes
	    archive_expsym_cmds_CXX='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
	    # -brtl affects multiple linker settings, -berok does not and is overridden later
	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([, ]\\)%-berok\\1%g"`'
	    if test svr4 != "$with_aix_soname"; then
	      # This is similar to how AIX traditionally builds its shared
	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
	    fi
	    if test aix != "$with_aix_soname"; then
	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
	    else
	      # used by -dlpreopen to get the symbols
	      archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
	    fi
	    archive_expsym_cmds_CXX="$archive_expsym_cmds_CXX"'~$RM -r $output_objdir/$realname.d'
          fi
        fi
        ;;

      beos*)
	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
	  allow_undefined_flag_CXX=unsupported
	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
	  # support --undefined.  This deserves some investigation.  FIXME
	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	else
	  ld_shlibs_CXX=no
	fi
	;;

      chorus*)
        case $cc_basename in
          *)
	  # FIXME: insert proper C++ library support
	  ld_shlibs_CXX=no
	  ;;
        esac
        ;;

      cygwin* | mingw* | pw32* | cegcc*)
	case $GXX,$cc_basename in
	,cl* | no,cl*)
	  # Native MSVC
	  # hardcode_libdir_flag_spec is actually meaningless, as there is
	  # no search path for DLLs.
	  hardcode_libdir_flag_spec_CXX=' '
	  allow_undefined_flag_CXX=unsupported
	  always_export_symbols_CXX=yes
	  file_list_spec_CXX='@'
	  # Tell ltmain to make .lib files, not .a files.
	  libext=lib
	  # Tell ltmain to make .dll files, not .so files.
	  shrext_cmds=.dll
	  # FIXME: Setting linknames here is a bad hack.
	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
	  archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
              cp "$export_symbols" "$output_objdir/$soname.def";
              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
            else
              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
            fi~
            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
            linknames='
	  # The linker will not automatically build a static lib if we build a DLL.
	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
	  enable_shared_with_static_runtimes_CXX=yes
	  # Don't use ranlib
	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
            lt_tool_outputfile="@TOOL_OUTPUT@"~
            case $lt_outputfile in
              *.exe|*.EXE) ;;
              *)
                lt_outputfile=$lt_outputfile.exe
                lt_tool_outputfile=$lt_tool_outputfile.exe
                ;;
            esac~
            func_to_tool_file "$lt_outputfile"~
            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
              $RM "$lt_outputfile.manifest";
            fi'
	  ;;
	*)
	  # g++
	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
	  # as there is no search path for DLLs.
	  hardcode_libdir_flag_spec_CXX='-L$libdir'
	  export_dynamic_flag_spec_CXX='$wl--export-all-symbols'
	  allow_undefined_flag_CXX=unsupported
	  always_export_symbols_CXX=no
	  enable_shared_with_static_runtimes_CXX=yes

	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
	    # If the export-symbols file already is a .def file, use it as
	    # is; otherwise, prepend EXPORTS...
	    archive_expsym_cmds_CXX='if   test DEF = "`$SED -n     -e '\''s/^[	 ]*//'\''     -e '\''/^\(;.*\)*$/d'\''     -e '\''s/^\(EXPORTS\|LIBRARY\)\([	 ].*\)*$/DEF/p'\''     -e q     $export_symbols`" ; then
              cp $export_symbols $output_objdir/$soname.def;
            else
              echo EXPORTS > $output_objdir/$soname.def;
              cat $export_symbols >> $output_objdir/$soname.def;
            fi~
            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
	  else
	    ld_shlibs_CXX=no
	  fi
	  ;;
	esac
	;;
      darwin* | rhapsody*)


  archive_cmds_need_lc_CXX=no
  hardcode_direct_CXX=no
  hardcode_automatic_CXX=yes
  hardcode_shlibpath_var_CXX=unsupported
  if test yes = "$lt_cv_ld_force_load"; then
    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'

  else
    whole_archive_flag_spec_CXX=''
  fi
  link_all_deplibs_CXX=yes
  allow_undefined_flag_CXX=$_lt_dar_allow_undefined
  case $cc_basename in
     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
     *) _lt_dar_can_shared=$GCC ;;
  esac
  if test yes = "$_lt_dar_can_shared"; then
    output_verbose_link_cmd=func_echo_all
    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
    archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
    module_expsym_cmds_CXX="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
       if test yes != "$lt_cv_apple_cc_single_mod"; then
      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
      archive_expsym_cmds_CXX="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
    fi

  else
  ld_shlibs_CXX=no
  fi

	;;

      os2*)
	hardcode_libdir_flag_spec_CXX='-L$libdir'
	hardcode_minus_L_CXX=yes
	allow_undefined_flag_CXX=unsupported
	shrext_cmds=.dll
	archive_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	  $ECHO EXPORTS >> $output_objdir/$libname.def~
	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	  emximp -o $lib $output_objdir/$libname.def'
	archive_expsym_cmds_CXX='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
	  $ECHO EXPORTS >> $output_objdir/$libname.def~
	  prefix_cmds="$SED"~
	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
	    prefix_cmds="$prefix_cmds -e 1d";
	  fi~
	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
	  emximp -o $lib $output_objdir/$libname.def'
	old_archive_From_new_cmds_CXX='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
	enable_shared_with_static_runtimes_CXX=yes
	;;

      dgux*)
        case $cc_basename in
          ec++*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          ghcx*)
	    # Green Hills C++ Compiler
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      freebsd2.*)
        # C++ shared libraries reported to be fairly broken before
	# switch to ELF
        ld_shlibs_CXX=no
        ;;

      freebsd-elf*)
        archive_cmds_need_lc_CXX=no
        ;;

      freebsd* | dragonfly*)
        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
        # conventions
        ld_shlibs_CXX=yes
        ;;

      haiku*)
        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
        link_all_deplibs_CXX=yes
        ;;

      hpux9*)
        hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
        hardcode_libdir_separator_CXX=:
        export_dynamic_flag_spec_CXX='$wl-E'
        hardcode_direct_CXX=yes
        hardcode_minus_L_CXX=yes # Not in the search PATH,
				             # but as the default
				             # location of the library.

        case $cc_basename in
          CC*)
            # FIXME: insert proper C++ library support
            ld_shlibs_CXX=no
            ;;
          aCC*)
            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
            # Commands to make compiler produce verbose output that lists
            # what "hidden" libraries, object files and flags are used when
            # linking a shared library.
            #
            # There doesn't appear to be a way to prevent this compiler from
            # explicitly linking system object files so we need to strip them
            # from the output so that they don't get included in the library
            # dependencies.
            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
            ;;
          *)
            if test yes = "$GXX"; then
              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
            else
              # FIXME: insert proper C++ library support
              ld_shlibs_CXX=no
            fi
            ;;
        esac
        ;;

      hpux10*|hpux11*)
        if test no = "$with_gnu_ld"; then
	  hardcode_libdir_flag_spec_CXX='$wl+b $wl$libdir'
	  hardcode_libdir_separator_CXX=:

          case $host_cpu in
            hppa*64*|ia64*)
              ;;
            *)
	      export_dynamic_flag_spec_CXX='$wl-E'
              ;;
          esac
        fi
        case $host_cpu in
          hppa*64*|ia64*)
            hardcode_direct_CXX=no
            hardcode_shlibpath_var_CXX=no
            ;;
          *)
            hardcode_direct_CXX=yes
            hardcode_direct_absolute_CXX=yes
            hardcode_minus_L_CXX=yes # Not in the search PATH,
					         # but as the default
					         # location of the library.
            ;;
        esac

        case $cc_basename in
          CC*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          aCC*)
	    case $host_cpu in
	      hppa*64*)
	        archive_cmds_CXX='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	      ia64*)
	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	      *)
	        archive_cmds_CXX='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	        ;;
	    esac
	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
	    ;;
          *)
	    if test yes = "$GXX"; then
	      if test no = "$with_gnu_ld"; then
	        case $host_cpu in
	          hppa*64*)
	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	          ia64*)
	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	          *)
	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	            ;;
	        esac
	      fi
	    else
	      # FIXME: insert proper C++ library support
	      ld_shlibs_CXX=no
	    fi
	    ;;
        esac
        ;;

      interix[3-9]*)
	hardcode_direct_CXX=no
	hardcode_shlibpath_var_CXX=no
	hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
	export_dynamic_flag_spec_CXX='$wl-E'
	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
	# Instead, shared libraries are loaded at an image base (0x10000000 by
	# default) and relocated if they conflict, which is a slow very memory
	# consuming and fragmenting process.  To avoid this, we pick a random,
	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
	archive_expsym_cmds_CXX='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
	;;
      irix5* | irix6*)
        case $cc_basename in
          CC*)
	    # SGI C++
	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'

	    # Archives containing C++ object files must be created using
	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
	    # necessary to make sure instantiated templates are included
	    # in the archive.
	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
	    ;;
          *)
	    if test yes = "$GXX"; then
	      if test no = "$with_gnu_ld"; then
	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
	      else
	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
	      fi
	    fi
	    link_all_deplibs_CXX=yes
	    ;;
        esac
        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
        hardcode_libdir_separator_CXX=:
        inherit_rpath_CXX=yes
        ;;

      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
        case $cc_basename in
          KCC*)
	    # Kuck and Associates, Inc. (KAI) C++ Compiler

	    # KCC will only create a shared library if the output file
	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
	    # to its proper name (with version) after linking.
	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'

	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'

	    # Archives containing C++ object files must be created using
	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
	    ;;
	  icpc* | ecpc* )
	    # Intel C++
	    with_gnu_ld=yes
	    # version 8.0 and above of icpc choke on multiply defined symbols
	    # if we add $predep_objects and $postdep_objects, however 7.1 and
	    # earlier do not add the objects themselves.
	    case `$CC -V 2>&1` in
	      *"Version 7."*)
	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
		;;
	      *)  # Version 8.0 or newer
	        tmp_idyn=
	        case $host_cpu in
		  ia64*) tmp_idyn=' -i_dynamic';;
		esac
	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
		;;
	    esac
	    archive_cmds_need_lc_CXX=no
	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
	    whole_archive_flag_spec_CXX='$wl--whole-archive$convenience $wl--no-whole-archive'
	    ;;
          pgCC* | pgcpp*)
            # Portland Group C++ compiler
	    case `$CC -V` in
	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
	      prelink_cmds_CXX='tpldir=Template.dir~
               rm -rf $tpldir~
               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
	      old_archive_cmds_CXX='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
                $RANLIB $oldlib'
	      archive_cmds_CXX='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
	      archive_expsym_cmds_CXX='tpldir=Template.dir~
                rm -rf $tpldir~
                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
	      ;;
	    *) # Version 6 and above use weak symbols
	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
	      ;;
	    esac

	    hardcode_libdir_flag_spec_CXX='$wl--rpath $wl$libdir'
	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
	    whole_archive_flag_spec_CXX='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
            ;;
	  cxx*)
	    # Compaq C++
	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'

	    runpath_var=LD_RUN_PATH
	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
	    hardcode_libdir_separator_CXX=:

	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
	    ;;
	  xl* | mpixl* | bgxl*)
	    # IBM XL 8.0 on PPC, with GNU ld
	    hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
	    export_dynamic_flag_spec_CXX='$wl--export-dynamic'
	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
	    if test yes = "$supports_anon_versioning"; then
	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
                echo "local: *; };" >> $output_objdir/$libname.ver~
                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
	    fi
	    ;;
	  *)
	    case `$CC -V 2>&1 | sed 5q` in
	    *Sun\ C*)
	      # Sun C++ 5.9
	      no_undefined_flag_CXX=' -zdefs'
	      archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	      archive_expsym_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
	      hardcode_libdir_flag_spec_CXX='-R$libdir'
	      whole_archive_flag_spec_CXX='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
	      compiler_needs_object_CXX=yes

	      # Not sure whether something based on
	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
	      # would be better.
	      output_verbose_link_cmd='func_echo_all'

	      # Archives containing C++ object files must be created using
	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
	      # necessary to make sure instantiated templates are included
	      # in the archive.
	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
	      ;;
	    esac
	    ;;
	esac
	;;

      lynxos*)
        # FIXME: insert proper C++ library support
	ld_shlibs_CXX=no
	;;

      m88k*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
	;;

      mvs*)
        case $cc_basename in
          cxx*)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
	  *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
	esac
	;;

      netbsd*)
        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
	  wlarc=
	  hardcode_libdir_flag_spec_CXX='-R$libdir'
	  hardcode_direct_CXX=yes
	  hardcode_shlibpath_var_CXX=no
	fi
	# Workaround some broken pre-1.5 toolchains
	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
	;;

      *nto* | *qnx*)
        ld_shlibs_CXX=yes
	;;

      openbsd* | bitrig*)
	if test -f /usr/libexec/ld.so; then
	  hardcode_direct_CXX=yes
	  hardcode_shlibpath_var_CXX=no
	  hardcode_direct_absolute_CXX=yes
	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
	  hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
	    export_dynamic_flag_spec_CXX='$wl-E'
	    whole_archive_flag_spec_CXX=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
	  fi
	  output_verbose_link_cmd=func_echo_all
	else
	  ld_shlibs_CXX=no
	fi
	;;

      osf3* | osf4* | osf5*)
        case $cc_basename in
          KCC*)
	    # Kuck and Associates, Inc. (KAI) C++ Compiler

	    # KCC will only create a shared library if the output file
	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
	    # to its proper name (with version) after linking.
	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'

	    hardcode_libdir_flag_spec_CXX='$wl-rpath,$libdir'
	    hardcode_libdir_separator_CXX=:

	    # Archives containing C++ object files must be created using
	    # the KAI C++ compiler.
	    case $host in
	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
	    esac
	    ;;
          RCC*)
	    # Rational C++ 2.4.1
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          cxx*)
	    case $host in
	      osf3*)
	        allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
	        hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
		;;
	      *)
	        allow_undefined_flag_CXX=' -expect_unresolved \*'
	        archive_cmds_CXX='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
                  echo "-hidden">> $lib.exp~
                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
                  $RM $lib.exp'
	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
		;;
	    esac

	    hardcode_libdir_separator_CXX=:

	    # Commands to make compiler produce verbose output that lists
	    # what "hidden" libraries, object files and flags are used when
	    # linking a shared library.
	    #
	    # There doesn't appear to be a way to prevent this compiler from
	    # explicitly linking system object files so we need to strip them
	    # from the output so that they don't get included in the library
	    # dependencies.
	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
	    ;;
	  *)
	    if test yes,no = "$GXX,$with_gnu_ld"; then
	      allow_undefined_flag_CXX=' $wl-expect_unresolved $wl\*'
	      case $host in
	        osf3*)
	          archive_cmds_CXX='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
		  ;;
	        *)
	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
		  ;;
	      esac

	      hardcode_libdir_flag_spec_CXX='$wl-rpath $wl$libdir'
	      hardcode_libdir_separator_CXX=:

	      # Commands to make compiler produce verbose output that lists
	      # what "hidden" libraries, object files and flags are used when
	      # linking a shared library.
	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'

	    else
	      # FIXME: insert proper C++ library support
	      ld_shlibs_CXX=no
	    fi
	    ;;
        esac
        ;;

      psos*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;

      sunos4*)
        case $cc_basename in
          CC*)
	    # Sun C++ 4.x
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          lcc*)
	    # Lucid
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      solaris*)
        case $cc_basename in
          CC* | sunCC*)
	    # Sun C++ 4.2, 5.x and Centerline C++
            archive_cmds_need_lc_CXX=yes
	    no_undefined_flag_CXX=' -zdefs'
	    archive_cmds_CXX='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	    hardcode_libdir_flag_spec_CXX='-R$libdir'
	    hardcode_shlibpath_var_CXX=no
	    case $host_os in
	      solaris2.[0-5] | solaris2.[0-5].*) ;;
	      *)
		# The compiler driver will combine and reorder linker options,
		# but understands '-z linker_flag'.
	        # Supported since Solaris 2.6 (maybe 2.5.1?)
		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
	        ;;
	    esac
	    link_all_deplibs_CXX=yes

	    output_verbose_link_cmd='func_echo_all'

	    # Archives containing C++ object files must be created using
	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
	    # necessary to make sure instantiated templates are included
	    # in the archive.
	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
	    ;;
          gcx*)
	    # Green Hills C++ Compiler
	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'

	    # The C++ compiler must be used to create the archive.
	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
	    ;;
          *)
	    # GNU C++ compiler with Solaris linker
	    if test yes,no = "$GXX,$with_gnu_ld"; then
	      no_undefined_flag_CXX=' $wl-z ${wl}defs'
	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	        # Commands to make compiler produce verbose output that lists
	        # what "hidden" libraries, object files and flags are used when
	        # linking a shared library.
	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
	      else
	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
	        # platform.
	        archive_cmds_CXX='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'

	        # Commands to make compiler produce verbose output that lists
	        # what "hidden" libraries, object files and flags are used when
	        # linking a shared library.
	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
	      fi

	      hardcode_libdir_flag_spec_CXX='$wl-R $wl$libdir'
	      case $host_os in
		solaris2.[0-5] | solaris2.[0-5].*) ;;
		*)
		  whole_archive_flag_spec_CXX='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
		  ;;
	      esac
	    fi
	    ;;
        esac
        ;;

    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
      no_undefined_flag_CXX='$wl-z,text'
      archive_cmds_need_lc_CXX=no
      hardcode_shlibpath_var_CXX=no
      runpath_var='LD_RUN_PATH'

      case $cc_basename in
        CC*)
	  archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
	*)
	  archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	  ;;
      esac
      ;;

      sysv5* | sco3.2v5* | sco5v6*)
	# Note: We CANNOT use -z defs as we might desire, because we do not
	# link with -lc, and that would cause any symbols used from libc to
	# always be unresolved, which means just about no library would
	# ever link correctly.  If we're not using GNU ld we use -z text
	# though, which does catch some bad symbols but isn't as heavy-handed
	# as -z defs.
	no_undefined_flag_CXX='$wl-z,text'
	allow_undefined_flag_CXX='$wl-z,nodefs'
	archive_cmds_need_lc_CXX=no
	hardcode_shlibpath_var_CXX=no
	hardcode_libdir_flag_spec_CXX='$wl-R,$libdir'
	hardcode_libdir_separator_CXX=':'
	link_all_deplibs_CXX=yes
	export_dynamic_flag_spec_CXX='$wl-Bexport'
	runpath_var='LD_RUN_PATH'

	case $cc_basename in
          CC*)
	    archive_cmds_CXX='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    archive_expsym_cmds_CXX='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
              '"$old_archive_cmds_CXX"
	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
              '"$reload_cmds_CXX"
	    ;;
	  *)
	    archive_cmds_CXX='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    archive_expsym_cmds_CXX='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
	    ;;
	esac
      ;;

      tandem*)
        case $cc_basename in
          NCC*)
	    # NonStop-UX NCC 3.20
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
          *)
	    # FIXME: insert proper C++ library support
	    ld_shlibs_CXX=no
	    ;;
        esac
        ;;

      vxworks*)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;

      *)
        # FIXME: insert proper C++ library support
        ld_shlibs_CXX=no
        ;;
    esac

    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
    test no = "$ld_shlibs_CXX" && can_build_shared=no

    GCC_CXX=$GXX
    LD_CXX=$LD

    ## CAVEAT EMPTOR:
    ## There is no encapsulation within the following macros, do not change
    ## the running order or otherwise move them around unless you know exactly
    ## what you are doing...
    # Dependencies to place before and after the object being linked:
predep_objects_CXX=
postdep_objects_CXX=
predeps_CXX=
postdeps_CXX=
compiler_lib_search_path_CXX=

cat > conftest.$ac_ext <<_LT_EOF
class Foo
{
public:
  Foo (void) { a = 0; }
private:
  int a;
};
_LT_EOF


_lt_libdeps_save_CFLAGS=$CFLAGS
case "$CC $CFLAGS " in #(
*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
esac

if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  # Parse the compiler output and extract the necessary
  # objects, libraries and library flags.

  # Sentinel used to keep track of whether or not we are before
  # the conftest object file.
  pre_test_object_deps_done=no

  for p in `eval "$output_verbose_link_cmd"`; do
    case $prev$p in

    -L* | -R* | -l*)
       # Some compilers place space between "-{L,R}" and the path.
       # Remove the space.
       if test x-L = "$p" ||
          test x-R = "$p"; then
	 prev=$p
	 continue
       fi

       # Expand the sysroot to ease extracting the directories later.
       if test -z "$prev"; then
         case $p in
         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
         esac
       fi
       case $p in
       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
       esac
       if test no = "$pre_test_object_deps_done"; then
	 case $prev in
	 -L | -R)
	   # Internal compiler library paths should come after those
	   # provided the user.  The postdeps already come after the
	   # user supplied libs so there is no need to process them.
	   if test -z "$compiler_lib_search_path_CXX"; then
	     compiler_lib_search_path_CXX=$prev$p
	   else
	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} $prev$p"
	   fi
	   ;;
	 # The "-l" case would never come before the object being
	 # linked, so don't bother handling this case.
	 esac
       else
	 if test -z "$postdeps_CXX"; then
	   postdeps_CXX=$prev$p
	 else
	   postdeps_CXX="${postdeps_CXX} $prev$p"
	 fi
       fi
       prev=
       ;;

    *.lto.$objext) ;; # Ignore GCC LTO objects
    *.$objext)
       # This assumes that the test object file only shows up
       # once in the compiler output.
       if test "$p" = "conftest.$objext"; then
	 pre_test_object_deps_done=yes
	 continue
       fi

       if test no = "$pre_test_object_deps_done"; then
	 if test -z "$predep_objects_CXX"; then
	   predep_objects_CXX=$p
	 else
	   predep_objects_CXX="$predep_objects_CXX $p"
	 fi
       else
	 if test -z "$postdep_objects_CXX"; then
	   postdep_objects_CXX=$p
	 else
	   postdep_objects_CXX="$postdep_objects_CXX $p"
	 fi
       fi
       ;;

    *) ;; # Ignore the rest.

    esac
  done

  # Clean up.
  rm -f a.out a.exe
else
  echo "libtool.m4: error: problem compiling CXX test program"
fi

$RM -f confest.$objext
CFLAGS=$_lt_libdeps_save_CFLAGS

# PORTME: override above test on systems where it is broken
case $host_os in
interix[3-9]*)
  # Interix 3.5 installs completely hosed .la files for C++, so rather than
  # hack all around it, let's just trust "g++" to DTRT.
  predep_objects_CXX=
  postdep_objects_CXX=
  postdeps_CXX=
  ;;
esac


case " $postdeps_CXX " in
*" -lc "*) archive_cmds_need_lc_CXX=no ;;
esac
 compiler_lib_search_dirs_CXX=
if test -n "${compiler_lib_search_path_CXX}"; then
 compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | $SED -e 's! -L! !g' -e 's!^ !!'`
fi































    lt_prog_compiler_wl_CXX=
lt_prog_compiler_pic_CXX=
lt_prog_compiler_static_CXX=


  # C++ specific cases for pic, static, wl, etc.
  if test yes = "$GXX"; then
    lt_prog_compiler_wl_CXX='-Wl,'
    lt_prog_compiler_static_CXX='-static'

    case $host_os in
    aix*)
      # All AIX code is PIC.
      if test ia64 = "$host_cpu"; then
	# AIX 5 now supports IA64 processor
	lt_prog_compiler_static_CXX='-Bstatic'
      fi
      lt_prog_compiler_pic_CXX='-fPIC'
      ;;

    amigaos*)
      case $host_cpu in
      powerpc)
            # see comment about AmigaOS4 .so support
            lt_prog_compiler_pic_CXX='-fPIC'
        ;;
      m68k)
            # FIXME: we need at least 68020 code to build shared libraries, but
            # adding the '-m68020' flag to GCC prevents building anything better,
            # like '-m68040'.
            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
        ;;
      esac
      ;;

    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
      # PIC is the default for these OSes.
      ;;
    mingw* | cygwin* | os2* | pw32* | cegcc*)
      # This hack is so that the source file can tell whether it is being
      # built for inclusion in a dll (and should export symbols for example).
      # Although the cygwin gcc ignores -fPIC, still need this for old-style
      # (--disable-auto-import) libraries
      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
      case $host_os in
      os2*)
	lt_prog_compiler_static_CXX='$wl-static'
	;;
      esac
      ;;
    darwin* | rhapsody*)
      # PIC is the default on this platform
      # Common symbols not allowed in MH_DYLIB files
      lt_prog_compiler_pic_CXX='-fno-common'
      ;;
    *djgpp*)
      # DJGPP does not support shared libraries at all
      lt_prog_compiler_pic_CXX=
      ;;
    haiku*)
      # PIC is the default for Haiku.
      # The "-static" flag exists, but is broken.
      lt_prog_compiler_static_CXX=
      ;;
    interix[3-9]*)
      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
      # Instead, we relocate shared libraries at runtime.
      ;;
    sysv4*MP*)
      if test -d /usr/nec; then
	lt_prog_compiler_pic_CXX=-Kconform_pic
      fi
      ;;
    hpux*)
      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
      # sets the default TLS model and affects inlining.
      case $host_cpu in
      hppa*64*)
	;;
      *)
	lt_prog_compiler_pic_CXX='-fPIC'
	;;
      esac
      ;;
    *qnx* | *nto*)
      # QNX uses GNU C++, but need to define -shared option too, otherwise
      # it will coredump.
      lt_prog_compiler_pic_CXX='-fPIC -shared'
      ;;
    *)
      lt_prog_compiler_pic_CXX='-fPIC'
      ;;
    esac
  else
    case $host_os in
      aix[4-9]*)
	# All AIX code is PIC.
	if test ia64 = "$host_cpu"; then
	  # AIX 5 now supports IA64 processor
	  lt_prog_compiler_static_CXX='-Bstatic'
	else
	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
	fi
	;;
      chorus*)
	case $cc_basename in
	cxch68*)
	  # Green Hills C++ Compiler
	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
	  ;;
	esac
	;;
      mingw* | cygwin* | os2* | pw32* | cegcc*)
	# This hack is so that the source file can tell whether it is being
	# built for inclusion in a dll (and should export symbols for example).
	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
	;;
      dgux*)
	case $cc_basename in
	  ec++*)
	    lt_prog_compiler_pic_CXX='-KPIC'
	    ;;
	  ghcx*)
	    # Green Hills C++ Compiler
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  *)
	    ;;
	esac
	;;
      freebsd* | dragonfly*)
	# FreeBSD uses GNU C++
	;;
      hpux9* | hpux10* | hpux11*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
	    if test ia64 != "$host_cpu"; then
	      lt_prog_compiler_pic_CXX='+Z'
	    fi
	    ;;
	  aCC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='$wl-a ${wl}archive'
	    case $host_cpu in
	    hppa*64*|ia64*)
	      # +Z the default
	      ;;
	    *)
	      lt_prog_compiler_pic_CXX='+Z'
	      ;;
	    esac
	    ;;
	  *)
	    ;;
	esac
	;;
      interix*)
	# This is c89, which is MS Visual C++ (no shared libs)
	# Anyone wants to do a port?
	;;
      irix5* | irix6* | nonstopux*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_static_CXX='-non_shared'
	    # CC pic flag -KPIC is the default.
	    ;;
	  *)
	    ;;
	esac
	;;
      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
	case $cc_basename in
	  KCC*)
	    # KAI C++ Compiler
	    lt_prog_compiler_wl_CXX='--backend -Wl,'
	    lt_prog_compiler_pic_CXX='-fPIC'
	    ;;
	  ecpc* )
	    # old Intel C++ for x86_64, which still supported -KPIC.
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-static'
	    ;;
	  icpc* )
	    # Intel C++, used to be incompatible with GCC.
	    # ICC 10 doesn't accept -KPIC any more.
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-fPIC'
	    lt_prog_compiler_static_CXX='-static'
	    ;;
	  pgCC* | pgcpp*)
	    # Portland Group C++ compiler
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-fpic'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	  cxx*)
	    # Compaq C++
	    # Make sure the PIC flag is empty.  It appears that all Alpha
	    # Linux and Compaq Tru64 Unix objects are PIC.
	    lt_prog_compiler_pic_CXX=
	    lt_prog_compiler_static_CXX='-non_shared'
	    ;;
	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
	    # IBM XL 8.0, 9.0 on PPC and BlueGene
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-qpic'
	    lt_prog_compiler_static_CXX='-qstaticlink'
	    ;;
	  *)
	    case `$CC -V 2>&1 | sed 5q` in
	    *Sun\ C*)
	      # Sun C++ 5.9
	      lt_prog_compiler_pic_CXX='-KPIC'
	      lt_prog_compiler_static_CXX='-Bstatic'
	      lt_prog_compiler_wl_CXX='-Qoption ld '
	      ;;
	    esac
	    ;;
	esac
	;;
      lynxos*)
	;;
      m88k*)
	;;
      mvs*)
	case $cc_basename in
	  cxx*)
	    lt_prog_compiler_pic_CXX='-W c,exportall'
	    ;;
	  *)
	    ;;
	esac
	;;
      netbsd* | netbsdelf*-gnu)
	;;
      *qnx* | *nto*)
        # QNX uses GNU C++, but need to define -shared option too, otherwise
        # it will coredump.
        lt_prog_compiler_pic_CXX='-fPIC -shared'
        ;;
      osf3* | osf4* | osf5*)
	case $cc_basename in
	  KCC*)
	    lt_prog_compiler_wl_CXX='--backend -Wl,'
	    ;;
	  RCC*)
	    # Rational C++ 2.4.1
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  cxx*)
	    # Digital/Compaq C++
	    lt_prog_compiler_wl_CXX='-Wl,'
	    # Make sure the PIC flag is empty.  It appears that all Alpha
	    # Linux and Compaq Tru64 Unix objects are PIC.
	    lt_prog_compiler_pic_CXX=
	    lt_prog_compiler_static_CXX='-non_shared'
	    ;;
	  *)
	    ;;
	esac
	;;
      psos*)
	;;
      solaris*)
	case $cc_basename in
	  CC* | sunCC*)
	    # Sun C++ 4.2, 5.x and Centerline C++
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    lt_prog_compiler_wl_CXX='-Qoption ld '
	    ;;
	  gcx*)
	    # Green Hills C++ Compiler
	    lt_prog_compiler_pic_CXX='-PIC'
	    ;;
	  *)
	    ;;
	esac
	;;
      sunos4*)
	case $cc_basename in
	  CC*)
	    # Sun C++ 4.x
	    lt_prog_compiler_pic_CXX='-pic'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	  lcc*)
	    # Lucid
	    lt_prog_compiler_pic_CXX='-pic'
	    ;;
	  *)
	    ;;
	esac
	;;
      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
	case $cc_basename in
	  CC*)
	    lt_prog_compiler_wl_CXX='-Wl,'
	    lt_prog_compiler_pic_CXX='-KPIC'
	    lt_prog_compiler_static_CXX='-Bstatic'
	    ;;
	esac
	;;
      tandem*)
	case $cc_basename in
	  NCC*)
	    # NonStop-UX NCC 3.20
	    lt_prog_compiler_pic_CXX='-KPIC'
	    ;;
	  *)
	    ;;
	esac
	;;
      vxworks*)
	;;
      *)
	lt_prog_compiler_can_build_shared_CXX=no
	;;
    esac
  fi

case $host_os in
  # For platforms that do not support PIC, -DPIC is meaningless:
  *djgpp*)
    lt_prog_compiler_pic_CXX=
    ;;
  *)
    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
    ;;
esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX

#
# Check to make sure the PIC flag actually works.
#
if test -n "$lt_prog_compiler_pic_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_pic_works_CXX=no
   ac_outfile=conftest.$ac_objext
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"  ## exclude from sc_useless_quotes_in_assignment
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   # The option is referenced via a variable to avoid confusing sed.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>conftest.err)
   ac_status=$?
   cat conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s "$ac_outfile"; then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings other than the usual output.
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_pic_works_CXX=yes
     fi
   fi
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }

if test yes = "$lt_cv_prog_compiler_pic_works_CXX"; then
    case $lt_prog_compiler_pic_CXX in
     "" | " "*) ;;
     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
     esac
else
    lt_prog_compiler_pic_CXX=
     lt_prog_compiler_can_build_shared_CXX=no
fi

fi





#
# Check to make sure the static flag actually works.
#
wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_static_works_CXX=no
   save_LDFLAGS=$LDFLAGS
   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
   echo "$lt_simple_link_test_code" > conftest.$ac_ext
   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
     # The linker can only warn and ignore the option if not recognized
     # So say no if there are warnings
     if test -s conftest.err; then
       # Append any errors to the config.log.
       cat conftest.err 1>&5
       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
       if diff conftest.exp conftest.er2 >/dev/null; then
         lt_cv_prog_compiler_static_works_CXX=yes
       fi
     else
       lt_cv_prog_compiler_static_works_CXX=yes
     fi
   fi
   $RM -r conftest*
   LDFLAGS=$save_LDFLAGS

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }

if test yes = "$lt_cv_prog_compiler_static_works_CXX"; then
    :
else
    lt_prog_compiler_static_CXX=
fi




    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o_CXX=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o_CXX=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }



    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_prog_compiler_c_o_CXX=no
   $RM -r conftest 2>/dev/null
   mkdir conftest
   cd conftest
   mkdir out
   echo "$lt_simple_compile_test_code" > conftest.$ac_ext

   lt_compiler_flag="-o out/conftest2.$ac_objext"
   # Insert the option either (1) after the last *FLAGS variable, or
   # (2) before a word containing "conftest.", or (3) at the end.
   # Note that $ac_compile itself does not contain backslashes and begins
   # with a dollar sign (not a hyphen), so the echo should work correctly.
   lt_compile=`echo "$ac_compile" | $SED \
   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
   -e 's:$: $lt_compiler_flag:'`
   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
   (eval "$lt_compile" 2>out/conftest.err)
   ac_status=$?
   cat out/conftest.err >&5
   echo "$as_me:$LINENO: \$? = $ac_status" >&5
   if (exit $ac_status) && test -s out/conftest2.$ac_objext
   then
     # The compiler can only warn and ignore the option if not recognized
     # So say no if there are warnings
     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
       lt_cv_prog_compiler_c_o_CXX=yes
     fi
   fi
   chmod u+w . 2>&5
   $RM conftest*
   # SGI C++ compiler will create directory out/ii_files/ for
   # template instantiation
   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
   $RM out/* && rmdir out
   cd ..
   $RM -r conftest
   $RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }




hard_links=nottested
if test no = "$lt_cv_prog_compiler_c_o_CXX" && test no != "$need_locks"; then
  # do not overwrite the value of need_locks provided by the user
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
$as_echo_n "checking if we can lock with hard links... " >&6; }
  hard_links=yes
  $RM conftest*
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  touch conftest.a
  ln conftest.a conftest.b 2>&5 || hard_links=no
  ln conftest.a conftest.b 2>/dev/null && hard_links=no
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
$as_echo "$hard_links" >&6; }
  if test no = "$hard_links"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&5
$as_echo "$as_me: WARNING: '$CC' does not support '-c -o', so 'make -j' may be unsafe" >&2;}
    need_locks=warn
  fi
else
  need_locks=no
fi



    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }

  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
  case $host_os in
  aix[4-9]*)
    # If we're using GNU nm, then we don't want the "-C" option.
    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
    # Without the "-l" option, or with the "-B" option, AIX nm treats
    # weak defined symbols like other global defined symbols, whereas
    # GNU nm marks them as "W".
    # While the 'weak' keyword is ignored in the Export File, we need
    # it in the Import File for the 'aix-soname' feature, so we have
    # to replace the "-B" option with "-P" for AIX nm.
    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
    else
      export_symbols_cmds_CXX='`func_echo_all $NM | $SED -e '\''s/B\([^B]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && (substr(\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
    fi
    ;;
  pw32*)
    export_symbols_cmds_CXX=$ltdll_cmds
    ;;
  cygwin* | mingw* | cegcc*)
    case $cc_basename in
    cl*)
      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
      ;;
    *)
      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
      ;;
    esac
    ;;
  linux* | k*bsd*-gnu | gnu*)
    link_all_deplibs_CXX=no
    ;;
  *)
    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
    ;;
  esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
$as_echo "$ld_shlibs_CXX" >&6; }
test no = "$ld_shlibs_CXX" && can_build_shared=no

with_gnu_ld_CXX=$with_gnu_ld






#
# Do we need to explicitly link libc?
#
case "x$archive_cmds_need_lc_CXX" in
x|xyes)
  # Assume -lc should be added
  archive_cmds_need_lc_CXX=yes

  if test yes,yes = "$GCC,$enable_shared"; then
    case $archive_cmds_CXX in
    *'~'*)
      # FIXME: we may have to deal with multi-command sequences.
      ;;
    '$CC '*)
      # Test whether the compiler implicitly links with -lc since on some
      # systems, -lgcc has to come before -lc. If gcc already passes -lc
      # to ld, don't add -lc before -lgcc.
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  $RM conftest*
	echo "$lt_simple_compile_test_code" > conftest.$ac_ext

	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
  (eval $ac_compile) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; } 2>conftest.err; then
	  soname=conftest
	  lib=conftest
	  libobjs=conftest.$ac_objext
	  deplibs=
	  wl=$lt_prog_compiler_wl_CXX
	  pic_flag=$lt_prog_compiler_pic_CXX
	  compiler_flags=-v
	  linker_flags=-v
	  verstring=
	  output_objdir=.
	  libname=conftest
	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
	  allow_undefined_flag_CXX=
	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
	  then
	    lt_cv_archive_cmds_need_lc_CXX=no
	  else
	    lt_cv_archive_cmds_need_lc_CXX=yes
	  fi
	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
	else
	  cat conftest.err 1>&5
	fi
	$RM conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
      ;;
    esac
  fi
  ;;
esac






























































    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
$as_echo_n "checking dynamic linker characteristics... " >&6; }

library_names_spec=
libname_spec='lib$name'
soname_spec=
shrext_cmds=.so
postinstall_cmds=
postuninstall_cmds=
finish_cmds=
finish_eval=
shlibpath_var=
shlibpath_overrides_runpath=unknown
version_type=none
dynamic_linker="$host_os ld.so"
sys_lib_dlsearch_path_spec="/lib /usr/lib"
need_lib_prefix=unknown
hardcode_into_libs=no

# when you set need_version to no, make sure it does not cause -set_version
# flags to be left without arguments
need_version=unknown



case $host_os in
aix3*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
  shlibpath_var=LIBPATH

  # AIX 3 has no versioning support, so we append a major version to the name.
  soname_spec='$libname$release$shared_ext$major'
  ;;

aix[4-9]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  hardcode_into_libs=yes
  if test ia64 = "$host_cpu"; then
    # AIX 5 supports IA64
    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
    shlibpath_var=LD_LIBRARY_PATH
  else
    # With GCC up to 2.95.x, collect2 would create an import file
    # for dependence libraries.  The import file would start with
    # the line '#! .'.  This would cause the generated library to
    # depend on '.', always an invalid library.  This was fixed in
    # development snapshots of GCC prior to 3.0.
    case $host_os in
      aix4 | aix4.[01] | aix4.[01].*)
      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
	   echo ' yes '
	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
	:
      else
	can_build_shared=no
      fi
      ;;
    esac
    # Using Import Files as archive members, it is possible to support
    # filename-based versioning of shared library archives on AIX. While
    # this would work for both with and without runtime linking, it will
    # prevent static linking of such archives. So we do filename-based
    # shared library versioning with .so extension only, which is used
    # when both runtime linking and shared linking is enabled.
    # Unfortunately, runtime linking may impact performance, so we do
    # not want this to be the default eventually. Also, we use the
    # versioned .so libs for executables only if there is the -brtl
    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
    # To allow for filename-based versioning support, we need to create
    # libNAME.so.V as an archive file, containing:
    # *) an Import File, referring to the versioned filename of the
    #    archive as well as the shared archive member, telling the
    #    bitwidth (32 or 64) of that shared object, and providing the
    #    list of exported symbols of that shared object, eventually
    #    decorated with the 'weak' keyword
    # *) the shared object with the F_LOADONLY flag set, to really avoid
    #    it being seen by the linker.
    # At run time we better use the real file rather than another symlink,
    # but for link time we create the symlink libNAME.so -> libNAME.so.V

    case $with_aix_soname,$aix_use_runtimelinking in
    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
    # soname into executable. Probably we can add versioning support to
    # collect2, so additional links can be useful in future.
    aix,yes) # traditional libtool
      dynamic_linker='AIX unversionable lib.so'
      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
      # instead of lib<name>.a to let people know that these are not
      # typical AIX shared libraries.
      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
      ;;
    aix,no) # traditional AIX only
      dynamic_linker='AIX lib.a(lib.so.V)'
      # We preserve .a as extension for shared libraries through AIX4.2
      # and later when we are not doing run time linking.
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      ;;
    svr4,*) # full svr4 only
      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o)"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,yes) # both, prefer svr4
      dynamic_linker="AIX lib.so.V($shared_archive_member_spec.o), lib.a(lib.so.V)"
      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
      # unpreferred sharedlib libNAME.a needs extra handling
      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
      # We do not specify a path in Import Files, so LIBPATH fires.
      shlibpath_overrides_runpath=yes
      ;;
    *,no) # both, prefer aix
      dynamic_linker="AIX lib.a(lib.so.V), lib.so.V($shared_archive_member_spec.o)"
      library_names_spec='$libname$release.a $libname.a'
      soname_spec='$libname$release$shared_ext$major'
      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
      ;;
    esac
    shlibpath_var=LIBPATH
  fi
  ;;

amigaos*)
  case $host_cpu in
  powerpc)
    # Since July 2007 AmigaOS4 officially supports .so libraries.
    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    ;;
  m68k)
    library_names_spec='$libname.ixlibrary $libname.a'
    # Create ${libname}_ixlibrary.a entries in /sys/libs.
    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
    ;;
  esac
  ;;

beos*)
  library_names_spec='$libname$shared_ext'
  dynamic_linker="$host_os ld.so"
  shlibpath_var=LIBRARY_PATH
  ;;

bsdi[45]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
  # the default ld.so.conf also contains /usr/contrib/lib and
  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
  # libtool to hard-code these into programs
  ;;

cygwin* | mingw* | pw32* | cegcc*)
  version_type=windows
  shrext_cmds=.dll
  need_version=no
  need_lib_prefix=no

  case $GCC,$cc_basename in
  yes,*)
    # gcc
    library_names_spec='$libname.dll.a'
    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \$file`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname~
      chmod a+x \$dldir/$dlname~
      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
      fi'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes

    case $host_os in
    cygwin*)
      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'

      ;;
    mingw* | cegcc*)
      # MinGW DLLs use traditional 'lib' prefix
      soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
      ;;
    pw32*)
      # pw32 DLLs use 'pw' prefix rather than 'lib'
      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
      ;;
    esac
    dynamic_linker='Win32 ld.exe'
    ;;

  *,cl*)
    # Native MSVC
    libname_spec='$name'
    soname_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext'
    library_names_spec='$libname.dll.lib'

    case $build_os in
    mingw*)
      sys_lib_search_path_spec=
      lt_save_ifs=$IFS
      IFS=';'
      for lt_path in $LIB
      do
        IFS=$lt_save_ifs
        # Let DOS variable expansion print the short 8.3 style file name.
        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
      done
      IFS=$lt_save_ifs
      # Convert to MSYS style.
      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
      ;;
    cygwin*)
      # Convert to unix form, then to dos form, then back to unix form
      # but this time dos style (no spaces!) so that the unix form looks
      # like /cygdrive/c/PROGRA~1:/cygdr...
      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
      ;;
    *)
      sys_lib_search_path_spec=$LIB
      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
        # It is most probably a Windows format PATH.
        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
      else
        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
      fi
      # FIXME: find the short name or the path components, as spaces are
      # common. (e.g. "Program Files" -> "PROGRA~1")
      ;;
    esac

    # DLL is installed to $(libdir)/../bin by postinstall_cmds
    postinstall_cmds='base_file=`basename \$file`~
      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
      dldir=$destdir/`dirname \$dlpath`~
      test -d \$dldir || mkdir -p \$dldir~
      $install_prog $dir/$dlname \$dldir/$dlname'
    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
      dlpath=$dir/\$dldll~
       $RM \$dlpath'
    shlibpath_overrides_runpath=yes
    dynamic_linker='Win32 link.exe'
    ;;

  *)
    # Assume MSVC wrapper
    library_names_spec='$libname`echo $release | $SED -e 's/[.]/-/g'`$versuffix$shared_ext $libname.lib'
    dynamic_linker='Win32 ld.exe'
    ;;
  esac
  # FIXME: first we should search . and the directory the executable is in
  shlibpath_var=PATH
  ;;

darwin* | rhapsody*)
  dynamic_linker="$host_os dyld"
  version_type=darwin
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
  soname_spec='$libname$release$major$shared_ext'
  shlibpath_overrides_runpath=yes
  shlibpath_var=DYLD_LIBRARY_PATH
  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'

  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
  ;;

dgux*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

freebsd* | dragonfly*)
  # DragonFly does not have aout.  When/if they implement a new
  # versioning mechanism, adjust this.
  if test -x /usr/bin/objformat; then
    objformat=`/usr/bin/objformat`
  else
    case $host_os in
    freebsd[23].*) objformat=aout ;;
    *) objformat=elf ;;
    esac
  fi
  version_type=freebsd-$objformat
  case $version_type in
    freebsd-elf*)
      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
      soname_spec='$libname$release$shared_ext$major'
      need_version=no
      need_lib_prefix=no
      ;;
    freebsd-*)
      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
      need_version=yes
      ;;
  esac
  shlibpath_var=LD_LIBRARY_PATH
  case $host_os in
  freebsd2.*)
    shlibpath_overrides_runpath=yes
    ;;
  freebsd3.[01]* | freebsdelf3.[01]*)
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
    shlibpath_overrides_runpath=no
    hardcode_into_libs=yes
    ;;
  *) # from 4.6 on, and DragonFly
    shlibpath_overrides_runpath=yes
    hardcode_into_libs=yes
    ;;
  esac
  ;;

haiku*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  dynamic_linker="$host_os runtime_loader"
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LIBRARY_PATH
  shlibpath_overrides_runpath=no
  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
  hardcode_into_libs=yes
  ;;

hpux9* | hpux10* | hpux11*)
  # Give a soname corresponding to the major version so that dld.sl refuses to
  # link against other versions.
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  case $host_cpu in
  ia64*)
    shrext_cmds='.so'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.so"
    shlibpath_var=LD_LIBRARY_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    if test 32 = "$HPUX_IA64_MODE"; then
      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
    else
      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
    fi
    ;;
  hppa*64*)
    shrext_cmds='.sl'
    hardcode_into_libs=yes
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
    ;;
  *)
    shrext_cmds='.sl'
    dynamic_linker="$host_os dld.sl"
    shlibpath_var=SHLIB_PATH
    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    ;;
  esac
  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
  postinstall_cmds='chmod 555 $lib'
  # or fails outright, so override atomically:
  install_override_mode=555
  ;;

interix[3-9]*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

irix5* | irix6* | nonstopux*)
  case $host_os in
    nonstopux*) version_type=nonstopux ;;
    *)
	if test yes = "$lt_cv_prog_gnu_ld"; then
		version_type=linux # correct to gnu/linux during the next big refactor
	else
		version_type=irix
	fi ;;
  esac
  need_lib_prefix=no
  need_version=no
  soname_spec='$libname$release$shared_ext$major'
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
  case $host_os in
  irix5* | nonstopux*)
    libsuff= shlibsuff=
    ;;
  *)
    case $LD in # libtool.m4 will add one of these switches to LD
    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
      libsuff= shlibsuff= libmagic=32-bit;;
    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
      libsuff=32 shlibsuff=N32 libmagic=N32;;
    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
      libsuff=64 shlibsuff=64 libmagic=64-bit;;
    *) libsuff= shlibsuff= libmagic=never-match;;
    esac
    ;;
  esac
  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
  shlibpath_overrides_runpath=no
  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
  hardcode_into_libs=yes
  ;;

# No shared lib support for Linux oldld, aout, or coff.
linux*oldld* | linux*aout* | linux*coff*)
  dynamic_linker=no
  ;;

linux*android*)
  version_type=none # Android doesn't support versioned libraries.
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext'
  soname_spec='$libname$release$shared_ext'
  finish_cmds=
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  dynamic_linker='Android linker'
  # Don't embed -rpath directories since the linker doesn't support them.
  hardcode_libdir_flag_spec_CXX='-L$libdir'
  ;;

# This must be glibc/ELF.
linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no

  # Some binutils ld are patched to set DT_RUNPATH
  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
  $as_echo_n "(cached) " >&6
else
  lt_cv_shlibpath_overrides_runpath=no
    save_LDFLAGS=$LDFLAGS
    save_libdir=$libdir
    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
  lt_cv_shlibpath_overrides_runpath=yes
fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LDFLAGS=$save_LDFLAGS
    libdir=$save_libdir

fi

  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath

  # This implies no fast_install, which is unacceptable.
  # Some rework will be needed to allow for fast_install
  # before this can be enabled.
  hardcode_into_libs=yes

  # Ideally, we could use ldconfig to report *all* directores which are
  # searched for libraries, however this is still not possible.  Aside from not
  # being certain /sbin/ldconfig is available, command
  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
  # even though it is searched at run-time.  Try to do the best guess by
  # appending ld.so.conf contents (and includes) to the search path.
  if test -f /etc/ld.so.conf; then
    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
  fi

  # We used to test for /lib/ld.so.1 and disable shared libraries on
  # powerpc, because MkLinux only supported shared libraries with the
  # GNU dynamic linker.  Since this was broken with cross compilers,
  # most powerpc-linux boxes support dynamic linking these days and
  # people can always --disable-shared, the test was removed, and we
  # assume the GNU/Linux dynamic linker is in use.
  dynamic_linker='GNU/Linux ld.so'
  ;;

netbsdelf*-gnu)
  version_type=linux
  need_lib_prefix=no
  need_version=no
  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
  soname_spec='${libname}${release}${shared_ext}$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='NetBSD ld.elf_so'
  ;;

netbsd*)
  version_type=sunos
  need_lib_prefix=no
  need_version=no
  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
    dynamic_linker='NetBSD (a.out) ld.so'
  else
    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
    soname_spec='$libname$release$shared_ext$major'
    dynamic_linker='NetBSD ld.elf_so'
  fi
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  ;;

newsos6)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

*nto* | *qnx*)
  version_type=qnx
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  dynamic_linker='ldqnx.so'
  ;;

openbsd* | bitrig*)
  version_type=sunos
  sys_lib_dlsearch_path_spec=/usr/lib
  need_lib_prefix=no
  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
    need_version=no
  else
    need_version=yes
  fi
  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  ;;

os2*)
  libname_spec='$name'
  version_type=windows
  shrext_cmds=.dll
  need_version=no
  need_lib_prefix=no
  # OS/2 can only load a DLL with a base name of 8 characters or less.
  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
    v=$($ECHO $release$versuffix | tr -d .-);
    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
    $ECHO $n$v`$shared_ext'
  library_names_spec='${libname}_dll.$libext'
  dynamic_linker='OS/2 ld.exe'
  shlibpath_var=BEGINLIBPATH
  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
  postinstall_cmds='base_file=`basename \$file`~
    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
    dldir=$destdir/`dirname \$dlpath`~
    test -d \$dldir || mkdir -p \$dldir~
    $install_prog $dir/$dlname \$dldir/$dlname~
    chmod a+x \$dldir/$dlname~
    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
    fi'
  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
    dlpath=$dir/\$dldll~
    $RM \$dlpath'
  ;;

osf3* | osf4* | osf5*)
  version_type=osf
  need_lib_prefix=no
  need_version=no
  soname_spec='$libname$release$shared_ext$major'
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
  ;;

rdos*)
  dynamic_linker=no
  ;;

solaris*)
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  # ldd complains unless libraries are executable
  postinstall_cmds='chmod +x $lib'
  ;;

sunos4*)
  version_type=sunos
  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  if test yes = "$with_gnu_ld"; then
    need_lib_prefix=no
  fi
  need_version=yes
  ;;

sysv4 | sysv4.3*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  case $host_vendor in
    sni)
      shlibpath_overrides_runpath=no
      need_lib_prefix=no
      runpath_var=LD_RUN_PATH
      ;;
    siemens)
      need_lib_prefix=no
      ;;
    motorola)
      need_lib_prefix=no
      need_version=no
      shlibpath_overrides_runpath=no
      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
      ;;
  esac
  ;;

sysv4*MP*)
  if test -d /usr/nec; then
    version_type=linux # correct to gnu/linux during the next big refactor
    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
    soname_spec='$libname$shared_ext.$major'
    shlibpath_var=LD_LIBRARY_PATH
  fi
  ;;

sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
  version_type=sco
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=yes
  hardcode_into_libs=yes
  if test yes = "$with_gnu_ld"; then
    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
  else
    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
    case $host_os in
      sco3.2v5*)
        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
	;;
    esac
  fi
  sys_lib_dlsearch_path_spec='/usr/lib'
  ;;

tpf*)
  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
  version_type=linux # correct to gnu/linux during the next big refactor
  need_lib_prefix=no
  need_version=no
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  shlibpath_var=LD_LIBRARY_PATH
  shlibpath_overrides_runpath=no
  hardcode_into_libs=yes
  ;;

uts4*)
  version_type=linux # correct to gnu/linux during the next big refactor
  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
  soname_spec='$libname$release$shared_ext$major'
  shlibpath_var=LD_LIBRARY_PATH
  ;;

*)
  dynamic_linker=no
  ;;
esac
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
$as_echo "$dynamic_linker" >&6; }
test no = "$dynamic_linker" && can_build_shared=no

variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
if test yes = "$GCC"; then
  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
fi

if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
fi

if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
fi

# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec

# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"

# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH








































    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
hardcode_action_CXX=
if test -n "$hardcode_libdir_flag_spec_CXX" ||
   test -n "$runpath_var_CXX" ||
   test yes = "$hardcode_automatic_CXX"; then

  # We can hardcode non-existent directories.
  if test no != "$hardcode_direct_CXX" &&
     # If the only mechanism to avoid hardcoding is shlibpath_var, we
     # have to relink, otherwise we might link with an installed library
     # when we should be linking with a yet-to-be-installed one
     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" &&
     test no != "$hardcode_minus_L_CXX"; then
    # Linking always hardcodes the temporary library directory.
    hardcode_action_CXX=relink
  else
    # We can link without hardcoding, and we can hardcode nonexisting dirs.
    hardcode_action_CXX=immediate
  fi
else
  # We cannot hardcode anything, or else we can only hardcode existing
  # directories.
  hardcode_action_CXX=unsupported
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
$as_echo "$hardcode_action_CXX" >&6; }

if test relink = "$hardcode_action_CXX" ||
   test yes = "$inherit_rpath_CXX"; then
  # Fast installation is not supported
  enable_fast_install=no
elif test yes = "$shlibpath_overrides_runpath" ||
     test no = "$enable_shared"; then
  # Fast installation is not necessary
  enable_fast_install=needless
fi







  fi # test -n "$compiler"

  CC=$lt_save_CC
  CFLAGS=$lt_save_CFLAGS
  LDCXX=$LD
  LD=$lt_save_LD
  GCC=$lt_save_GCC
  with_gnu_ld=$lt_save_with_gnu_ld
  lt_cv_path_LDCXX=$lt_cv_path_LD
  lt_cv_path_LD=$lt_save_path_LD
  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
fi # test yes != "$_lt_caught_CXX_error"

ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


# Extract the first word of "$CXX", so it can be a program name with args.
set dummy $CXX; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_HAVE_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$HAVE_CXX"; then
  ac_cv_prog_HAVE_CXX="$HAVE_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_HAVE_CXX="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_HAVE_CXX" && ac_cv_prog_HAVE_CXX="no"
fi
fi
HAVE_CXX=$ac_cv_prog_HAVE_CXX
if test -n "$HAVE_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CXX" >&5
$as_echo "$HAVE_CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi



ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu
if test -n "$ac_tool_prefix"; then
  for ac_prog in gcc objcc objc cc CC
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_OBJC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$OBJC"; then
  ac_cv_prog_OBJC="$OBJC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_OBJC="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
OBJC=$ac_cv_prog_OBJC
if test -n "$OBJC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJC" >&5
$as_echo "$OBJC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$OBJC" && break
  done
fi
if test -z "$OBJC"; then
  ac_ct_OBJC=$OBJC
  for ac_prog in gcc objcc objc cc CC
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_OBJC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_OBJC"; then
  ac_cv_prog_ac_ct_OBJC="$ac_ct_OBJC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_OBJC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_OBJC=$ac_cv_prog_ac_ct_OBJC
if test -n "$ac_ct_OBJC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJC" >&5
$as_echo "$ac_ct_OBJC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_OBJC" && break
done

  if test "x$ac_ct_OBJC" = x; then
    OBJC="gcc"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    OBJC=$ac_ct_OBJC
  fi
fi

# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for Objective C compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU Objective C compiler" >&5
$as_echo_n "checking whether we are using the GNU Objective C compiler... " >&6; }
if ${ac_cv_objc_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_objc_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objc_compiler_gnu" >&5
$as_echo "$ac_cv_objc_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GOBJC=yes
else
  GOBJC=
fi
ac_test_OBJCFLAGS=${OBJCFLAGS+set}
ac_save_OBJCFLAGS=$OBJCFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $OBJC accepts -g" >&5
$as_echo_n "checking whether $OBJC accepts -g... " >&6; }
if ${ac_cv_prog_objc_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_objc_werror_flag=$ac_objc_werror_flag
   ac_objc_werror_flag=yes
   ac_cv_prog_objc_g=no
   OBJCFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  ac_cv_prog_objc_g=yes
else
  OBJCFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :

else
  ac_objc_werror_flag=$ac_save_objc_werror_flag
	 OBJCFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  ac_cv_prog_objc_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_objc_werror_flag=$ac_save_objc_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_objc_g" >&5
$as_echo "$ac_cv_prog_objc_g" >&6; }
if test "$ac_test_OBJCFLAGS" = set; then
  OBJCFLAGS=$ac_save_OBJCFLAGS
elif test $ac_cv_prog_objc_g = yes; then
  if test "$GOBJC" = yes; then
    OBJCFLAGS="-g -O2"
  else
    OBJCFLAGS="-g"
  fi
else
  if test "$GOBJC" = yes; then
    OBJCFLAGS="-O2"
  else
    OBJCFLAGS=
  fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

depcc="$OBJC" am_compiler_list='gcc3 gcc'

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_OBJC_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_OBJC_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false


  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_OBJC_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_OBJC_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_OBJC_dependencies_compiler_type" >&5
$as_echo "$am_cv_OBJC_dependencies_compiler_type" >&6; }
OBJCDEPMODE=depmode=$am_cv_OBJC_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_OBJC_dependencies_compiler_type" = gcc3; then
  am__fastdepOBJC_TRUE=
  am__fastdepOBJC_FALSE='#'
else
  am__fastdepOBJC_TRUE='#'
  am__fastdepOBJC_FALSE=
fi







{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working do while(0) macros" >&5
$as_echo_n "checking for working do while(0) macros... " >&6; }
if ${_cv_g_support_dowhile_macros+:} false; then :
  $as_echo_n "(cached) " >&6
else

	cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

	#define STMT_START do
	#define STMT_END while(0)
	#define STMT_TEST STMT_START { i = 0; } STMT_END
	int main(void) { int i = 1; STMT_TEST; return i; }
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  _cv_g_support_dowhile_macros=yes
else
  _cv_g_support_dowhile_macros=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_g_support_dowhile_macros" >&5
$as_echo "$_cv_g_support_dowhile_macros" >&6; }
if test x$_cv_g_support_dowhile_macros = xyes; then

$as_echo "#define HAVE_DOWHILE_MACROS 1" >>confdefs.h

fi


# Extract the first word of "valgrind", so it can be a program name with args.
set dummy valgrind; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_VALGRIND_PATH+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $VALGRIND_PATH in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_VALGRIND_PATH="$VALGRIND_PATH" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_VALGRIND_PATH="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_VALGRIND_PATH" && ac_cv_path_VALGRIND_PATH="no"
  ;;
esac
fi
VALGRIND_PATH=$ac_cv_path_VALGRIND_PATH
if test -n "$VALGRIND_PATH"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VALGRIND_PATH" >&5
$as_echo "$VALGRIND_PATH" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


 if test ! "x$VALGRIND_PATH" = "xno"; then
  HAVE_VALGRIND_TRUE=
  HAVE_VALGRIND_FALSE='#'
else
  HAVE_VALGRIND_TRUE='#'
  HAVE_VALGRIND_FALSE=
fi





                # Check whether --enable-introspection was given.
if test "${enable_introspection+set}" = set; then :
  enableval=$enable_introspection;
else
  enable_introspection=auto
fi


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gobject-introspection" >&5
$as_echo_n "checking for gobject-introspection... " >&6; }

        case $enable_introspection in #(
  no) :
            found_introspection="no (disabled, use --enable-introspection to enable)"
     ;; #(
      yes) :
            if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  :
else
  as_fn_error $? "gobject-introspection-1.0 is not installed" "$LINENO" 5
fi
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.31.1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.31.1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  found_introspection=yes
else
  as_fn_error $? "You need to have gobject-introspection >= 1.31.1 installed to build GStreamer Bad Plug-ins" "$LINENO" 5
fi
     ;; #(
      auto) :
            if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gobject-introspection-1.0 >= 1.31.1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gobject-introspection-1.0 >= 1.31.1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  found_introspection=yes
else
  found_introspection=no
fi
     ;; #(
  *) :
                as_fn_error $? "invalid argument passed to --enable-introspection, should be one of [no/auto/yes]" "$LINENO" 5
     ;;
esac
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $found_introspection" >&5
$as_echo "$found_introspection" >&6; }

    INTROSPECTION_SCANNER=
    INTROSPECTION_COMPILER=
    INTROSPECTION_GENERATE=
    INTROSPECTION_GIRDIR=
    INTROSPECTION_TYPELIBDIR=
    if test "x$found_introspection" = "xyes"; then
       INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
       INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
       INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
       INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
       INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
       INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
       INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
       INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
       INTROSPECTION_INIT="extern void gst_init(gint*,gchar**); gst_init(NULL,NULL);"
    fi










     if test "x$found_introspection" = "xyes"; then
  HAVE_INTROSPECTION_TRUE=
  HAVE_INTROSPECTION_FALSE='#'
else
  HAVE_INTROSPECTION_TRUE='#'
  HAVE_INTROSPECTION_FALSE=
fi







    # Extract the first word of "gtkdoc-check", so it can be a program name with args.
set dummy gtkdoc-check; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GTKDOC_CHECK+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GTKDOC_CHECK in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GTKDOC_CHECK="$GTKDOC_CHECK" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GTKDOC_CHECK="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
GTKDOC_CHECK=$ac_cv_path_GTKDOC_CHECK
if test -n "$GTKDOC_CHECK"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_CHECK" >&5
$as_echo "$GTKDOC_CHECK" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  for ac_prog in gtkdoc-rebase
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GTKDOC_REBASE+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GTKDOC_REBASE in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GTKDOC_REBASE="$GTKDOC_REBASE" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GTKDOC_REBASE="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
GTKDOC_REBASE=$ac_cv_path_GTKDOC_REBASE
if test -n "$GTKDOC_REBASE"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_REBASE" >&5
$as_echo "$GTKDOC_REBASE" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$GTKDOC_REBASE" && break
done
test -n "$GTKDOC_REBASE" || GTKDOC_REBASE="true"

  # Extract the first word of "gtkdoc-mkpdf", so it can be a program name with args.
set dummy gtkdoc-mkpdf; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GTKDOC_MKPDF+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GTKDOC_MKPDF in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GTKDOC_MKPDF="$GTKDOC_MKPDF" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GTKDOC_MKPDF="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
GTKDOC_MKPDF=$ac_cv_path_GTKDOC_MKPDF
if test -n "$GTKDOC_MKPDF"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GTKDOC_MKPDF" >&5
$as_echo "$GTKDOC_MKPDF" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi




# Check whether --with-html-dir was given.
if test "${with_html_dir+set}" = set; then :
  withval=$with_html_dir;
else
  with_html_dir='${datadir}/gtk-doc/html'
fi

  HTML_DIR="$with_html_dir"


    # Check whether --enable-gtk-doc was given.
if test "${enable_gtk_doc+set}" = set; then :
  enableval=$enable_gtk_doc;
else
  enable_gtk_doc=no
fi


  if test x$enable_gtk_doc = xyes; then
    if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk-doc >= 1.12\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk-doc >= 1.12") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  :
else
  as_fn_error $? "You need to have gtk-doc >= 1.12 installed to build $PACKAGE_NAME" "$LINENO" 5
fi
        if test "x$PACKAGE_NAME" != "xglib"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTKDOC_DEPS" >&5
$as_echo_n "checking for GTKDOC_DEPS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTKDOC_DEPS_CFLAGS"; then
        pkg_cv_GTKDOC_DEPS_CFLAGS="$GTKDOC_DEPS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTKDOC_DEPS_CFLAGS=`$PKG_CONFIG --cflags "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTKDOC_DEPS_LIBS"; then
        pkg_cv_GTKDOC_DEPS_LIBS="$GTKDOC_DEPS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTKDOC_DEPS_LIBS=`$PKG_CONFIG --libs "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0"`
        else
	        GTKDOC_DEPS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTKDOC_DEPS_PKG_ERRORS" >&5

	as_fn_error $? "Package requirements (glib-2.0 >= 2.10.0 gobject-2.0  >= 2.10.0) were not met:

$GTKDOC_DEPS_PKG_ERRORS

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" "$LINENO" 5
elif test $pkg_failed = untried; then
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables GTKDOC_DEPS_CFLAGS
and GTKDOC_DEPS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
	GTKDOC_DEPS_CFLAGS=$pkg_cv_GTKDOC_DEPS_CFLAGS
	GTKDOC_DEPS_LIBS=$pkg_cv_GTKDOC_DEPS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
    fi
        if test -z "$SED"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
$as_echo_n "checking for a sed that does not truncate output... " >&6; }
if ${ac_cv_path_SED+:} false; then :
  $as_echo_n "(cached) " >&6
else
            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
     for ac_i in 1 2 3 4 5 6 7; do
       ac_script="$ac_script$as_nl$ac_script"
     done
     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
     { ac_script=; unset ac_script;}
     if test -z "$SED"; then
  ac_path_SED_found=false
  # Loop through the user's path and test for each of PROGNAME-LIST
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_prog in sed gsed; do
    for ac_exec_ext in '' $ac_executable_extensions; do
      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
      as_fn_executable_p "$ac_path_SED" || continue
# Check for GNU ac_path_SED and select it if it is found.
  # Check for GNU $ac_path_SED
case `"$ac_path_SED" --version 2>&1` in
*GNU*)
  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
*)
  ac_count=0
  $as_echo_n 0123456789 >"conftest.in"
  while :
  do
    cat "conftest.in" "conftest.in" >"conftest.tmp"
    mv "conftest.tmp" "conftest.in"
    cp "conftest.in" "conftest.nl"
    $as_echo '' >> "conftest.nl"
    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
    as_fn_arith $ac_count + 1 && ac_count=$as_val
    if test $ac_count -gt ${ac_path_SED_max-0}; then
      # Best one so far, save it but keep looking for a better one
      ac_cv_path_SED="$ac_path_SED"
      ac_path_SED_max=$ac_count
    fi
    # 10*(2^10) chars as input seems more than enough
    test $ac_count -gt 10 && break
  done
  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
esac

      $ac_path_SED_found && break 3
    done
  done
  done
IFS=$as_save_IFS
  if test -z "$ac_cv_path_SED"; then
    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
  fi
else
  ac_cv_path_SED=$SED
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
$as_echo "$ac_cv_path_SED" >&6; }
 SED="$ac_cv_path_SED"
  rm -f conftest.sed

    fi
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build gtk-doc documentation" >&5
$as_echo_n "checking whether to build gtk-doc documentation... " >&6; }
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_gtk_doc" >&5
$as_echo "$enable_gtk_doc" >&6; }

    # Check whether --enable-gtk-doc-html was given.
if test "${enable_gtk_doc_html+set}" = set; then :
  enableval=$enable_gtk_doc_html;
else
  enable_gtk_doc_html=yes
fi

    # Check whether --enable-gtk-doc-pdf was given.
if test "${enable_gtk_doc_pdf+set}" = set; then :
  enableval=$enable_gtk_doc_pdf;
else
  enable_gtk_doc_pdf=no
fi


  if test -z "$GTKDOC_MKPDF"; then
    enable_gtk_doc_pdf=no
  fi


   if test x$enable_gtk_doc = xyes; then
  ENABLE_GTK_DOC_TRUE=
  ENABLE_GTK_DOC_FALSE='#'
else
  ENABLE_GTK_DOC_TRUE='#'
  ENABLE_GTK_DOC_FALSE=
fi

   if test x$enable_gtk_doc_html = xyes; then
  GTK_DOC_BUILD_HTML_TRUE=
  GTK_DOC_BUILD_HTML_FALSE='#'
else
  GTK_DOC_BUILD_HTML_TRUE='#'
  GTK_DOC_BUILD_HTML_FALSE=
fi

   if test x$enable_gtk_doc_pdf = xyes; then
  GTK_DOC_BUILD_PDF_TRUE=
  GTK_DOC_BUILD_PDF_FALSE='#'
else
  GTK_DOC_BUILD_PDF_TRUE='#'
  GTK_DOC_BUILD_PDF_FALSE=
fi

   if test -n "$LIBTOOL"; then
  GTK_DOC_USE_LIBTOOL_TRUE=
  GTK_DOC_USE_LIBTOOL_FALSE='#'
else
  GTK_DOC_USE_LIBTOOL_TRUE='#'
  GTK_DOC_USE_LIBTOOL_FALSE=
fi








        # Find any Python interpreter.
    if test -z "$PYTHON"; then
      for ac_prog in python python2 python3 python3.3 python3.2 python3.1 python3.0 python2.7  python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_PYTHON+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PYTHON in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
PYTHON=$ac_cv_path_PYTHON
if test -n "$PYTHON"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
$as_echo "$PYTHON" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$PYTHON" && break
done
test -n "$PYTHON" || PYTHON=":"

    fi
    am_display_PYTHON=python


  if test "$PYTHON" = :; then
      as_fn_error $? "no suitable Python interpreter found" "$LINENO" 5
  else


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON version" >&5
$as_echo_n "checking for $am_display_PYTHON version... " >&6; }
if ${am_cv_python_version+:} false; then :
  $as_echo_n "(cached) " >&6
else
  am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[:3])"`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_version" >&5
$as_echo "$am_cv_python_version" >&6; }
  PYTHON_VERSION=$am_cv_python_version



  PYTHON_PREFIX='${prefix}'

  PYTHON_EXEC_PREFIX='${exec_prefix}'



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON platform" >&5
$as_echo_n "checking for $am_display_PYTHON platform... " >&6; }
if ${am_cv_python_platform+:} false; then :
  $as_echo_n "(cached) " >&6
else
  am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_platform" >&5
$as_echo "$am_cv_python_platform" >&6; }
  PYTHON_PLATFORM=$am_cv_python_platform


  # Just factor out some code duplication.
  am_python_setup_sysconfig="\
import sys
# Prefer sysconfig over distutils.sysconfig, for better compatibility
# with python 3.x.  See automake bug#10227.
try:
    import sysconfig
except ImportError:
    can_use_sysconfig = 0
else:
    can_use_sysconfig = 1
# Can't use sysconfig in CPython 2.7, since it's broken in virtualenvs:
# <https://github.com/pypa/virtualenv/issues/118>
try:
    from platform import python_implementation
    if python_implementation() == 'CPython' and sys.version[:3] == '2.7':
        can_use_sysconfig = 0
except ImportError:
    pass"


            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON script directory" >&5
$as_echo_n "checking for $am_display_PYTHON script directory... " >&6; }
if ${am_cv_python_pythondir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$prefix" = xNONE
     then
       am_py_prefix=$ac_default_prefix
     else
       am_py_prefix=$prefix
     fi
     am_cv_python_pythondir=`$PYTHON -c "
$am_python_setup_sysconfig
if can_use_sysconfig:
    sitedir = sysconfig.get_path('purelib', vars={'base':'$am_py_prefix'})
else:
    from distutils import sysconfig
    sitedir = sysconfig.get_python_lib(0, 0, prefix='$am_py_prefix')
sys.stdout.write(sitedir)"`
     case $am_cv_python_pythondir in
     $am_py_prefix*)
       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
       ;;
     *)
       case $am_py_prefix in
         /usr|/System*) ;;
         *)
	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
	  ;;
       esac
       ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pythondir" >&5
$as_echo "$am_cv_python_pythondir" >&6; }
  pythondir=$am_cv_python_pythondir



  pkgpythondir=\${pythondir}/$PACKAGE


        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $am_display_PYTHON extension module directory" >&5
$as_echo_n "checking for $am_display_PYTHON extension module directory... " >&6; }
if ${am_cv_python_pyexecdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "x$exec_prefix" = xNONE
     then
       am_py_exec_prefix=$am_py_prefix
     else
       am_py_exec_prefix=$exec_prefix
     fi
     am_cv_python_pyexecdir=`$PYTHON -c "
$am_python_setup_sysconfig
if can_use_sysconfig:
    sitedir = sysconfig.get_path('platlib', vars={'platbase':'$am_py_prefix'})
else:
    from distutils import sysconfig
    sitedir = sysconfig.get_python_lib(1, 0, prefix='$am_py_prefix')
sys.stdout.write(sitedir)"`
     case $am_cv_python_pyexecdir in
     $am_py_exec_prefix*)
       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
       ;;
     *)
       case $am_py_exec_prefix in
         /usr|/System*) ;;
         *)
	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
	   ;;
       esac
       ;;
     esac

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_python_pyexecdir" >&5
$as_echo "$am_cv_python_pyexecdir" >&6; }
  pyexecdir=$am_cv_python_pyexecdir



  pkgpyexecdir=\${pyexecdir}/$PACKAGE



  fi




  build_plugin_docs=no
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build plugin documentation" >&5
$as_echo_n "checking whether to build plugin documentation... " >&6; }
  if test x$enable_gtk_doc = xyes; then
    if test x$PYTHON != x; then
      build_plugin_docs=yes
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (python not found)" >&5
$as_echo "no (python not found)" >&6; }
    fi
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no (gtk-doc disabled or not available)" >&5
$as_echo "no (gtk-doc disabled or not available)" >&6; }
  fi

   if test x$build_plugin_docs = xyes; then
  ENABLE_PLUGIN_DOCS_TRUE=
  ENABLE_PLUGIN_DOCS_FALSE='#'
else
  ENABLE_PLUGIN_DOCS_TRUE='#'
  ENABLE_PLUGIN_DOCS_FALSE=
fi




LIBM=
case $host in
*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
  # These system don't have libm, or don't need it
  ;;
*-ncr-sysv4.3*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _mwvalidcheckl in -lmw" >&5
$as_echo_n "checking for _mwvalidcheckl in -lmw... " >&6; }
if ${ac_cv_lib_mw__mwvalidcheckl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lmw  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char _mwvalidcheckl ();
int
main ()
{
return _mwvalidcheckl ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_mw__mwvalidcheckl=yes
else
  ac_cv_lib_mw__mwvalidcheckl=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mw__mwvalidcheckl" >&5
$as_echo "$ac_cv_lib_mw__mwvalidcheckl" >&6; }
if test "x$ac_cv_lib_mw__mwvalidcheckl" = xyes; then :
  LIBM=-lmw
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
$as_echo_n "checking for cos in -lm... " >&6; }
if ${ac_cv_lib_m_cos+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char cos ();
int
main ()
{
return cos ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_cos=yes
else
  ac_cv_lib_m_cos=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
$as_echo "$ac_cv_lib_m_cos" >&6; }
if test "x$ac_cv_lib_m_cos" = xyes; then :
  LIBM="$LIBM -lm"
fi

  ;;
*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5
$as_echo_n "checking for cos in -lm... " >&6; }
if ${ac_cv_lib_m_cos+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char cos ();
int
main ()
{
return cos ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_m_cos=yes
else
  ac_cv_lib_m_cos=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_cos" >&5
$as_echo "$ac_cv_lib_m_cos" >&6; }
if test "x$ac_cv_lib_m_cos" = xyes; then :
  LIBM=-lm
fi

  ;;
esac







  for ac_header in $ac_header_list
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

fi

done








for ac_func in getpagesize
do :
  ac_fn_c_check_func "$LINENO" "getpagesize" "ac_cv_func_getpagesize"
if test "x$ac_cv_func_getpagesize" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GETPAGESIZE 1
_ACEOF

fi
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for working mmap" >&5
$as_echo_n "checking for working mmap... " >&6; }
if ${ac_cv_func_mmap_fixed_mapped+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_func_mmap_fixed_mapped=no
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$ac_includes_default
/* malloc might have been renamed as rpl_malloc. */
#undef malloc

/* Thanks to Mike Haertel and Jim Avera for this test.
   Here is a matrix of mmap possibilities:
	mmap private not fixed
	mmap private fixed at somewhere currently unmapped
	mmap private fixed at somewhere already mapped
	mmap shared not fixed
	mmap shared fixed at somewhere currently unmapped
	mmap shared fixed at somewhere already mapped
   For private mappings, we should verify that changes cannot be read()
   back from the file, nor mmap's back from the file at a different
   address.  (There have been systems where private was not correctly
   implemented like the infamous i386 svr4.0, and systems where the
   VM page cache was not coherent with the file system buffer cache
   like early versions of FreeBSD and possibly contemporary NetBSD.)
   For shared mappings, we should conversely verify that changes get
   propagated back to all the places they're supposed to be.

   Grep wants private fixed already mapped.
   The main things grep needs to know about mmap are:
   * does it exist and is it safe to write into the mmap'd area
   * how to use it (BSD variants)  */

#include <fcntl.h>
#include <sys/mman.h>

#if !defined STDC_HEADERS && !defined HAVE_STDLIB_H
char *malloc ();
#endif

/* This mess was copied from the GNU getpagesize.h.  */
#ifndef HAVE_GETPAGESIZE
# ifdef _SC_PAGESIZE
#  define getpagesize() sysconf(_SC_PAGESIZE)
# else /* no _SC_PAGESIZE */
#  ifdef HAVE_SYS_PARAM_H
#   include <sys/param.h>
#   ifdef EXEC_PAGESIZE
#    define getpagesize() EXEC_PAGESIZE
#   else /* no EXEC_PAGESIZE */
#    ifdef NBPG
#     define getpagesize() NBPG * CLSIZE
#     ifndef CLSIZE
#      define CLSIZE 1
#     endif /* no CLSIZE */
#    else /* no NBPG */
#     ifdef NBPC
#      define getpagesize() NBPC
#     else /* no NBPC */
#      ifdef PAGESIZE
#       define getpagesize() PAGESIZE
#      endif /* PAGESIZE */
#     endif /* no NBPC */
#    endif /* no NBPG */
#   endif /* no EXEC_PAGESIZE */
#  else /* no HAVE_SYS_PARAM_H */
#   define getpagesize() 8192	/* punt totally */
#  endif /* no HAVE_SYS_PARAM_H */
# endif /* no _SC_PAGESIZE */

#endif /* no HAVE_GETPAGESIZE */

int
main ()
{
  char *data, *data2, *data3;
  const char *cdata2;
  int i, pagesize;
  int fd, fd2;

  pagesize = getpagesize ();

  /* First, make a file with some known garbage in it. */
  data = (char *) malloc (pagesize);
  if (!data)
    return 1;
  for (i = 0; i < pagesize; ++i)
    *(data + i) = rand ();
  umask (0);
  fd = creat ("conftest.mmap", 0600);
  if (fd < 0)
    return 2;
  if (write (fd, data, pagesize) != pagesize)
    return 3;
  close (fd);

  /* Next, check that the tail of a page is zero-filled.  File must have
     non-zero length, otherwise we risk SIGBUS for entire page.  */
  fd2 = open ("conftest.txt", O_RDWR | O_CREAT | O_TRUNC, 0600);
  if (fd2 < 0)
    return 4;
  cdata2 = "";
  if (write (fd2, cdata2, 1) != 1)
    return 5;
  data2 = (char *) mmap (0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd2, 0L);
  if (data2 == MAP_FAILED)
    return 6;
  for (i = 0; i < pagesize; ++i)
    if (*(data2 + i))
      return 7;
  close (fd2);
  if (munmap (data2, pagesize))
    return 8;

  /* Next, try to mmap the file at a fixed address which already has
     something else allocated at it.  If we can, also make sure that
     we see the same garbage.  */
  fd = open ("conftest.mmap", O_RDWR);
  if (fd < 0)
    return 9;
  if (data2 != mmap (data2, pagesize, PROT_READ | PROT_WRITE,
		     MAP_PRIVATE | MAP_FIXED, fd, 0L))
    return 10;
  for (i = 0; i < pagesize; ++i)
    if (*(data + i) != *(data2 + i))
      return 11;

  /* Finally, make sure that changes to the mapped area do not
     percolate back to the file as seen by read().  (This is a bug on
     some variants of i386 svr4.0.)  */
  for (i = 0; i < pagesize; ++i)
    *(data2 + i) = *(data2 + i) + 1;
  data3 = (char *) malloc (pagesize);
  if (!data3)
    return 12;
  if (read (fd, data3, pagesize) != pagesize)
    return 13;
  for (i = 0; i < pagesize; ++i)
    if (*(data + i) != *(data3 + i))
      return 14;
  close (fd);
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_func_mmap_fixed_mapped=yes
else
  ac_cv_func_mmap_fixed_mapped=no
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_mmap_fixed_mapped" >&5
$as_echo "$ac_cv_func_mmap_fixed_mapped" >&6; }
if test $ac_cv_func_mmap_fixed_mapped = yes; then

$as_echo "#define HAVE_MMAP 1" >>confdefs.h

fi
rm -f conftest.mmap conftest.txt




ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

ax_pthread_ok=no

# We used to check for pthread.h first, but this fails if pthread.h
# requires special compiler flags (e.g. on True64 or Sequent).
# It gets checked for in the link test anyway.

# First of all, check if the user has set any of the PTHREAD_LIBS,
# etcetera environment variables, and if threads linking works using
# them:
if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
        save_CFLAGS="$CFLAGS"
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
        save_LIBS="$LIBS"
        LIBS="$PTHREAD_LIBS $LIBS"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char pthread_join ();
int
main ()
{
return pthread_join ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ax_pthread_ok=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
$as_echo "$ax_pthread_ok" >&6; }
        if test x"$ax_pthread_ok" = xno; then
                PTHREAD_LIBS=""
                PTHREAD_CFLAGS=""
        fi
        LIBS="$save_LIBS"
        CFLAGS="$save_CFLAGS"
fi

# We must check for the threads library under a number of different
# names; the ordering is very important because some systems
# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
# libraries is broken (non-POSIX).

# Create a list of thread flags to try.  Items starting with a "-" are
# C compiler flags, and other items are library names, except for "none"
# which indicates that we try without any flags at all, and "pthread-config"
# which is a program returning the flags for the Pth emulation library.

ax_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"

# The ordering *is* (sometimes) important.  Some notes on the
# individual items follow:

# pthreads: AIX (must check this before -lpthread)
# none: in case threads are in libc; should be tried before -Kthread and
#       other compiler flags to prevent continual compiler warnings
# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
# -pthreads: Solaris/gcc
# -mthreads: Mingw32/gcc, Lynx/gcc
# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
#      doesn't hurt to check since this sometimes defines pthreads too;
#      also defines -D_REENTRANT)
#      ... -mt is also the pthreads flag for HP/aCC
# pthread: Linux, etcetera
# --thread-safe: KAI C++
# pthread-config: use pthread-config program (for GNU Pth library)

case ${host_os} in
        solaris*)

        # On Solaris (at least, for some versions), libc contains stubbed
        # (non-functional) versions of the pthreads routines, so link-based
        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
        # a function called by this macro, so we could check for that, but
        # who knows whether they'll stub that too in a future libc.)  So,
        # we'll just look for -pthreads and -lpthread first:

        ax_pthread_flags="-pthreads pthread -mt -pthread $ax_pthread_flags"
        ;;

        darwin*)
        ax_pthread_flags="-pthread $ax_pthread_flags"
        ;;
esac

# Clang doesn't consider unrecognized options an error unless we specify
# -Werror. We throw in some extra Clang-specific options to ensure that
# this doesn't happen for GCC, which also accepts -Werror.

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags" >&5
$as_echo_n "checking if compiler needs -Werror to reject unknown flags... " >&6; }
save_CFLAGS="$CFLAGS"
ax_pthread_extra_flags="-Werror"
CFLAGS="$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int foo(void);
int
main ()
{
foo()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
else
  ax_pthread_extra_flags=
                   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS="$save_CFLAGS"

if test x"$ax_pthread_ok" = xno; then
for flag in $ax_pthread_flags; do

        case $flag in
                none)
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
$as_echo_n "checking whether pthreads work without any flags... " >&6; }
                ;;

                -*)
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
$as_echo_n "checking whether pthreads work with $flag... " >&6; }
                PTHREAD_CFLAGS="$flag"
                ;;

                pthread-config)
                # Extract the first word of "pthread-config", so it can be a program name with args.
set dummy pthread-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ax_pthread_config+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ax_pthread_config"; then
  ac_cv_prog_ax_pthread_config="$ax_pthread_config" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ax_pthread_config="yes"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_prog_ax_pthread_config" && ac_cv_prog_ax_pthread_config="no"
fi
fi
ax_pthread_config=$ac_cv_prog_ax_pthread_config
if test -n "$ax_pthread_config"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config" >&5
$as_echo "$ax_pthread_config" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


                if test x"$ax_pthread_config" = xno; then continue; fi
                PTHREAD_CFLAGS="`pthread-config --cflags`"
                PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
                ;;

                *)
                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
                PTHREAD_LIBS="-l$flag"
                ;;
        esac

        save_LIBS="$LIBS"
        save_CFLAGS="$CFLAGS"
        LIBS="$PTHREAD_LIBS $LIBS"
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags"

        # Check for various functions.  We must include pthread.h,
        # since some functions may be macros.  (On the Sequent, we
        # need a special flag -Kthread to make this header compile.)
        # We check for pthread_join because it is in -lpthread on IRIX
        # while pthread_create is in libc.  We check for pthread_attr_init
        # due to DEC craziness with -lpthreads.  We check for
        # pthread_cleanup_push because it is one of the few pthread
        # functions on Solaris that doesn't have a non-functional libc stub.
        # We try pthread_create on general principles.
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
                        static void routine(void *a) { a = 0; }
                        static void *start_routine(void *a) { return a; }
int
main ()
{
pthread_t th; pthread_attr_t attr;
                        pthread_create(&th, 0, start_routine, 0);
                        pthread_join(th, 0);
                        pthread_attr_init(&attr);
                        pthread_cleanup_push(routine, 0);
                        pthread_cleanup_pop(0) /* ; */
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ax_pthread_ok=yes
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

        LIBS="$save_LIBS"
        CFLAGS="$save_CFLAGS"

        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok" >&5
$as_echo "$ax_pthread_ok" >&6; }
        if test "x$ax_pthread_ok" = xyes; then
                break;
        fi

        PTHREAD_LIBS=""
        PTHREAD_CFLAGS=""
done
fi

# Various other checks:
if test "x$ax_pthread_ok" = xyes; then
        save_LIBS="$LIBS"
        LIBS="$PTHREAD_LIBS $LIBS"
        save_CFLAGS="$CFLAGS"
        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"

        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
$as_echo_n "checking for joinable pthread attribute... " >&6; }
        attr_name=unknown
        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
            cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
int
main ()
{
int attr = $attr; return attr /* ; */
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  attr_name=$attr; break
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        done
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
$as_echo "$attr_name" >&6; }
        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then

cat >>confdefs.h <<_ACEOF
#define PTHREAD_CREATE_JOINABLE $attr_name
_ACEOF

        fi

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
        flag=no
        case ${host_os} in
            aix* | freebsd* | darwin*) flag="-D_THREAD_SAFE";;
            osf* | hpux*) flag="-D_REENTRANT";;
            solaris*)
            if test "$GCC" = "yes"; then
                flag="-D_REENTRANT"
            else
                # TODO: What about Clang on Solaris?
                flag="-mt -D_REENTRANT"
            fi
            ;;
        esac
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag" >&5
$as_echo "$flag" >&6; }
        if test "x$flag" != xno; then
            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
        fi

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT" >&5
$as_echo_n "checking for PTHREAD_PRIO_INHERIT... " >&6; }
if ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :
  $as_echo_n "(cached) " >&6
else

                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <pthread.h>
int
main ()
{
int i = PTHREAD_PRIO_INHERIT;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ax_cv_PTHREAD_PRIO_INHERIT=yes
else
  ax_cv_PTHREAD_PRIO_INHERIT=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT" >&5
$as_echo "$ax_cv_PTHREAD_PRIO_INHERIT" >&6; }
        if test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes"; then :

$as_echo "#define HAVE_PTHREAD_PRIO_INHERIT 1" >>confdefs.h

fi

        LIBS="$save_LIBS"
        CFLAGS="$save_CFLAGS"

        # More AIX lossage: compile with *_r variant
        if test "x$GCC" != xyes; then
            case $host_os in
                aix*)
                case "x/$CC" in #(
  x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :
    #handle absolute path differently from PATH based program lookup
                   case "x$CC" in #(
  x/*) :
    if as_fn_executable_p ${CC}_r; then :
  PTHREAD_CC="${CC}_r"
fi ;; #(
  *) :
    for ac_prog in ${CC}_r
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_PTHREAD_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$PTHREAD_CC"; then
  ac_cv_prog_PTHREAD_CC="$PTHREAD_CC" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_PTHREAD_CC="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
if test -n "$PTHREAD_CC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
$as_echo "$PTHREAD_CC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$PTHREAD_CC" && break
done
test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"
 ;;
esac ;; #(
  *) :
     ;;
esac
                ;;
            esac
        fi
fi

test -n "$PTHREAD_CC" || PTHREAD_CC="$CC"





# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
if test x"$ax_pthread_ok" = xyes; then

$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h

        :
else
        ax_pthread_ok=no

fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu




for ac_header in unistd.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "unistd.h" "ac_cv_header_unistd_h" "$ac_includes_default"
if test "x$ac_cv_header_unistd_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_UNISTD_H 1
_ACEOF
 HAVE_UNISTD_H=yes
fi

done

 if test "x$HAVE_UNISTD_H" = "xyes"; then
  HAVE_UNISTD_H_TRUE=
  HAVE_UNISTD_H_FALSE='#'
else
  HAVE_UNISTD_H_TRUE='#'
  HAVE_UNISTD_H_FALSE=
fi


if test "x$HAVE_UNISTD_H" != "xyes"; then
  GST_PLUGINS_SELECTED=`echo $GST_PLUGINS_SELECTED | $SED -e s/festival//`
fi

for ac_header in sys/time.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_time_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_TIME_H 1
_ACEOF

fi

done


# ------ AX CREATE STDINT H -------------------------------------
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint types" >&5
$as_echo_n "checking for stdint types... " >&6; }
ac_stdint_h=`echo _stdint.h`
# try to shortcircuit - if the default include path of the compiler
# can find a "stdint.h" header then we assume that all compilers can.
if ${ac_cv_header_stdint_t+:} false; then :
  $as_echo_n "(cached) " >&6
else

old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
old_CFLAGS="$CFLAGS"     ; CFLAGS=""
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
int
main ()
{
int_least32_t v = 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_stdint_result="(assuming C99 compatible system)"
 ac_cv_header_stdint_t="stdint.h";
else
  ac_cv_header_stdint_t=""
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
if test "$GCC" = "yes" && test ".$ac_cv_header_stdint_t" = "."; then
CFLAGS="-std=c99"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdint.h>
int
main ()
{
int_least32_t v = 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&5
$as_echo "$as_me: WARNING: your GCC compiler has a defunct stdint.h for its default-mode" >&2;}
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
CXXFLAGS="$old_CXXFLAGS"
CPPFLAGS="$old_CPPFLAGS"
CFLAGS="$old_CFLAGS"
fi


v="... $ac_cv_header_stdint_h"
if test "$ac_stdint_h" = "stdint.h" ; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./stdint.h?)" >&5
$as_echo "(are you sure you want them in ./stdint.h?)" >&6; }
elif test "$ac_stdint_h" = "inttypes.h" ; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: (are you sure you want them in ./inttypes.h?)" >&5
$as_echo "(are you sure you want them in ./inttypes.h?)" >&6; }
elif test "_$ac_cv_header_stdint_t" = "_" ; then
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: (putting them into $ac_stdint_h)$v" >&5
$as_echo "(putting them into $ac_stdint_h)$v" >&6; }
else
 ac_cv_header_stdint="$ac_cv_header_stdint_t"
 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint (shortcircuit)" >&5
$as_echo "$ac_cv_header_stdint (shortcircuit)" >&6; }
fi

if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..


inttype_headers=`echo  | sed -e 's/,/ /g'`

ac_cv_stdint_result="(no helpful system typedefs seen)"

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
$as_echo_n "checking for stdint uintptr_t... " >&6; }
if ${ac_cv_header_stdint_x+:} false; then :
  $as_echo_n "(cached) " >&6
else

 ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
$as_echo "(..)" >&6; }
  for i in    stdint.h inttypes.h sys/inttypes.h $inttype_headers
  do
   unset ac_cv_type_uintptr_t
   unset ac_cv_type_uint64_t
   ac_fn_c_check_type "$LINENO" "uintptr_t" "ac_cv_type_uintptr_t" "#include <$i>
"
if test "x$ac_cv_type_uintptr_t" = xyes; then :
  ac_cv_header_stdint_x=$i
else
  continue
fi

   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
"
if test "x$ac_cv_type_uint64_t" = xyes; then :
  and64="/uint64_t"
else
  and64=""
fi

   ac_cv_stdint_result="(seen uintptr_t$and64 in $i)"
 break
  done
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uintptr_t" >&5
$as_echo_n "checking for stdint uintptr_t... " >&6; }

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_x" >&5
$as_echo "$ac_cv_header_stdint_x" >&6; }


if test "_$ac_cv_header_stdint_x" = "_" ; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
$as_echo_n "checking for stdint uint32_t... " >&6; }
if ${ac_cv_header_stdint_o+:} false; then :
  $as_echo_n "(cached) " >&6
else

 ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
$as_echo "(..)" >&6; }
  for i in    inttypes.h sys/inttypes.h stdint.h $inttype_headers
  do
   unset ac_cv_type_uint32_t
   unset ac_cv_type_uint64_t
   ac_fn_c_check_type "$LINENO" "uint32_t" "ac_cv_type_uint32_t" "#include <$i>
"
if test "x$ac_cv_type_uint32_t" = xyes; then :
  ac_cv_header_stdint_o=$i
else
  continue
fi

   ac_fn_c_check_type "$LINENO" "uint64_t" "ac_cv_type_uint64_t" "#include<$i>
"
if test "x$ac_cv_type_uint64_t" = xyes; then :
  and64="/uint64_t"
else
  and64=""
fi

   ac_cv_stdint_result="(seen uint32_t$and64 in $i)"
 break
   break;
  done
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint uint32_t" >&5
$as_echo_n "checking for stdint uint32_t... " >&6; }

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_o" >&5
$as_echo "$ac_cv_header_stdint_o" >&6; }

fi

if test "_$ac_cv_header_stdint_x" = "_" ; then
if test "_$ac_cv_header_stdint_o" = "_" ; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
$as_echo_n "checking for stdint u_int32_t... " >&6; }
if ${ac_cv_header_stdint_u+:} false; then :
  $as_echo_n "(cached) " >&6
else

 ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
$as_echo "(..)" >&6; }
  for i in    sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do
   unset ac_cv_type_u_int32_t
   unset ac_cv_type_u_int64_t
   ac_fn_c_check_type "$LINENO" "u_int32_t" "ac_cv_type_u_int32_t" "#include <$i>
"
if test "x$ac_cv_type_u_int32_t" = xyes; then :
  ac_cv_header_stdint_u=$i
else
  continue
fi

   ac_fn_c_check_type "$LINENO" "u_int64_t" "ac_cv_type_u_int64_t" "#include<$i>
"
if test "x$ac_cv_type_u_int64_t" = xyes; then :
  and64="/u_int64_t"
else
  and64=""
fi

   ac_cv_stdint_result="(seen u_int32_t$and64 in $i)"
 break
   break;
  done
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint u_int32_t" >&5
$as_echo_n "checking for stdint u_int32_t... " >&6; }

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdint_u" >&5
$as_echo "$ac_cv_header_stdint_u" >&6; }

fi fi

if test "_$ac_cv_header_stdint_x" = "_" ; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for stdint datatype model" >&5
$as_echo_n "checking for stdint datatype model... " >&6; }
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: (..)" >&5
$as_echo "(..)" >&6; }

   # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5
$as_echo_n "checking size of char... " >&6; }
if ${ac_cv_sizeof_char+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_char" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (char)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_char=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5
$as_echo "$ac_cv_sizeof_char" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_CHAR $ac_cv_sizeof_char
_ACEOF


   # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5
$as_echo_n "checking size of short... " >&6; }
if ${ac_cv_sizeof_short+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_short" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (short)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_short=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5
$as_echo "$ac_cv_sizeof_short" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_SHORT $ac_cv_sizeof_short
_ACEOF


   # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5
$as_echo_n "checking size of int... " >&6; }
if ${ac_cv_sizeof_int+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_int" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (int)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_int=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5
$as_echo "$ac_cv_sizeof_int" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_INT $ac_cv_sizeof_int
_ACEOF


   # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5
$as_echo_n "checking size of long... " >&6; }
if ${ac_cv_sizeof_long+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_long" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (long)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_long=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5
$as_echo "$ac_cv_sizeof_long" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_LONG $ac_cv_sizeof_long
_ACEOF


   # The cast to long int works around a bug in the HP C Compiler
# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
# This bug is HP SR number 8606223364.
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void*" >&5
$as_echo_n "checking size of void*... " >&6; }
if ${ac_cv_sizeof_voidp+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void*))" "ac_cv_sizeof_voidp"        "$ac_includes_default"; then :

else
  if test "$ac_cv_type_voidp" = yes; then
     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error 77 "cannot compute sizeof (void*)
See \`config.log' for more details" "$LINENO" 5; }
   else
     ac_cv_sizeof_voidp=0
   fi
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_voidp" >&5
$as_echo "$ac_cv_sizeof_voidp" >&6; }



cat >>confdefs.h <<_ACEOF
#define SIZEOF_VOIDP $ac_cv_sizeof_voidp
_ACEOF


   ac_cv_char_data_model=""
   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_char"
   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_short"
   ac_cv_char_data_model="$ac_cv_char_data_model$ac_cv_sizeof_int"
   ac_cv_long_data_model=""
   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_int"
   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_long"
   ac_cv_long_data_model="$ac_cv_long_data_model$ac_cv_sizeof_voidp"
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking data model" >&5
$as_echo_n "checking data model... " >&6; }
   case "$ac_cv_char_data_model/$ac_cv_long_data_model" in
    122/242)     ac_cv_data_model="IP16"  ; n="standard 16bit machine" ;;
    122/244)     ac_cv_data_model="LP32"  ; n="standard 32bit machine" ;;
    122/*)       ac_cv_data_model="i16"   ; n="unusual int16 model" ;;
    124/444)     ac_cv_data_model="ILP32" ; n="standard 32bit unixish" ;;
    124/488)     ac_cv_data_model="LP64"  ; n="standard 64bit unixish" ;;
    124/448)     ac_cv_data_model="LLP64" ; n="unusual 64bit unixish" ;;
    124/*)       ac_cv_data_model="i32"   ; n="unusual int32 model" ;;
    128/888)     ac_cv_data_model="ILP64" ; n="unusual 64bit numeric" ;;
    128/*)       ac_cv_data_model="i64"   ; n="unusual int64 model" ;;
    222/*2)      ac_cv_data_model="DSP16" ; n="strict 16bit dsptype" ;;
    333/*3)      ac_cv_data_model="DSP24" ; n="strict 24bit dsptype" ;;
    444/*4)      ac_cv_data_model="DSP32" ; n="strict 32bit dsptype" ;;
    666/*6)      ac_cv_data_model="DSP48" ; n="strict 48bit dsptype" ;;
    888/*8)      ac_cv_data_model="DSP64" ; n="strict 64bit dsptype" ;;
    222/*|333/*|444/*|666/*|888/*) :
                 ac_cv_data_model="iDSP"  ; n="unusual dsptype" ;;
     *)          ac_cv_data_model="none"  ; n="very unusual model" ;;
   esac
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_data_model ($ac_cv_long_data_model, $n)" >&5
$as_echo "$ac_cv_data_model ($ac_cv_long_data_model, $n)" >&6; }

fi

if test "_$ac_cv_header_stdint_x" != "_" ; then
   ac_cv_header_stdint="$ac_cv_header_stdint_x"
elif  test "_$ac_cv_header_stdint_o" != "_" ; then
   ac_cv_header_stdint="$ac_cv_header_stdint_o"
elif  test "_$ac_cv_header_stdint_u" != "_" ; then
   ac_cv_header_stdint="$ac_cv_header_stdint_u"
else
   ac_cv_header_stdint="stddef.h"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for extra inttypes in chosen header" >&5
$as_echo_n "checking for extra inttypes in chosen header... " >&6; }
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ($ac_cv_header_stdint)" >&5
$as_echo "($ac_cv_header_stdint)" >&6; }
unset ac_cv_type_int_least32_t
unset ac_cv_type_int_fast32_t
ac_fn_c_check_type "$LINENO" "int_least32_t" "ac_cv_type_int_least32_t" "#include <$ac_cv_header_stdint>
"
if test "x$ac_cv_type_int_least32_t" = xyes; then :

fi

ac_fn_c_check_type "$LINENO" "int_fast32_t" "ac_cv_type_int_fast32_t" "#include<$ac_cv_header_stdint>
"
if test "x$ac_cv_type_int_fast32_t" = xyes; then :

fi

ac_fn_c_check_type "$LINENO" "intmax_t" "ac_cv_type_intmax_t" "#include <$ac_cv_header_stdint>
"
if test "x$ac_cv_type_intmax_t" = xyes; then :

fi


fi # shortcircut to system "stdint.h"
# ------------------ PREPARE VARIABLES ------------------------------
if test "$GCC" = "yes" ; then
ac_cv_stdint_message="using gnu compiler "`$CC --version | head -1`
else
ac_cv_stdint_message="using $CC"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&5
$as_echo "make use of $ac_cv_header_stdint in $ac_stdint_h $ac_cv_stdint_result" >&6; }

# ----------------- DONE inttypes.h checks START header -------------
ac_config_commands="$ac_config_commands $ac_stdint_h"



for ac_header in pthread.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "pthread.h" "ac_cv_header_pthread_h" "$ac_includes_default"
if test "x$ac_cv_header_pthread_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_PTHREAD_H 1
_ACEOF
 HAVE_PTHREAD_H=yes
fi

done

 if test "x$HAVE_PTHREAD_H" = "xyes"; then
  HAVE_PTHREAD_H_TRUE=
  HAVE_PTHREAD_H_FALSE='#'
else
  HAVE_PTHREAD_H_TRUE='#'
  HAVE_PTHREAD_H_FALSE=
fi


if test "x$HAVE_PTHREAD_H" != "xyes"; then
  GST_PLUGINS_SELECTED=`echo $GST_PLUGINS_SELECTED | $SED -e s/dccp//`
fi




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/ioctl.h" >&5
$as_echo_n "checking for FIONREAD in sys/ioctl.h... " >&6; }
  if ${_cv_gst_fionread_in_sys_ioctl+:} false; then :
  $as_echo_n "(cached) " >&6
else

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <sys/types.h>
#include <sys/ioctl.h>

int
main ()
{

int x = FIONREAD;
if ( x )
  return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  _cv_gst_fionread_in_sys_ioctl="yes"
else
  _cv_gst_fionread_in_sys_ioctl="no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_ioctl" >&5
$as_echo "$_cv_gst_fionread_in_sys_ioctl" >&6; }

  if test "$_cv_gst_fionread_in_sys_ioctl" = "yes"; then

$as_echo "#define HAVE_FIONREAD_IN_SYS_IOCTL 1" >>confdefs.h


  else

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FIONREAD in sys/filio.h" >&5
$as_echo_n "checking for FIONREAD in sys/filio.h... " >&6; }
    if ${_cv_gst_fionread_in_sys_filio+:} false; then :
  $as_echo_n "(cached) " >&6
else

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

  #include <sys/types.h>
  #include <sys/filio.h>

int
main ()
{

  int x = FIONREAD;
  if ( x )
    return 0;

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  _cv_gst_fionread_in_sys_filio="yes"
else
  _cv_gst_fionread_in_sys_filio="no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $_cv_gst_fionread_in_sys_filio" >&5
$as_echo "$_cv_gst_fionread_in_sys_filio" >&6; }

    if test "$_cv_gst_fionread_in_sys_filio" = "yes"; then

$as_echo "#define HAVE_FIONREAD_IN_SYS_FILIO 1" >>confdefs.h

    fi

  fi





for ac_func in gmtime_r
do :
  ac_fn_c_check_func "$LINENO" "gmtime_r" "ac_cv_func_gmtime_r"
if test "x$ac_cv_func_gmtime_r" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_GMTIME_R 1
_ACEOF

fi
done


for ac_header in sys/utsname.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sys/utsname.h" "ac_cv_header_sys_utsname_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_utsname_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_UTSNAME_H 1
_ACEOF

fi

done



ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket"
if test "x$ac_cv_func_socket" = xyes; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket in -lsocket" >&5
$as_echo_n "checking for socket in -lsocket... " >&6; }
if ${ac_cv_lib_socket_socket+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char socket ();
int
main ()
{
return socket ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_socket_socket=yes
else
  ac_cv_lib_socket_socket=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_socket" >&5
$as_echo "$ac_cv_lib_socket_socket" >&6; }
if test "x$ac_cv_lib_socket_socket" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBSOCKET 1
_ACEOF

  LIBS="-lsocket $LIBS"

fi

fi

ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
if test "x$ac_cv_func_gethostbyname" = xyes; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5
$as_echo_n "checking for gethostbyname in -lnsl... " >&6; }
if ${ac_cv_lib_nsl_gethostbyname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lnsl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gethostbyname ();
int
main ()
{
return gethostbyname ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_nsl_gethostbyname=yes
else
  ac_cv_lib_nsl_gethostbyname=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5
$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; }
if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBNSL 1
_ACEOF

  LIBS="-lnsl $LIBS"

fi

fi


GLIB_REQ=2.40.0



    GLIB_REQ=$GLIB_REQ
  if test "x$GLIB_REQ" = "x"
  then
    as_fn_error $? "Please specify a required version for GLib 2.0" "$LINENO" 5
  fi



  which="glib-2.0 >= $GLIB_REQ gobject-2.0 gmodule-no-export-2.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLIB" >&5
$as_echo_n "checking for GLIB... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GLIB_CFLAGS"; then
        pkg_cv_GLIB_CFLAGS="$GLIB_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GLIB_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GLIB_LIBS"; then
        pkg_cv_GLIB_LIBS="$GLIB_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GLIB_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GLIB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        GLIB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GLIB_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GLIB="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5
$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GLIB="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GLIB_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLIB_PKG_ERRORS" >&5
$as_echo "$as_me: $GLIB_PKG_ERRORS" >&6;}
      fi

else
	GLIB_CFLAGS=$pkg_cv_GLIB_CFLAGS
	GLIB_LIBS=$pkg_cv_GLIB_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GLIB="yes"

fi



  if test "x$HAVE_GLIB" = "xno"; then
    as_fn_error $? "This package requires GLib >= $GLIB_REQ to compile." "$LINENO" 5
  fi

        GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_THREADS_MANDATORY"

    if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
    GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_DEPRECATED"
  fi

  # Check whether --enable-gobject-cast-checks was given.
if test "${enable_gobject_cast_checks+set}" = set; then :
  enableval=$enable_gobject_cast_checks; enable_gobject_cast_checks=$enableval
else
  enable_gobject_cast_checks=auto
fi


  if test "x$enable_gobject_cast_checks" = "xauto"; then
        if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
      enable_gobject_cast_checks=yes
    else
      enable_gobject_cast_checks=no
    fi
  fi

  if test "x$enable_gobject_cast_checks" = "xno"; then
    GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_CAST_CHECKS"
  fi

  # Check whether --enable-glib-asserts was given.
if test "${enable_glib_asserts+set}" = set; then :
  enableval=$enable_glib_asserts; enable_glib_assertions=$enableval
else
  enable_glib_assertions=yes
fi


  if test "x$enable_glib_assertions" = "xno"; then
    GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
  fi

                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glib-genmarshal" >&5
$as_echo_n "checking for glib-genmarshal... " >&6; }
  if test "x$GLIB_GENMARSHAL" != "x"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL (from environment)" >&5
$as_echo "$GLIB_GENMARSHAL (from environment)" >&6; }
  else
    GLIB_GENMARSHAL=`$PKG_CONFIG --variable=glib_genmarshal glib-2.0`
    if $GLIB_GENMARSHAL --version 2>/dev/null >/dev/null; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL (from pkg-config path)" >&5
$as_echo "$GLIB_GENMARSHAL (from pkg-config path)" >&6; }
    else
      # Extract the first word of "glib-genmarshal", so it can be a program name with args.
set dummy glib-genmarshal; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_GLIB_GENMARSHAL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $GLIB_GENMARSHAL in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_GLIB_GENMARSHAL="$GLIB_GENMARSHAL" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_GLIB_GENMARSHAL="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_GLIB_GENMARSHAL" && ac_cv_path_GLIB_GENMARSHAL="glib-genmarshal"
  ;;
esac
fi
GLIB_GENMARSHAL=$ac_cv_path_GLIB_GENMARSHAL
if test -n "$GLIB_GENMARSHAL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5
$as_echo "$GLIB_GENMARSHAL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


      { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_GENMARSHAL" >&5
$as_echo "$GLIB_GENMARSHAL" >&6; }
    fi
  fi
  if ! $GLIB_GENMARSHAL --version 2>/dev/null >/dev/null; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $GLIB_GENMARSHAL does not seem to work!" >&5
$as_echo "$as_me: WARNING: $GLIB_GENMARSHAL does not seem to work!" >&2;}
  fi


    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glib-mkenums" >&5
$as_echo_n "checking for glib-mkenums... " >&6; }
  if test "x$GLIB_MKENUMS" != "x"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS (from environment)" >&5
$as_echo "$GLIB_MKENUMS (from environment)" >&6; }
  else
        GLIB_MKENUMS=`$PKG_CONFIG --variable=glib_mkenums glib-2.0`
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GLIB_MKENUMS" >&5
$as_echo "$GLIB_MKENUMS" >&6; }
  fi
  if ! $GLIB_MKENUMS --version 2>/dev/null >/dev/null; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $GLIB_MKENUMS does not seem to work!" >&5
$as_echo "$as_me: WARNING: $GLIB_MKENUMS does not seem to work!" >&2;}
  fi





pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO" >&5
$as_echo_n "checking for GIO... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GIO_CFLAGS"; then
        pkg_cv_GIO_CFLAGS="$GIO_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= \$GLIB_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gio-2.0 >= $GLIB_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GIO_CFLAGS=`$PKG_CONFIG --cflags "gio-2.0 >= $GLIB_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GIO_LIBS"; then
        pkg_cv_GIO_LIBS="$GIO_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-2.0 >= \$GLIB_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gio-2.0 >= $GLIB_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GIO_LIBS=`$PKG_CONFIG --libs "gio-2.0 >= $GLIB_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GIO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gio-2.0 >= $GLIB_REQ"`
        else
	        GIO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gio-2.0 >= $GLIB_REQ"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GIO_PKG_ERRORS" >&5

	as_fn_error $? "Package requirements (gio-2.0 >= $GLIB_REQ) were not met:

$GIO_PKG_ERRORS

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GIO_CFLAGS
and GIO_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" "$LINENO" 5
elif test $pkg_failed = untried; then
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables GIO_CFLAGS
and GIO_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
	GIO_CFLAGS=$pkg_cv_GIO_CFLAGS
	GIO_LIBS=$pkg_cv_GIO_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
  if test "x$HAVE_GIO" = "xno"; then
    as_fn_error $? "This package requires GIO >= $GLIB_REQ to compile." "$LINENO" 5
  fi

  GIO_MODULE_DIR="`$PKG_CONFIG --variable=giomoduledir gio-2.0`"

cat >>confdefs.h <<_ACEOF
#define GIO_MODULE_DIR "$GIO_MODULE_DIR"
_ACEOF

  GIO_LIBDIR="`$PKG_CONFIG --variable=libdir gio-2.0`"

cat >>confdefs.h <<_ACEOF
#define GIO_LIBDIR "$GIO_LIBDIR"
_ACEOF

  GIO_PREFIX="`$PKG_CONFIG --variable=prefix gio-2.0`"

cat >>confdefs.h <<_ACEOF
#define GIO_PREFIX "$GIO_PREFIX"
_ACEOF









  module=gstreamer-$GST_API_VERSION
  minver=$GST_REQ
  name="GStreamer"
  required=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST" >&5
$as_echo_n "checking for GST... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_CFLAGS"; then
        pkg_cv_GST_CFLAGS="$GST_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_LIBS"; then
        pkg_cv_GST_LIBS="$GST_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_CFLAGS=$pkg_cv_GST_CFLAGS
	GST_LIBS=$pkg_cv_GST_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST="yes"

fi


    if test -z $GST_TOOLS_DIR; then
    GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-$GST_API_VERSION`
    if test -z $GST_TOOLS_DIR; then
      as_fn_error $? "no tools dir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5
    fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer tools in $GST_TOOLS_DIR" >&5
$as_echo "$as_me: using GStreamer tools in $GST_TOOLS_DIR" >&6;}


        if test -z $GST_PLUGINS_DIR; then
    GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-$GST_API_VERSION`
    if test -z $GST_PLUGINS_DIR; then
      as_fn_error $? "no pluginsdir set in GStreamer pkg-config file, core upgrade needed." "$LINENO" 5
    fi
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&5
$as_echo "$as_me: using GStreamer plug-ins in $GST_PLUGINS_DIR" >&6;}




  module=gstreamer-base-$GST_API_VERSION
  minver=$GST_REQ
  name="GStreamer Base Libraries"
  required=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_BASE" >&5
$as_echo_n "checking for GST_BASE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_BASE_CFLAGS"; then
        pkg_cv_GST_BASE_CFLAGS="$GST_BASE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_BASE_LIBS"; then
        pkg_cv_GST_BASE_LIBS="$GST_BASE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_BASE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_BASE="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_BASE="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_BASE_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_BASE_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_BASE_CFLAGS=$pkg_cv_GST_BASE_CFLAGS
	GST_BASE_LIBS=$pkg_cv_GST_BASE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_BASE="yes"

fi





  module=gstreamer-check-$GST_API_VERSION
  minver=$GST_REQ
  name="GStreamer Check unittest Library"
  required=no

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CHECK" >&5
$as_echo_n "checking for GST_CHECK... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_CHECK_CFLAGS"; then
        pkg_cv_GST_CHECK_CFLAGS="$GST_CHECK_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_CHECK_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_CHECK_LIBS"; then
        pkg_cv_GST_CHECK_LIBS="$GST_CHECK_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_CHECK_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_CHECK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_CHECK_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_CHECK="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_CHECK="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CHECK_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_CHECK_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_CHECK_CFLAGS=$pkg_cv_GST_CHECK_CFLAGS
	GST_CHECK_LIBS=$pkg_cv_GST_CHECK_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_CHECK="yes"

fi





  module=gstreamer-controller-$GST_API_VERSION
  minver=$GST_REQ
  name="GStreamer Controller Library"
  required=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_CONTROLLER" >&5
$as_echo_n "checking for GST_CONTROLLER... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_CONTROLLER_CFLAGS"; then
        pkg_cv_GST_CONTROLLER_CFLAGS="$GST_CONTROLLER_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_CONTROLLER_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_CONTROLLER_LIBS"; then
        pkg_cv_GST_CONTROLLER_LIBS="$GST_CONTROLLER_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_CONTROLLER_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_CONTROLLER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_CONTROLLER_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_CONTROLLER="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_CONTROLLER="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_CONTROLLER_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_CONTROLLER_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_CONTROLLER_CFLAGS=$pkg_cv_GST_CONTROLLER_CFLAGS
	GST_CONTROLLER_LIBS=$pkg_cv_GST_CONTROLLER_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_CONTROLLER="yes"

fi





  module=gstreamer-net-$GST_API_VERSION
  minver=$GST_REQ
  name="GStreamer Network Library"
  required=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_NET" >&5
$as_echo_n "checking for GST_NET... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_NET_CFLAGS"; then
        pkg_cv_GST_NET_CFLAGS="$GST_NET_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_NET_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_NET_LIBS"; then
        pkg_cv_GST_NET_LIBS="$GST_NET_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_NET_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_NET_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_NET_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_NET_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_NET="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_NET_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_NET_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_NET="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_NET_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_NET_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_NET_CFLAGS=$pkg_cv_GST_NET_CFLAGS
	GST_NET_LIBS=$pkg_cv_GST_NET_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_NET="yes"

fi



 if test "x$HAVE_GST_CHECK" = "xyes"; then
  HAVE_GST_CHECK_TRUE=
  HAVE_GST_CHECK_FALSE='#'
else
  HAVE_GST_CHECK_TRUE='#'
  HAVE_GST_CHECK_FALSE=
fi




  module=gstreamer-plugins-base-$GST_API_VERSION
  minver=$GSTPB_REQ
  name="GStreamer Base Plugins"
  required=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_BASE" >&5
$as_echo_n "checking for GST_PLUGINS_BASE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_BASE_CFLAGS"; then
        pkg_cv_GST_PLUGINS_BASE_CFLAGS="$GST_PLUGINS_BASE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_BASE_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_BASE_LIBS"; then
        pkg_cv_GST_PLUGINS_BASE_LIBS="$GST_PLUGINS_BASE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_BASE_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_PLUGINS_BASE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PLUGINS_BASE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_PLUGINS_BASE="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_PLUGINS_BASE="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_BASE_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_BASE_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_PLUGINS_BASE_CFLAGS=$pkg_cv_GST_PLUGINS_BASE_CFLAGS
	GST_PLUGINS_BASE_LIBS=$pkg_cv_GST_PLUGINS_BASE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_PLUGINS_BASE="yes"

fi



  if test "x$HAVE_GST_PLUGINS_BASE" = "xyes"; then
                if test -z $GSTPB_PLUGINS_DIR; then
      GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-$GST_API_VERSION`
      if test -z $GSTPB_PLUGINS_DIR; then
        as_fn_error $? "no pluginsdir set in GStreamer Base Plugins pkg-config file" "$LINENO" 5
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&5
$as_echo "$as_me: using GStreamer Base Plugins in $GSTPB_PLUGINS_DIR" >&6;}
    GST_PLUGINS_BASE_DIR="$GSTPB_PLUGINS_DIR/gst:$GSTPB_PLUGINS_DIR/sys:$GSTPB_PLUGINS_DIR/ext"


  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether this is an uninstalled GStreamer setup" >&5
$as_echo_n "checking whether this is an uninstalled GStreamer setup... " >&6; }
  if ${gst_cv_is_uninstalled_setup+:} false; then :
  $as_echo_n "(cached) " >&6
else

    gst_cv_is_uninstalled_setup=no
    if (set -u; : $GST_PLUGIN_SYSTEM_PATH) 2>/dev/null ; then
      if test -z "$GST_PLUGIN_SYSTEM_PATH" \
           -a -n "$GST_PLUGIN_SCANNER"     \
           -a -n "$GST_PLUGIN_PATH"        \
           -a -n "$GST_REGISTRY"           \
           -a -n "$DYLD_LIBRARY_PATH"      \
           -a -n "$LD_LIBRARY_PATH"; then
        gst_cv_is_uninstalled_setup=yes;
      fi
    fi

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gst_cv_is_uninstalled_setup" >&5
$as_echo "$gst_cv_is_uninstalled_setup" >&6; }
  if test "x$gst_cv_is_uninstalled_setup" = "xyes"; then



  module=gstreamer-plugins-good-$GST_API_VERSION
  minver=0.11.0
  name="GStreamer Good Plugins"
  required=no

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_GOOD" >&5
$as_echo_n "checking for GST_PLUGINS_GOOD... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_GOOD_CFLAGS"; then
        pkg_cv_GST_PLUGINS_GOOD_CFLAGS="$GST_PLUGINS_GOOD_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_GOOD_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_GOOD_LIBS"; then
        pkg_cv_GST_PLUGINS_GOOD_LIBS="$GST_PLUGINS_GOOD_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_GOOD_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PLUGINS_GOOD_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_PLUGINS_GOOD_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PLUGINS_GOOD_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_PLUGINS_GOOD="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_GOOD_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_GOOD_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_PLUGINS_GOOD="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_GOOD_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_GOOD_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_PLUGINS_GOOD_CFLAGS=$pkg_cv_GST_PLUGINS_GOOD_CFLAGS
	GST_PLUGINS_GOOD_LIBS=$pkg_cv_GST_PLUGINS_GOOD_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_PLUGINS_GOOD="yes"

fi



  if test "x$HAVE_GST_PLUGINS_GOOD" = "xyes"; then
                if test -z $GST_PLUGINS_GOOD_DIR; then
      GST_PLUGINS_GOOD_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-good-$GST_API_VERSION`
      if test -z $GST_PLUGINS_GOOD_DIR; then
        as_fn_error $? "no pluginsdir set in GStreamer Good Plugins pkg-config file" "$LINENO" 5
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Good Plugins in $GST_PLUGINS_GOOD_DIR" >&5
$as_echo "$as_me: using GStreamer Good Plugins in $GST_PLUGINS_GOOD_DIR" >&6;}
    GST_PLUGINS_GOOD_DIR="$GST_PLUGINS_GOOD_DIR/gst:$GST_PLUGINS_GOOD_DIR/sys:$GST_PLUGINS_GOOD_DIR/ext"

  fi



  module=gstreamer-plugins-ugly-$GST_API_VERSION
  minver=0.11.0
  name="GStreamer Ugly Plugins"
  required=no

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_UGLY" >&5
$as_echo_n "checking for GST_PLUGINS_UGLY... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_UGLY_CFLAGS"; then
        pkg_cv_GST_PLUGINS_UGLY_CFLAGS="$GST_PLUGINS_UGLY_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_UGLY_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_UGLY_LIBS"; then
        pkg_cv_GST_PLUGINS_UGLY_LIBS="$GST_PLUGINS_UGLY_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_UGLY_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PLUGINS_UGLY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_PLUGINS_UGLY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PLUGINS_UGLY_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_PLUGINS_UGLY="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_UGLY_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_UGLY_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_PLUGINS_UGLY="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_UGLY_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_UGLY_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_PLUGINS_UGLY_CFLAGS=$pkg_cv_GST_PLUGINS_UGLY_CFLAGS
	GST_PLUGINS_UGLY_LIBS=$pkg_cv_GST_PLUGINS_UGLY_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_PLUGINS_UGLY="yes"

fi



  if test "x$HAVE_GST_PLUGINS_UGLY" = "xyes"; then
                if test -z $GST_PLUGINS_UGLY_DIR; then
      GST_PLUGINS_UGLY_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-ugly-$GST_API_VERSION`
      if test -z $GST_PLUGINS_UGLY_DIR; then
        as_fn_error $? "no pluginsdir set in GStreamer Ugly Plugins pkg-config file" "$LINENO" 5
      fi
    fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Ugly Plugins in $GST_PLUGINS_UGLY_DIR" >&5
$as_echo "$as_me: using GStreamer Ugly Plugins in $GST_PLUGINS_UGLY_DIR" >&6;}
    GST_PLUGINS_UGLY_DIR="$GST_PLUGINS_UGLY_DIR/gst:$GST_PLUGINS_UGLY_DIR/sys:$GST_PLUGINS_UGLY_DIR/ext"

  fi



  module=gstreamer-plugins-libav-$GST_API_VERSION
  minver=0.11.0
  name="GStreamer Libav Plugins"
  required=no

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PLUGINS_LIBAV" >&5
$as_echo_n "checking for GST_PLUGINS_LIBAV... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_LIBAV_CFLAGS"; then
        pkg_cv_GST_PLUGINS_LIBAV_CFLAGS="$GST_PLUGINS_LIBAV_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_LIBAV_CFLAGS=`$PKG_CONFIG --cflags "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PLUGINS_LIBAV_LIBS"; then
        pkg_cv_GST_PLUGINS_LIBAV_LIBS="$GST_PLUGINS_LIBAV_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$module >= \$minver\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$module >= $minver") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PLUGINS_LIBAV_LIBS=`$PKG_CONFIG --libs "$module >= $minver" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PLUGINS_LIBAV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$module >= $minver"`
        else
	        GST_PLUGINS_LIBAV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$module >= $minver"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PLUGINS_LIBAV_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_PLUGINS_LIBAV="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_LIBAV_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_LIBAV_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_PLUGINS_LIBAV="no"
      { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PLUGINS_LIBAV_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PLUGINS_LIBAV_PKG_ERRORS" >&6;}
      if test "x$required" = "xyes"; then
        as_fn_error $? "no $module >= $minver ($name) found" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: no $module >= $minver ($name) found" >&5
$as_echo "$as_me: no $module >= $minver ($name) found" >&6;}
      fi

else
	GST_PLUGINS_LIBAV_CFLAGS=$pkg_cv_GST_PLUGINS_LIBAV_CFLAGS
	GST_PLUGINS_LIBAV_LIBS=$pkg_cv_GST_PLUGINS_LIBAV_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_PLUGINS_LIBAV="yes"

fi



  if test "x$HAVE_GST_PLUGINS_LIBAV" = "xyes"; then
                if test -z $GST_PLUGINS_LIBAV_DIR; then
      GST_PLUGINS_LIBAV_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-libav-$GST_API_VERSION`
      if test -z $GST_PLUGINS_LIBAV_DIR; then
        as_fn_error $? "no pluginsdir set in GStreamer Libav Plugins pkg-config file" "$LINENO" 5
      fi
    fi
    GST_PLUGINS_LIBAV_DIR="$GST_PLUGINS_LIBAV_DIR/ext/libav"
    { $as_echo "$as_me:${as_lineno-$LINENO}: using GStreamer Libav Plugins in $GST_PLUGINS_LIBAV_DIR" >&5
$as_echo "$as_me: using GStreamer Libav Plugins in $GST_PLUGINS_LIBAV_DIR" >&6;}

  fi


  else
    :
  fi


GLIB_PREFIX="`$PKG_CONFIG --variable=prefix glib-2.0`"
GST_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-$GST_API_VERSION`"
GSTPB_PREFIX="`$PKG_CONFIG --variable=prefix gstreamer-plugins-base-$GST_API_VERSION`"




HAVE_GTK=NO
GTK2_REQ=2.14.0
GTK3_REQ=2.91.3
if test "x$BUILD_EXAMPLES" = "xyes"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking which gtk+ version to compile examples against (optional)" >&5
$as_echo_n "checking which gtk+ version to compile examples against (optional)... " >&6; }

# Check whether --with-gtk was given.
if test "${with_gtk+set}" = set; then :
  withval=$with_gtk; case "$with_gtk" in
        2.0) GTK_REQ=$GTK2_REQ ;;
        3.0) GTK_REQ=$GTK3_REQ ;;
        *) as_fn_error $? "invalid gtk+ version specified" "$LINENO" 5;;
    esac
else
  with_gtk=2.0
     GTK_REQ=$GTK2_REQ
fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_gtk (>= $GTK_REQ)" >&5
$as_echo "$with_gtk (>= $GTK_REQ)" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK" >&5
$as_echo_n "checking for GTK... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK_CFLAGS"; then
        pkg_cv_GTK_CFLAGS="$GTK_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK_CFLAGS=`$PKG_CONFIG --cflags "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK_LIBS"; then
        pkg_cv_GTK_LIBS="$GTK_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-\$with_gtk >= \$GTK_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK_LIBS=`$PKG_CONFIG --libs "gtk+-x11-$with_gtk >= $GTK_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"`
        else
	        GTK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-x11-$with_gtk >= $GTK_REQ"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_GTK=no
elif test $pkg_failed = untried; then
	HAVE_GTK=no
else
	GTK_CFLAGS=$pkg_cv_GTK_CFLAGS
	GTK_LIBS=$pkg_cv_GTK_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_GTK=yes
fi


fi
 if test "x$HAVE_GTK" = "xyes"; then
  HAVE_GTK_TRUE=
  HAVE_GTK_FALSE='#'
else
  HAVE_GTK_TRUE='#'
  HAVE_GTK_FALSE=
fi


# Check whether --enable-Bsymbolic was given.
if test "${enable_Bsymbolic+set}" = set; then :
  enableval=$enable_Bsymbolic;
else
  SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5
$as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; }
               LDFLAGS=-Wl,-Bsymbolic-functions
               LIBS=
               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
return 0
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
                           enable_Bsymbolic=yes
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                           enable_Bsymbolic=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
               LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"
fi



HAVE_GTK3=NO
if test "x$BUILD_EXAMPLES" = "xyes"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK3" >&5
$as_echo_n "checking for GTK3... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_CFLAGS"; then
        pkg_cv_GTK3_CFLAGS="$GTK3_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_LIBS"; then
        pkg_cv_GTK3_LIBS="$GTK3_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0 >= 3.4"`
        else
	        GTK3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0 >= 3.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK3_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_GTK3=no
elif test $pkg_failed = untried; then
	HAVE_GTK3=no
else
	GTK3_CFLAGS=$pkg_cv_GTK3_CFLAGS
	GTK3_LIBS=$pkg_cv_GTK3_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_GTK3=yes
fi
  if test "x$HAVE_GTK3" = "xyes"; then
    HAVE_GTK=yes
    GTK_VERSION=`$PKG_CONFIG --variable=gtk_binary_version gtk+-3.0`

    GTK_PREFIX=`$PKG_CONFIG --variable=prefix gdk-pixbuf-2.0`

  fi
fi



 if test "x$HAVE_GTK3" = "xyes"; then
  HAVE_GTK3_TRUE=
  HAVE_GTK3_FALSE='#'
else
  HAVE_GTK3_TRUE='#'
  HAVE_GTK3_FALSE=
fi


HAVE_CLUTTER=no
HAVE_CLUTTER_X11=no
HAVE_CLUTTER_GLX=no
if test "x$BUILD_EXAMPLES" = "xyes"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CLUTTER" >&5
$as_echo_n "checking for CLUTTER... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_CFLAGS"; then
        pkg_cv_CLUTTER_CFLAGS="$CLUTTER_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_CFLAGS=`$PKG_CONFIG --cflags "clutter-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_LIBS"; then
        pkg_cv_CLUTTER_LIBS="$CLUTTER_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_LIBS=`$PKG_CONFIG --libs "clutter-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CLUTTER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "clutter-1.0 >= 1.8"`
        else
	        CLUTTER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "clutter-1.0 >= 1.8"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CLUTTER_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_CLUTTER=no
elif test $pkg_failed = untried; then
	HAVE_CLUTTER=no
else
	CLUTTER_CFLAGS=$pkg_cv_CLUTTER_CFLAGS
	CLUTTER_LIBS=$pkg_cv_CLUTTER_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_CLUTTER=yes
fi





pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CLUTTER_GLX" >&5
$as_echo_n "checking for CLUTTER_GLX... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_GLX_CFLAGS"; then
        pkg_cv_CLUTTER_GLX_CFLAGS="$CLUTTER_GLX_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-glx-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-glx-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_GLX_CFLAGS=`$PKG_CONFIG --cflags "clutter-glx-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_GLX_LIBS"; then
        pkg_cv_CLUTTER_GLX_LIBS="$CLUTTER_GLX_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-glx-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-glx-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_GLX_LIBS=`$PKG_CONFIG --libs "clutter-glx-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CLUTTER_GLX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "clutter-glx-1.0 >= 1.8"`
        else
	        CLUTTER_GLX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "clutter-glx-1.0 >= 1.8"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CLUTTER_GLX_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_CLUTTER_GLX=no
elif test $pkg_failed = untried; then
	HAVE_CLUTTER_GLX=no
else
	CLUTTER_GLX_CFLAGS=$pkg_cv_CLUTTER_GLX_CFLAGS
	CLUTTER_GLX_LIBS=$pkg_cv_CLUTTER_GLX_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_CLUTTER_GLX=yes
fi





pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CLUTTER_X11" >&5
$as_echo_n "checking for CLUTTER_X11... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_X11_CFLAGS"; then
        pkg_cv_CLUTTER_X11_CFLAGS="$CLUTTER_X11_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-x11-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-x11-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_X11_CFLAGS=`$PKG_CONFIG --cflags "clutter-x11-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CLUTTER_X11_LIBS"; then
        pkg_cv_CLUTTER_X11_LIBS="$CLUTTER_X11_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"clutter-x11-1.0 >= 1.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "clutter-x11-1.0 >= 1.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CLUTTER_X11_LIBS=`$PKG_CONFIG --libs "clutter-x11-1.0 >= 1.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CLUTTER_X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "clutter-x11-1.0 >= 1.8"`
        else
	        CLUTTER_X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "clutter-x11-1.0 >= 1.8"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CLUTTER_X11_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_CLUTTER_X11=no
elif test $pkg_failed = untried; then
	HAVE_CLUTTER_X11=no
else
	CLUTTER_X11_CFLAGS=$pkg_cv_CLUTTER_X11_CFLAGS
	CLUTTER_X11_LIBS=$pkg_cv_CLUTTER_X11_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_CLUTTER_X11=yes
fi



fi
 if test "x$HAVE_CLUTTER" = "xyes"; then
  HAVE_CLUTTER_TRUE=
  HAVE_CLUTTER_FALSE='#'
else
  HAVE_CLUTTER_TRUE='#'
  HAVE_CLUTTER_FALSE=
fi

 if test "x$HAVE_CLUTTER_GLX" = "xyes"; then
  HAVE_CLUTTER_GLX_TRUE=
  HAVE_CLUTTER_GLX_FALSE='#'
else
  HAVE_CLUTTER_GLX_TRUE='#'
  HAVE_CLUTTER_GLX_FALSE=
fi

 if test "x$HAVE_CLUTTER_X11" = "xyes"; then
  HAVE_CLUTTER_X11_TRUE=
  HAVE_CLUTTER_X11_FALSE='#'
else
  HAVE_CLUTTER_X11_TRUE='#'
  HAVE_CLUTTER_X11_FALSE=
fi


if test "x$BUILD_EXAMPLES" = "xyes"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCOMPOSITE" >&5
$as_echo_n "checking for XCOMPOSITE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$XCOMPOSITE_CFLAGS"; then
        pkg_cv_XCOMPOSITE_CFLAGS="$XCOMPOSITE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xcomposite\""; } >&5
  ($PKG_CONFIG --exists --print-errors "xcomposite") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_XCOMPOSITE_CFLAGS=`$PKG_CONFIG --cflags "xcomposite" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$XCOMPOSITE_LIBS"; then
        pkg_cv_XCOMPOSITE_LIBS="$XCOMPOSITE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xcomposite\""; } >&5
  ($PKG_CONFIG --exists --print-errors "xcomposite") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_XCOMPOSITE_LIBS=`$PKG_CONFIG --libs "xcomposite" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        XCOMPOSITE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xcomposite"`
        else
	        XCOMPOSITE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xcomposite"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$XCOMPOSITE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_XCOMPOSITE=no
elif test $pkg_failed = untried; then
	HAVE_XCOMPOSITE=no
else
	XCOMPOSITE_CFLAGS=$pkg_cv_XCOMPOSITE_CFLAGS
	XCOMPOSITE_LIBS=$pkg_cv_XCOMPOSITE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_XCOMPOSITE=yes
fi


fi
 if test "x$HAVE_XCOMPOSITE" = "xyes"; then
  HAVE_XCOMPOSITE_TRUE=
  HAVE_XCOMPOSITE_FALSE='#'
else
  HAVE_XCOMPOSITE_TRUE='#'
  HAVE_XCOMPOSITE_FALSE=
fi


HAVE_GRAPHENE=NO

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GRAPHENE" >&5
$as_echo_n "checking for GRAPHENE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GRAPHENE_CFLAGS"; then
        pkg_cv_GRAPHENE_CFLAGS="$GRAPHENE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GRAPHENE_CFLAGS=`$PKG_CONFIG --cflags "graphene-1.0 >= 1.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GRAPHENE_LIBS"; then
        pkg_cv_GRAPHENE_LIBS="$GRAPHENE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"graphene-1.0 >= 1.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "graphene-1.0 >= 1.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GRAPHENE_LIBS=`$PKG_CONFIG --libs "graphene-1.0 >= 1.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "graphene-1.0 >= 1.0.0"`
        else
	        GRAPHENE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "graphene-1.0 >= 1.0.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GRAPHENE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_GRAPHENE=no
elif test $pkg_failed = untried; then
	HAVE_GRAPHENE=no
else
	GRAPHENE_CFLAGS=$pkg_cv_GRAPHENE_CFLAGS
	GRAPHENE_LIBS=$pkg_cv_GRAPHENE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_GRAPHENE=yes
fi
if test "x$HAVE_GRAPHENE" = "xyes"; then

$as_echo "#define HAVE_GRAPHENE 1 " >>confdefs.h

fi



 if test "x$HAVE_GRAPHENE" = "xyes"; then
  HAVE_GRAPHENE_TRUE=
  HAVE_GRAPHENE_FALSE='#'
else
  HAVE_GRAPHENE_TRUE='#'
  HAVE_GRAPHENE_FALSE=
fi



HAVE_SDL=NO
if test "x$BUILD_EXAMPLES" = "xyes"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL" >&5
$as_echo_n "checking for SDL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SDL_CFLAGS"; then
        pkg_cv_SDL_CFLAGS="$SDL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl >= 1.2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sdl >= 1.2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SDL_CFLAGS=`$PKG_CONFIG --cflags "sdl >= 1.2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SDL_LIBS"; then
        pkg_cv_SDL_LIBS="$SDL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sdl >= 1.2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sdl >= 1.2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SDL_LIBS=`$PKG_CONFIG --libs "sdl >= 1.2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SDL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sdl >= 1.2.0"`
        else
	        SDL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sdl >= 1.2.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SDL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SDL=no
elif test $pkg_failed = untried; then
	HAVE_SDL=no
else
	SDL_CFLAGS=$pkg_cv_SDL_CFLAGS
	SDL_LIBS=$pkg_cv_SDL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SDL=yes
fi



fi
 if test "x$HAVE_SDL" = "xyes"; then
  HAVE_SDL_TRUE=
  HAVE_SDL_FALSE='#'
else
  HAVE_SDL_TRUE='#'
  HAVE_SDL_FALSE=
fi




pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMODULE_EXPORT" >&5
$as_echo_n "checking for GMODULE_EXPORT... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GMODULE_EXPORT_CFLAGS"; then
        pkg_cv_GMODULE_EXPORT_CFLAGS="$GMODULE_EXPORT_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-export-2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gmodule-export-2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GMODULE_EXPORT_CFLAGS=`$PKG_CONFIG --cflags "gmodule-export-2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GMODULE_EXPORT_LIBS"; then
        pkg_cv_GMODULE_EXPORT_LIBS="$GMODULE_EXPORT_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-export-2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gmodule-export-2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GMODULE_EXPORT_LIBS=`$PKG_CONFIG --libs "gmodule-export-2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GMODULE_EXPORT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gmodule-export-2.0"`
        else
	        GMODULE_EXPORT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gmodule-export-2.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GMODULE_EXPORT_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_GMODULE_EXPORT=no
elif test $pkg_failed = untried; then
	HAVE_GMODULE_EXPORT=no
else
	GMODULE_EXPORT_CFLAGS=$pkg_cv_GMODULE_EXPORT_CFLAGS
	GMODULE_EXPORT_LIBS=$pkg_cv_GMODULE_EXPORT_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_GMODULE_EXPORT=yes
fi


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GMODULE_NO_EXPORT" >&5
$as_echo_n "checking for GMODULE_NO_EXPORT... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GMODULE_NO_EXPORT_CFLAGS"; then
        pkg_cv_GMODULE_NO_EXPORT_CFLAGS="$GMODULE_NO_EXPORT_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-no-export-2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gmodule-no-export-2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GMODULE_NO_EXPORT_CFLAGS=`$PKG_CONFIG --cflags "gmodule-no-export-2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GMODULE_NO_EXPORT_LIBS"; then
        pkg_cv_GMODULE_NO_EXPORT_LIBS="$GMODULE_NO_EXPORT_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gmodule-no-export-2.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gmodule-no-export-2.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GMODULE_NO_EXPORT_LIBS=`$PKG_CONFIG --libs "gmodule-no-export-2.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GMODULE_NO_EXPORT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gmodule-no-export-2.0"`
        else
	        GMODULE_NO_EXPORT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gmodule-no-export-2.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GMODULE_NO_EXPORT_PKG_ERRORS" >&5

	as_fn_error $? "Package requirements (gmodule-no-export-2.0) were not met:

$GMODULE_NO_EXPORT_PKG_ERRORS

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GMODULE_NO_EXPORT_CFLAGS
and GMODULE_NO_EXPORT_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" "$LINENO" 5
elif test $pkg_failed = untried; then
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables GMODULE_NO_EXPORT_CFLAGS
and GMODULE_NO_EXPORT_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
	GMODULE_NO_EXPORT_CFLAGS=$pkg_cv_GMODULE_NO_EXPORT_CFLAGS
	GMODULE_NO_EXPORT_LIBS=$pkg_cv_GMODULE_NO_EXPORT_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi

HAVE_X11=NO

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X11" >&5
$as_echo_n "checking for X11... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$X11_CFLAGS"; then
        pkg_cv_X11_CFLAGS="$X11_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5
  ($PKG_CONFIG --exists --print-errors "x11") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X11_CFLAGS=`$PKG_CONFIG --cflags "x11" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$X11_LIBS"; then
        pkg_cv_X11_LIBS="$X11_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"x11\""; } >&5
  ($PKG_CONFIG --exists --print-errors "x11") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X11_LIBS=`$PKG_CONFIG --libs "x11" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "x11"`
        else
	        X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "x11"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$X11_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_X11=no
elif test $pkg_failed = untried; then
	HAVE_X11=no
else
	X11_CFLAGS=$pkg_cv_X11_CFLAGS
	X11_LIBS=$pkg_cv_X11_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_X11=yes
fi



 if test "x$HAVE_X11" = "xyes"; then
  HAVE_X11_TRUE=
  HAVE_X11_FALSE='#'
else
  HAVE_X11_TRUE='#'
  HAVE_X11_FALSE=
fi

if test "x$HAVE_X11" = "xyes"; then

$as_echo "#define HAVE_X11 1" >>confdefs.h

fi


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EXIF" >&5
$as_echo_n "checking for EXIF... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$EXIF_CFLAGS"; then
        pkg_cv_EXIF_CFLAGS="$EXIF_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexif >= 0.6.16\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libexif >= 0.6.16") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_EXIF_CFLAGS=`$PKG_CONFIG --cflags "libexif >= 0.6.16" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$EXIF_LIBS"; then
        pkg_cv_EXIF_LIBS="$EXIF_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libexif >= 0.6.16\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libexif >= 0.6.16") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_EXIF_LIBS=`$PKG_CONFIG --libs "libexif >= 0.6.16" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        EXIF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libexif >= 0.6.16"`
        else
	        EXIF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libexif >= 0.6.16"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$EXIF_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_EXIF="no"
elif test $pkg_failed = untried; then
	HAVE_EXIF="no"
else
	EXIF_CFLAGS=$pkg_cv_EXIF_CFLAGS
	EXIF_LIBS=$pkg_cv_EXIF_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_EXIF="yes"
fi


 if test "x$HAVE_EXIF" = "xyes"; then
  USE_EXIF_TRUE=
  USE_EXIF_FALSE='#'
else
  USE_EXIF_TRUE='#'
  USE_EXIF_FALSE=
fi



  ORC_REQ=0.4.17

  # Check whether --enable-orc was given.
if test "${enable_orc+set}" = set; then :
  enableval=$enable_orc; case "${enableval}" in
    auto) enable_orc=auto ;;
    yes) enable_orc=yes ;;
    no)  enable_orc=no ;;
    *) as_fn_error $? "bad value ${enableval} for --enable-orc" "$LINENO" 5 ;;
  esac

else
  enable_orc=auto
fi

  if test "x$enable_orc" != "xno" ; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ORC" >&5
$as_echo_n "checking for ORC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$ORC_CFLAGS"; then
        pkg_cv_ORC_CFLAGS="$ORC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ORC_CFLAGS=`$PKG_CONFIG --cflags "orc-0.4 >= $ORC_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$ORC_LIBS"; then
        pkg_cv_ORC_LIBS="$ORC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"orc-0.4 >= \$ORC_REQ\""; } >&5
  ($PKG_CONFIG --exists --print-errors "orc-0.4 >= $ORC_REQ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ORC_LIBS=`$PKG_CONFIG --libs "orc-0.4 >= $ORC_REQ" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        ORC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"`
        else
	        ORC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "orc-0.4 >= $ORC_REQ"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$ORC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      if test "x$enable_orc" = "xyes" ; then
        as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5
      fi

$as_echo "#define DISABLE_ORC 1" >>confdefs.h

      HAVE_ORC=no
      HAVE_ORCC=no

elif test $pkg_failed = untried; then

      if test "x$enable_orc" = "xyes" ; then
        as_fn_error $? "--enable-orc specified, but Orc >= $ORC_REQ not found" "$LINENO" 5
      fi

$as_echo "#define DISABLE_ORC 1" >>confdefs.h

      HAVE_ORC=no
      HAVE_ORCC=no

else
	ORC_CFLAGS=$pkg_cv_ORC_CFLAGS
	ORC_LIBS=$pkg_cv_ORC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_ORC 1" >>confdefs.h

      HAVE_ORC=yes
      if test "x$ORCC" = "x" ; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for usable orcc" >&5
$as_echo_n "checking for usable orcc... " >&6; }
        ORCC=`$PKG_CONFIG --variable=orcc orc-0.4`
                        if $ORCC --version 1> /dev/null 2> /dev/null; then :

else
  ORCC=`which orcc`
fi
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ORCC" >&5
$as_echo "$ORCC" >&6; }
      fi

      ORCC_FLAGS="--compat $ORC_REQ"

      if test "x$ORCC" = "x"; then :
  HAVE_ORCC=no
else
  HAVE_ORCC=yes
fi

fi
  else

$as_echo "#define DISABLE_ORC 1" >>confdefs.h

    HAVE_ORC=no
    HAVE_ORCC=no
  fi
   if test "x$HAVE_ORC" = "xyes"; then
  HAVE_ORC_TRUE=
  HAVE_ORC_FALSE='#'
else
  HAVE_ORC_TRUE='#'
  HAVE_ORC_FALSE=
fi

   if test "x$HAVE_ORCC" = "xyes"; then
  HAVE_ORCC_TRUE=
  HAVE_ORCC_FALSE='#'
else
  HAVE_ORCC_TRUE='#'
  HAVE_ORCC_FALSE=
fi




GST_LICENSE="LGPL"

cat >>confdefs.h <<_ACEOF
#define GST_LICENSE "$GST_LICENSE"
_ACEOF




  EXP_VAR=LIBDIR
  FROM_VAR=$libdir

    prefix_save=$prefix
  exec_prefix_save=$exec_prefix

    if test "x$prefix" = "xNONE"; then
    prefix="$ac_default_prefix"
  fi
    if test "x$exec_prefix" = "xNONE"; then
    exec_prefix=$prefix
  fi

  full_var="$FROM_VAR"
    while true; do
    new_full_var="`eval echo $full_var`"
    if test "x$new_full_var" = "x$full_var"; then break; fi
    full_var=$new_full_var
  done

    full_var=$new_full_var
  LIBDIR="$full_var"


    prefix=$prefix_save
  exec_prefix=$exec_prefix_save


cat >>confdefs.h <<_ACEOF
#define LIBDIR "$LIBDIR"
_ACEOF




  EXP_VAR=PLUGINDIR
  FROM_VAR=${libdir}/gstreamer-$GST_API_VERSION

    prefix_save=$prefix
  exec_prefix_save=$exec_prefix

    if test "x$prefix" = "xNONE"; then
    prefix="$ac_default_prefix"
  fi
    if test "x$exec_prefix" = "xNONE"; then
    exec_prefix=$prefix
  fi

  full_var="$FROM_VAR"
    while true; do
    new_full_var="`eval echo $full_var`"
    if test "x$new_full_var" = "x$full_var"; then break; fi
    full_var=$new_full_var
  done

    full_var=$new_full_var
  PLUGINDIR="$full_var"


    prefix=$prefix_save
  exec_prefix=$exec_prefix_save


cat >>confdefs.h <<_ACEOF
#define PLUGINDIR "$PLUGINDIR"
_ACEOF

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $PLUGINDIR as the plugin install location" >&5
$as_echo "$as_me: Using $PLUGINDIR as the plugin install location" >&6;}

    plugindir="\$(libdir)/gstreamer-$GST_API_VERSION"




  if test "x$PACKAGE_VERSION_NANO" = "x0"; then

      if test "xyes" = "xno" -o "xyes" = "x"; then
    GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
  elif test "xyes" = "xyes"; then
            if ( echo  "${srcdir}/gst-plugins-bad.doap"  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
      GST_PACKAGE_RELEASE_DATETIME= "${srcdir}/gst-plugins-bad.doap"
    else
            YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO   "${srcdir}/gst-plugins-bad.doap" `;
      if test "x$YYYY_MM_DD" != "x"; then
        GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD
      else
        as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract
            release date for release version  $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO  from  \"${srcdir}/gst-plugins-bad.doap\" " "$LINENO" 5
        GST_PACKAGE_RELEASE_DATETIME=""
      fi
    fi
    elif ( echo yes | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
    GST_PACKAGE_RELEASE_DATETIME=yes
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
$as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;}
    GST_PACKAGE_RELEASE_DATETIME=""
  fi

  if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5
$as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;}
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5
$as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;}


cat >>confdefs.h <<_ACEOF
#define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME"
_ACEOF

  fi

  else

      if test "xno" = "xno" -o "xno" = "x"; then
    GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
  elif test "xno" = "xyes"; then
            if ( echo  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
      GST_PACKAGE_RELEASE_DATETIME=
    else
            YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  `;
      if test "x$YYYY_MM_DD" != "x"; then
        GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD
      else
        as_fn_error $? "SET_PACKAGE_RELEASE_DATETIME: could not extract
            release date for release version  from " "$LINENO" 5
        GST_PACKAGE_RELEASE_DATETIME=""
      fi
    fi
    elif ( echo no | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
    GST_PACKAGE_RELEASE_DATETIME=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
$as_echo "$as_me: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&2;}
    GST_PACKAGE_RELEASE_DATETIME=""
  fi

  if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&5
$as_echo "$as_me: WARNING: Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME" >&2;}
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&5
$as_echo "$as_me: Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME" >&6;}


cat >>confdefs.h <<_ACEOF
#define GST_PACKAGE_RELEASE_DATETIME "$GST_PACKAGE_RELEASE_DATETIME"
_ACEOF

  fi

  fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static plugins or not" >&5
$as_echo_n "checking whether to build static plugins or not... " >&6; }
# Check whether --enable-static-plugins was given.
if test "${enable_static_plugins+set}" = set; then :
  enableval=$enable_static_plugins; case $enableval in #(
  no) :
     ;; #(
  yes) :
     ;; #(
  *) :
    as_fn_error $? "bad value \"$enableval\" for --enable-static-plugins" "$LINENO" 5 ;;
esac
else
  enable_static_plugins=no
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static_plugins" >&5
$as_echo "$enable_static_plugins" >&6; }
if test "x$enable_static_plugins" = xyes; then

$as_echo "#define GST_PLUGIN_BUILD_STATIC 1" >>confdefs.h

  GST_PLUGIN_LIBTOOLFLAGS=""
else
  GST_PLUGIN_LIBTOOLFLAGS="--tag=disable-static"
fi

 if test "x$enable_static_plugins" = "xyes"; then
  GST_PLUGIN_BUILD_STATIC_TRUE=
  GST_PLUGIN_BUILD_STATIC_FALSE='#'
else
  GST_PLUGIN_BUILD_STATIC_TRUE='#'
  GST_PLUGIN_BUILD_STATIC_FALSE=
fi



# Check whether --with-player-tests was given.
if test "${with_player_tests+set}" = set; then :
  withval=$with_player_tests;
fi

if test x$with_player_tests = xyes; then
  # Extract the first word of "wget", so it can be a program name with args.
set dummy wget; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_WGET+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $WGET in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
  ;;
esac
fi
WGET=$ac_cv_path_WGET
if test -n "$WGET"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
$as_echo "$WGET" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  if test x$WGET = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: wget required for GstPlayer tests but not found - disabling" >&5
$as_echo "$as_me: WARNING: wget required for GstPlayer tests but not found - disabling" >&2;}
    with_player_tests=no
  fi
fi
 if test "x$with_player_tests" = "xyes"; then
  WITH_GST_PLAYER_TESTS_TRUE=
  WITH_GST_PLAYER_TESTS_FALSE='#'
else
  WITH_GST_PLAYER_TESTS_TRUE='#'
  WITH_GST_PLAYER_TESTS_FALSE=
fi


# set by AG_GST_PARSE_SUBSYSTEM_DISABLES above
NO_WARNINGS=""



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the GStreamer debugging system is enabled" >&5
$as_echo_n "checking whether the GStreamer debugging system is enabled... " >&6; }
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

  save_CFLAGS="$CFLAGS"
  CFLAGS="$GST_CFLAGS $CFLAGS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


      #include <gst/gstconfig.h>
      #ifdef GST_DISABLE_GST_DEBUG
      #error "debugging disabled, make compiler fail"
      #endif
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
   debug_system_enabled=yes
else
  debug_system_enabled=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $debug_system_enabled" >&5
$as_echo "$debug_system_enabled" >&6; }

  if test "x$debug_system_enabled" = "xyes" ; then
    NO_WARNINGS=""
    true
  else
    NO_WARNINGS="-Wno-unused"
    true
  fi






  WARNING_CFLAGS=""
  ERROR_CFLAGS=""


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wall" >&5
$as_echo_n "checking to see if compiler understands -Wall... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Wall"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CFLAGS="$WARNING_CFLAGS -Wall"
    true
  else

    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wdeclaration-after-statement" >&5
$as_echo_n "checking to see if compiler understands -Wdeclaration-after-statement... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Wdeclaration-after-statement"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CFLAGS="$WARNING_CFLAGS -Wdeclaration-after-statement"
    true
  else

    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wvla" >&5
$as_echo_n "checking to see if compiler understands -Wvla... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Wvla"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CFLAGS="$WARNING_CFLAGS -Wvla"
    true
  else

    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Wpointer-arith" >&5
$as_echo_n "checking to see if compiler understands -Wpointer-arith... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Wpointer-arith"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CFLAGS="$WARNING_CFLAGS -Wpointer-arith"
    true
  else

    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


    if test "x$FATAL_WARNINGS" != "xno"
  then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -Werror" >&5
$as_echo_n "checking to see if compiler understands -Werror... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Werror"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_CFLAGS="$ERROR_CFLAGS -Werror"
    true
  else

    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }

  fi

  if test "x
    -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls
    -Wwrite-strings -Wformat-security -Wold-style-definition
    -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar
    -Wnested-externs $NO_WARNINGS" != "x"
  then
    UNSUPPORTED=""
    list="
    -Wmissing-declarations -Wmissing-prototypes -Wredundant-decls
    -Wwrite-strings -Wformat-security -Wold-style-definition
    -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar
    -Wnested-externs $NO_WARNINGS"
    for each in $list
    do

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands $each" >&5
$as_echo_n "checking to see if compiler understands $each... " >&6; }

  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS $each"

  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CFLAGS="$WARNING_CFLAGS $each"
    true
  else
    UNSUPPORTED="$UNSUPPORTED $each"
    true
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }

    done
    if test "X$UNSUPPORTED" != X ; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5
$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;}
    fi
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CFLAGS to $WARNING_CFLAGS" >&5
$as_echo "$as_me: set WARNING_CFLAGS to $WARNING_CFLAGS" >&6;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CFLAGS to $ERROR_CFLAGS" >&5
$as_echo "$as_me: set ERROR_CFLAGS to $ERROR_CFLAGS" >&6;}





  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands " >&5
$as_echo_n "checking to see if c++ compiler understands ... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS "

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then

    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }





  ERROR_CXXFLAGS=""
  WARNING_CXXFLAGS=""




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wall" >&5
$as_echo_n "checking to see if c++ compiler understands -Wall... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -Wall"

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wall"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


    if test "x$FATAL_WARNINGS" != "xno"
  then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Werror" >&5
$as_echo_n "checking to see if c++ compiler understands -Werror... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -Werror"

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


    if test "x$ERROR_CXXFLAGS" != "x"
    then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -Wno-non-virtual-dtor" >&5
$as_echo_n "checking to see if c++ compiler understands -Wno-non-virtual-dtor... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -Wno-non-virtual-dtor"

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Wno-non-virtual-dtor"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


				if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -fno-strict-aliasing" >&5
$as_echo_n "checking to see if c++ compiler understands -fno-strict-aliasing... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -fno-strict-aliasing"

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


fi
    fi
  fi

  if test "x
    -Wmissing-declarations -Wredundant-decls
    -Wwrite-strings -Wformat-nonliteral -Wformat-security
    -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar $NO_WARNINGS" != "x"
  then
    UNSUPPORTED=""
    list="
    -Wmissing-declarations -Wredundant-decls
    -Wwrite-strings -Wformat-nonliteral -Wformat-security
    -Winit-self -Wmissing-include-dirs -Waddress -Wno-multichar $NO_WARNINGS"
    for each in $list
    do



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands $each" >&5
$as_echo_n "checking to see if c++ compiler understands $each... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS $each"

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_CXXFLAGS="$WARNING_CXXFLAGS $each"
    true
  else
    UNSUPPORTED="$UNSUPPORTED $each"
    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }

    done
    if test "X$UNSUPPORTED" != X ; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5
$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;}
    fi
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&5
$as_echo "$as_me: set WARNING_CXXFLAGS to $WARNING_CXXFLAGS" >&6;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&5
$as_echo "$as_me: set ERROR_CXXFLAGS to $ERROR_CXXFLAGS" >&6;}






  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands " >&5
$as_echo_n "checking to see if Objective C compiler understands ... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS "

  ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then

    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }





  ERROR_OBJCFLAGS=""
  WARNING_OBJCFLAGS=""




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands -Wall" >&5
$as_echo_n "checking to see if Objective C compiler understands -Wall... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -Wall"

  ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_OBJCFLAGS="$WARNING_OBJCFLAGS -Wall"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


    if test "x$FATAL_WARNINGS" != "xno"
  then



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands -Werror" >&5
$as_echo_n "checking to see if Objective C compiler understands -Werror... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -Werror"

  ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -Werror"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


    if test "x$ERROR_OBJCFLAGS" != "x"
    then
				if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"glib-2.0 < 2.19.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "glib-2.0 < 2.19.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then




  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands -fno-strict-aliasing" >&5
$as_echo_n "checking to see if Objective C compiler understands -fno-strict-aliasing... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -fno-strict-aliasing"

  ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -fno-strict-aliasing"
    true
  else

    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }


fi
    fi
  fi

  if test "x
    -Wmissing-declarations -Wredundant-decls
    -Wwrite-strings -Wformat-nonliteral -Wformat-security
    -Winit-self -Wmissing-include-dirs -Wno-multichar $NO_WARNINGS" != "x"
  then
    UNSUPPORTED=""
    list="
    -Wmissing-declarations -Wredundant-decls
    -Wwrite-strings -Wformat-nonliteral -Wformat-security
    -Winit-self -Wmissing-include-dirs -Wno-multichar $NO_WARNINGS"
    for each in $list
    do



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands $each" >&5
$as_echo_n "checking to see if Objective C compiler understands $each... " >&6; }

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS $each"

  ac_ext=m
ac_cpp='$OBJCPP $CPPFLAGS'
ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_objc_compiler_gnu


  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_objc_try_compile "$LINENO"; then :
  flag_ok=yes
else
  flag_ok=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CPPFLAGS="$save_CPPFLAGS"

  if test "X$flag_ok" = Xyes ; then
    WARNING_OBJCFLAGS="$WARNING_OBJCFLAGS $each"
    true
  else
    UNSUPPORTED="$UNSUPPORTED $each"
    true
  fi

  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
$as_echo "$flag_ok" >&6; }

    done
    if test "X$UNSUPPORTED" != X ; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: unsupported compiler flags: $UNSUPPORTED" >&5
$as_echo "$as_me: unsupported compiler flags: $UNSUPPORTED" >&6;}
    fi
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: set WARNING_OBJCFLAGS to $WARNING_OBJCFLAGS" >&5
$as_echo "$as_me: set WARNING_OBJCFLAGS to $WARNING_OBJCFLAGS" >&6;}
  { $as_echo "$as_me:${as_lineno-$LINENO}: set ERROR_OBJCFLAGS to $ERROR_OBJCFLAGS" >&5
$as_echo "$as_me: set ERROR_OBJCFLAGS to $ERROR_OBJCFLAGS" >&6;}



      if test "x$GST_GIT" = "xyes"; then
    GST_LEVEL_DEFAULT=GST_LEVEL_ERROR
  else
    GST_LEVEL_DEFAULT=GST_LEVEL_NONE
  fi

cat >>confdefs.h <<_ACEOF
#define GST_LEVEL_DEFAULT $GST_LEVEL_DEFAULT
_ACEOF





            DEFAULT_AUDIOSINK="autoaudiosink"
  DEFAULT_VIDEOSINK="autovideosink"
  DEFAULT_AUDIOSRC="alsasrc"
  DEFAULT_VIDEOSRC="v4l2src"
  DEFAULT_VISUALIZER="goom"
  case "$host" in
    *-sun-* | *pc-solaris* )
      DEFAULT_AUDIOSRC="sunaudiosrc"
      ;;
    *-darwin* )
      DEFAULT_AUDIOSRC="osxaudiosrc"
      ;;
  esac


# Check whether --with-default-audiosink was given.
if test "${with_default_audiosink+set}" = set; then :
  withval=$with_default_audiosink;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-default-audiosink" "$LINENO" 5 ;;
        *)   DEFAULT_AUDIOSINK="${withval}" ;;
      esac

else

      DEFAULT_AUDIOSINK="$DEFAULT_AUDIOSINK"

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSINK as default audio sink" >&5
$as_echo "$as_me: Using $DEFAULT_AUDIOSINK as default audio sink" >&6;}


cat >>confdefs.h <<_ACEOF
#define DEFAULT_AUDIOSINK "$DEFAULT_AUDIOSINK"
_ACEOF



# Check whether --with-default-audiosrc was given.
if test "${with_default_audiosrc+set}" = set; then :
  withval=$with_default_audiosrc;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-default-audiosrc" "$LINENO" 5 ;;
        *)   DEFAULT_AUDIOSRC="${withval}" ;;
      esac

else

      DEFAULT_AUDIOSRC="$DEFAULT_AUDIOSRC"

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_AUDIOSRC as default audio source" >&5
$as_echo "$as_me: Using $DEFAULT_AUDIOSRC as default audio source" >&6;}


cat >>confdefs.h <<_ACEOF
#define DEFAULT_AUDIOSRC "$DEFAULT_AUDIOSRC"
_ACEOF



# Check whether --with-default-videosink was given.
if test "${with_default_videosink+set}" = set; then :
  withval=$with_default_videosink;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-default-videosink" "$LINENO" 5 ;;
        *)   DEFAULT_VIDEOSINK="${withval}" ;;
      esac

else

      DEFAULT_VIDEOSINK="$DEFAULT_VIDEOSINK"

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSINK as default video sink" >&5
$as_echo "$as_me: Using $DEFAULT_VIDEOSINK as default video sink" >&6;}


cat >>confdefs.h <<_ACEOF
#define DEFAULT_VIDEOSINK "$DEFAULT_VIDEOSINK"
_ACEOF



# Check whether --with-default-videosrc was given.
if test "${with_default_videosrc+set}" = set; then :
  withval=$with_default_videosrc;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-default-videosrc" "$LINENO" 5 ;;
        *)   DEFAULT_VIDEOSRC="${withval}" ;;
      esac

else

      DEFAULT_VIDEOSRC="$DEFAULT_VIDEOSRC"

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VIDEOSRC as default video source" >&5
$as_echo "$as_me: Using $DEFAULT_VIDEOSRC as default video source" >&6;}


cat >>confdefs.h <<_ACEOF
#define DEFAULT_VIDEOSRC "$DEFAULT_VIDEOSRC"
_ACEOF



# Check whether --with-default-visualizer was given.
if test "${with_default_visualizer+set}" = set; then :
  withval=$with_default_visualizer;
      case "${withval}" in
        yes) as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;;
        no)  as_fn_error $? "bad value ${withval} for --with-default-visualizer" "$LINENO" 5 ;;
        *)   DEFAULT_VISUALIZER="${withval}" ;;
      esac

else

      DEFAULT_VISUALIZER="$DEFAULT_VISUALIZER"

fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: Using $DEFAULT_VISUALIZER as default visualizer" >&5
$as_echo "$as_me: Using $DEFAULT_VISUALIZER as default visualizer" >&6;}


cat >>confdefs.h <<_ACEOF
#define DEFAULT_VISUALIZER "$DEFAULT_VISUALIZER"
_ACEOF



GST_PLUGINS_NONPORTED=" cdxaparse \
 dccp faceoverlay \
 hdvparse \
 mve nuvdemux \
 patchdetect \
 sdi tta \
 videomeasure \
 linsys \
 apexsink dc1394 \
 musepack nas sdl timidity \
 wininet \
 xvid lv2 sndio libvisual"



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL accurip"



  # Check whether --enable-accurip was given.
if test "${enable_accurip+set}" = set; then :
  enableval=$enable_accurip;
      case "${enableval}" in
        yes) gst_use_accurip=yes ;;
        no) gst_use_accurip=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-accurip" "$LINENO" 5 ;;
       esac

else
  gst_use_accurip=yes
fi

  if test x$gst_use_accurip = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin accurip" >&5
$as_echo "$as_me: disabling dependency-less plugin accurip" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS accurip"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " accurip " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED accurip"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " accurip " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ accurip / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " accurip " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ accurip / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " accurip " > /dev/null; then
  USE_PLUGIN_ACCURIP_TRUE=
  USE_PLUGIN_ACCURIP_FALSE='#'
else
  USE_PLUGIN_ACCURIP_TRUE='#'
  USE_PLUGIN_ACCURIP_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL adpcmdec"



  # Check whether --enable-adpcmdec was given.
if test "${enable_adpcmdec+set}" = set; then :
  enableval=$enable_adpcmdec;
      case "${enableval}" in
        yes) gst_use_adpcmdec=yes ;;
        no) gst_use_adpcmdec=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-adpcmdec" "$LINENO" 5 ;;
       esac

else
  gst_use_adpcmdec=yes
fi

  if test x$gst_use_adpcmdec = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin adpcmdec" >&5
$as_echo "$as_me: disabling dependency-less plugin adpcmdec" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS adpcmdec"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " adpcmdec " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED adpcmdec"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " adpcmdec " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adpcmdec / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " adpcmdec " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adpcmdec / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " adpcmdec " > /dev/null; then
  USE_PLUGIN_ADPCMDEC_TRUE=
  USE_PLUGIN_ADPCMDEC_FALSE='#'
else
  USE_PLUGIN_ADPCMDEC_TRUE='#'
  USE_PLUGIN_ADPCMDEC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL adpcmenc"



  # Check whether --enable-adpcmenc was given.
if test "${enable_adpcmenc+set}" = set; then :
  enableval=$enable_adpcmenc;
      case "${enableval}" in
        yes) gst_use_adpcmenc=yes ;;
        no) gst_use_adpcmenc=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-adpcmenc" "$LINENO" 5 ;;
       esac

else
  gst_use_adpcmenc=yes
fi

  if test x$gst_use_adpcmenc = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin adpcmenc" >&5
$as_echo "$as_me: disabling dependency-less plugin adpcmenc" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS adpcmenc"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " adpcmenc " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED adpcmenc"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " adpcmenc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adpcmenc / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " adpcmenc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ adpcmenc / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " adpcmenc " > /dev/null; then
  USE_PLUGIN_ADPCMENC_TRUE=
  USE_PLUGIN_ADPCMENC_FALSE='#'
else
  USE_PLUGIN_ADPCMENC_TRUE='#'
  USE_PLUGIN_ADPCMENC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL aiff"



  # Check whether --enable-aiff was given.
if test "${enable_aiff+set}" = set; then :
  enableval=$enable_aiff;
      case "${enableval}" in
        yes) gst_use_aiff=yes ;;
        no) gst_use_aiff=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-aiff" "$LINENO" 5 ;;
       esac

else
  gst_use_aiff=yes
fi

  if test x$gst_use_aiff = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin aiff" >&5
$as_echo "$as_me: disabling dependency-less plugin aiff" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS aiff"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " aiff " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED aiff"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " aiff " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ aiff / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " aiff " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ aiff / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " aiff " > /dev/null; then
  USE_PLUGIN_AIFF_TRUE=
  USE_PLUGIN_AIFF_FALSE='#'
else
  USE_PLUGIN_AIFF_TRUE='#'
  USE_PLUGIN_AIFF_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videoframe_audiolevel"



  # Check whether --enable-videoframe_audiolevel was given.
if test "${enable_videoframe_audiolevel+set}" = set; then :
  enableval=$enable_videoframe_audiolevel;
      case "${enableval}" in
        yes) gst_use_videoframe_audiolevel=yes ;;
        no) gst_use_videoframe_audiolevel=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-videoframe_audiolevel" "$LINENO" 5 ;;
       esac

else
  gst_use_videoframe_audiolevel=yes
fi

  if test x$gst_use_videoframe_audiolevel = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videoframe_audiolevel" >&5
$as_echo "$as_me: disabling dependency-less plugin videoframe_audiolevel" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videoframe_audiolevel"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videoframe_audiolevel"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoframe_audiolevel / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoframe_audiolevel / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " videoframe_audiolevel " > /dev/null; then
  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE=
  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE='#'
else
  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE='#'
  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL asfmux"



  # Check whether --enable-asfmux was given.
if test "${enable_asfmux+set}" = set; then :
  enableval=$enable_asfmux;
      case "${enableval}" in
        yes) gst_use_asfmux=yes ;;
        no) gst_use_asfmux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-asfmux" "$LINENO" 5 ;;
       esac

else
  gst_use_asfmux=yes
fi

  if test x$gst_use_asfmux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin asfmux" >&5
$as_echo "$as_me: disabling dependency-less plugin asfmux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS asfmux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " asfmux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED asfmux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " asfmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ asfmux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " asfmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ asfmux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " asfmux " > /dev/null; then
  USE_PLUGIN_ASFMUX_TRUE=
  USE_PLUGIN_ASFMUX_FALSE='#'
else
  USE_PLUGIN_ASFMUX_TRUE='#'
  USE_PLUGIN_ASFMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiofxbad"



  # Check whether --enable-audiofxbad was given.
if test "${enable_audiofxbad+set}" = set; then :
  enableval=$enable_audiofxbad;
      case "${enableval}" in
        yes) gst_use_audiofxbad=yes ;;
        no) gst_use_audiofxbad=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-audiofxbad" "$LINENO" 5 ;;
       esac

else
  gst_use_audiofxbad=yes
fi

  if test x$gst_use_audiofxbad = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiofxbad" >&5
$as_echo "$as_me: disabling dependency-less plugin audiofxbad" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiofxbad"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiofxbad " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiofxbad"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiofxbad " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiofxbad / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audiofxbad " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiofxbad / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " audiofxbad " > /dev/null; then
  USE_PLUGIN_AUDIOFXBAD_TRUE=
  USE_PLUGIN_AUDIOFXBAD_FALSE='#'
else
  USE_PLUGIN_AUDIOFXBAD_TRUE='#'
  USE_PLUGIN_AUDIOFXBAD_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiomixer"



  # Check whether --enable-audiomixer was given.
if test "${enable_audiomixer+set}" = set; then :
  enableval=$enable_audiomixer;
      case "${enableval}" in
        yes) gst_use_audiomixer=yes ;;
        no) gst_use_audiomixer=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-audiomixer" "$LINENO" 5 ;;
       esac

else
  gst_use_audiomixer=yes
fi

  if test x$gst_use_audiomixer = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiomixer" >&5
$as_echo "$as_me: disabling dependency-less plugin audiomixer" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiomixer"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiomixer " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiomixer"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiomixer " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiomixer / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audiomixer " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiomixer / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " audiomixer " > /dev/null; then
  USE_PLUGIN_AUDIOMIXER_TRUE=
  USE_PLUGIN_AUDIOMIXER_FALSE='#'
else
  USE_PLUGIN_AUDIOMIXER_TRUE='#'
  USE_PLUGIN_AUDIOMIXER_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL compositor"



  # Check whether --enable-compositor was given.
if test "${enable_compositor+set}" = set; then :
  enableval=$enable_compositor;
      case "${enableval}" in
        yes) gst_use_compositor=yes ;;
        no) gst_use_compositor=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-compositor" "$LINENO" 5 ;;
       esac

else
  gst_use_compositor=yes
fi

  if test x$gst_use_compositor = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin compositor" >&5
$as_echo "$as_me: disabling dependency-less plugin compositor" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS compositor"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " compositor " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED compositor"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " compositor " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ compositor / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " compositor " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ compositor / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " compositor " > /dev/null; then
  USE_PLUGIN_COMPOSITOR_TRUE=
  USE_PLUGIN_COMPOSITOR_FALSE='#'
else
  USE_PLUGIN_COMPOSITOR_TRUE='#'
  USE_PLUGIN_COMPOSITOR_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL audiovisualizers"



  # Check whether --enable-audiovisualizers was given.
if test "${enable_audiovisualizers+set}" = set; then :
  enableval=$enable_audiovisualizers;
      case "${enableval}" in
        yes) gst_use_audiovisualizers=yes ;;
        no) gst_use_audiovisualizers=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-audiovisualizers" "$LINENO" 5 ;;
       esac

else
  gst_use_audiovisualizers=yes
fi

  if test x$gst_use_audiovisualizers = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin audiovisualizers" >&5
$as_echo "$as_me: disabling dependency-less plugin audiovisualizers" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS audiovisualizers"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " audiovisualizers " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED audiovisualizers"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " audiovisualizers " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiovisualizers / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " audiovisualizers " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ audiovisualizers / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " audiovisualizers " > /dev/null; then
  USE_PLUGIN_AUDIOVISUALIZERS_TRUE=
  USE_PLUGIN_AUDIOVISUALIZERS_FALSE='#'
else
  USE_PLUGIN_AUDIOVISUALIZERS_TRUE='#'
  USE_PLUGIN_AUDIOVISUALIZERS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL autoconvert"



  # Check whether --enable-autoconvert was given.
if test "${enable_autoconvert+set}" = set; then :
  enableval=$enable_autoconvert;
      case "${enableval}" in
        yes) gst_use_autoconvert=yes ;;
        no) gst_use_autoconvert=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-autoconvert" "$LINENO" 5 ;;
       esac

else
  gst_use_autoconvert=yes
fi

  if test x$gst_use_autoconvert = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin autoconvert" >&5
$as_echo "$as_me: disabling dependency-less plugin autoconvert" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS autoconvert"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " autoconvert " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED autoconvert"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " autoconvert " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ autoconvert / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " autoconvert " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ autoconvert / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " autoconvert " > /dev/null; then
  USE_PLUGIN_AUTOCONVERT_TRUE=
  USE_PLUGIN_AUTOCONVERT_FALSE='#'
else
  USE_PLUGIN_AUTOCONVERT_TRUE='#'
  USE_PLUGIN_AUTOCONVERT_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL bayer"



  # Check whether --enable-bayer was given.
if test "${enable_bayer+set}" = set; then :
  enableval=$enable_bayer;
      case "${enableval}" in
        yes) gst_use_bayer=yes ;;
        no) gst_use_bayer=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-bayer" "$LINENO" 5 ;;
       esac

else
  gst_use_bayer=yes
fi

  if test x$gst_use_bayer = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin bayer" >&5
$as_echo "$as_me: disabling dependency-less plugin bayer" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS bayer"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " bayer " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED bayer"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " bayer " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ bayer / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " bayer " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ bayer / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " bayer " > /dev/null; then
  USE_PLUGIN_BAYER_TRUE=
  USE_PLUGIN_BAYER_FALSE='#'
else
  USE_PLUGIN_BAYER_TRUE='#'
  USE_PLUGIN_BAYER_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL camerabin2"



  # Check whether --enable-camerabin2 was given.
if test "${enable_camerabin2+set}" = set; then :
  enableval=$enable_camerabin2;
      case "${enableval}" in
        yes) gst_use_camerabin2=yes ;;
        no) gst_use_camerabin2=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-camerabin2" "$LINENO" 5 ;;
       esac

else
  gst_use_camerabin2=yes
fi

  if test x$gst_use_camerabin2 = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin camerabin2" >&5
$as_echo "$as_me: disabling dependency-less plugin camerabin2" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS camerabin2"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " camerabin2 " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED camerabin2"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " camerabin2 " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ camerabin2 / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " camerabin2 " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ camerabin2 / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " camerabin2 " > /dev/null; then
  USE_PLUGIN_CAMERABIN2_TRUE=
  USE_PLUGIN_CAMERABIN2_FALSE='#'
else
  USE_PLUGIN_CAMERABIN2_TRUE='#'
  USE_PLUGIN_CAMERABIN2_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL cdxaparse"



  # Check whether --enable-cdxaparse was given.
if test "${enable_cdxaparse+set}" = set; then :
  enableval=$enable_cdxaparse;
      case "${enableval}" in
        yes) gst_use_cdxaparse=yes ;;
        no) gst_use_cdxaparse=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-cdxaparse" "$LINENO" 5 ;;
       esac

else
  gst_use_cdxaparse=yes
fi

  if test x$gst_use_cdxaparse = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin cdxaparse" >&5
$as_echo "$as_me: disabling dependency-less plugin cdxaparse" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS cdxaparse"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " cdxaparse " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED cdxaparse"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " cdxaparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ cdxaparse / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " cdxaparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ cdxaparse / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " cdxaparse " > /dev/null; then
  USE_PLUGIN_CDXAPARSE_TRUE=
  USE_PLUGIN_CDXAPARSE_FALSE='#'
else
  USE_PLUGIN_CDXAPARSE_TRUE='#'
  USE_PLUGIN_CDXAPARSE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL coloreffects"



  # Check whether --enable-coloreffects was given.
if test "${enable_coloreffects+set}" = set; then :
  enableval=$enable_coloreffects;
      case "${enableval}" in
        yes) gst_use_coloreffects=yes ;;
        no) gst_use_coloreffects=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-coloreffects" "$LINENO" 5 ;;
       esac

else
  gst_use_coloreffects=yes
fi

  if test x$gst_use_coloreffects = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin coloreffects" >&5
$as_echo "$as_me: disabling dependency-less plugin coloreffects" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS coloreffects"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " coloreffects " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED coloreffects"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " coloreffects " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ coloreffects / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " coloreffects " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ coloreffects / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " coloreffects " > /dev/null; then
  USE_PLUGIN_COLOREFFECTS_TRUE=
  USE_PLUGIN_COLOREFFECTS_FALSE='#'
else
  USE_PLUGIN_COLOREFFECTS_TRUE='#'
  USE_PLUGIN_COLOREFFECTS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL dataurisrc"



  # Check whether --enable-dataurisrc was given.
if test "${enable_dataurisrc+set}" = set; then :
  enableval=$enable_dataurisrc;
      case "${enableval}" in
        yes) gst_use_dataurisrc=yes ;;
        no) gst_use_dataurisrc=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-dataurisrc" "$LINENO" 5 ;;
       esac

else
  gst_use_dataurisrc=yes
fi

  if test x$gst_use_dataurisrc = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin dataurisrc" >&5
$as_echo "$as_me: disabling dependency-less plugin dataurisrc" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS dataurisrc"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " dataurisrc " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED dataurisrc"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " dataurisrc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dataurisrc / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " dataurisrc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dataurisrc / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " dataurisrc " > /dev/null; then
  USE_PLUGIN_DATAURISRC_TRUE=
  USE_PLUGIN_DATAURISRC_FALSE='#'
else
  USE_PLUGIN_DATAURISRC_TRUE='#'
  USE_PLUGIN_DATAURISRC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL dccp"



  # Check whether --enable-dccp was given.
if test "${enable_dccp+set}" = set; then :
  enableval=$enable_dccp;
      case "${enableval}" in
        yes) gst_use_dccp=yes ;;
        no) gst_use_dccp=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-dccp" "$LINENO" 5 ;;
       esac

else
  gst_use_dccp=yes
fi

  if test x$gst_use_dccp = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin dccp" >&5
$as_echo "$as_me: disabling dependency-less plugin dccp" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS dccp"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " dccp " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED dccp"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " dccp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dccp / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " dccp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dccp / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " dccp " > /dev/null; then
  USE_PLUGIN_DCCP_TRUE=
  USE_PLUGIN_DCCP_FALSE='#'
else
  USE_PLUGIN_DCCP_TRUE='#'
  USE_PLUGIN_DCCP_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL debugutils"



  # Check whether --enable-debugutils was given.
if test "${enable_debugutils+set}" = set; then :
  enableval=$enable_debugutils;
      case "${enableval}" in
        yes) gst_use_debugutils=yes ;;
        no) gst_use_debugutils=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-debugutils" "$LINENO" 5 ;;
       esac

else
  gst_use_debugutils=yes
fi

  if test x$gst_use_debugutils = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin debugutils" >&5
$as_echo "$as_me: disabling dependency-less plugin debugutils" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS debugutils"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED debugutils"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " debugutils " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ debugutils / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " debugutils " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ debugutils / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " debugutils " > /dev/null; then
  USE_PLUGIN_DEBUGUTILS_TRUE=
  USE_PLUGIN_DEBUGUTILS_FALSE='#'
else
  USE_PLUGIN_DEBUGUTILS_TRUE='#'
  USE_PLUGIN_DEBUGUTILS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL dvbsuboverlay"



  # Check whether --enable-dvbsuboverlay was given.
if test "${enable_dvbsuboverlay+set}" = set; then :
  enableval=$enable_dvbsuboverlay;
      case "${enableval}" in
        yes) gst_use_dvbsuboverlay=yes ;;
        no) gst_use_dvbsuboverlay=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-dvbsuboverlay" "$LINENO" 5 ;;
       esac

else
  gst_use_dvbsuboverlay=yes
fi

  if test x$gst_use_dvbsuboverlay = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin dvbsuboverlay" >&5
$as_echo "$as_me: disabling dependency-less plugin dvbsuboverlay" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS dvbsuboverlay"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " dvbsuboverlay " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED dvbsuboverlay"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " dvbsuboverlay " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dvbsuboverlay / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " dvbsuboverlay " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dvbsuboverlay / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " dvbsuboverlay " > /dev/null; then
  USE_PLUGIN_DVBSUBOVERLAY_TRUE=
  USE_PLUGIN_DVBSUBOVERLAY_FALSE='#'
else
  USE_PLUGIN_DVBSUBOVERLAY_TRUE='#'
  USE_PLUGIN_DVBSUBOVERLAY_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL dvdspu"



  # Check whether --enable-dvdspu was given.
if test "${enable_dvdspu+set}" = set; then :
  enableval=$enable_dvdspu;
      case "${enableval}" in
        yes) gst_use_dvdspu=yes ;;
        no) gst_use_dvdspu=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-dvdspu" "$LINENO" 5 ;;
       esac

else
  gst_use_dvdspu=yes
fi

  if test x$gst_use_dvdspu = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin dvdspu" >&5
$as_echo "$as_me: disabling dependency-less plugin dvdspu" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS dvdspu"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " dvdspu " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED dvdspu"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " dvdspu " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dvdspu / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " dvdspu " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dvdspu / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " dvdspu " > /dev/null; then
  USE_PLUGIN_DVDSPU_TRUE=
  USE_PLUGIN_DVDSPU_FALSE='#'
else
  USE_PLUGIN_DVDSPU_TRUE='#'
  USE_PLUGIN_DVDSPU_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL faceoverlay"



  # Check whether --enable-faceoverlay was given.
if test "${enable_faceoverlay+set}" = set; then :
  enableval=$enable_faceoverlay;
      case "${enableval}" in
        yes) gst_use_faceoverlay=yes ;;
        no) gst_use_faceoverlay=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-faceoverlay" "$LINENO" 5 ;;
       esac

else
  gst_use_faceoverlay=yes
fi

  if test x$gst_use_faceoverlay = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin faceoverlay" >&5
$as_echo "$as_me: disabling dependency-less plugin faceoverlay" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS faceoverlay"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " faceoverlay " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED faceoverlay"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " faceoverlay " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ faceoverlay / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " faceoverlay " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ faceoverlay / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " faceoverlay " > /dev/null; then
  USE_PLUGIN_FACEOVERLAY_TRUE=
  USE_PLUGIN_FACEOVERLAY_FALSE='#'
else
  USE_PLUGIN_FACEOVERLAY_TRUE='#'
  USE_PLUGIN_FACEOVERLAY_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL festival"



  # Check whether --enable-festival was given.
if test "${enable_festival+set}" = set; then :
  enableval=$enable_festival;
      case "${enableval}" in
        yes) gst_use_festival=yes ;;
        no) gst_use_festival=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-festival" "$LINENO" 5 ;;
       esac

else
  gst_use_festival=yes
fi

  if test x$gst_use_festival = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin festival" >&5
$as_echo "$as_me: disabling dependency-less plugin festival" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS festival"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " festival " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED festival"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " festival " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ festival / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " festival " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ festival / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " festival " > /dev/null; then
  USE_PLUGIN_FESTIVAL_TRUE=
  USE_PLUGIN_FESTIVAL_FALSE='#'
else
  USE_PLUGIN_FESTIVAL_TRUE='#'
  USE_PLUGIN_FESTIVAL_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL fieldanalysis"



  # Check whether --enable-fieldanalysis was given.
if test "${enable_fieldanalysis+set}" = set; then :
  enableval=$enable_fieldanalysis;
      case "${enableval}" in
        yes) gst_use_fieldanalysis=yes ;;
        no) gst_use_fieldanalysis=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-fieldanalysis" "$LINENO" 5 ;;
       esac

else
  gst_use_fieldanalysis=yes
fi

  if test x$gst_use_fieldanalysis = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin fieldanalysis" >&5
$as_echo "$as_me: disabling dependency-less plugin fieldanalysis" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS fieldanalysis"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " fieldanalysis " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED fieldanalysis"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " fieldanalysis " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ fieldanalysis / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " fieldanalysis " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ fieldanalysis / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " fieldanalysis " > /dev/null; then
  USE_PLUGIN_FIELDANALYSIS_TRUE=
  USE_PLUGIN_FIELDANALYSIS_FALSE='#'
else
  USE_PLUGIN_FIELDANALYSIS_TRUE='#'
  USE_PLUGIN_FIELDANALYSIS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL freeverb"



  # Check whether --enable-freeverb was given.
if test "${enable_freeverb+set}" = set; then :
  enableval=$enable_freeverb;
      case "${enableval}" in
        yes) gst_use_freeverb=yes ;;
        no) gst_use_freeverb=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-freeverb" "$LINENO" 5 ;;
       esac

else
  gst_use_freeverb=yes
fi

  if test x$gst_use_freeverb = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin freeverb" >&5
$as_echo "$as_me: disabling dependency-less plugin freeverb" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS freeverb"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " freeverb " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED freeverb"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " freeverb " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ freeverb / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " freeverb " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ freeverb / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " freeverb " > /dev/null; then
  USE_PLUGIN_FREEVERB_TRUE=
  USE_PLUGIN_FREEVERB_FALSE='#'
else
  USE_PLUGIN_FREEVERB_TRUE='#'
  USE_PLUGIN_FREEVERB_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL frei0r"



  # Check whether --enable-frei0r was given.
if test "${enable_frei0r+set}" = set; then :
  enableval=$enable_frei0r;
      case "${enableval}" in
        yes) gst_use_frei0r=yes ;;
        no) gst_use_frei0r=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-frei0r" "$LINENO" 5 ;;
       esac

else
  gst_use_frei0r=yes
fi

  if test x$gst_use_frei0r = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin frei0r" >&5
$as_echo "$as_me: disabling dependency-less plugin frei0r" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS frei0r"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " frei0r " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED frei0r"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " frei0r " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ frei0r / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " frei0r " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ frei0r / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " frei0r " > /dev/null; then
  USE_PLUGIN_FREI0R_TRUE=
  USE_PLUGIN_FREI0R_FALSE='#'
else
  USE_PLUGIN_FREI0R_TRUE='#'
  USE_PLUGIN_FREI0R_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL gaudieffects"



  # Check whether --enable-gaudieffects was given.
if test "${enable_gaudieffects+set}" = set; then :
  enableval=$enable_gaudieffects;
      case "${enableval}" in
        yes) gst_use_gaudieffects=yes ;;
        no) gst_use_gaudieffects=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-gaudieffects" "$LINENO" 5 ;;
       esac

else
  gst_use_gaudieffects=yes
fi

  if test x$gst_use_gaudieffects = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin gaudieffects" >&5
$as_echo "$as_me: disabling dependency-less plugin gaudieffects" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS gaudieffects"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " gaudieffects " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED gaudieffects"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " gaudieffects " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gaudieffects / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " gaudieffects " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gaudieffects / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " gaudieffects " > /dev/null; then
  USE_PLUGIN_GAUDIEFFECTS_TRUE=
  USE_PLUGIN_GAUDIEFFECTS_FALSE='#'
else
  USE_PLUGIN_GAUDIEFFECTS_TRUE='#'
  USE_PLUGIN_GAUDIEFFECTS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL geometrictransform"



  # Check whether --enable-geometrictransform was given.
if test "${enable_geometrictransform+set}" = set; then :
  enableval=$enable_geometrictransform;
      case "${enableval}" in
        yes) gst_use_geometrictransform=yes ;;
        no) gst_use_geometrictransform=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-geometrictransform" "$LINENO" 5 ;;
       esac

else
  gst_use_geometrictransform=yes
fi

  if test x$gst_use_geometrictransform = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin geometrictransform" >&5
$as_echo "$as_me: disabling dependency-less plugin geometrictransform" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS geometrictransform"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " geometrictransform " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED geometrictransform"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " geometrictransform " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ geometrictransform / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " geometrictransform " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ geometrictransform / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " geometrictransform " > /dev/null; then
  USE_PLUGIN_GEOMETRICTRANSFORM_TRUE=
  USE_PLUGIN_GEOMETRICTRANSFORM_FALSE='#'
else
  USE_PLUGIN_GEOMETRICTRANSFORM_TRUE='#'
  USE_PLUGIN_GEOMETRICTRANSFORM_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL gdp"



  # Check whether --enable-gdp was given.
if test "${enable_gdp+set}" = set; then :
  enableval=$enable_gdp;
      case "${enableval}" in
        yes) gst_use_gdp=yes ;;
        no) gst_use_gdp=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-gdp" "$LINENO" 5 ;;
       esac

else
  gst_use_gdp=yes
fi

  if test x$gst_use_gdp = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin gdp" >&5
$as_echo "$as_me: disabling dependency-less plugin gdp" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS gdp"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " gdp " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED gdp"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " gdp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gdp / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " gdp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ gdp / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " gdp " > /dev/null; then
  USE_PLUGIN_GDP_TRUE=
  USE_PLUGIN_GDP_FALSE='#'
else
  USE_PLUGIN_GDP_TRUE='#'
  USE_PLUGIN_GDP_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL hdvparse"



  # Check whether --enable-hdvparse was given.
if test "${enable_hdvparse+set}" = set; then :
  enableval=$enable_hdvparse;
      case "${enableval}" in
        yes) gst_use_hdvparse=yes ;;
        no) gst_use_hdvparse=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-hdvparse" "$LINENO" 5 ;;
       esac

else
  gst_use_hdvparse=yes
fi

  if test x$gst_use_hdvparse = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin hdvparse" >&5
$as_echo "$as_me: disabling dependency-less plugin hdvparse" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS hdvparse"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " hdvparse " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED hdvparse"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " hdvparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ hdvparse / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " hdvparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ hdvparse / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " hdvparse " > /dev/null; then
  USE_PLUGIN_HDVPARSE_TRUE=
  USE_PLUGIN_HDVPARSE_FALSE='#'
else
  USE_PLUGIN_HDVPARSE_TRUE='#'
  USE_PLUGIN_HDVPARSE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL id3tag"



  # Check whether --enable-id3tag was given.
if test "${enable_id3tag+set}" = set; then :
  enableval=$enable_id3tag;
      case "${enableval}" in
        yes) gst_use_id3tag=yes ;;
        no) gst_use_id3tag=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-id3tag" "$LINENO" 5 ;;
       esac

else
  gst_use_id3tag=yes
fi

  if test x$gst_use_id3tag = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin id3tag" >&5
$as_echo "$as_me: disabling dependency-less plugin id3tag" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS id3tag"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " id3tag " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED id3tag"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " id3tag " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ id3tag / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " id3tag " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ id3tag / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " id3tag " > /dev/null; then
  USE_PLUGIN_ID3TAG_TRUE=
  USE_PLUGIN_ID3TAG_FALSE='#'
else
  USE_PLUGIN_ID3TAG_TRUE='#'
  USE_PLUGIN_ID3TAG_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL inter"



  # Check whether --enable-inter was given.
if test "${enable_inter+set}" = set; then :
  enableval=$enable_inter;
      case "${enableval}" in
        yes) gst_use_inter=yes ;;
        no) gst_use_inter=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-inter" "$LINENO" 5 ;;
       esac

else
  gst_use_inter=yes
fi

  if test x$gst_use_inter = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin inter" >&5
$as_echo "$as_me: disabling dependency-less plugin inter" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS inter"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " inter " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED inter"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " inter " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ inter / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " inter " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ inter / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " inter " > /dev/null; then
  USE_PLUGIN_INTER_TRUE=
  USE_PLUGIN_INTER_FALSE='#'
else
  USE_PLUGIN_INTER_TRUE='#'
  USE_PLUGIN_INTER_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL interlace"



  # Check whether --enable-interlace was given.
if test "${enable_interlace+set}" = set; then :
  enableval=$enable_interlace;
      case "${enableval}" in
        yes) gst_use_interlace=yes ;;
        no) gst_use_interlace=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-interlace" "$LINENO" 5 ;;
       esac

else
  gst_use_interlace=yes
fi

  if test x$gst_use_interlace = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin interlace" >&5
$as_echo "$as_me: disabling dependency-less plugin interlace" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS interlace"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " interlace " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED interlace"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " interlace " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ interlace / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " interlace " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ interlace / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " interlace " > /dev/null; then
  USE_PLUGIN_INTERLACE_TRUE=
  USE_PLUGIN_INTERLACE_FALSE='#'
else
  USE_PLUGIN_INTERLACE_TRUE='#'
  USE_PLUGIN_INTERLACE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL ivfparse"



  # Check whether --enable-ivfparse was given.
if test "${enable_ivfparse+set}" = set; then :
  enableval=$enable_ivfparse;
      case "${enableval}" in
        yes) gst_use_ivfparse=yes ;;
        no) gst_use_ivfparse=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-ivfparse" "$LINENO" 5 ;;
       esac

else
  gst_use_ivfparse=yes
fi

  if test x$gst_use_ivfparse = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin ivfparse" >&5
$as_echo "$as_me: disabling dependency-less plugin ivfparse" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS ivfparse"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " ivfparse " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED ivfparse"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " ivfparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ ivfparse / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ivfparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ ivfparse / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " ivfparse " > /dev/null; then
  USE_PLUGIN_IVFPARSE_TRUE=
  USE_PLUGIN_IVFPARSE_FALSE='#'
else
  USE_PLUGIN_IVFPARSE_TRUE='#'
  USE_PLUGIN_IVFPARSE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL ivtc"



  # Check whether --enable-ivtc was given.
if test "${enable_ivtc+set}" = set; then :
  enableval=$enable_ivtc;
      case "${enableval}" in
        yes) gst_use_ivtc=yes ;;
        no) gst_use_ivtc=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-ivtc" "$LINENO" 5 ;;
       esac

else
  gst_use_ivtc=yes
fi

  if test x$gst_use_ivtc = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin ivtc" >&5
$as_echo "$as_me: disabling dependency-less plugin ivtc" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS ivtc"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " ivtc " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED ivtc"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " ivtc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ ivtc / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ivtc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ ivtc / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " ivtc " > /dev/null; then
  USE_PLUGIN_IVTC_TRUE=
  USE_PLUGIN_IVTC_FALSE='#'
else
  USE_PLUGIN_IVTC_TRUE='#'
  USE_PLUGIN_IVTC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL jp2kdecimator"



  # Check whether --enable-jp2kdecimator was given.
if test "${enable_jp2kdecimator+set}" = set; then :
  enableval=$enable_jp2kdecimator;
      case "${enableval}" in
        yes) gst_use_jp2kdecimator=yes ;;
        no) gst_use_jp2kdecimator=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-jp2kdecimator" "$LINENO" 5 ;;
       esac

else
  gst_use_jp2kdecimator=yes
fi

  if test x$gst_use_jp2kdecimator = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin jp2kdecimator" >&5
$as_echo "$as_me: disabling dependency-less plugin jp2kdecimator" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS jp2kdecimator"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " jp2kdecimator " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED jp2kdecimator"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " jp2kdecimator " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ jp2kdecimator / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " jp2kdecimator " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ jp2kdecimator / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " jp2kdecimator " > /dev/null; then
  USE_PLUGIN_JP2KDECIMATOR_TRUE=
  USE_PLUGIN_JP2KDECIMATOR_FALSE='#'
else
  USE_PLUGIN_JP2KDECIMATOR_TRUE='#'
  USE_PLUGIN_JP2KDECIMATOR_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL jpegformat"



  # Check whether --enable-jpegformat was given.
if test "${enable_jpegformat+set}" = set; then :
  enableval=$enable_jpegformat;
      case "${enableval}" in
        yes) gst_use_jpegformat=yes ;;
        no) gst_use_jpegformat=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-jpegformat" "$LINENO" 5 ;;
       esac

else
  gst_use_jpegformat=yes
fi

  if test x$gst_use_jpegformat = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin jpegformat" >&5
$as_echo "$as_me: disabling dependency-less plugin jpegformat" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS jpegformat"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " jpegformat " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED jpegformat"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " jpegformat " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ jpegformat / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " jpegformat " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ jpegformat / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " jpegformat " > /dev/null; then
  USE_PLUGIN_JPEGFORMAT_TRUE=
  USE_PLUGIN_JPEGFORMAT_FALSE='#'
else
  USE_PLUGIN_JPEGFORMAT_TRUE='#'
  USE_PLUGIN_JPEGFORMAT_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL librfb"



  # Check whether --enable-librfb was given.
if test "${enable_librfb+set}" = set; then :
  enableval=$enable_librfb;
      case "${enableval}" in
        yes) gst_use_librfb=yes ;;
        no) gst_use_librfb=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-librfb" "$LINENO" 5 ;;
       esac

else
  gst_use_librfb=yes
fi

  if test x$gst_use_librfb = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin librfb" >&5
$as_echo "$as_me: disabling dependency-less plugin librfb" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS librfb"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " librfb " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED librfb"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " librfb " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ librfb / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " librfb " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ librfb / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " librfb " > /dev/null; then
  USE_PLUGIN_LIBRFB_TRUE=
  USE_PLUGIN_LIBRFB_FALSE='#'
else
  USE_PLUGIN_LIBRFB_TRUE='#'
  USE_PLUGIN_LIBRFB_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL midi"



  # Check whether --enable-midi was given.
if test "${enable_midi+set}" = set; then :
  enableval=$enable_midi;
      case "${enableval}" in
        yes) gst_use_midi=yes ;;
        no) gst_use_midi=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-midi" "$LINENO" 5 ;;
       esac

else
  gst_use_midi=yes
fi

  if test x$gst_use_midi = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin midi" >&5
$as_echo "$as_me: disabling dependency-less plugin midi" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS midi"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " midi " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED midi"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " midi " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ midi / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " midi " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ midi / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " midi " > /dev/null; then
  USE_PLUGIN_MIDI_TRUE=
  USE_PLUGIN_MIDI_FALSE='#'
else
  USE_PLUGIN_MIDI_TRUE='#'
  USE_PLUGIN_MIDI_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mpegdemux"



  # Check whether --enable-mpegdemux was given.
if test "${enable_mpegdemux+set}" = set; then :
  enableval=$enable_mpegdemux;
      case "${enableval}" in
        yes) gst_use_mpegdemux=yes ;;
        no) gst_use_mpegdemux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mpegdemux" "$LINENO" 5 ;;
       esac

else
  gst_use_mpegdemux=yes
fi

  if test x$gst_use_mpegdemux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mpegdemux" >&5
$as_echo "$as_me: disabling dependency-less plugin mpegdemux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mpegdemux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mpegdemux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mpegdemux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mpegdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegdemux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mpegdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegdemux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mpegdemux " > /dev/null; then
  USE_PLUGIN_MPEGDEMUX_TRUE=
  USE_PLUGIN_MPEGDEMUX_FALSE='#'
else
  USE_PLUGIN_MPEGDEMUX_TRUE='#'
  USE_PLUGIN_MPEGDEMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mpegtsdemux"



  # Check whether --enable-mpegtsdemux was given.
if test "${enable_mpegtsdemux+set}" = set; then :
  enableval=$enable_mpegtsdemux;
      case "${enableval}" in
        yes) gst_use_mpegtsdemux=yes ;;
        no) gst_use_mpegtsdemux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mpegtsdemux" "$LINENO" 5 ;;
       esac

else
  gst_use_mpegtsdemux=yes
fi

  if test x$gst_use_mpegtsdemux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mpegtsdemux" >&5
$as_echo "$as_me: disabling dependency-less plugin mpegtsdemux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mpegtsdemux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mpegtsdemux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mpegtsdemux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mpegtsdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegtsdemux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mpegtsdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegtsdemux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mpegtsdemux " > /dev/null; then
  USE_PLUGIN_MPEGTSDEMUX_TRUE=
  USE_PLUGIN_MPEGTSDEMUX_FALSE='#'
else
  USE_PLUGIN_MPEGTSDEMUX_TRUE='#'
  USE_PLUGIN_MPEGTSDEMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mpegtsmux"



  # Check whether --enable-mpegtsmux was given.
if test "${enable_mpegtsmux+set}" = set; then :
  enableval=$enable_mpegtsmux;
      case "${enableval}" in
        yes) gst_use_mpegtsmux=yes ;;
        no) gst_use_mpegtsmux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mpegtsmux" "$LINENO" 5 ;;
       esac

else
  gst_use_mpegtsmux=yes
fi

  if test x$gst_use_mpegtsmux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mpegtsmux" >&5
$as_echo "$as_me: disabling dependency-less plugin mpegtsmux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mpegtsmux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mpegtsmux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mpegtsmux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mpegtsmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegtsmux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mpegtsmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegtsmux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mpegtsmux " > /dev/null; then
  USE_PLUGIN_MPEGTSMUX_TRUE=
  USE_PLUGIN_MPEGTSMUX_FALSE='#'
else
  USE_PLUGIN_MPEGTSMUX_TRUE='#'
  USE_PLUGIN_MPEGTSMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mpegpsmux"



  # Check whether --enable-mpegpsmux was given.
if test "${enable_mpegpsmux+set}" = set; then :
  enableval=$enable_mpegpsmux;
      case "${enableval}" in
        yes) gst_use_mpegpsmux=yes ;;
        no) gst_use_mpegpsmux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mpegpsmux" "$LINENO" 5 ;;
       esac

else
  gst_use_mpegpsmux=yes
fi

  if test x$gst_use_mpegpsmux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mpegpsmux" >&5
$as_echo "$as_me: disabling dependency-less plugin mpegpsmux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mpegpsmux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mpegpsmux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mpegpsmux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mpegpsmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegpsmux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mpegpsmux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mpegpsmux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mpegpsmux " > /dev/null; then
  USE_PLUGIN_MPEGPSMUX_TRUE=
  USE_PLUGIN_MPEGPSMUX_FALSE='#'
else
  USE_PLUGIN_MPEGPSMUX_TRUE='#'
  USE_PLUGIN_MPEGPSMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mve"



  # Check whether --enable-mve was given.
if test "${enable_mve+set}" = set; then :
  enableval=$enable_mve;
      case "${enableval}" in
        yes) gst_use_mve=yes ;;
        no) gst_use_mve=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mve" "$LINENO" 5 ;;
       esac

else
  gst_use_mve=yes
fi

  if test x$gst_use_mve = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mve" >&5
$as_echo "$as_me: disabling dependency-less plugin mve" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mve"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mve " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mve"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mve " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mve / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mve " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mve / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mve " > /dev/null; then
  USE_PLUGIN_MVE_TRUE=
  USE_PLUGIN_MVE_FALSE='#'
else
  USE_PLUGIN_MVE_TRUE='#'
  USE_PLUGIN_MVE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL mxf"



  # Check whether --enable-mxf was given.
if test "${enable_mxf+set}" = set; then :
  enableval=$enable_mxf;
      case "${enableval}" in
        yes) gst_use_mxf=yes ;;
        no) gst_use_mxf=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-mxf" "$LINENO" 5 ;;
       esac

else
  gst_use_mxf=yes
fi

  if test x$gst_use_mxf = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin mxf" >&5
$as_echo "$as_me: disabling dependency-less plugin mxf" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS mxf"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " mxf " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED mxf"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " mxf " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mxf / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " mxf " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ mxf / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " mxf " > /dev/null; then
  USE_PLUGIN_MXF_TRUE=
  USE_PLUGIN_MXF_FALSE='#'
else
  USE_PLUGIN_MXF_TRUE='#'
  USE_PLUGIN_MXF_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL netsim"



  # Check whether --enable-netsim was given.
if test "${enable_netsim+set}" = set; then :
  enableval=$enable_netsim;
      case "${enableval}" in
        yes) gst_use_netsim=yes ;;
        no) gst_use_netsim=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-netsim" "$LINENO" 5 ;;
       esac

else
  gst_use_netsim=yes
fi

  if test x$gst_use_netsim = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin netsim" >&5
$as_echo "$as_me: disabling dependency-less plugin netsim" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS netsim"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " netsim " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED netsim"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " netsim " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ netsim / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " netsim " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ netsim / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " netsim " > /dev/null; then
  USE_PLUGIN_NETSIM_TRUE=
  USE_PLUGIN_NETSIM_FALSE='#'
else
  USE_PLUGIN_NETSIM_TRUE='#'
  USE_PLUGIN_NETSIM_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL nuvdemux"



  # Check whether --enable-nuvdemux was given.
if test "${enable_nuvdemux+set}" = set; then :
  enableval=$enable_nuvdemux;
      case "${enableval}" in
        yes) gst_use_nuvdemux=yes ;;
        no) gst_use_nuvdemux=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-nuvdemux" "$LINENO" 5 ;;
       esac

else
  gst_use_nuvdemux=yes
fi

  if test x$gst_use_nuvdemux = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin nuvdemux" >&5
$as_echo "$as_me: disabling dependency-less plugin nuvdemux" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS nuvdemux"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " nuvdemux " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED nuvdemux"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " nuvdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ nuvdemux / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " nuvdemux " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ nuvdemux / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " nuvdemux " > /dev/null; then
  USE_PLUGIN_NUVDEMUX_TRUE=
  USE_PLUGIN_NUVDEMUX_FALSE='#'
else
  USE_PLUGIN_NUVDEMUX_TRUE='#'
  USE_PLUGIN_NUVDEMUX_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL onvif"



  # Check whether --enable-onvif was given.
if test "${enable_onvif+set}" = set; then :
  enableval=$enable_onvif;
      case "${enableval}" in
        yes) gst_use_onvif=yes ;;
        no) gst_use_onvif=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-onvif" "$LINENO" 5 ;;
       esac

else
  gst_use_onvif=yes
fi

  if test x$gst_use_onvif = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin onvif" >&5
$as_echo "$as_me: disabling dependency-less plugin onvif" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS onvif"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " onvif " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED onvif"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " onvif " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ onvif / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " onvif " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ onvif / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " onvif " > /dev/null; then
  USE_PLUGIN_ONVIF_TRUE=
  USE_PLUGIN_ONVIF_FALSE='#'
else
  USE_PLUGIN_ONVIF_TRUE='#'
  USE_PLUGIN_ONVIF_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL patchdetect"



  # Check whether --enable-patchdetect was given.
if test "${enable_patchdetect+set}" = set; then :
  enableval=$enable_patchdetect;
      case "${enableval}" in
        yes) gst_use_patchdetect=yes ;;
        no) gst_use_patchdetect=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-patchdetect" "$LINENO" 5 ;;
       esac

else
  gst_use_patchdetect=yes
fi

  if test x$gst_use_patchdetect = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin patchdetect" >&5
$as_echo "$as_me: disabling dependency-less plugin patchdetect" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS patchdetect"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " patchdetect " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED patchdetect"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " patchdetect " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ patchdetect / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " patchdetect " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ patchdetect / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " patchdetect " > /dev/null; then
  USE_PLUGIN_PATCHDETECT_TRUE=
  USE_PLUGIN_PATCHDETECT_FALSE='#'
else
  USE_PLUGIN_PATCHDETECT_TRUE='#'
  USE_PLUGIN_PATCHDETECT_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL pcapparse"



  # Check whether --enable-pcapparse was given.
if test "${enable_pcapparse+set}" = set; then :
  enableval=$enable_pcapparse;
      case "${enableval}" in
        yes) gst_use_pcapparse=yes ;;
        no) gst_use_pcapparse=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-pcapparse" "$LINENO" 5 ;;
       esac

else
  gst_use_pcapparse=yes
fi

  if test x$gst_use_pcapparse = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin pcapparse" >&5
$as_echo "$as_me: disabling dependency-less plugin pcapparse" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS pcapparse"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " pcapparse " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED pcapparse"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " pcapparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ pcapparse / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " pcapparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ pcapparse / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " pcapparse " > /dev/null; then
  USE_PLUGIN_PCAPPARSE_TRUE=
  USE_PLUGIN_PCAPPARSE_FALSE='#'
else
  USE_PLUGIN_PCAPPARSE_TRUE='#'
  USE_PLUGIN_PCAPPARSE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL pnm"



  # Check whether --enable-pnm was given.
if test "${enable_pnm+set}" = set; then :
  enableval=$enable_pnm;
      case "${enableval}" in
        yes) gst_use_pnm=yes ;;
        no) gst_use_pnm=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-pnm" "$LINENO" 5 ;;
       esac

else
  gst_use_pnm=yes
fi

  if test x$gst_use_pnm = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin pnm" >&5
$as_echo "$as_me: disabling dependency-less plugin pnm" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS pnm"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " pnm " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED pnm"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " pnm " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ pnm / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " pnm " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ pnm / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " pnm " > /dev/null; then
  USE_PLUGIN_PNM_TRUE=
  USE_PLUGIN_PNM_FALSE='#'
else
  USE_PLUGIN_PNM_TRUE='#'
  USE_PLUGIN_PNM_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL rawparse"



  # Check whether --enable-rawparse was given.
if test "${enable_rawparse+set}" = set; then :
  enableval=$enable_rawparse;
      case "${enableval}" in
        yes) gst_use_rawparse=yes ;;
        no) gst_use_rawparse=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-rawparse" "$LINENO" 5 ;;
       esac

else
  gst_use_rawparse=yes
fi

  if test x$gst_use_rawparse = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin rawparse" >&5
$as_echo "$as_me: disabling dependency-less plugin rawparse" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS rawparse"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " rawparse " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED rawparse"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " rawparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rawparse / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " rawparse " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ rawparse / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " rawparse " > /dev/null; then
  USE_PLUGIN_RAWPARSE_TRUE=
  USE_PLUGIN_RAWPARSE_FALSE='#'
else
  USE_PLUGIN_RAWPARSE_TRUE='#'
  USE_PLUGIN_RAWPARSE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL removesilence"



  # Check whether --enable-removesilence was given.
if test "${enable_removesilence+set}" = set; then :
  enableval=$enable_removesilence;
      case "${enableval}" in
        yes) gst_use_removesilence=yes ;;
        no) gst_use_removesilence=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-removesilence" "$LINENO" 5 ;;
       esac

else
  gst_use_removesilence=yes
fi

  if test x$gst_use_removesilence = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin removesilence" >&5
$as_echo "$as_me: disabling dependency-less plugin removesilence" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS removesilence"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " removesilence " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED removesilence"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " removesilence " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ removesilence / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " removesilence " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ removesilence / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " removesilence " > /dev/null; then
  USE_PLUGIN_REMOVESILENCE_TRUE=
  USE_PLUGIN_REMOVESILENCE_FALSE='#'
else
  USE_PLUGIN_REMOVESILENCE_TRUE='#'
  USE_PLUGIN_REMOVESILENCE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL sdi"



  # Check whether --enable-sdi was given.
if test "${enable_sdi+set}" = set; then :
  enableval=$enable_sdi;
      case "${enableval}" in
        yes) gst_use_sdi=yes ;;
        no) gst_use_sdi=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-sdi" "$LINENO" 5 ;;
       esac

else
  gst_use_sdi=yes
fi

  if test x$gst_use_sdi = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin sdi" >&5
$as_echo "$as_me: disabling dependency-less plugin sdi" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS sdi"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " sdi " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED sdi"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " sdi " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ sdi / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " sdi " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ sdi / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " sdi " > /dev/null; then
  USE_PLUGIN_SDI_TRUE=
  USE_PLUGIN_SDI_FALSE='#'
else
  USE_PLUGIN_SDI_TRUE='#'
  USE_PLUGIN_SDI_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL sdp"



  # Check whether --enable-sdp was given.
if test "${enable_sdp+set}" = set; then :
  enableval=$enable_sdp;
      case "${enableval}" in
        yes) gst_use_sdp=yes ;;
        no) gst_use_sdp=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-sdp" "$LINENO" 5 ;;
       esac

else
  gst_use_sdp=yes
fi

  if test x$gst_use_sdp = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin sdp" >&5
$as_echo "$as_me: disabling dependency-less plugin sdp" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS sdp"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " sdp " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED sdp"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " sdp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ sdp / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " sdp " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ sdp / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " sdp " > /dev/null; then
  USE_PLUGIN_SDP_TRUE=
  USE_PLUGIN_SDP_FALSE='#'
else
  USE_PLUGIN_SDP_TRUE='#'
  USE_PLUGIN_SDP_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL segmentclip"



  # Check whether --enable-segmentclip was given.
if test "${enable_segmentclip+set}" = set; then :
  enableval=$enable_segmentclip;
      case "${enableval}" in
        yes) gst_use_segmentclip=yes ;;
        no) gst_use_segmentclip=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-segmentclip" "$LINENO" 5 ;;
       esac

else
  gst_use_segmentclip=yes
fi

  if test x$gst_use_segmentclip = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin segmentclip" >&5
$as_echo "$as_me: disabling dependency-less plugin segmentclip" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS segmentclip"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " segmentclip " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED segmentclip"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " segmentclip " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ segmentclip / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " segmentclip " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ segmentclip / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " segmentclip " > /dev/null; then
  USE_PLUGIN_SEGMENTCLIP_TRUE=
  USE_PLUGIN_SEGMENTCLIP_FALSE='#'
else
  USE_PLUGIN_SEGMENTCLIP_TRUE='#'
  USE_PLUGIN_SEGMENTCLIP_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL siren"



  # Check whether --enable-siren was given.
if test "${enable_siren+set}" = set; then :
  enableval=$enable_siren;
      case "${enableval}" in
        yes) gst_use_siren=yes ;;
        no) gst_use_siren=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-siren" "$LINENO" 5 ;;
       esac

else
  gst_use_siren=yes
fi

  if test x$gst_use_siren = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin siren" >&5
$as_echo "$as_me: disabling dependency-less plugin siren" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS siren"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " siren " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED siren"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " siren " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ siren / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " siren " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ siren / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " siren " > /dev/null; then
  USE_PLUGIN_SIREN_TRUE=
  USE_PLUGIN_SIREN_FALSE='#'
else
  USE_PLUGIN_SIREN_TRUE='#'
  USE_PLUGIN_SIREN_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL smooth"



  # Check whether --enable-smooth was given.
if test "${enable_smooth+set}" = set; then :
  enableval=$enable_smooth;
      case "${enableval}" in
        yes) gst_use_smooth=yes ;;
        no) gst_use_smooth=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-smooth" "$LINENO" 5 ;;
       esac

else
  gst_use_smooth=yes
fi

  if test x$gst_use_smooth = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin smooth" >&5
$as_echo "$as_me: disabling dependency-less plugin smooth" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS smooth"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " smooth " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED smooth"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " smooth " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ smooth / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " smooth " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ smooth / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " smooth " > /dev/null; then
  USE_PLUGIN_SMOOTH_TRUE=
  USE_PLUGIN_SMOOTH_FALSE='#'
else
  USE_PLUGIN_SMOOTH_TRUE='#'
  USE_PLUGIN_SMOOTH_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL speed"



  # Check whether --enable-speed was given.
if test "${enable_speed+set}" = set; then :
  enableval=$enable_speed;
      case "${enableval}" in
        yes) gst_use_speed=yes ;;
        no) gst_use_speed=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-speed" "$LINENO" 5 ;;
       esac

else
  gst_use_speed=yes
fi

  if test x$gst_use_speed = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin speed" >&5
$as_echo "$as_me: disabling dependency-less plugin speed" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS speed"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " speed " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED speed"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " speed " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ speed / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " speed " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ speed / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " speed " > /dev/null; then
  USE_PLUGIN_SPEED_TRUE=
  USE_PLUGIN_SPEED_FALSE='#'
else
  USE_PLUGIN_SPEED_TRUE='#'
  USE_PLUGIN_SPEED_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL subenc"



  # Check whether --enable-subenc was given.
if test "${enable_subenc+set}" = set; then :
  enableval=$enable_subenc;
      case "${enableval}" in
        yes) gst_use_subenc=yes ;;
        no) gst_use_subenc=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-subenc" "$LINENO" 5 ;;
       esac

else
  gst_use_subenc=yes
fi

  if test x$gst_use_subenc = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin subenc" >&5
$as_echo "$as_me: disabling dependency-less plugin subenc" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS subenc"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " subenc " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED subenc"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " subenc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ subenc / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " subenc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ subenc / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " subenc " > /dev/null; then
  USE_PLUGIN_SUBENC_TRUE=
  USE_PLUGIN_SUBENC_FALSE='#'
else
  USE_PLUGIN_SUBENC_TRUE='#'
  USE_PLUGIN_SUBENC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL stereo"



  # Check whether --enable-stereo was given.
if test "${enable_stereo+set}" = set; then :
  enableval=$enable_stereo;
      case "${enableval}" in
        yes) gst_use_stereo=yes ;;
        no) gst_use_stereo=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-stereo" "$LINENO" 5 ;;
       esac

else
  gst_use_stereo=yes
fi

  if test x$gst_use_stereo = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin stereo" >&5
$as_echo "$as_me: disabling dependency-less plugin stereo" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS stereo"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " stereo " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED stereo"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " stereo " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ stereo / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " stereo " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ stereo / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " stereo " > /dev/null; then
  USE_PLUGIN_STEREO_TRUE=
  USE_PLUGIN_STEREO_FALSE='#'
else
  USE_PLUGIN_STEREO_TRUE='#'
  USE_PLUGIN_STEREO_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL tta"



  # Check whether --enable-tta was given.
if test "${enable_tta+set}" = set; then :
  enableval=$enable_tta;
      case "${enableval}" in
        yes) gst_use_tta=yes ;;
        no) gst_use_tta=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-tta" "$LINENO" 5 ;;
       esac

else
  gst_use_tta=yes
fi

  if test x$gst_use_tta = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin tta" >&5
$as_echo "$as_me: disabling dependency-less plugin tta" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS tta"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " tta " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED tta"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " tta " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ tta / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " tta " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ tta / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " tta " > /dev/null; then
  USE_PLUGIN_TTA_TRUE=
  USE_PLUGIN_TTA_FALSE='#'
else
  USE_PLUGIN_TTA_TRUE='#'
  USE_PLUGIN_TTA_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videofilters"



  # Check whether --enable-videofilters was given.
if test "${enable_videofilters+set}" = set; then :
  enableval=$enable_videofilters;
      case "${enableval}" in
        yes) gst_use_videofilters=yes ;;
        no) gst_use_videofilters=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-videofilters" "$LINENO" 5 ;;
       esac

else
  gst_use_videofilters=yes
fi

  if test x$gst_use_videofilters = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videofilters" >&5
$as_echo "$as_me: disabling dependency-less plugin videofilters" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videofilters"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videofilters " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videofilters"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videofilters " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videofilters / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videofilters " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videofilters / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " videofilters " > /dev/null; then
  USE_PLUGIN_VIDEOFILTERS_TRUE=
  USE_PLUGIN_VIDEOFILTERS_FALSE='#'
else
  USE_PLUGIN_VIDEOFILTERS_TRUE='#'
  USE_PLUGIN_VIDEOFILTERS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videomeasure"



  # Check whether --enable-videomeasure was given.
if test "${enable_videomeasure+set}" = set; then :
  enableval=$enable_videomeasure;
      case "${enableval}" in
        yes) gst_use_videomeasure=yes ;;
        no) gst_use_videomeasure=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-videomeasure" "$LINENO" 5 ;;
       esac

else
  gst_use_videomeasure=yes
fi

  if test x$gst_use_videomeasure = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videomeasure" >&5
$as_echo "$as_me: disabling dependency-less plugin videomeasure" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videomeasure"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videomeasure " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videomeasure"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videomeasure " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videomeasure / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videomeasure " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videomeasure / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " videomeasure " > /dev/null; then
  USE_PLUGIN_VIDEOMEASURE_TRUE=
  USE_PLUGIN_VIDEOMEASURE_FALSE='#'
else
  USE_PLUGIN_VIDEOMEASURE_TRUE='#'
  USE_PLUGIN_VIDEOMEASURE_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videoparsers"



  # Check whether --enable-videoparsers was given.
if test "${enable_videoparsers+set}" = set; then :
  enableval=$enable_videoparsers;
      case "${enableval}" in
        yes) gst_use_videoparsers=yes ;;
        no) gst_use_videoparsers=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-videoparsers" "$LINENO" 5 ;;
       esac

else
  gst_use_videoparsers=yes
fi

  if test x$gst_use_videoparsers = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videoparsers" >&5
$as_echo "$as_me: disabling dependency-less plugin videoparsers" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videoparsers"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videoparsers " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videoparsers"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videoparsers " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoparsers / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videoparsers " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoparsers / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " videoparsers " > /dev/null; then
  USE_PLUGIN_VIDEOPARSERS_TRUE=
  USE_PLUGIN_VIDEOPARSERS_FALSE='#'
else
  USE_PLUGIN_VIDEOPARSERS_TRUE='#'
  USE_PLUGIN_VIDEOPARSERS_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videosignal"



  # Check whether --enable-videosignal was given.
if test "${enable_videosignal+set}" = set; then :
  enableval=$enable_videosignal;
      case "${enableval}" in
        yes) gst_use_videosignal=yes ;;
        no) gst_use_videosignal=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-videosignal" "$LINENO" 5 ;;
       esac

else
  gst_use_videosignal=yes
fi

  if test x$gst_use_videosignal = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videosignal" >&5
$as_echo "$as_me: disabling dependency-less plugin videosignal" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videosignal"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videosignal " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videosignal"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videosignal " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videosignal / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videosignal " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videosignal / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " videosignal " > /dev/null; then
  USE_PLUGIN_VIDEOSIGNAL_TRUE=
  USE_PLUGIN_VIDEOSIGNAL_FALSE='#'
else
  USE_PLUGIN_VIDEOSIGNAL_TRUE='#'
  USE_PLUGIN_VIDEOSIGNAL_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL vmnc"



  # Check whether --enable-vmnc was given.
if test "${enable_vmnc+set}" = set; then :
  enableval=$enable_vmnc;
      case "${enableval}" in
        yes) gst_use_vmnc=yes ;;
        no) gst_use_vmnc=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-vmnc" "$LINENO" 5 ;;
       esac

else
  gst_use_vmnc=yes
fi

  if test x$gst_use_vmnc = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin vmnc" >&5
$as_echo "$as_me: disabling dependency-less plugin vmnc" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS vmnc"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " vmnc " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED vmnc"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " vmnc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ vmnc / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " vmnc " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ vmnc / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " vmnc " > /dev/null; then
  USE_PLUGIN_VMNC_TRUE=
  USE_PLUGIN_VMNC_FALSE='#'
else
  USE_PLUGIN_VMNC_TRUE='#'
  USE_PLUGIN_VMNC_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL y4m"



  # Check whether --enable-y4m was given.
if test "${enable_y4m+set}" = set; then :
  enableval=$enable_y4m;
      case "${enableval}" in
        yes) gst_use_y4m=yes ;;
        no) gst_use_y4m=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-y4m" "$LINENO" 5 ;;
       esac

else
  gst_use_y4m=yes
fi

  if test x$gst_use_y4m = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin y4m" >&5
$as_echo "$as_me: disabling dependency-less plugin y4m" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS y4m"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED y4m"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " y4m " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ y4m / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " y4m " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ y4m / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " y4m " > /dev/null; then
  USE_PLUGIN_Y4M_TRUE=
  USE_PLUGIN_Y4M_FALSE='#'
else
  USE_PLUGIN_Y4M_TRUE='#'
  USE_PLUGIN_Y4M_FALSE=
fi



  GST_PLUGINS_ALL="$GST_PLUGINS_ALL yadif"



  # Check whether --enable-yadif was given.
if test "${enable_yadif+set}" = set; then :
  enableval=$enable_yadif;
      case "${enableval}" in
        yes) gst_use_yadif=yes ;;
        no) gst_use_yadif=no ;;
        *) as_fn_error $? "bad value ${enableval} for --enable-yadif" "$LINENO" 5 ;;
       esac

else
  gst_use_yadif=yes
fi

  if test x$gst_use_yadif = xno; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin yadif" >&5
$as_echo "$as_me: disabling dependency-less plugin yadif" >&6;}
    WITHOUT_PLUGINS="$WITHOUT_PLUGINS yadif"
  fi


    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " yadif " > /dev/null; then
    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED yadif"
  fi
    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " yadif " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ yadif / /'`
  fi
    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " yadif " > /dev/null; then
    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ yadif / /'`
  fi
   if echo " $GST_PLUGINS_SELECTED " | grep -i " yadif " > /dev/null; then
  USE_PLUGIN_YADIF_TRUE=
  USE_PLUGIN_YADIF_FALSE='#'
else
  USE_PLUGIN_YADIF_TRUE='#'
  USE_PLUGIN_YADIF_FALSE=
fi




ac_fn_c_check_header_preproc "$LINENO" "AVFoundation/AVFoundation.h" "ac_cv_header_AVFoundation_AVFoundation_h"
if test "x$ac_cv_header_AVFoundation_AVFoundation_h" = xyes; then :
  HAVE_AVFOUNDATION="yes"
else
  HAVE_AVFOUNDATION="no"
fi


ac_fn_c_check_header_preproc "$LINENO" "MobileCoreServices/MobileCoreServices.h" "ac_cv_header_MobileCoreServices_MobileCoreServices_h"
if test "x$ac_cv_header_MobileCoreServices_MobileCoreServices_h" = xyes; then :
  HAVE_IOS="yes"
else
  HAVE_IOS="no"
fi


ac_fn_c_check_header_preproc "$LINENO" "VideoToolbox/VideoToolbox.h" "ac_cv_header_VideoToolbox_VideoToolbox_h"
if test "x$ac_cv_header_VideoToolbox_VideoToolbox_h" = xyes; then :
  HAVE_VIDEOTOOLBOX="yes"
else
  HAVE_VIDEOTOOLBOX="no"
fi



if test "x$HAVE_VIDEOTOOLBOX" = "xyes"; then
  old_LIBS=$LIBS
  LIBS="$LIBS -framework VideoToolbox"
  ac_fn_c_check_func "$LINENO" "VTCompressionSessionPrepareToEncodeFrames" "ac_cv_func_VTCompressionSessionPrepareToEncodeFrames"
if test "x$ac_cv_func_VTCompressionSessionPrepareToEncodeFrames" = xyes; then :


$as_echo "#define HAVE_VIDEOTOOLBOX_10_9_6 1" >>confdefs.h


fi

  LIBS=$old_LIBS
fi

 if test "x$HAVE_AVFOUNDATION" = "xyes"; then
  HAVE_AVFOUNDATION_TRUE=
  HAVE_AVFOUNDATION_FALSE='#'
else
  HAVE_AVFOUNDATION_TRUE='#'
  HAVE_AVFOUNDATION_FALSE=
fi

if test "x$HAVE_AVFOUNDATION" = "xyes"; then

$as_echo "#define HAVE_AVFOUNDATION 1" >>confdefs.h

fi

 if test "x$HAVE_IOS" = "xyes"; then
  HAVE_IOS_TRUE=
  HAVE_IOS_FALSE='#'
else
  HAVE_IOS_TRUE='#'
  HAVE_IOS_FALSE=
fi

if test "x$HAVE_IOS" = "xyes"; then

$as_echo "#define HAVE_IOS 1" >>confdefs.h

fi

 if test "x$HAVE_VIDEOTOOLBOX" = "xyes"; then
  HAVE_VIDEOTOOLBOX_TRUE=
  HAVE_VIDEOTOOLBOX_FALSE='#'
else
  HAVE_VIDEOTOOLBOX_TRUE='#'
  HAVE_VIDEOTOOLBOX_FALSE=
fi

if test "x$HAVE_VIDEOTOOLBOX" = "xyes"; then

$as_echo "#define HAVE_VIDEOTOOLBOX 1" >>confdefs.h

fi

for ac_header in sys/socket.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "sys/socket.h" "ac_cv_header_sys_socket_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_socket_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_SOCKET_H 1
_ACEOF
 HAVE_SYS_SOCKET_H=yes
fi

done

for ac_header in winsock2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "winsock2.h" "ac_cv_header_winsock2_h" "$ac_includes_default"
if test "x$ac_cv_header_winsock2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_WINSOCK2_H 1
_ACEOF
 HAVE_WINSOCK2_H=yes
fi

done


if test "x$HAVE_WINSOCK2_H" = "xyes"; then
  WINSOCK2_LIBS="-lws2_32"

fi

if test "x$HAVE_PTHREAD_H" = "xyes"; then
  DCCP_LIBS="$DCCP_LIBS $PTHREAD_LIBS"

else

  GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ dccp / /'`
   if false; then
  USE_PLUGIN_DCCP_TRUE=
  USE_PLUGIN_DCCP_FALSE='#'
else
  USE_PLUGIN_DCCP_TRUE='#'
  USE_PLUGIN_DCCP_FALSE=
fi


fi

# Check whether --enable-opengl was given.
if test "${enable_opengl+set}" = set; then :
  enableval=$enable_opengl; case "${enableval}" in
       yes)  NEED_GL=yes ;;
       no)   NEED_GL=no ;;
       auto) NEED_GL=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-opengl" "$LINENO" 5 ;;
     esac
else
  NEED_GL=auto
fi



# Check whether --with-opengl-module-name was given.
if test "${with_opengl_module_name+set}" = set; then :
  withval=$with_opengl_module_name;
fi

if test x$with_opengl_module_name != x; then

cat >>confdefs.h <<_ACEOF
#define GST_GL_LIBGL_MODULE_NAME "$with_opengl_module_name"
_ACEOF

fi

# Check whether --enable-gles2 was given.
if test "${enable_gles2+set}" = set; then :
  enableval=$enable_gles2; case "${enableval}" in
       yes)  NEED_GLES2=yes ;;
       no)   NEED_GLES2=no ;;
       auto) NEED_GLES2=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-gles2" "$LINENO" 5 ;;
     esac
else
  NEED_GLES2=auto
fi



# Check whether --with-gles2-module-name was given.
if test "${with_gles2_module_name+set}" = set; then :
  withval=$with_gles2_module_name;
fi

if test x$with_gles2_module_name != x; then

cat >>confdefs.h <<_ACEOF
#define GST_GL_LIBGLESV2_MODULE_NAME "$with_gles2_module_name"
_ACEOF

fi

# Check whether --enable-egl was given.
if test "${enable_egl+set}" = set; then :
  enableval=$enable_egl; case "${enableval}" in
       yes)  NEED_EGL=yes ;;
       no)   NEED_EGL=no ;;
       auto) NEED_EGL=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-egl" "$LINENO" 5 ;;
     esac
else
  NEED_EGL=auto
fi



# Check whether --with-egl-module-name was given.
if test "${with_egl_module_name+set}" = set; then :
  withval=$with_egl_module_name;
fi

if test x$with_egl_module_name != x; then

cat >>confdefs.h <<_ACEOF
#define GST_GL_LIBEGL_MODULE_NAME "$with_egl_module_name"
_ACEOF

fi

# Check whether --enable-wgl was given.
if test "${enable_wgl+set}" = set; then :
  enableval=$enable_wgl; case "${enableval}" in
       yes)  NEED_WGL=yes ;;
       no)   NEED_WGL=no ;;
       auto) NEED_WGL=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-wgl" "$LINENO" 5 ;;
     esac
else
  NEED_WGL=auto
fi


# Check whether --enable-glx was given.
if test "${enable_glx+set}" = set; then :
  enableval=$enable_glx; case "${enableval}" in
       yes)  NEED_GLX=yes ;;
       no)   NEED_GLX=no ;;
       auto) NEED_GLX=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-glx" "$LINENO" 5 ;;
     esac
else
  NEED_GLX=auto
fi


# Check whether --enable-cocoa was given.
if test "${enable_cocoa+set}" = set; then :
  enableval=$enable_cocoa; case "${enableval}" in
       yes)  NEED_COCOA=yes ;;
       no)   NEED_COCOA=no ;;
       auto) NEED_COCOA=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-cocoa" "$LINENO" 5 ;;
     esac
else
  NEED_COCOA=auto
fi


# Check whether --enable-x11 was given.
if test "${enable_x11+set}" = set; then :
  enableval=$enable_x11; case "${enableval}" in
       yes)  NEED_X11=yes ;;
       no)   NEED_X11=no ;;
       auto) NEED_X11=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-x11" "$LINENO" 5 ;;
     esac
else
  NEED_X11=auto
fi


# Check whether --enable-wayland was given.
if test "${enable_wayland+set}" = set; then :
  enableval=$enable_wayland; case "${enableval}" in
       yes)  NEED_WAYLAND_EGL=yes ;;
       no)   NEED_WAYLAND_EGL=no ;;
       auto) NEED_WAYLAND_EGL=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-wayland" "$LINENO" 5 ;;
     esac
else
  NEED_WAYLAND_EGL=auto
fi


# Check whether --enable-dispmanx was given.
if test "${enable_dispmanx+set}" = set; then :
  enableval=$enable_dispmanx; case "${enableval}" in
       yes)  NEED_DISPMANX=yes ;;
       no)   NEED_DISPMANX=no ;;
       auto) NEED_DISPMANX=auto ;;
       *) as_fn_error $? "bad value ${enableval} for --enable-dispmanx" "$LINENO" 5 ;;
     esac
else
  NEED_DISPMANX=auto
fi



  which="x11"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5
$as_echo_n "checking for X... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$X_CFLAGS"; then
        pkg_cv_X_CFLAGS="$X_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$X_LIBS"; then
        pkg_cv_X_LIBS="$X_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        X_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        X_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$X_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_X="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$X_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $X_PKG_ERRORS" >&5
$as_echo "$as_me: $X_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_X="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$X_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $X_PKG_ERRORS" >&5
$as_echo "$as_me: $X_PKG_ERRORS" >&6;}
      fi

else
	X_CFLAGS=$pkg_cv_X_CFLAGS
	X_LIBS=$pkg_cv_X_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_X="yes"

fi


save_CPPFLAGS="$CPPFLAGS"
save_LIBS="$LIBS"

HAVE_GL=no
HAVE_GLES2=no
HAVE_WAYLAND_EGL=no

HAVE_EGL_RPI=no

case $host in
  *-mingw32* )
    LIBS="$LIBS -lgdi32"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glTexImage2D in -lopengl32" >&5
$as_echo_n "checking for glTexImage2D in -lopengl32... " >&6; }
if ${ac_cv_lib_opengl32_glTexImage2D+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lopengl32  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char glTexImage2D ();
int
main ()
{
return glTexImage2D ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_opengl32_glTexImage2D=yes
else
  ac_cv_lib_opengl32_glTexImage2D=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_opengl32_glTexImage2D" >&5
$as_echo "$ac_cv_lib_opengl32_glTexImage2D" >&6; }
if test "x$ac_cv_lib_opengl32_glTexImage2D" = xyes; then :
  HAVE_GL=yes
else
  HAVE_GL=no
fi

  if test "x$HAVE_GL" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
if test "x$ac_cv_header_GL_gl_h" = xyes; then :
  :
else
  HAVE_GL=no
fi


    if test "x$HAVE_GL" = "xyes"; then
            :
    else
      :
    fi
  else
    :
  fi



    ac_fn_c_check_header_compile "$LINENO" "GL/wglext.h" "ac_cv_header_GL_wglext_h" "#include <GL/gl.h>
"
if test "x$ac_cv_header_GL_wglext_h" = xyes; then :
  HAVE_WGLEXT="yes"
else
  HAVE_WGLEXT="no"
fi


    if test "x$HAVE_WGLEXT" = "xyes"; then
      HAVE_WGL=yes
      HAVE_GL=yes
    fi
  ;;
  *)
    if test "x$NEED_GL" != "xno"; then

  which="gl"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL" >&5
$as_echo_n "checking for GL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GL_CFLAGS"; then
        pkg_cv_GL_CFLAGS="$GL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GL_LIBS"; then
        pkg_cv_GL_LIBS="$GL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        GL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GL_PKG_ERRORS" >&5
$as_echo "$as_me: $GL_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GL_PKG_ERRORS" >&5
$as_echo "$as_me: $GL_PKG_ERRORS" >&6;}
      fi

else
	GL_CFLAGS=$pkg_cv_GL_CFLAGS
	GL_LIBS=$pkg_cv_GL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GL="yes"

fi


      if test "x$HAVE_GL" != "xyes"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glTexImage2D in -lGL" >&5
$as_echo_n "checking for glTexImage2D in -lGL... " >&6; }
if ${ac_cv_lib_GL_glTexImage2D+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lGL  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char glTexImage2D ();
int
main ()
{
return glTexImage2D ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_GL_glTexImage2D=yes
else
  ac_cv_lib_GL_glTexImage2D=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GL_glTexImage2D" >&5
$as_echo "$ac_cv_lib_GL_glTexImage2D" >&6; }
if test "x$ac_cv_lib_GL_glTexImage2D" = xyes; then :
  HAVE_GL=yes
else
  HAVE_GL=no
fi

  if test "x$HAVE_GL" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "GL/gl.h" "ac_cv_header_GL_gl_h" "$ac_includes_default"
if test "x$ac_cv_header_GL_gl_h" = xyes; then :
  :
else
  HAVE_GL=no
fi


    if test "x$HAVE_GL" = "xyes"; then
            :
    else
      :
    fi
  else
    :
  fi



      fi
    fi
    if test "x$NEED_GLES2" != "xno"; then

  which="glesv2"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLES2" >&5
$as_echo_n "checking for GLES2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GLES2_CFLAGS"; then
        pkg_cv_GLES2_CFLAGS="$GLES2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GLES2_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GLES2_LIBS"; then
        pkg_cv_GLES2_LIBS="$GLES2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GLES2_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GLES2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        GLES2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GLES2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GLES2="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GLES2_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLES2_PKG_ERRORS" >&5
$as_echo "$as_me: $GLES2_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GLES2="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GLES2_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLES2_PKG_ERRORS" >&5
$as_echo "$as_me: $GLES2_PKG_ERRORS" >&6;}
      fi

else
	GLES2_CFLAGS=$pkg_cv_GLES2_CFLAGS
	GLES2_LIBS=$pkg_cv_GLES2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GLES2="yes"

fi


      if test "x$HAVE_GLES2" != "xyes"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glTexImage2D in -lGLESv2" >&5
$as_echo_n "checking for glTexImage2D in -lGLESv2... " >&6; }
if ${ac_cv_lib_GLESv2_glTexImage2D+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv2  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char glTexImage2D ();
int
main ()
{
return glTexImage2D ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_GLESv2_glTexImage2D=yes
else
  ac_cv_lib_GLESv2_glTexImage2D=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glTexImage2D" >&5
$as_echo "$ac_cv_lib_GLESv2_glTexImage2D" >&6; }
if test "x$ac_cv_lib_GLESv2_glTexImage2D" = xyes; then :
  HAVE_GLES2=yes
else
  HAVE_GLES2=no
fi

  if test "x$HAVE_GLES2" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "GLES2/gl2.h" "ac_cv_header_GLES2_gl2_h" "$ac_includes_default"
if test "x$ac_cv_header_GLES2_gl2_h" = xyes; then :
  :
else
  HAVE_GLES2=no
fi


    if test "x$HAVE_GLES2" = "xyes"; then
            :
    else
      :
    fi
  else
    :
  fi



      fi
    fi
    if test "x$NEED_EGL" != "xno"; then

  which="egl"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EGL" >&5
$as_echo_n "checking for EGL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$EGL_CFLAGS"; then
        pkg_cv_EGL_CFLAGS="$EGL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_EGL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$EGL_LIBS"; then
        pkg_cv_EGL_LIBS="$EGL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_EGL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        EGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        EGL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$EGL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_EGL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$EGL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $EGL_PKG_ERRORS" >&5
$as_echo "$as_me: $EGL_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_EGL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$EGL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $EGL_PKG_ERRORS" >&5
$as_echo "$as_me: $EGL_PKG_ERRORS" >&6;}
      fi

else
	EGL_CFLAGS=$pkg_cv_EGL_CFLAGS
	EGL_LIBS=$pkg_cv_EGL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_EGL="yes"

fi


      if test "x$HAVE_EGL" != "xyes"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetError in -lEGL" >&5
$as_echo_n "checking for eglGetError in -lEGL... " >&6; }
if ${ac_cv_lib_EGL_eglGetError+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lEGL  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char eglGetError ();
int
main ()
{
return eglGetError ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_EGL_eglGetError=yes
else
  ac_cv_lib_EGL_eglGetError=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglGetError" >&5
$as_echo "$ac_cv_lib_EGL_eglGetError" >&6; }
if test "x$ac_cv_lib_EGL_eglGetError" = xyes; then :
  HAVE_EGL=yes
else
  HAVE_EGL=no
fi

  if test "x$HAVE_EGL" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default"
if test "x$ac_cv_header_EGL_egl_h" = xyes; then :
  :
else
  HAVE_EGL=no
fi


    if test "x$HAVE_EGL" = "xyes"; then
            :
    else
      :
    fi
  else
    :
  fi



      fi
    fi

    old_LIBS=$LIBS
    old_CFLAGS=$CFLAGS

        ac_fn_c_check_header_mongrel "$LINENO" "EGL/fbdev_window.h" "ac_cv_header_EGL_fbdev_window_h" "$ac_includes_default"
if test "x$ac_cv_header_EGL_fbdev_window_h" = xyes; then :

        LIBS="$LIBS -lUMP"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mali_image_create in -lMali" >&5
$as_echo_n "checking for mali_image_create in -lMali... " >&6; }
if ${ac_cv_lib_Mali_mali_image_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lMali  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char mali_image_create ();
int
main ()
{
return mali_image_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Mali_mali_image_create=yes
else
  ac_cv_lib_Mali_mali_image_create=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_Mali_mali_image_create" >&5
$as_echo "$ac_cv_lib_Mali_mali_image_create" >&6; }
if test "x$ac_cv_lib_Mali_mali_image_create" = xyes; then :

            LIBS="$LIBS -lMali"
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGLESv2" >&5
$as_echo_n "checking for glEnable in -lGLESv2... " >&6; }
if ${ac_cv_lib_GLESv2_glEnable+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv2  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char glEnable ();
int
main ()
{
return glEnable ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_GLESv2_glEnable=yes
else
  ac_cv_lib_GLESv2_glEnable=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glEnable" >&5
$as_echo "$ac_cv_lib_GLESv2_glEnable" >&6; }
if test "x$ac_cv_lib_GLESv2_glEnable" = xyes; then :

                ac_fn_c_check_header_mongrel "$LINENO" "GLES2/gl2.h" "ac_cv_header_GLES2_gl2_h" "$ac_includes_default"
if test "x$ac_cv_header_GLES2_gl2_h" = xyes; then :

                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetProcAddress in -lEGL" >&5
$as_echo_n "checking for eglGetProcAddress in -lEGL... " >&6; }
if ${ac_cv_lib_EGL_eglGetProcAddress+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lEGL  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char eglGetProcAddress ();
int
main ()
{
return eglGetProcAddress ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_EGL_eglGetProcAddress=yes
else
  ac_cv_lib_EGL_eglGetProcAddress=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglGetProcAddress" >&5
$as_echo "$ac_cv_lib_EGL_eglGetProcAddress" >&6; }
if test "x$ac_cv_lib_EGL_eglGetProcAddress" = xyes; then :

                        ac_fn_c_check_header_mongrel "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default"
if test "x$ac_cv_header_EGL_egl_h" = xyes; then :

                            HAVE_EGL=yes
                            HAVE_GLES2=yes
                            EGL_LIBS="-lMali -lUMP"
                            EGL_CFLAGS=""

$as_echo "#define USE_EGL_MALI_FB 1" >>confdefs.h


fi



fi


fi



fi


fi


fi



            LIBS="$LIBS -lvcos -lvchiq_arm"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for bcm_host_init in -lbcm_host" >&5
$as_echo_n "checking for bcm_host_init in -lbcm_host... " >&6; }
if ${ac_cv_lib_bcm_host_bcm_host_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lbcm_host  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char bcm_host_init ();
int
main ()
{
return bcm_host_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_bcm_host_bcm_host_init=yes
else
  ac_cv_lib_bcm_host_bcm_host_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bcm_host_bcm_host_init" >&5
$as_echo "$ac_cv_lib_bcm_host_bcm_host_init" >&6; }
if test "x$ac_cv_lib_bcm_host_bcm_host_init" = xyes; then :

        LIBS="$LIBS -lbcm_host"
        ac_fn_c_check_header_mongrel "$LINENO" "bcm_host.h" "ac_cv_header_bcm_host_h" "$ac_includes_default"
if test "x$ac_cv_header_bcm_host_h" = xyes; then :

            LIBS="$LIBS -lGLESv2"
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetProcAddress in -lEGL" >&5
$as_echo_n "checking for eglGetProcAddress in -lEGL... " >&6; }
if ${ac_cv_lib_EGL_eglGetProcAddress+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lEGL  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char eglGetProcAddress ();
int
main ()
{
return eglGetProcAddress ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_EGL_eglGetProcAddress=yes
else
  ac_cv_lib_EGL_eglGetProcAddress=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_EGL_eglGetProcAddress" >&5
$as_echo "$ac_cv_lib_EGL_eglGetProcAddress" >&6; }
if test "x$ac_cv_lib_EGL_eglGetProcAddress" = xyes; then :

                LIBS="$LIBS -lEGL"
                ac_fn_c_check_header_mongrel "$LINENO" "EGL/egl.h" "ac_cv_header_EGL_egl_h" "$ac_includes_default"
if test "x$ac_cv_header_EGL_egl_h" = xyes; then :

                    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glEnable in -lGLESv2" >&5
$as_echo_n "checking for glEnable in -lGLESv2... " >&6; }
if ${ac_cv_lib_GLESv2_glEnable+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLESv2  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char glEnable ();
int
main ()
{
return glEnable ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_GLESv2_glEnable=yes
else
  ac_cv_lib_GLESv2_glEnable=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_GLESv2_glEnable" >&5
$as_echo "$ac_cv_lib_GLESv2_glEnable" >&6; }
if test "x$ac_cv_lib_GLESv2_glEnable" = xyes; then :

                        ac_fn_c_check_header_mongrel "$LINENO" "GLES2/gl2.h" "ac_cv_header_GLES2_gl2_h" "$ac_includes_default"
if test "x$ac_cv_header_GLES2_gl2_h" = xyes; then :

                            HAVE_EGL=yes
                            HAVE_GLES2=yes
                            HAVE_EGL_RPI=yes
                            EGL_LIBS="-lbcm_host -lvcos -lvchiq_arm"
                            EGL_CFLAGS=""

$as_echo "#define USE_EGL_RPI 1" >>confdefs.h


fi



fi


fi



fi


fi



fi


    LIBS=$old_LIBS
    CFLAGS=$old_CFLAGS


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAYLAND_EGL" >&5
$as_echo_n "checking for WAYLAND_EGL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$WAYLAND_EGL_CFLAGS"; then
        pkg_cv_WAYLAND_EGL_CFLAGS="$WAYLAND_EGL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WAYLAND_EGL_CFLAGS=`$PKG_CONFIG --cflags "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$WAYLAND_EGL_LIBS"; then
        pkg_cv_WAYLAND_EGL_LIBS="$WAYLAND_EGL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WAYLAND_EGL_LIBS=`$PKG_CONFIG --libs "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        WAYLAND_EGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0"`
        else
	        WAYLAND_EGL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 9.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$WAYLAND_EGL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_WAYLAND_EGL=no
elif test $pkg_failed = untried; then
	HAVE_WAYLAND_EGL=no
else
	WAYLAND_EGL_CFLAGS=$pkg_cv_WAYLAND_EGL_CFLAGS
	WAYLAND_EGL_LIBS=$pkg_cv_WAYLAND_EGL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_WAYLAND_EGL=yes
fi
  ;;
esac

CPPFLAGS="$save_CPPFLAGS"
LIBS="$save_LIBS"

USE_OPENGL=no
USE_GLES2=no
USE_GLX=no
USE_COCOA=no
USE_WGL=no
USE_X11=no
USE_EAGL=no
GL_LIBS=
GL_CFLAGS=
GL_OBJCFLAGS=

if test "x$HAVE_EGL" = "xno"; then
  if test "x$NEED_EGL" = "xyes"; then
    as_fn_error $? "Could not find the required EGL libraries" "$LINENO" 5
  fi
fi

if test "x$HAVE_GL" = "xno"; then
  if test "x$NEED_GL" = "xyes"; then
    as_fn_error $? "Could not find the required OpenGL libraries" "$LINENO" 5
  fi
fi

if test "x$HAVE_GLES2" = "xno"; then
  if test "x$NEED_GLES2" = "xyes"; then
    as_fn_error $? "Could not find the required OpenGL|ES 2.0 libraries" "$LINENO" 5
  fi
fi

if test "x$HAVE_X" = "xno"; then
  if test "x$NEED_GLX" = "xyes"; then
    as_fn_error $? "Building the GLX backend without X11 is unsupported" "$LINENO" 5
  fi
  if test "x$NEED_X11" = "xyes"; then
    as_fn_error $? "Could not find X11 development libraries" "$LINENO" 5
  fi
else
  if test "x$NEED_GL" != "xno"; then
    if test "x$HAVE_GL" = "xno"; then
      if test "x$NEED_GLX" = "xyes"; then
        as_fn_error $? "Building the GLX backend without the OpenGL backend is unsupported" "$LINENO" 5
      fi
    else       USE_OPENGL=yes
      if test "x$NEED_GLX" != "xno"; then
        USE_GLX=yes
      fi
    fi
  fi
fi

HAVE_DRM_FOURCC_HEADER=no
ac_fn_c_check_header_mongrel "$LINENO" "libdrm/drm_fourcc.h" "ac_cv_header_libdrm_drm_fourcc_h" "$ac_includes_default"
if test "x$ac_cv_header_libdrm_drm_fourcc_h" = xyes; then :
  HAVE_DRM_FOURCC_HEADER=yes
fi



HAVE_GST_ALLOCATORS=no

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_ALLOCATORS" >&5
$as_echo_n "checking for GST_ALLOCATORS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_ALLOCATORS_CFLAGS"; then
        pkg_cv_GST_ALLOCATORS_CFLAGS="$GST_ALLOCATORS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-allocators-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gstreamer-allocators-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_ALLOCATORS_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-allocators-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_ALLOCATORS_LIBS"; then
        pkg_cv_GST_ALLOCATORS_LIBS="$GST_ALLOCATORS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-allocators-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gstreamer-allocators-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_ALLOCATORS_LIBS=`$PKG_CONFIG --libs "gstreamer-allocators-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gstreamer-allocators-1.0"`
        else
	        GST_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gstreamer-allocators-1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_ALLOCATORS_PKG_ERRORS" >&5

	as_fn_error $? "Package requirements (gstreamer-allocators-1.0) were not met:

$GST_ALLOCATORS_PKG_ERRORS

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables GST_ALLOCATORS_CFLAGS
and GST_ALLOCATORS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
" "$LINENO" 5
elif test $pkg_failed = untried; then
	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.

Alternatively, you may set the environment variables GST_ALLOCATORS_CFLAGS
and GST_ALLOCATORS_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

To get pkg-config, see <http://pkg-config.freedesktop.org/>.
See \`config.log' for more details" "$LINENO" 5; }
else
	GST_ALLOCATORS_CFLAGS=$pkg_cv_GST_ALLOCATORS_CFLAGS
	GST_ALLOCATORS_LIBS=$pkg_cv_GST_ALLOCATORS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_GST_ALLOCATORS=yes
fi

GST_GL_HAVE_DMABUF=0
if test "x$HAVE_DRM_FOURCC_HEADER" = "xyes" -a \
        "x$HAVE_GST_ALLOCATORS" = "xyes" -a \
        "x$HAVE_EGL" = "xyes"; then
          GST_GL_HAVE_DMABUF=1
fi

if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
  GL_INCLUDES="
#ifdef __GNUC__
#  pragma GCC diagnostic push
#  pragma GCC diagnostic ignored \"-Wredundant-decls\"
#endif
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif
# ifdef HAVE_IOS
#  include <OpenGLES/ES2/gl.h>
#  include <OpenGLES/ES2/glext.h>
# else
#  include <GLES2/gl2.h>
#  include <GLES2/gl2ext.h>
# endif
# ifdef __APPLE__
#  include <OpenGL/OpenGL.h>
#  include <OpenGL/gl.h>
#  if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
#   define GL_DO_NOT_WARN_IF_MULTI_GL_VERSION_HEADERS_INCLUDED
#   include <OpenGL/gl3.h>
#  endif
# else
#  include <GL/gl.h>
#  if __WIN32__ || _WIN32
#   include <GL/glext.h>
#  endif
# endif
int main (int argc, char **argv) { return 0; }
"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is possible to include both GL and GLES2 headers" >&5
$as_echo_n "checking whether it is possible to include both GL and GLES2 headers... " >&6; }
  save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS $GL_CFLAGS $GLES2_CFLAGS $WARNING_CFLAGS $ERROR_CFLAGS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$GL_INCLUDES
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
    if test "x$NEED_GLES2" = "xyes"; then
      if test "x$NEED_GL" = "xyes"; then
        as_fn_error $? "Cannot seem to include both GL and GLES2 headers. Try disabling one API" "$LINENO" 5
      fi
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling Desktop GL support" >&5
$as_echo "$as_me: WARNING: Disabling Desktop GL support" >&2;}
      HAVE_GL=no
      USE_OPENGL=no
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Disabling GL|ES 2.0 support" >&5
$as_echo "$as_me: WARNING: Disabling GL|ES 2.0 support" >&2;}
      HAVE_GLES2=no
    fi

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"
fi

#dnl Check for OpenGL
echo host is $host
case $host in
  *-android*)
    if test "x$NEED_WGL" = "xyes"; then
      as_fn_error $? "WGL is not available on Android" "$LINENO" 5
    fi
    if test "x$NEED_GLX" = "xyes"; then
      as_fn_error $? "GLX is not available on Android" "$LINENO" 5
    fi
    if test "x$NEED_GL" = "xyes"; then
      as_fn_error $? "GL is not available on Android" "$LINENO" 5
    fi
    if test "x$NEED_X11" = "xyes"; then
      as_fn_error $? "X11 is not available on Android" "$LINENO" 5
    fi
    if test "x$NEED_COCOA" = "xyes"; then
      as_fn_error $? "Cocoa is not available on Android" "$LINENO" 5
    fi

        if test "x$HAVE_GLES2" = "xyes"; then
      if test "x$NEED_GLES2" != "xno"; then
        GL_LIBS="$GL_LIBS -lGLESv2"
        USE_GLES2=yes
      fi
    fi

        if test "x$HAVE_EGL" = "xyes"; then
      if test "x$NEED_EGL" != "xno"; then
        GL_LIBS="$GL_LIBS -lEGL"
        USE_EGL=yes
      fi
    fi

    if test "x$USE_EGL" != "xyes"; then
      as_fn_error $? "Need EGL on Android" "$LINENO" 5
    fi

    if test "x$USE_GLES2" != "xyes"; then
      as_fn_error $? "Need OpenGL|ES 2.0 on Android" "$LINENO" 5
    fi

    HAVE_WINDOW_ANDROID=yes
    ;;
  *-linux* | *-cygwin* | *-solaris* | *-netbsd* | *-freebsd* | *-openbsd* | *-kfreebsd* | *-dragonflybsd* | *-gnu* )
    if test "x$NEED_WGL" = "xyes"; then
      as_fn_error $? "WGL is not available on unix" "$LINENO" 5
    fi

    if test "x$HAVE_X" = "xno"; then
      if test "x$HAVE_WAYLAND_EGL" = "xno"; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: X or Wayland is required for OpenGL support" >&5
$as_echo "$as_me: WARNING: X or Wayland is required for OpenGL support" >&2;}
      fi
    fi

        if test "x$HAVE_GL" = "xyes"; then
      if test "x$NEED_GL" != "xno"; then
        GL_LIBS="$GL_LIBS -lGL"
      fi
    fi

        if test "x$HAVE_GLES2" = "xyes"; then
      if test "x$NEED_GLES2" != "xno"; then
        GL_LIBS="$GL_LIBS -lGLESv2"
        USE_GLES2=yes
      fi
    fi

    if test "x$HAVE_X" = "xyes" -a "x$HAVE_EGL_RPI" = "xno"; then
      if test "x$NEED_X11" != "xno"; then
        GL_LIBS="$GL_LIBS $X_LIBS"
        GL_CFLAGS="$GL_CFLAGS $X_CFLAGS"
        HAVE_WINDOW_X11=yes
      fi
    fi

    if test "x$HAVE_WAYLAND_EGL" = "xyes"; then
      if test "x$NEED_EGL" = "xno" -o "x$HAVE_EGL" = "xno"; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: EGL is required by the Wayland backend for OpenGL support" >&5
$as_echo "$as_me: WARNING: EGL is required by the Wayland backend for OpenGL support" >&2;}
      else
        if test "x$NEED_WAYLAND_EGL" != "xno"; then
          HAVE_WINDOW_WAYLAND=yes
          GL_LIBS="$GL_LIBS $WAYLAND_EGL_LIBS"
          GL_CFLAGS="$GL_CFLAGS $WAYLAND_EGL_CFLAGS"
        fi
      fi
    fi

    if test "x$HAVE_EGL_RPI" = "xyes"; then
      if test "x$NEED_DISPMANX" != "xno"; then
        HAVE_WINDOW_DISPMANX=yes
        USE_EGL=yes
      fi
    fi

        if test "x$HAVE_EGL" = "xno"; then
      if test "x$HAVE_GL" = "xno"; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Building requires either EGL or GLX for OpenGL support" >&5
$as_echo "$as_me: WARNING: Building requires either EGL or GLX for OpenGL support" >&2;}
      fi
    else
      if test "x$NEED_EGL" != "xno"; then
        if test "x$HAVE_WINDOW_WAYLAND" = "xyes" -o "x$HAVE_WINDOW_X11" = "xyes" -o "x$HAVE_WINDOW_DISPMANX" = "xyes"; then
          GL_LIBS="$GL_LIBS -lEGL $EGL_LIBS"
          GL_CFLAGS="$GL_CFLAGS $EGL_CFLAGS"
          USE_EGL=yes
        fi
      fi
    fi
    ;;
  *-darwin*)
    if test "x$HAVE_IOS" = "xyes"; then
      if test "x$NEED_WGL" = "xyes"; then
        as_fn_error $? "WGL is not available on iOS" "$LINENO" 5
      fi
      if test "x$NEED_GLX" = "xyes"; then
        as_fn_error $? "GLX is not available on iOS" "$LINENO" 5
      fi
      if test "x$NEED_GL" = "xyes"; then
        as_fn_error $? "GL is not available on iOS" "$LINENO" 5
      fi
      if test "x$NEED_X11" = "xyes"; then
        as_fn_error $? "X11 is not available on iOS" "$LINENO" 5
      fi
      if test "x$NEED_COCOA" = "xyes"; then
        as_fn_error $? "Cocoa is not available on iOS" "$LINENO" 5
      fi
      if test "x$NEED_EGL" = "xyes"; then
        as_fn_error $? "EGL is not available on iOS" "$LINENO" 5
      fi

      GL_LIBS="$LIBS -framework OpenGLES -framework QuartzCore -framework UIKit -framework CoreGraphics -framework CoreFoundation -framework Foundation"
      GL_CFLAGS="$GL_CFLAGS"
      USE_GLES2=yes
      USE_EAGL=yes
      HAVE_WINDOW_EAGL=yes

      ac_cv_type_GLsizeiptr=yes
      ac_cv_type_GLintptr=yes
      ac_cv_type_GLchar=yes
    else
            if test "x$NEED_WGL" = "xyes"; then
        as_fn_error $? "WGL is not available on Mac OS X" "$LINENO" 5
      fi

      if test "x$NEED_COCOA" != "xno"; then
        GL_LIBS="$LIBS -framework OpenGL -framework Cocoa -framework QuartzCore -framework CoreFoundation"
        GL_CFLAGS="$GL_CFLAGS"
        USE_COCOA=yes
        HAVE_WINDOW_COCOA=yes
        USE_OPENGL=yes
      fi

      if test "x$USE_GLX" = "xyes"; then
        if test "x$HAVE_X" = "xyes"; then
          if test "x$NEED_X11" != "xno"; then
            GL_LIBS="$GL_LIBS $X_LIBS"
            GL_CFLAGS="$GL_CFLAGS $X_CFLAGS"
            HAVE_WINDOW_X11=yes
          fi
        fi

        if test "x$HAVE_GL" = "xyes"; then
          if test "x$NEED_GL" != "xno"; then
            GL_LIBS="$GL_LIBS -lGL"
          fi
          USE_OPENGL=yes
        fi
      fi

      if test "x$HAVE_EGL" = "xyes"; then
        if test "x$NEED_EGL" != "xno"; then
          if test "x$HAVE_WINDOW_X11" = "xyes"; then
            GL_LIBS="$GL_LIBS -lEGL $EGL_LIBS"
            GL_CFLAGS="$GL_CFLAGS $EGL_CFLAGS"
            USE_EGL=yes
          fi
        fi
      fi

            if test "x$HAVE_GLES2" = "xyes"; then
        if test "x$NEED_GLES2" != "xno"; then
          GL_LIBS="$GL_LIBS -lGLESv2"
          USE_GLES2=yes
        fi
      fi
    fi
    ;;
  *-mingw32*)
    if test "x$NEED_GLX" = "xyes"; then
      as_fn_error $? "GLX is not available on Windows" "$LINENO" 5
    fi
    if test "x$NEED_GLES2" = "xyes"; then
      as_fn_error $? "OpenGL|ES 2.0 is not supported on your platform yet" "$LINENO" 5
    fi

    if test "x$HAVE_GL" = "xyes"; then
      if test "x$NEED_GL" != "xno"; then
        if test "x$HAVE_WGL" = "xyes"; then
          if test "$NEED_WGL" != "xno"; then
            GL_LIBS="$GL_LIBS -lgdi32 -lopengl32"
            HAVE_WINDOW_WIN32=yes
            USE_OPENGL=yes
            USE_WGL=yes
          fi
        fi
      fi
    fi
    ;;
  *)
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Don't know how to check for OpenGL on your platform." >&5
$as_echo "$as_me: WARNING: Don't know how to check for OpenGL on your platform." >&2;}
    ;;
esac

GL_PLATFORMS=
GL_WINDOWS=
GL_APIS=
GL_CONFIG_DEFINES=


GST_GL_HAVE_OPENGL=0
GST_GL_HAVE_GLES2=0
GST_GL_HAVE_GLES3=0

if test "x$USE_OPENGL" = "xyes"; then
  GL_APIS="gl $GL_APIS"
  GST_GL_HAVE_OPENGL=1
fi
if test "x$USE_GLES2" = "xyes"; then
  GL_APIS="gles2 $GL_APIS"
  GST_GL_HAVE_GLES2=1
fi

GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
#define GST_GL_HAVE_OPENGL $GST_GL_HAVE_OPENGL
#define GST_GL_HAVE_GLES2 $GST_GL_HAVE_GLES2
#define GST_GL_HAVE_GLES3 $GST_GL_HAVE_GLES3
"


GST_GL_HAVE_WINDOW_X11=0
GST_GL_HAVE_WINDOW_COCOA=0
GST_GL_HAVE_WINDOW_WIN32=0
GST_GL_HAVE_WINDOW_WAYLAND=0
GST_GL_HAVE_WINDOW_ANDROID=0
GST_GL_HAVE_WINDOW_DISPMANX=0
GST_GL_HAVE_WINDOW_EAGL=0

if test "x$HAVE_WINDOW_X11" = "xyes"; then
  GL_WINDOWS="x11 $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_X11=1
fi
if test "x$HAVE_WINDOW_COCOA" = "xyes"; then
  GL_WINDOWS="cocoa $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_COCOA=1
fi
if test "x$HAVE_WINDOW_WIN32" = "xyes"; then
  GL_WINDOWS="win32 $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_WIN32=1
fi
if test "x$HAVE_WINDOW_WAYLAND" = "xyes"; then
  GL_WINDOWS="wayland $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_WAYLAND=1
fi
if test "x$HAVE_WINDOW_ANDROID" = "xyes"; then
  GL_WINDOWS="android $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_ANDROID=1
fi
if test "x$HAVE_WINDOW_DISPMANX" = "xyes"; then
  GL_WINDOWS="dispmanx $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_DISPMANX=1
fi
if test "x$HAVE_WINDOW_EAGL" = "xyes"; then
  GL_WINDOWS="eagl $GL_WINDOWS"
  GST_GL_HAVE_WINDOW_EAGL=1
fi

GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
#define GST_GL_HAVE_WINDOW_X11 $GST_GL_HAVE_WINDOW_X11
#define GST_GL_HAVE_WINDOW_COCOA $GST_GL_HAVE_WINDOW_COCOA
#define GST_GL_HAVE_WINDOW_WIN32 $GST_GL_HAVE_WINDOW_WIN32
#define GST_GL_HAVE_WINDOW_WAYLAND $GST_GL_HAVE_WINDOW_WAYLAND
#define GST_GL_HAVE_WINDOW_ANDROID $GST_GL_HAVE_WINDOW_ANDROID
#define GST_GL_HAVE_WINDOW_DISPMANX $GST_GL_HAVE_WINDOW_DISPMANX
#define GST_GL_HAVE_WINDOW_EAGL $GST_GL_HAVE_WINDOW_EAGL
"


GST_GL_HAVE_PLATFORM_EGL=0
GST_GL_HAVE_PLATFORM_GLX=0
GST_GL_HAVE_PLATFORM_WGL=0
GST_GL_HAVE_PLATFORM_CGL=0
GST_GL_HAVE_PLATFORM_EAGL=0

if test "x$USE_EGL" = "xyes"; then
  GL_PLATFORMS="egl $GL_PLATFORMS"
  GST_GL_HAVE_PLATFORM_EGL=1
fi
if test "x$USE_GLX" = "xyes"; then
  GL_PLATFORMS="glx $GL_PLATFORMS"
  GST_GL_HAVE_PLATFORM_GLX=1
fi
if test "x$USE_WGL" = "xyes"; then
  GL_PLATFORMS="wgl $GL_PLATFORMS"
  GST_GL_HAVE_PLATFORM_WGL=1
fi
if test "x$USE_COCOA" = "xyes"; then
  GL_PLATFORMS="cgl $GL_PLATFORMS"
  GST_GL_HAVE_PLATFORM_CGL=1
fi
if test "x$USE_EAGL" = "xyes"; then
  GL_PLATFORMS="eagl $GL_PLATFORMS"
  GST_GL_HAVE_PLATFORM_EAGL=1
fi

GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
#define GST_GL_HAVE_PLATFORM_EGL $GST_GL_HAVE_PLATFORM_EGL
#define GST_GL_HAVE_PLATFORM_GLX $GST_GL_HAVE_PLATFORM_GLX
#define GST_GL_HAVE_PLATFORM_WGL $GST_GL_HAVE_PLATFORM_WGL
#define GST_GL_HAVE_PLATFORM_CGL $GST_GL_HAVE_PLATFORM_CGL
#define GST_GL_HAVE_PLATFORM_EAGL $GST_GL_HAVE_PLATFORM_EAGL
"

GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
#define GST_GL_HAVE_DMABUF $GST_GL_HAVE_DMABUF
"

if test "x$GL_APIS" = "x"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Either OpenGL or OpenGL|ES is required for OpenGL support" >&5
$as_echo "$as_me: WARNING: Either OpenGL or OpenGL|ES is required for OpenGL support" >&2;}
fi
if test "x$GL_PLATFORMS" = "x"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find any OpenGL platforms to use such as CGL, WGL or GLX" >&5
$as_echo "$as_me: WARNING: Could not find any OpenGL platforms to use such as CGL, WGL or GLX" >&2;}
fi
if test "x$GL_WINDOWS" = "x"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find any window systems to use such as Cocoa, Win32API or X11" >&5
$as_echo "$as_me: WARNING: Could not find any window systems to use such as Cocoa, Win32API or X11" >&2;}
fi

if test "x$GL_APIS" = "x" -o "x$GL_PLATFORMS" = "x" -o "x$GL_WINDOWS" = "x"; then
  GL_LIBS=
  GL_CFLAGS=
  GL_OBJCFLAGS=
  USE_OPENGL=no
  USE_GLES2=no
  USE_GLX=no
  USE_EGL=no
  USE_WGL=no
  USE_COCOA=no
  USE_EGL_MALI=no
  USE_EGL_RPI=no
  USE_EAGL=no

  HAVE_WINDOW_X11=no
  HAVE_WINDOW_WIN32=no
  HAVE_WINDOW_DISPMANX=no
  HAVE_WINDOW_WAYLAND=no
  HAVE_WINDOW_ANDROID=no
  HAVE_WINDOW_COCOA=no
  HAVE_WINDOW_EAGL=no
fi







 if test "x$HAVE_WINDOW_X11" = "xyes"; then
  HAVE_WINDOW_X11_TRUE=
  HAVE_WINDOW_X11_FALSE='#'
else
  HAVE_WINDOW_X11_TRUE='#'
  HAVE_WINDOW_X11_FALSE=
fi

 if test "x$HAVE_WINDOW_COCOA" = "xyes"; then
  HAVE_WINDOW_COCOA_TRUE=
  HAVE_WINDOW_COCOA_FALSE='#'
else
  HAVE_WINDOW_COCOA_TRUE='#'
  HAVE_WINDOW_COCOA_FALSE=
fi

 if test "x$HAVE_WINDOW_WIN32" = "xyes"; then
  HAVE_WINDOW_WIN32_TRUE=
  HAVE_WINDOW_WIN32_FALSE='#'
else
  HAVE_WINDOW_WIN32_TRUE='#'
  HAVE_WINDOW_WIN32_FALSE=
fi

 if test "x$HAVE_WINDOW_DISPMANX" = "xyes"; then
  HAVE_WINDOW_DISPMANX_TRUE=
  HAVE_WINDOW_DISPMANX_FALSE='#'
else
  HAVE_WINDOW_DISPMANX_TRUE='#'
  HAVE_WINDOW_DISPMANX_FALSE=
fi

 if test "x$HAVE_WINDOW_WAYLAND" = "xyes"; then
  HAVE_WINDOW_WAYLAND_TRUE=
  HAVE_WINDOW_WAYLAND_FALSE='#'
else
  HAVE_WINDOW_WAYLAND_TRUE='#'
  HAVE_WINDOW_WAYLAND_FALSE=
fi

 if test "x$HAVE_WINDOW_ANDROID" = "xyes"; then
  HAVE_WINDOW_ANDROID_TRUE=
  HAVE_WINDOW_ANDROID_FALSE='#'
else
  HAVE_WINDOW_ANDROID_TRUE='#'
  HAVE_WINDOW_ANDROID_FALSE=
fi

 if test "x$HAVE_WINDOW_EAGL" = "xyes"; then
  HAVE_WINDOW_EAGL_TRUE=
  HAVE_WINDOW_EAGL_FALSE='#'
else
  HAVE_WINDOW_EAGL_TRUE='#'
  HAVE_WINDOW_EAGL_FALSE=
fi


 if test "x$USE_OPENGL" = "xyes"; then
  USE_OPENGL_TRUE=
  USE_OPENGL_FALSE='#'
else
  USE_OPENGL_TRUE='#'
  USE_OPENGL_FALSE=
fi

 if test "x$USE_GLES2" = "xyes"; then
  USE_GLES2_TRUE=
  USE_GLES2_FALSE='#'
else
  USE_GLES2_TRUE='#'
  USE_GLES2_FALSE=
fi

 if test "x$USE_GLX" = "xyes"; then
  USE_GLX_TRUE=
  USE_GLX_FALSE='#'
else
  USE_GLX_TRUE='#'
  USE_GLX_FALSE=
fi

 if test "x$USE_EGL" = "xyes"; then
  USE_EGL_TRUE=
  USE_EGL_FALSE='#'
else
  USE_EGL_TRUE='#'
  USE_EGL_FALSE=
fi

 if test "x$USE_WGL" = "xyes"; then
  USE_WGL_TRUE=
  USE_WGL_FALSE='#'
else
  USE_WGL_TRUE='#'
  USE_WGL_FALSE=
fi

 if test "x$USE_COCOA" = "xyes"; then
  USE_COCOA_TRUE=
  USE_COCOA_FALSE='#'
else
  USE_COCOA_TRUE='#'
  USE_COCOA_FALSE=
fi

 if test "x$USE_EGL_MALI" = "xyes"; then
  USE_EGL_MALI_TRUE=
  USE_EGL_MALI_FALSE='#'
else
  USE_EGL_MALI_TRUE='#'
  USE_EGL_MALI_FALSE=
fi

 if test "x$USE_EGL_RPI" = "xyes"; then
  USE_EGL_RPI_TRUE=
  USE_EGL_RPI_FALSE='#'
else
  USE_EGL_RPI_TRUE='#'
  USE_EGL_RPI_FALSE=
fi

 if test "x$USE_EAGL" = "xyes"; then
  USE_EAGL_TRUE=
  USE_EAGL_FALSE='#'
else
  USE_EAGL_TRUE='#'
  USE_EAGL_FALSE=
fi


 if test "x$USE_OPENGL" = "xyes" -o "x$USE_GLES2" = "xyes"; then
  HAVE_GST_GL_TRUE=
  HAVE_GST_GL_FALSE='#'
else
  HAVE_GST_GL_TRUE='#'
  HAVE_GST_GL_FALSE=
fi


GL_INCLUDES=""
if test "x$USE_GLES2" = "xyes"; then
  GL_INCLUDES="$GL_INCLUDES
#ifndef GL_GLEXT_PROTOTYPES
#define GL_GLEXT_PROTOTYPES 1
#endif
# ifdef HAVE_IOS
#  include <OpenGLES/ES2/gl.h>
#  include <OpenGLES/ES2/glext.h>
# else
#  include <GLES2/gl2.h>
#  include <GLES2/gl2ext.h>
# endif
"
fi

if test "x$USE_OPENGL" = "xyes"; then
  GL_INCLUDES="$GL_INCLUDES
# ifdef __APPLE__
#  include <OpenGL/OpenGL.h>
#  include <OpenGL/gl.h>
# else
#  include <GL/gl.h>
#  if __WIN32__ || _WIN32
#   include <GL/glext.h>
#  endif
# endif
"
fi

GST_GL_HAVE_GLEGLIMAGEOES=0
GST_GL_HAVE_GLCHAR=0
GST_GL_HAVE_GLSIZEIPTR=0
GST_GL_HAVE_GLINTPTR=0
GST_GL_HAVE_GLSYNC=0
GST_GL_HAVE_GLUINT64=0
GST_GL_HAVE_GLINT64=0

old_CFLAGS=$CFLAGS
CFLAGS="$GL_CFLAGS $CFLAGS"

ac_fn_c_check_type "$LINENO" "GLeglImageOES" "ac_cv_type_GLeglImageOES" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLeglImageOES" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLEGLIMAGEOES 1
_ACEOF


fi

if test "x$ac_cv_type_GLeglImageOES" = "xyes"; then
  GST_GL_HAVE_GLEGLIMAGEOES=1
fi

ac_fn_c_check_type "$LINENO" "GLchar" "ac_cv_type_GLchar" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLchar" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLCHAR 1
_ACEOF


fi

if test "x$ac_cv_type_GLchar" = "xyes"; then
  GST_GL_HAVE_GLCHAR=1
fi

ac_fn_c_check_type "$LINENO" "GLsizeiptr" "ac_cv_type_GLsizeiptr" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLsizeiptr" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLSIZEIPTR 1
_ACEOF


fi

if test "x$ac_cv_type_GLsizeiptr" = "xyes"; then
  GST_GL_HAVE_GLSIZEIPTR=1
fi

ac_fn_c_check_type "$LINENO" "GLintptr" "ac_cv_type_GLintptr" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLintptr" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLINTPTR 1
_ACEOF


fi

if test "x$ac_cv_type_GLintptr" = "xyes"; then
  GST_GL_HAVE_GLINTPTR=1
fi

ac_fn_c_check_type "$LINENO" "GLsync" "ac_cv_type_GLsync" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLsync" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLSYNC 1
_ACEOF


fi

if test "x$ac_cv_type_GLsync" = "xyes"; then
  GST_GL_HAVE_GLSYNC=1
fi

ac_fn_c_check_type "$LINENO" "GLuint64" "ac_cv_type_GLuint64" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLuint64" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLUINT64 1
_ACEOF


fi

if test "x$ac_cv_type_GLuint64" = "xyes"; then
  GST_GL_HAVE_GLUINT64=1
fi

ac_fn_c_check_type "$LINENO" "GLint64" "ac_cv_type_GLint64" "$GL_INCLUDES
"
if test "x$ac_cv_type_GLint64" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_GLINT64 1
_ACEOF


fi

if test "x$ac_cv_type_GLint64" = "xyes"; then
  GST_GL_HAVE_GLINT64=1
fi

CFLAGS=$old_CFLAGS

GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
#define GST_GL_HAVE_GLEGLIMAGEOES $GST_GL_HAVE_GLEGLIMAGEOES
#define GST_GL_HAVE_GLCHAR $GST_GL_HAVE_GLCHAR
#define GST_GL_HAVE_GLSIZEIPTR $GST_GL_HAVE_GLSIZEIPTR
#define GST_GL_HAVE_GLINTPTR $GST_GL_HAVE_GLINTPTR
#define GST_GL_HAVE_GLSYNC $GST_GL_HAVE_GLSYNC
#define GST_GL_HAVE_GLUINT64 $GST_GL_HAVE_GLUINT64
#define GST_GL_HAVE_GLINT64 $GST_GL_HAVE_GLINT64
"

ac_config_commands="$ac_config_commands gst-libs/gst/gl/gstglconfig.h"



pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBPNG" >&5
$as_echo_n "checking for LIBPNG... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBPNG_CFLAGS"; then
        pkg_cv_LIBPNG_CFLAGS="$LIBPNG_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libpng >= 1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBPNG_CFLAGS=`$PKG_CONFIG --cflags "libpng >= 1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBPNG_LIBS"; then
        pkg_cv_LIBPNG_LIBS="$LIBPNG_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libpng >= 1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libpng >= 1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBPNG_LIBS=`$PKG_CONFIG --libs "libpng >= 1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBPNG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libpng >= 1.0"`
        else
	        LIBPNG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libpng >= 1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBPNG_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_PNG=no
elif test $pkg_failed = untried; then
	HAVE_PNG=no
else
	LIBPNG_CFLAGS=$pkg_cv_LIBPNG_CFLAGS
	LIBPNG_LIBS=$pkg_cv_LIBPNG_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_PNG=yes
fi
if test "x$HAVE_PNG" = "xyes"; then

$as_echo "#define HAVE_PNG 1 " >>confdefs.h

fi



 if test "x$HAVE_PNG" = "xyes"; then
  HAVE_PNG_TRUE=
  HAVE_PNG_FALSE='#'
else
  HAVE_PNG_TRUE='#'
  HAVE_PNG_FALSE=
fi



# Check whether --with-jpeg-mmx was given.
if test "${with_jpeg_mmx+set}" = set; then :
  withval=$with_jpeg_mmx;
fi

OLD_LIBS="$LIBS"
if test x$with_jpeg_mmx != x; then
  LIBS="$LIBS -L$with_jpeg_mmx"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg-mmx" >&5
$as_echo_n "checking for jpeg_set_defaults in -ljpeg-mmx... " >&6; }
if ${ac_cv_lib_jpeg_mmx_jpeg_set_defaults+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ljpeg-mmx  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char jpeg_set_defaults ();
int
main ()
{
return jpeg_set_defaults ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_jpeg_mmx_jpeg_set_defaults=yes
else
  ac_cv_lib_jpeg_mmx_jpeg_set_defaults=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&5
$as_echo "$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" >&6; }
if test "x$ac_cv_lib_jpeg_mmx_jpeg_set_defaults" = xyes; then :
  HAVE_JPEG="yes"
else
  HAVE_JPEG="no"
fi

JPEG_LIBS="$LIBS -ljpeg-mmx"
LIBS="$OLD_LIBS"
if test x$HAVE_JPEG != xyes; then
  JPEG_LIBS="-ljpeg"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for jpeg_set_defaults in -ljpeg" >&5
$as_echo_n "checking for jpeg_set_defaults in -ljpeg... " >&6; }
if ${ac_cv_lib_jpeg_jpeg_set_defaults+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ljpeg  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char jpeg_set_defaults ();
int
main ()
{
return jpeg_set_defaults ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_jpeg_jpeg_set_defaults=yes
else
  ac_cv_lib_jpeg_jpeg_set_defaults=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_jpeg_jpeg_set_defaults" >&5
$as_echo "$ac_cv_lib_jpeg_jpeg_set_defaults" >&6; }
if test "x$ac_cv_lib_jpeg_jpeg_set_defaults" = xyes; then :
  HAVE_JPEG="yes"
else
  HAVE_JPEG="no"
fi

fi

if test x$HAVE_JPEG = xyes; then

$as_echo "#define HAVE_JPEG 1" >>confdefs.h

else

$as_echo "#define HAVE_JPEG 0" >>confdefs.h

  JPEG_LIBS=
fi


 if test "x$HAVE_JPEG" = "xyes"; then
  HAVE_JPEG_TRUE=
  HAVE_JPEG_FALSE='#'
else
  HAVE_JPEG_TRUE='#'
  HAVE_JPEG_FALSE=
fi


VULKAN_CONFIG_DEFINES=""


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XCB" >&5
$as_echo_n "checking for XCB... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$XCB_CFLAGS"; then
        pkg_cv_XCB_CFLAGS="$XCB_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xcb >= 1.10\""; } >&5
  ($PKG_CONFIG --exists --print-errors "xcb >= 1.10") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_XCB_CFLAGS=`$PKG_CONFIG --cflags "xcb >= 1.10" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$XCB_LIBS"; then
        pkg_cv_XCB_LIBS="$XCB_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"xcb >= 1.10\""; } >&5
  ($PKG_CONFIG --exists --print-errors "xcb >= 1.10") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_XCB_LIBS=`$PKG_CONFIG --libs "xcb >= 1.10" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        XCB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "xcb >= 1.10"`
        else
	        XCB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "xcb >= 1.10"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$XCB_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_XCB=no
elif test $pkg_failed = untried; then
	HAVE_XCB=no
else
	XCB_CFLAGS=$pkg_cv_XCB_CFLAGS
	XCB_LIBS=$pkg_cv_XCB_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_XCB=yes
fi

 if test "x$HAVE_XCB" = "xyes"; then
  USE_XCB_TRUE=
  USE_XCB_FALSE='#'
else
  USE_XCB_TRUE='#'
  USE_XCB_FALSE=
fi

if test "x$HAVE_XCB" = "xyes"; then
  VULKAN_CONFIG_DEFINES="$VULKAN_CONFIG_DEFINES
  #define GST_VULKAN_HAVE_WINDOW_XCB 1"
fi

ac_config_commands="$ac_config_commands ext/vulkan/vkconfig.h"



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DirectSound ***" >&5
$as_echo "$as_me: *** checking feature: DirectSound ***" >&6;}
if test "xdirectsoundsrc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: directsoundsrc ***" >&5
$as_echo "$as_me: *** for plug-ins: directsoundsrc ***" >&6;}
fi
NOUSE=
if test "x$USE_DIRECTSOUND" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-directsound was given.
if test "${enable_directsound+set}" = set; then :
  enableval=$enable_directsound;  case "${enableval}" in
      yes) USE_DIRECTSOUND=yes;;
      no) USE_DIRECTSOUND=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-directsound" "$LINENO" 5 ;;
    esac
else
   USE_DIRECTSOUND=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DIRECTSOUND="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** directsoundsrc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** directsoundsrc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DIRECTSOUND " > /dev/null; then
  USE_DIRECTSOUND="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** directsoundsrc not ported" >&5
$as_echo "$as_me: WARNING: *** directsoundsrc not ported" >&2;}
fi


if test x$USE_DIRECTSOUND = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DIRECTSOUND=no

  HAVE_DIRECTSOUND="no"
  save_CFLAGS="$CFLAGS"
  save_LDFLAGS="$LDFLAGS"
  save_LIBS="$LIBS"
  CFLAGS="$CFLAGS $DIRECTX_CFLAGS"
  LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
  LIBS="$LIBS -lwinmm -ldsound -ldxerr9 -luser32"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DirectSound LDFLAGS" >&5
$as_echo_n "checking for DirectSound LDFLAGS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <windows.h>
#include <dxerr9.h>
#include <dsound.h>
#include <mmsystem.h>

int
main ()
{

  DXGetErrorString9 (0);
  DirectSoundCreate(NULL, NULL, NULL);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_DIRECTSOUND="yes"
else
  HAVE_DIRECTSOUND="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DIRECTSOUND" >&5
$as_echo "$HAVE_DIRECTSOUND" >&6; }
  CFLAGS=$save_CFLAGS
  LDFLAGS=$save_LDFLAGS
  LIBS=$save_LIBS

  if test "x$HAVE_DIRECTSOUND" = "xyes";  then
        DIRECTSOUND_LIBS="-lwinmm -ldsound -ldxerr9 -luser32"



  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DIRECTSOUND = xno; then
    USE_DIRECTSOUND=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: directsoundsrc" >&5
$as_echo "$as_me: *** These plugins will be built: directsoundsrc" >&6;}
  fi
fi
if test x$USE_DIRECTSOUND = xyes; then
  :
  if test "xdirectsoundsrc" != "x"; then
    GST_PLUGINS_YES="\tdirectsoundsrc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DIRECTSOUND /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: directsoundsrc" >&5
$as_echo "$as_me: *** These plugins will not be built: directsoundsrc" >&6;}
  if test "xdirectsoundsrc" != "x"; then
    GST_PLUGINS_NO="\tdirectsoundsrc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DIRECTSOUND = xyes; then
  USE_DIRECTSOUND_TRUE=
  USE_DIRECTSOUND_FALSE='#'
else
  USE_DIRECTSOUND_TRUE='#'
  USE_DIRECTSOUND_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: WASAPI plug-in ***" >&5
$as_echo "$as_me: *** checking feature: WASAPI plug-in ***" >&6;}
if test "xwasapi" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wasapi ***" >&5
$as_echo "$as_me: *** for plug-ins: wasapi ***" >&6;}
fi
NOUSE=
if test "x$USE_WASAPI" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-wasapi was given.
if test "${enable_wasapi+set}" = set; then :
  enableval=$enable_wasapi;  case "${enableval}" in
      yes) USE_WASAPI=yes;;
      no) USE_WASAPI=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-wasapi" "$LINENO" 5 ;;
    esac
else
   USE_WASAPI=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WASAPI="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wasapi pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** wasapi pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WASAPI " > /dev/null; then
  USE_WASAPI="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wasapi not ported" >&5
$as_echo "$as_me: WARNING: *** wasapi not ported" >&2;}
fi


if test x$USE_WASAPI = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WASAPI=no

  HAVE_WASAPI="no"
  save_CFLAGS="$CFLAGS"
  save_LDFLAGS="$LDFLAGS"
  save_LIBS="$LIBS"
  CFLAGS="$CFLAGS $DIRECTX_CFLAGS"
  LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
  LIBS="$LIBS -lole32 -lwinmm -lksuser"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WASAPI LDFLAGS" >&5
$as_echo_n "checking for WASAPI LDFLAGS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <windows.h>
#include <stdio.h>
#include <mmsystem.h>
#include <mmdeviceapi.h>

int
main ()
{

int main ()
{
    HRESULT hr = S_OK;

    hr = CoInitialize(NULL);
    if (FAILED(hr)) {
        printf("CoInitialize failed: hr = 0x%08x", hr);
        return __LINE__;
    }

	int result = 0;
    // result = do_everything(argc, argv);

    CoUninitialize();
    return result;
}

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_WASAPI="yes"
else
  HAVE_WASAPI="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_WASAPI" >&5
$as_echo "$HAVE_WASAPI" >&6; }
  CFLAGS=$save_CFLAGS
  LDFLAGS=$save_LDFLAGS
  LIBS=$save_LIBS

  if test "x$HAVE_WASAPI" = "xyes";  then
    WASAPI_LIBS="-lole32 -lwinmm -lksuser"

  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WASAPI = xno; then
    USE_WASAPI=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wasapi" >&5
$as_echo "$as_me: *** These plugins will be built: wasapi" >&6;}
  fi
fi
if test x$USE_WASAPI = xyes; then
  :
  if test "xwasapi" != "x"; then
    GST_PLUGINS_YES="\twasapi\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WASAPI /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wasapi" >&5
$as_echo "$as_me: *** These plugins will not be built: wasapi" >&6;}
  if test "xwasapi" != "x"; then
    GST_PLUGINS_NO="\twasapi\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WASAPI = xyes; then
  USE_WASAPI_TRUE=
  USE_WASAPI_FALSE='#'
else
  USE_WASAPI_TRUE='#'
  USE_WASAPI_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Direct3D plug-in ***" >&5
$as_echo "$as_me: *** checking feature: Direct3D plug-in ***" >&6;}
if test "xdirect3dsink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: direct3dsink ***" >&5
$as_echo "$as_me: *** for plug-ins: direct3dsink ***" >&6;}
fi
NOUSE=
if test "x$USE_DIRECT3D" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-direct3d was given.
if test "${enable_direct3d+set}" = set; then :
  enableval=$enable_direct3d;  case "${enableval}" in
      yes) USE_DIRECT3D=yes;;
      no) USE_DIRECT3D=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-direct3d" "$LINENO" 5 ;;
    esac
else
   USE_DIRECT3D=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DIRECT3D="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** direct3dsink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** direct3dsink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DIRECT3D " > /dev/null; then
  USE_DIRECT3D="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** direct3dsink not ported" >&5
$as_echo "$as_me: WARNING: *** direct3dsink not ported" >&2;}
fi


if test x$USE_DIRECT3D = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DIRECT3D=no

  HAVE_DIRECT3D="no"
  save_CFLAGS="$CFLAGS"
  save_LDFLAGS="$LDFLAGS"
  save_LIBS="$LIBS"
  CFLAGS="$CFLAGS $DIRECTX_CFLAGS"
  LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
  LIBS="$LIBS -ld3d9 -lgdi32"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Direct3D LDFLAGS" >&5
$as_echo_n "checking for Direct3D LDFLAGS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <windows.h>
#include <d3d9.h>

int
main ()
{

  Direct3DCreate9(D3D_SDK_VERSION);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_DIRECT3D="yes"
else
  HAVE_DIRECT3D="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_DIRECT3D" >&5
$as_echo "$HAVE_DIRECT3D" >&6; }
  CFLAGS=$save_CFLAGS
  LDFLAGS=$save_LDFLAGS
  LIBS=$save_LIBS

  if test "x$HAVE_DIRECT3D" = "xyes";  then
    DIRECT3D_LIBS="-ld3d9 -lgdi32"

  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DIRECT3D = xno; then
    USE_DIRECT3D=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: direct3dsink" >&5
$as_echo "$as_me: *** These plugins will be built: direct3dsink" >&6;}
  fi
fi
if test x$USE_DIRECT3D = xyes; then
  :
  if test "xdirect3dsink" != "x"; then
    GST_PLUGINS_YES="\tdirect3dsink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DIRECT3D /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: direct3dsink" >&5
$as_echo "$as_me: *** These plugins will not be built: direct3dsink" >&6;}
  if test "xdirect3dsink" != "x"; then
    GST_PLUGINS_NO="\tdirect3dsink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DIRECT3D = xyes; then
  USE_DIRECT3D_TRUE=
  USE_DIRECT3D_FALSE='#'
else
  USE_DIRECT3D_TRUE='#'
  USE_DIRECT3D_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: winscreencap plug-in ***" >&5
$as_echo "$as_me: *** checking feature: winscreencap plug-in ***" >&6;}
if test "xwinscreencap" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: winscreencap ***" >&5
$as_echo "$as_me: *** for plug-ins: winscreencap ***" >&6;}
fi
NOUSE=
if test "x$USE_WINSCREENCAP" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-winscreencap was given.
if test "${enable_winscreencap+set}" = set; then :
  enableval=$enable_winscreencap;  case "${enableval}" in
      yes) USE_WINSCREENCAP=yes;;
      no) USE_WINSCREENCAP=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-winscreencap" "$LINENO" 5 ;;
    esac
else
   USE_WINSCREENCAP=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WINSCREENCAP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** winscreencap pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** winscreencap pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WINSCREENCAP " > /dev/null; then
  USE_WINSCREENCAP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** winscreencap not ported" >&5
$as_echo "$as_me: WARNING: *** winscreencap not ported" >&2;}
fi


if test x$USE_WINSCREENCAP = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WINSCREENCAP=no

  HAVE_WINSCREENCAP="no"
  save_CFLAGS="$CFLAGS"
  save_LDFLAGS="$LDFLAGS"
  save_LIBS="$LIBS"
  CFLAGS="$CFLAGS $DIRECTX_CFLAGS"
  LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
  LIBS="$LIBS -ld3d9 -lgdi32"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Direct3D LDFLAGS" >&5
$as_echo_n "checking for Direct3D LDFLAGS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <windows.h>
#include <d3d9.h>

int
main ()
{

  Direct3DCreate9(D3D_SDK_VERSION);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_WINSCREENCAP="yes"
else
  HAVE_WINSCREENCAP="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_WINSCREENCAP" >&5
$as_echo "$HAVE_WINSCREENCAP" >&6; }
  CFLAGS=$save_CFLAGS
  LDFLAGS=$save_LDFLAGS
  LIBS=$save_LIBS

  if test "x$HAVE_WINSCREENCAP" = "xyes";  then
    WINSCREENCAP_LIBS="-ld3d9 -lgdi32"

  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WINSCREENCAP = xno; then
    USE_WINSCREENCAP=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: winscreencap" >&5
$as_echo "$as_me: *** These plugins will be built: winscreencap" >&6;}
  fi
fi
if test x$USE_WINSCREENCAP = xyes; then
  :
  if test "xwinscreencap" != "x"; then
    GST_PLUGINS_YES="\twinscreencap\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WINSCREENCAP /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: winscreencap" >&5
$as_echo "$as_me: *** These plugins will not be built: winscreencap" >&6;}
  if test "xwinscreencap" != "x"; then
    GST_PLUGINS_NO="\twinscreencap\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WINSCREENCAP = xyes; then
  USE_WINSCREENCAP_TRUE=
  USE_WINSCREENCAP_FALSE='#'
else
  USE_WINSCREENCAP_TRUE='#'
  USE_WINSCREENCAP_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Winks plug-in ***" >&5
$as_echo "$as_me: *** checking feature: Winks plug-in ***" >&6;}
if test "xwinks" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: winks ***" >&5
$as_echo "$as_me: *** for plug-ins: winks ***" >&6;}
fi
NOUSE=
if test "x$USE_WINKS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-winks was given.
if test "${enable_winks+set}" = set; then :
  enableval=$enable_winks;  case "${enableval}" in
      yes) USE_WINKS=yes;;
      no) USE_WINKS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-winks" "$LINENO" 5 ;;
    esac
else
   USE_WINKS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WINKS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** winks pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** winks pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WINKS " > /dev/null; then
  USE_WINKS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** winks not ported" >&5
$as_echo "$as_me: WARNING: *** winks not ported" >&2;}
fi


if test x$USE_WINKS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WINKS=no

  HAVE_WINKS="no"
  save_CFLAGS="$CFLAGS"
  save_LDFLAGS="$LDFLAGS"
  save_LIBS="$LIBS"
  CFLAGS="$CFLAGS $DIRECTX_CFLAGS"
  LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS"
  LIBS="$LIBS -lole32 -luuid -lstrmiids"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Winks LDFLAGS" >&5
$as_echo_n "checking for Winks LDFLAGS... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <windows.h>
#include <strmif.h>
#include <uuids.h>

int
main ()
{

int main () {
  IGraphBuilder *pGraph = NULL;
  HRESULT hr = CoInitialize(NULL);
  hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
                        &IID_IGraphBuilder, (void **)&pGraph);

  return 0;
}

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_WINKS="yes"
else
  HAVE_WINKS="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_WINKS" >&5
$as_echo "$HAVE_WINKS" >&6; }
  CFLAGS=$save_CFLAGS
  LDFLAGS=$save_LDFLAGS
  LIBS=$save_LIBS

  if test "x$HAVE_WINKS" = "xyes";  then
        WINKS_LIBS="-ldxguid -lole32 -luuid -lstrmiids -lksuser -lsetupapi"



  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WINKS = xno; then
    USE_WINKS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: winks" >&5
$as_echo "$as_me: *** These plugins will be built: winks" >&6;}
  fi
fi
if test x$USE_WINKS = xyes; then
  :
  if test "xwinks" != "x"; then
    GST_PLUGINS_YES="\twinks\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WINKS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: winks" >&5
$as_echo "$as_me: *** These plugins will not be built: winks" >&6;}
  if test "xwinks" != "x"; then
    GST_PLUGINS_NO="\twinks\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WINKS = xyes; then
  USE_WINKS_TRUE=
  USE_WINKS_FALSE='#'
else
  USE_WINKS_TRUE='#'
  USE_WINKS_FALSE=
fi



HAVE_ANDROID_MEDIA="no"
echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Android Media ***" >&5
$as_echo "$as_me: *** checking feature: Android Media ***" >&6;}
if test "xandroidmedia" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: androidmedia ***" >&5
$as_echo "$as_me: *** for plug-ins: androidmedia ***" >&6;}
fi
NOUSE=
if test "x$USE_ANDROID_MEDIA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-android_media was given.
if test "${enable_android_media+set}" = set; then :
  enableval=$enable_android_media;  case "${enableval}" in
      yes) USE_ANDROID_MEDIA=yes;;
      no) USE_ANDROID_MEDIA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-android_media" "$LINENO" 5 ;;
    esac
else
   USE_ANDROID_MEDIA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_ANDROID_MEDIA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** androidmedia pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** androidmedia pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ANDROID_MEDIA " > /dev/null; then
  USE_ANDROID_MEDIA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** androidmedia not ported" >&5
$as_echo "$as_me: WARNING: *** androidmedia not ported" >&2;}
fi


if test x$USE_ANDROID_MEDIA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_ANDROID_MEDIA=no

  case "$host" in
    *android*)
      ac_fn_c_check_header_mongrel "$LINENO" "jni.h" "ac_cv_header_jni_h" "$ac_includes_default"
if test "x$ac_cv_header_jni_h" = xyes; then :
  HAVE_ANDROID_MEDIA="yes"
else
  HAVE_ANDROID_MEDIA="no"
fi


      ;;
    *)
      HAVE_ANDROID_MEDIA="no"
      ;;
  esac


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_ANDROID_MEDIA = xno; then
    USE_ANDROID_MEDIA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: androidmedia" >&5
$as_echo "$as_me: *** These plugins will be built: androidmedia" >&6;}
  fi
fi
if test x$USE_ANDROID_MEDIA = xyes; then
  :
  if test "xandroidmedia" != "x"; then
    GST_PLUGINS_YES="\tandroidmedia\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_ANDROID_MEDIA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: androidmedia" >&5
$as_echo "$as_me: *** These plugins will not be built: androidmedia" >&6;}
  if test "xandroidmedia" != "x"; then
    GST_PLUGINS_NO="\tandroidmedia\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_ANDROID_MEDIA = xyes; then
  USE_ANDROID_MEDIA_TRUE=
  USE_ANDROID_MEDIA_FALSE='#'
else
  USE_ANDROID_MEDIA_TRUE='#'
  USE_ANDROID_MEDIA_FALSE=
fi



HAVE_APPLE_MEDIA="no"
echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Apple video ***" >&5
$as_echo "$as_me: *** checking feature: Apple video ***" >&6;}
if test "xapplemedia" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: applemedia ***" >&5
$as_echo "$as_me: *** for plug-ins: applemedia ***" >&6;}
fi
NOUSE=
if test "x$USE_APPLE_MEDIA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-apple_media was given.
if test "${enable_apple_media+set}" = set; then :
  enableval=$enable_apple_media;  case "${enableval}" in
      yes) USE_APPLE_MEDIA=yes;;
      no) USE_APPLE_MEDIA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-apple_media" "$LINENO" 5 ;;
    esac
else
   USE_APPLE_MEDIA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_APPLE_MEDIA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** applemedia pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** applemedia pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " APPLE_MEDIA " > /dev/null; then
  USE_APPLE_MEDIA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** applemedia not ported" >&5
$as_echo "$as_me: WARNING: *** applemedia not ported" >&2;}
fi


if test x$USE_APPLE_MEDIA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_APPLE_MEDIA=no

  ac_fn_c_check_header_mongrel "$LINENO" "SystemConfiguration/SystemConfiguration.h" "ac_cv_header_SystemConfiguration_SystemConfiguration_h" "$ac_includes_default"
if test "x$ac_cv_header_SystemConfiguration_SystemConfiguration_h" = xyes; then :
  HAVE_APPLE_MEDIA="yes"
else
  HAVE_APPLE_MEDIA="no"
fi


    if test "x$HAVE_IOS" = "xno"; then
    ac_fn_c_check_header_mongrel "$LINENO" "VideoToolbox/VideoToolbox.h" "ac_cv_header_VideoToolbox_VideoToolbox_h" "$ac_includes_default"
if test "x$ac_cv_header_VideoToolbox_VideoToolbox_h" = xyes; then :

else
  HAVE_APPLE_MEDIA="no"
fi


  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_APPLE_MEDIA = xno; then
    USE_APPLE_MEDIA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: applemedia" >&5
$as_echo "$as_me: *** These plugins will be built: applemedia" >&6;}
  fi
fi
if test x$USE_APPLE_MEDIA = xyes; then
  :
  if test "xapplemedia" != "x"; then
    GST_PLUGINS_YES="\tapplemedia\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_APPLE_MEDIA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: applemedia" >&5
$as_echo "$as_me: *** These plugins will not be built: applemedia" >&6;}
  if test "xapplemedia" != "x"; then
    GST_PLUGINS_NO="\tapplemedia\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_APPLE_MEDIA = xyes; then
  USE_APPLE_MEDIA_TRUE=
  USE_APPLE_MEDIA_FALSE='#'
else
  USE_APPLE_MEDIA_TRUE='#'
  USE_APPLE_MEDIA_FALSE=
fi



case "$host" in
  *-*darwin*)
    ;;
  *)
    HAVE_APPLE_MEDIA="no"
    ;;
esac

echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Bluez ***" >&5
$as_echo "$as_me: *** checking feature: Bluez ***" >&6;}
if test "xbluez" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: bluez ***" >&5
$as_echo "$as_me: *** for plug-ins: bluez ***" >&6;}
fi
NOUSE=
if test "x$USE_BLUEZ" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-bluez was given.
if test "${enable_bluez+set}" = set; then :
  enableval=$enable_bluez;  case "${enableval}" in
      yes) USE_BLUEZ=yes;;
      no) USE_BLUEZ=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-bluez" "$LINENO" 5 ;;
    esac
else
   USE_BLUEZ=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_BLUEZ="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bluez pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** bluez pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " BLUEZ " > /dev/null; then
  USE_BLUEZ="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bluez not ported" >&5
$as_echo "$as_me: WARNING: *** bluez not ported" >&2;}
fi


if test x$USE_BLUEZ = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_BLUEZ=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BLUEZ5" >&5
$as_echo_n "checking for BLUEZ5... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$BLUEZ5_CFLAGS"; then
        pkg_cv_BLUEZ5_CFLAGS="$BLUEZ5_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"bluez >= 5.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "bluez >= 5.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BLUEZ5_CFLAGS=`$PKG_CONFIG --cflags "bluez >= 5.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$BLUEZ5_LIBS"; then
        pkg_cv_BLUEZ5_LIBS="$BLUEZ5_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"bluez >= 5.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "bluez >= 5.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BLUEZ5_LIBS=`$PKG_CONFIG --libs "bluez >= 5.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        BLUEZ5_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "bluez >= 5.0"`
        else
	        BLUEZ5_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "bluez >= 5.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$BLUEZ5_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_BLUEZ=no

elif test $pkg_failed = untried; then

    HAVE_BLUEZ=no

else
	BLUEZ5_CFLAGS=$pkg_cv_BLUEZ5_CFLAGS
	BLUEZ5_LIBS=$pkg_cv_BLUEZ5_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GIO_UNIX" >&5
$as_echo_n "checking for GIO_UNIX... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GIO_UNIX_CFLAGS"; then
        pkg_cv_GIO_UNIX_CFLAGS="$GIO_UNIX_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 > 2.24\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 > 2.24") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GIO_UNIX_CFLAGS=`$PKG_CONFIG --cflags "gio-unix-2.0 > 2.24" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GIO_UNIX_LIBS"; then
        pkg_cv_GIO_UNIX_LIBS="$GIO_UNIX_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gio-unix-2.0 > 2.24\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gio-unix-2.0 > 2.24") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GIO_UNIX_LIBS=`$PKG_CONFIG --libs "gio-unix-2.0 > 2.24" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GIO_UNIX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gio-unix-2.0 > 2.24"`
        else
	        GIO_UNIX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gio-unix-2.0 > 2.24"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GIO_UNIX_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_BLUEZ=no

elif test $pkg_failed = untried; then

      HAVE_BLUEZ=no

else
	GIO_UNIX_CFLAGS=$pkg_cv_GIO_UNIX_CFLAGS
	GIO_UNIX_LIBS=$pkg_cv_GIO_UNIX_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      # Extract the first word of "gdbus-codegen", so it can be a program name with args.
set dummy gdbus-codegen; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_GDBUS_CODEGEN+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$GDBUS_CODEGEN"; then
  ac_cv_prog_GDBUS_CODEGEN="$GDBUS_CODEGEN" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_GDBUS_CODEGEN="gdbus-codegen"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
GDBUS_CODEGEN=$ac_cv_prog_GDBUS_CODEGEN
if test -n "$GDBUS_CODEGEN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $GDBUS_CODEGEN" >&5
$as_echo "$GDBUS_CODEGEN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


      HAVE_BLUEZ=yes

$as_echo "#define HAVE_BLUEZ5 1" >>confdefs.h


fi

fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_BLUEZ = xno; then
    USE_BLUEZ=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: bluez" >&5
$as_echo "$as_me: *** These plugins will be built: bluez" >&6;}
  fi
fi
if test x$USE_BLUEZ = xyes; then
  :
  if test "xbluez" != "x"; then
    GST_PLUGINS_YES="\tbluez\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_BLUEZ /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: bluez" >&5
$as_echo "$as_me: *** These plugins will not be built: bluez" >&6;}
  if test "xbluez" != "x"; then
    GST_PLUGINS_NO="\tbluez\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_BLUEZ = xyes; then
  USE_BLUEZ_TRUE=
  USE_BLUEZ_FALSE='#'
else
  USE_BLUEZ_TRUE='#'
  USE_BLUEZ_FALSE=
fi



HAVE_AVC="no"
echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: AVC Video Services ***" >&5
$as_echo "$as_me: *** checking feature: AVC Video Services ***" >&6;}
if test "xavcsrc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: avcsrc ***" >&5
$as_echo "$as_me: *** for plug-ins: avcsrc ***" >&6;}
fi
NOUSE=
if test "x$USE_AVC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-avc was given.
if test "${enable_avc+set}" = set; then :
  enableval=$enable_avc;  case "${enableval}" in
      yes) USE_AVC=yes;;
      no) USE_AVC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-avc" "$LINENO" 5 ;;
    esac
else
   USE_AVC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_AVC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** avcsrc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** avcsrc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " AVC " > /dev/null; then
  USE_AVC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** avcsrc not ported" >&5
$as_echo "$as_me: WARNING: *** avcsrc not ported" >&2;}
fi


if test x$USE_AVC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_AVC=no

  ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CPPFLAGS -framework AVCVideoServices -framework CoreFoundation"
  save_LIBS="$LIBS"
  LIBS="$LIBS -framework AVCVideoServices -framework CoreFoundation"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_link "$LINENO"; then :
  HAVE_AVC=yes
else
  HAVE_AVC=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$save_LIBS
  CPPFLAGS=$save_CPPFLAGS
  ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_AVC = xno; then
    USE_AVC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: avcsrc" >&5
$as_echo "$as_me: *** These plugins will be built: avcsrc" >&6;}
  fi
fi
if test x$USE_AVC = xyes; then
  :
  if test "xavcsrc" != "x"; then
    GST_PLUGINS_YES="\tavcsrc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_AVC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: avcsrc" >&5
$as_echo "$as_me: *** These plugins will not be built: avcsrc" >&6;}
  if test "xavcsrc" != "x"; then
    GST_PLUGINS_NO="\tavcsrc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_AVC = xyes; then
  USE_AVC_TRUE=
  USE_AVC_FALSE='#'
else
  USE_AVC_TRUE='#'
  USE_AVC_FALSE=
fi


case "$host" in
  *-*darwin*)
    ;;
  *)
    HAVE_AVC="no"
    ;;
esac

echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: POSIX shared memory source and sink ***" >&5
$as_echo "$as_me: *** checking feature: POSIX shared memory source and sink ***" >&6;}
if test "xshm" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: shm ***" >&5
$as_echo "$as_me: *** for plug-ins: shm ***" >&6;}
fi
NOUSE=
if test "x$USE_SHM" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-shm was given.
if test "${enable_shm+set}" = set; then :
  enableval=$enable_shm;  case "${enableval}" in
      yes) USE_SHM=yes;;
      no) USE_SHM=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-shm" "$LINENO" 5 ;;
    esac
else
   USE_SHM=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SHM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** shm pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** shm pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SHM " > /dev/null; then
  USE_SHM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** shm not ported" >&5
$as_echo "$as_me: WARNING: *** shm not ported" >&2;}
fi


if test x$USE_SHM = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SHM=no

    if test "x$HAVE_SYS_SOCKET_H" = "xyes"; then
        case $host in
        *-darwin* | *-macos10*)

$as_echo "#define HAVE_OSX 1" >>confdefs.h

            HAVE_SHM=yes
            ;;
        *)
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shm_open in -lrt" >&5
$as_echo_n "checking for shm_open in -lrt... " >&6; }
if ${ac_cv_lib_rt_shm_open+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char shm_open ();
int
main ()
{
return shm_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_rt_shm_open=yes
else
  ac_cv_lib_rt_shm_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_shm_open" >&5
$as_echo "$ac_cv_lib_rt_shm_open" >&6; }
if test "x$ac_cv_lib_rt_shm_open" = xyes; then :
  ac_fn_c_check_decl "$LINENO" "MSG_NOSIGNAL" "ac_cv_have_decl_MSG_NOSIGNAL" "
                #include <sys/socket.h>

"
if test "x$ac_cv_have_decl_MSG_NOSIGNAL" = xyes; then :
  HAVE_SHM=yes
else
  HAVE_SHM=no
fi

else
  HAVE_SHM=no
fi

            SHM_LIBS="-lrt"

            ;;
        esac
    else
        HAVE_SHM=no
    fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SHM = xno; then
    USE_SHM=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: shm" >&5
$as_echo "$as_me: *** These plugins will be built: shm" >&6;}
  fi
fi
if test x$USE_SHM = xyes; then
  :
  if test "xshm" != "x"; then
    GST_PLUGINS_YES="\tshm\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SHM /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: shm" >&5
$as_echo "$as_me: *** These plugins will not be built: shm" >&6;}
  if test "xshm" != "x"; then
    GST_PLUGINS_NO="\tshm\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SHM = xyes; then
  USE_SHM_TRUE=
  USE_SHM_FALSE='#'
else
  USE_SHM_TRUE='#'
  USE_SHM_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Video CD ***" >&5
$as_echo "$as_me: *** checking feature: Video CD ***" >&6;}
if test "xvcdsrc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vcdsrc ***" >&5
$as_echo "$as_me: *** for plug-ins: vcdsrc ***" >&6;}
fi
NOUSE=
if test "x$USE_VCD" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-vcd was given.
if test "${enable_vcd+set}" = set; then :
  enableval=$enable_vcd;  case "${enableval}" in
      yes) USE_VCD=yes;;
      no) USE_VCD=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-vcd" "$LINENO" 5 ;;
    esac
else
   USE_VCD=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_VCD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vcdsrc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** vcdsrc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VCD " > /dev/null; then
  USE_VCD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vcdsrc not ported" >&5
$as_echo "$as_me: WARNING: *** vcdsrc not ported" >&2;}
fi


if test x$USE_VCD = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_VCD=no

  ac_fn_c_check_header_mongrel "$LINENO" "linux/cdrom.h" "ac_cv_header_linux_cdrom_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_cdrom_h" = xyes; then :
  HAVE_VCD="yes"
else
  HAVE_VCD="no"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_VCD = xno; then
    USE_VCD=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vcdsrc" >&5
$as_echo "$as_me: *** These plugins will be built: vcdsrc" >&6;}
  fi
fi
if test x$USE_VCD = xyes; then
  :
  if test "xvcdsrc" != "x"; then
    GST_PLUGINS_YES="\tvcdsrc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_VCD /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vcdsrc" >&5
$as_echo "$as_me: *** These plugins will not be built: vcdsrc" >&6;}
  if test "xvcdsrc" != "x"; then
    GST_PLUGINS_NO="\tvcdsrc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_VCD = xyes; then
  USE_VCD_TRUE=
  USE_VCD_FALSE='#'
else
  USE_VCD_TRUE='#'
  USE_VCD_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OpenSL ES ***" >&5
$as_echo "$as_me: *** checking feature: OpenSL ES ***" >&6;}
if test "xopensl" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: opensl ***" >&5
$as_echo "$as_me: *** for plug-ins: opensl ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENSLES" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-opensles was given.
if test "${enable_opensles+set}" = set; then :
  enableval=$enable_opensles;  case "${enableval}" in
      yes) USE_OPENSLES=yes;;
      no) USE_OPENSLES=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-opensles" "$LINENO" 5 ;;
    esac
else
   USE_OPENSLES=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENSLES="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opensl pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** opensl pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENSLES " > /dev/null; then
  USE_OPENSLES="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opensl not ported" >&5
$as_echo "$as_me: WARNING: *** opensl not ported" >&2;}
fi


if test x$USE_OPENSLES = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENSLES=no

  ac_fn_c_check_header_mongrel "$LINENO" "SLES/OpenSLES.h" "ac_cv_header_SLES_OpenSLES_h" "$ac_includes_default"
if test "x$ac_cv_header_SLES_OpenSLES_h" = xyes; then :
  HAVE_OPENSLES="yes"
else
  HAVE_OPENSLES="no"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENSLES = xno; then
    USE_OPENSLES=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: opensl" >&5
$as_echo "$as_me: *** These plugins will be built: opensl" >&6;}
  fi
fi
if test x$USE_OPENSLES = xyes; then
  :
  if test "xopensl" != "x"; then
    GST_PLUGINS_YES="\topensl\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENSLES /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: opensl" >&5
$as_echo "$as_me: *** These plugins will not be built: opensl" >&6;}
  if test "xopensl" != "x"; then
    GST_PLUGINS_NO="\topensl\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENSLES = xyes; then
  USE_OPENSLES_TRUE=
  USE_OPENSLES_FALSE='#'
else
  USE_OPENSLES_TRUE='#'
  USE_OPENSLES_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: UVC H264 ***" >&5
$as_echo "$as_me: *** checking feature: UVC H264 ***" >&6;}
if test "xuvch264" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: uvch264 ***" >&5
$as_echo "$as_me: *** for plug-ins: uvch264 ***" >&6;}
fi
NOUSE=
if test "x$USE_UVCH264" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-uvch264 was given.
if test "${enable_uvch264+set}" = set; then :
  enableval=$enable_uvch264;  case "${enableval}" in
      yes) USE_UVCH264=yes;;
      no) USE_UVCH264=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-uvch264" "$LINENO" 5 ;;
    esac
else
   USE_UVCH264=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_UVCH264="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** uvch264 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** uvch264 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " UVCH264 " > /dev/null; then
  USE_UVCH264="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** uvch264 not ported" >&5
$as_echo "$as_me: WARNING: *** uvch264 not ported" >&2;}
fi


if test x$USE_UVCH264 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_UVCH264=no

  ac_fn_c_check_header_mongrel "$LINENO" "linux/uvcvideo.h" "ac_cv_header_linux_uvcvideo_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_uvcvideo_h" = xyes; then :
  HAVE_UVCVIDEO_H=yes
else
  HAVE_UVCVIDEO_H=no
fi



pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for G_UDEV" >&5
$as_echo_n "checking for G_UDEV... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$G_UDEV_CFLAGS"; then
        pkg_cv_G_UDEV_CFLAGS="$G_UDEV_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "gudev-1.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_G_UDEV_CFLAGS=`$PKG_CONFIG --cflags "gudev-1.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$G_UDEV_LIBS"; then
        pkg_cv_G_UDEV_LIBS="$G_UDEV_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gudev-1.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "gudev-1.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_G_UDEV_LIBS=`$PKG_CONFIG --libs "gudev-1.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        G_UDEV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gudev-1.0 "`
        else
	        G_UDEV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gudev-1.0 "`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$G_UDEV_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_GUDEV="no"
elif test $pkg_failed = untried; then
	HAVE_GUDEV="no"
else
	G_UDEV_CFLAGS=$pkg_cv_G_UDEV_CFLAGS
	G_UDEV_LIBS=$pkg_cv_G_UDEV_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_GUDEV 1" >>confdefs.h

          HAVE_GUDEV="yes"
fi

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBUSB" >&5
$as_echo_n "checking for LIBUSB... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBUSB_CFLAGS"; then
        pkg_cv_LIBUSB_CFLAGS="$LIBUSB_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "libusb-1.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBUSB_CFLAGS=`$PKG_CONFIG --cflags "libusb-1.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBUSB_LIBS"; then
        pkg_cv_LIBUSB_LIBS="$LIBUSB_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libusb-1.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "libusb-1.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBUSB_LIBS=`$PKG_CONFIG --libs "libusb-1.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBUSB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libusb-1.0 "`
        else
	        LIBUSB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libusb-1.0 "`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBUSB_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LIBUSB="no"
elif test $pkg_failed = untried; then
	HAVE_LIBUSB="no"
else
	LIBUSB_CFLAGS=$pkg_cv_LIBUSB_CFLAGS
	LIBUSB_LIBS=$pkg_cv_LIBUSB_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_LIBUSB 1" >>confdefs.h

          HAVE_LIBUSB="yes"
fi
  if test "x$HAVE_UVCVIDEO_H" = "xyes" && \
     test "x$HAVE_GUDEV" = "xyes" && \
     test "x$HAVE_LIBUSB" = "xyes"; then
    HAVE_UVCH264=yes
  else
    HAVE_UVCH264=no
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_UVCH264 = xno; then
    USE_UVCH264=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: uvch264" >&5
$as_echo "$as_me: *** These plugins will be built: uvch264" >&6;}
  fi
fi
if test x$USE_UVCH264 = xyes; then
  :
  if test "xuvch264" != "x"; then
    GST_PLUGINS_YES="\tuvch264\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_UVCH264 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: uvch264" >&5
$as_echo "$as_me: *** These plugins will not be built: uvch264" >&6;}
  if test "xuvch264" != "x"; then
    GST_PLUGINS_NO="\tuvch264\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_UVCH264 = xyes; then
  USE_UVCH264_TRUE=
  USE_UVCH264_FALSE='#'
else
  USE_UVCH264_TRUE='#'
  USE_UVCH264_FALSE=
fi







echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: NVIDIA Encode API ***" >&5
$as_echo "$as_me: *** checking feature: NVIDIA Encode API ***" >&6;}
if test "xnvenc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: nvenc ***" >&5
$as_echo "$as_me: *** for plug-ins: nvenc ***" >&6;}
fi
NOUSE=
if test "x$USE_NVENC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-nvenc was given.
if test "${enable_nvenc+set}" = set; then :
  enableval=$enable_nvenc;  case "${enableval}" in
      yes) USE_NVENC=yes;;
      no) USE_NVENC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-nvenc" "$LINENO" 5 ;;
    esac
else
   USE_NVENC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_NVENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nvenc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** nvenc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " NVENC " > /dev/null; then
  USE_NVENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nvenc not ported" >&5
$as_echo "$as_me: WARNING: *** nvenc not ported" >&2;}
fi


if test x$USE_NVENC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_NVENC=no


  which="gstreamer-video-1.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_VIDEO" >&5
$as_echo_n "checking for GST_VIDEO... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_VIDEO_CFLAGS"; then
        pkg_cv_GST_VIDEO_CFLAGS="$GST_VIDEO_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_VIDEO_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_VIDEO_LIBS"; then
        pkg_cv_GST_VIDEO_LIBS="$GST_VIDEO_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_VIDEO_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_VIDEO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        GST_VIDEO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_VIDEO_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_VIDEO="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GST_VIDEO_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_VIDEO_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_VIDEO_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_VIDEO="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GST_VIDEO_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_VIDEO_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_VIDEO_PKG_ERRORS" >&6;}
      fi

else
	GST_VIDEO_CFLAGS=$pkg_cv_GST_VIDEO_CFLAGS
	GST_VIDEO_LIBS=$pkg_cv_GST_VIDEO_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_VIDEO="yes"

fi



  which="gstreamer-pbutils-1.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PBUTILS" >&5
$as_echo_n "checking for GST_PBUTILS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PBUTILS_CFLAGS"; then
        pkg_cv_GST_PBUTILS_CFLAGS="$GST_PBUTILS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PBUTILS_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GST_PBUTILS_LIBS"; then
        pkg_cv_GST_PBUTILS_LIBS="$GST_PBUTILS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GST_PBUTILS_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GST_PBUTILS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        GST_PBUTILS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GST_PBUTILS_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GST_PBUTILS="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GST_PBUTILS_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PBUTILS_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PBUTILS_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_GST_PBUTILS="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$GST_PBUTILS_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PBUTILS_PKG_ERRORS" >&5
$as_echo "$as_me: $GST_PBUTILS_PKG_ERRORS" >&6;}
      fi

else
	GST_PBUTILS_CFLAGS=$pkg_cv_GST_PBUTILS_CFLAGS
	GST_PBUTILS_LIBS=$pkg_cv_GST_PBUTILS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_GST_PBUTILS="yes"

fi



# Check whether --with-cuda-prefix was given.
if test "${with_cuda_prefix+set}" = set; then :
  withval=$with_cuda_prefix; if test "x$with_cuda_prefix" != "x"; then :
  CUDA_PREFIX="$with_cuda_prefix"
fi
else
  CUDA_PREFIX=""
fi


  HAVE_CUDA="yes"
  if test "x$CUDA_PREFIX" != "x"; then
        if test "x$CUDA_CFLAGS" = "x" -a "x$CUDA_LIBS" = "x"; then
            CUDA_CFLAGS="-I$CUDA_PREFIX/include"
      CUDA_LIBS="-L$CUDA_PREFIX/lib -L$CUDA_PREFIX/lib64 -L$CUDA_PREFIX/lib/stubs -L$CUDA_PREFIX/lib64/stubs -lcuda -lcudart"
    fi
  else

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.5 cudart-7.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.5 cudart-7.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.5 cudart-7.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.5 cudart-7.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.5 cudart-7.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.5 cudart-7.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.5 cudart-7.5"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.5 cudart-7.5"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.0 cudart-7.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.0 cudart-7.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
elif test $pkg_failed = untried; then

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
elif test $pkg_failed = untried; then


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
elif test $pkg_failed = untried; then

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
elif test $pkg_failed = untried; then


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.0 cudart-7.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.0 cudart-7.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
elif test $pkg_failed = untried; then

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
elif test $pkg_failed = untried; then


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
$as_echo_n "checking for CUDA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_CFLAGS"; then
        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CUDA_LIBS"; then
        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        else
	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CUDA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
elif test $pkg_failed = untried; then

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
else
	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
	CUDA_LIBS=$pkg_cv_CUDA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	:
fi
  fi

  HAVE_CUDA_H=no
  HAVE_CUDART_H=no
  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$CUDA_CFLAGS $save_CPPFLAGS "
  ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default"
if test "x$ac_cv_header_cuda_h" = xyes; then :
  HAVE_CUDA_H=yes
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda.h" >&5
$as_echo "$as_me: WARNING: Could not find cuda.h" >&2;}
fi


  ac_fn_c_check_header_mongrel "$LINENO" "cuda_runtime_api.h" "ac_cv_header_cuda_runtime_api_h" "$ac_includes_default"
if test "x$ac_cv_header_cuda_runtime_api_h" = xyes; then :
  HAVE_CUDART_H=yes
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda_runtime_api.h" >&5
$as_echo "$as_me: WARNING: Could not find cuda_runtime_api.h" >&2;}
fi


  CPPFLAGS=$save_CPPFLAGS

    save_LIBS="$LIBS"
  LIBS="$CUDA_LIBS $save_LIBS"
  HAVE_CUDART_LIB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cudaGetErrorString in -lcudart" >&5
$as_echo_n "checking for cudaGetErrorString in -lcudart... " >&6; }
if ${ac_cv_lib_cudart_cudaGetErrorString+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lcudart  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char cudaGetErrorString ();
int
main ()
{
return cudaGetErrorString ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_cudart_cudaGetErrorString=yes
else
  ac_cv_lib_cudart_cudaGetErrorString=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_cudaGetErrorString" >&5
$as_echo "$ac_cv_lib_cudart_cudaGetErrorString" >&6; }
if test "x$ac_cv_lib_cudart_cudaGetErrorString" = xyes; then :
  HAVE_CUDART_LIB="yes"
else

      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cudart library" >&5
$as_echo "$as_me: WARNING: Could not find cudart library" >&2;}
fi

  HAVE_CUDA_LIB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cuInit in -lcuda" >&5
$as_echo_n "checking for cuInit in -lcuda... " >&6; }
if ${ac_cv_lib_cuda_cuInit+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lcuda  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char cuInit ();
int
main ()
{
return cuInit ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_cuda_cuInit=yes
else
  ac_cv_lib_cuda_cuInit=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_cuInit" >&5
$as_echo "$ac_cv_lib_cuda_cuInit" >&6; }
if test "x$ac_cv_lib_cuda_cuInit" = xyes; then :
  HAVE_CUDA_LIB="yes"
else

      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda library" >&5
$as_echo "$as_me: WARNING: Could not find cuda library" >&2;}
fi

  LIBS="$save_LIBS"

    HAVE_NVENCODEAPI_H=no

  save_CPPFLAGS="$CPPFLAGS"
  CPPFLAGS="$NVENCODE_CFLAGS $save_CPPFLAGS"
  ac_fn_c_check_header_mongrel "$LINENO" "nvEncodeAPI.h" "ac_cv_header_nvEncodeAPI_h" "$ac_includes_default"
if test "x$ac_cv_header_nvEncodeAPI_h" = xyes; then :

      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <nvEncodeAPI.h>
          #if NVENCAPI_MAJOR_VERSION < 5
          #error "Need nvEncodeAPI.h >= 5.0"
          #endif

_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :

          HAVE_NVENCODEAPI_H=yes

else

          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: nvEncodeAPI.h must be >= 5.0" >&5
$as_echo "$as_me: WARNING: nvEncodeAPI.h must be >= 5.0" >&2;}

fi
rm -f conftest.err conftest.i conftest.$ac_ext

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find nvEncodeAPI.h" >&5
$as_echo "$as_me: WARNING: Could not find nvEncodeAPI.h" >&2;}
fi



  CPPFLAGS="$save_CPPFLAGS"

    HAVE_NVENCODE_LIB=no

  saved_LIBS="$LIBS"
  LIBS="$NVENCODE_LIBS $saved_LIBS"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NvEncodeAPICreateInstance in -lnvidia-encode" >&5
$as_echo_n "checking for NvEncodeAPICreateInstance in -lnvidia-encode... " >&6; }
if ${ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lnvidia-encode  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char NvEncodeAPICreateInstance ();
int
main ()
{
return NvEncodeAPICreateInstance ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance=yes
else
  ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" >&5
$as_echo "$ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" >&6; }
if test "x$ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" = xyes; then :
  HAVE_NVENCODE_LIB="yes"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find library nvidia-encode" >&5
$as_echo "$as_me: WARNING: Could not find library nvidia-encode" >&2;}
fi

  NVENCODE_LIBS="$NVENCODE_LIBS -lnvidia-encode"

  LIBS="$saved_LIBS"

  USE_NVENC_GST_GL=no
  if test "x$HAVE_CUDA_H" = "xyes" \
      -a "x$HAVE_CUDART_H" = "xyes" \
      -a "x$HAVE_CUDA_LIB" = "xyes" \
      -a "x$HAVE_CUDART_LIB" = "xyes" \
      -a "x$HAVE_NVENCODEAPI_H" = "xyes" \
      -a "x$HAVE_NVENCODE_LIB" = "xyes"; then
    HAVE_NVENC="yes"
    if test x"$USE_OPENGL" = x"yes"; then
            save_CPPFLAGS="$CPPFLAGS"
      CPPFLAGS="$save_CPPFLAGS $CUDA_CFLAGS"
      ac_fn_c_check_header_mongrel "$LINENO" "cuda_gl_interop.h" "ac_cv_header_cuda_gl_interop_h" "$ac_includes_default"
if test "x$ac_cv_header_cuda_gl_interop_h" = xyes; then :

        USE_NVENC_GST_GL="yes"

$as_echo "#define HAVE_NVENC_GST_GL 1 " >>confdefs.h


fi


      CPPFLAGS="$save_CPPFLAGS"
    fi
  else
    HAVE_NVENC="no"
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_NVENC = xno; then
    USE_NVENC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: nvenc" >&5
$as_echo "$as_me: *** These plugins will be built: nvenc" >&6;}
  fi
fi
if test x$USE_NVENC = xyes; then
  :
  if test "xnvenc" != "x"; then
    GST_PLUGINS_YES="\tnvenc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_NVENC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: nvenc" >&5
$as_echo "$as_me: *** These plugins will not be built: nvenc" >&6;}
  if test "xnvenc" != "x"; then
    GST_PLUGINS_NO="\tnvenc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_NVENC = xyes; then
  USE_NVENC_TRUE=
  USE_NVENC_FALSE='#'
else
  USE_NVENC_TRUE='#'
  USE_NVENC_FALSE=
fi


 if test "x$USE_NVENC_GST_GL" = "xyes"; then
  USE_NVENC_GST_GL_TRUE=
  USE_NVENC_GST_GL_FALSE='#'
else
  USE_NVENC_GST_GL_TRUE='#'
  USE_NVENC_GST_GL_FALSE=
fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: tinyalsa ***" >&5
$as_echo "$as_me: *** checking feature: tinyalsa ***" >&6;}
if test "xtinyalsa" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: tinyalsa ***" >&5
$as_echo "$as_me: *** for plug-ins: tinyalsa ***" >&6;}
fi
NOUSE=
if test "x$USE_TINYALSA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-tinyalsa was given.
if test "${enable_tinyalsa+set}" = set; then :
  enableval=$enable_tinyalsa;  case "${enableval}" in
      yes) USE_TINYALSA=yes;;
      no) USE_TINYALSA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-tinyalsa" "$LINENO" 5 ;;
    esac
else
   USE_TINYALSA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_TINYALSA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** tinyalsa pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** tinyalsa pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " TINYALSA " > /dev/null; then
  USE_TINYALSA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** tinyalsa not ported" >&5
$as_echo "$as_me: WARNING: *** tinyalsa not ported" >&2;}
fi


if test x$USE_TINYALSA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_TINYALSA=no

  ac_fn_c_check_header_mongrel "$LINENO" "tinyalsa/asoundlib.h" "ac_cv_header_tinyalsa_asoundlib_h" "$ac_includes_default"
if test "x$ac_cv_header_tinyalsa_asoundlib_h" = xyes; then :
  HAVE_TINYALSA="yes"
else
  HAVE_TINYALSA="no"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_TINYALSA = xno; then
    USE_TINYALSA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: tinyalsa" >&5
$as_echo "$as_me: *** These plugins will be built: tinyalsa" >&6;}
  fi
fi
if test x$USE_TINYALSA = xyes; then
  :
  if test "xtinyalsa" != "x"; then
    GST_PLUGINS_YES="\ttinyalsa\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_TINYALSA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: tinyalsa" >&5
$as_echo "$as_me: *** These plugins will not be built: tinyalsa" >&6;}
  if test "xtinyalsa" != "x"; then
    GST_PLUGINS_NO="\ttinyalsa\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_TINYALSA = xyes; then
  USE_TINYALSA_TRUE=
  USE_TINYALSA_FALSE='#'
else
  USE_TINYALSA_TRUE='#'
  USE_TINYALSA_FALSE=
fi




if test "x$BUILD_EXTERNAL" = "xyes"; then

echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ASS/SSA renderer ***" >&5
$as_echo "$as_me: *** checking feature: ASS/SSA renderer ***" >&6;}
if test "xassrender" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: assrender ***" >&5
$as_echo "$as_me: *** for plug-ins: assrender ***" >&6;}
fi
NOUSE=
if test "x$USE_ASSRENDER" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-assrender was given.
if test "${enable_assrender+set}" = set; then :
  enableval=$enable_assrender;  case "${enableval}" in
      yes) USE_ASSRENDER=yes;;
      no) USE_ASSRENDER=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-assrender" "$LINENO" 5 ;;
    esac
else
   USE_ASSRENDER=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_ASSRENDER="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** assrender pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** assrender pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ASSRENDER " > /dev/null; then
  USE_ASSRENDER="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** assrender not ported" >&5
$as_echo "$as_me: WARNING: *** assrender not ported" >&2;}
fi


if test x$USE_ASSRENDER = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_ASSRENDER=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ASSRENDER" >&5
$as_echo_n "checking for ASSRENDER... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$ASSRENDER_CFLAGS"; then
        pkg_cv_ASSRENDER_CFLAGS="$ASSRENDER_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.10.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libass >= 0.10.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ASSRENDER_CFLAGS=`$PKG_CONFIG --cflags "libass >= 0.10.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$ASSRENDER_LIBS"; then
        pkg_cv_ASSRENDER_LIBS="$ASSRENDER_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.10.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libass >= 0.10.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ASSRENDER_LIBS=`$PKG_CONFIG --libs "libass >= 0.10.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libass >= 0.10.2"`
        else
	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libass >= 0.10.2"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$ASSRENDER_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_ASSRENDER="no"

elif test $pkg_failed = untried; then

    HAVE_ASSRENDER="no"

else
	ASSRENDER_CFLAGS=$pkg_cv_ASSRENDER_CFLAGS
	ASSRENDER_LIBS=$pkg_cv_ASSRENDER_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_ASSRENDER="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_ASSRENDER = xno; then
    USE_ASSRENDER=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: assrender" >&5
$as_echo "$as_me: *** These plugins will be built: assrender" >&6;}
  fi
fi
if test x$USE_ASSRENDER = xyes; then
  :
  if test "xassrender" != "x"; then
    GST_PLUGINS_YES="\tassrender\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_ASSRENDER /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: assrender" >&5
$as_echo "$as_me: *** These plugins will not be built: assrender" >&6;}
  if test "xassrender" != "x"; then
    GST_PLUGINS_NO="\tassrender\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_ASSRENDER = xyes; then
  USE_ASSRENDER_TRUE=
  USE_ASSRENDER_FALSE='#'
else
  USE_ASSRENDER_TRUE='#'
  USE_ASSRENDER_FALSE=
fi





echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: vo-amrwbenc library ***" >&5
$as_echo "$as_me: *** checking feature: vo-amrwbenc library ***" >&6;}
if test "xvo-amrwbenc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vo-amrwbenc ***" >&5
$as_echo "$as_me: *** for plug-ins: vo-amrwbenc ***" >&6;}
fi
NOUSE=
if test "x$USE_VOAMRWBENC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-voamrwbenc was given.
if test "${enable_voamrwbenc+set}" = set; then :
  enableval=$enable_voamrwbenc;  case "${enableval}" in
      yes) USE_VOAMRWBENC=yes;;
      no) USE_VOAMRWBENC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-voamrwbenc" "$LINENO" 5 ;;
    esac
else
   USE_VOAMRWBENC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_VOAMRWBENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vo-amrwbenc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** vo-amrwbenc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VOAMRWBENC " > /dev/null; then
  USE_VOAMRWBENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vo-amrwbenc not ported" >&5
$as_echo "$as_me: WARNING: *** vo-amrwbenc not ported" >&2;}
fi


if test x$USE_VOAMRWBENC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_VOAMRWBENC=no


  which="vo-amrwbenc >= 0.1.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VOAMRWBENC" >&5
$as_echo_n "checking for VOAMRWBENC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$VOAMRWBENC_CFLAGS"; then
        pkg_cv_VOAMRWBENC_CFLAGS="$VOAMRWBENC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VOAMRWBENC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$VOAMRWBENC_LIBS"; then
        pkg_cv_VOAMRWBENC_LIBS="$VOAMRWBENC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VOAMRWBENC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        VOAMRWBENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        VOAMRWBENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$VOAMRWBENC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_VOAMRWBENC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$VOAMRWBENC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $VOAMRWBENC_PKG_ERRORS" >&5
$as_echo "$as_me: $VOAMRWBENC_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_VOAMRWBENC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$VOAMRWBENC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $VOAMRWBENC_PKG_ERRORS" >&5
$as_echo "$as_me: $VOAMRWBENC_PKG_ERRORS" >&6;}
      fi

else
	VOAMRWBENC_CFLAGS=$pkg_cv_VOAMRWBENC_CFLAGS
	VOAMRWBENC_LIBS=$pkg_cv_VOAMRWBENC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_VOAMRWBENC="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_VOAMRWBENC = xno; then
    USE_VOAMRWBENC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vo-amrwbenc" >&5
$as_echo "$as_me: *** These plugins will be built: vo-amrwbenc" >&6;}
  fi
fi
if test x$USE_VOAMRWBENC = xyes; then
  :
  if test "xvo-amrwbenc" != "x"; then
    GST_PLUGINS_YES="\tvo-amrwbenc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_VOAMRWBENC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vo-amrwbenc" >&5
$as_echo "$as_me: *** These plugins will not be built: vo-amrwbenc" >&6;}
  if test "xvo-amrwbenc" != "x"; then
    GST_PLUGINS_NO="\tvo-amrwbenc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_VOAMRWBENC = xyes; then
  USE_VOAMRWBENC_TRUE=
  USE_VOAMRWBENC_FALSE='#'
else
  USE_VOAMRWBENC_TRUE='#'
  USE_VOAMRWBENC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: vo-aacenc library ***" >&5
$as_echo "$as_me: *** checking feature: vo-aacenc library ***" >&6;}
if test "xvo-aacenc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vo-aacenc ***" >&5
$as_echo "$as_me: *** for plug-ins: vo-aacenc ***" >&6;}
fi
NOUSE=
if test "x$USE_VOAACENC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-voaacenc was given.
if test "${enable_voaacenc+set}" = set; then :
  enableval=$enable_voaacenc;  case "${enableval}" in
      yes) USE_VOAACENC=yes;;
      no) USE_VOAACENC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-voaacenc" "$LINENO" 5 ;;
    esac
else
   USE_VOAACENC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_VOAACENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vo-aacenc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** vo-aacenc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VOAACENC " > /dev/null; then
  USE_VOAACENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vo-aacenc not ported" >&5
$as_echo "$as_me: WARNING: *** vo-aacenc not ported" >&2;}
fi


if test x$USE_VOAACENC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_VOAACENC=no


  which="vo-aacenc >= 0.1.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VOAACENC" >&5
$as_echo_n "checking for VOAACENC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$VOAACENC_CFLAGS"; then
        pkg_cv_VOAACENC_CFLAGS="$VOAACENC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VOAACENC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$VOAACENC_LIBS"; then
        pkg_cv_VOAACENC_LIBS="$VOAACENC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VOAACENC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        VOAACENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        VOAACENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$VOAACENC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_VOAACENC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$VOAACENC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $VOAACENC_PKG_ERRORS" >&5
$as_echo "$as_me: $VOAACENC_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_VOAACENC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$VOAACENC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $VOAACENC_PKG_ERRORS" >&5
$as_echo "$as_me: $VOAACENC_PKG_ERRORS" >&6;}
      fi

else
	VOAACENC_CFLAGS=$pkg_cv_VOAACENC_CFLAGS
	VOAACENC_LIBS=$pkg_cv_VOAACENC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_VOAACENC="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_VOAACENC = xno; then
    USE_VOAACENC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vo-aacenc" >&5
$as_echo "$as_me: *** These plugins will be built: vo-aacenc" >&6;}
  fi
fi
if test x$USE_VOAACENC = xyes; then
  :
  if test "xvo-aacenc" != "x"; then
    GST_PLUGINS_YES="\tvo-aacenc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_VOAACENC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vo-aacenc" >&5
$as_echo "$as_me: *** These plugins will not be built: vo-aacenc" >&6;}
  if test "xvo-aacenc" != "x"; then
    GST_PLUGINS_NO="\tvo-aacenc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_VOAACENC = xyes; then
  USE_VOAACENC_TRUE=
  USE_VOAACENC_FALSE='#'
else
  USE_VOAACENC_TRUE='#'
  USE_VOAACENC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: AirPort Express Wireless sink ***" >&5
$as_echo "$as_me: *** checking feature: AirPort Express Wireless sink ***" >&6;}
if test "xapexsink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: apexsink ***" >&5
$as_echo "$as_me: *** for plug-ins: apexsink ***" >&6;}
fi
NOUSE=
if test "x$USE_APEXSINK" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-apexsink was given.
if test "${enable_apexsink+set}" = set; then :
  enableval=$enable_apexsink;  case "${enableval}" in
      yes) USE_APEXSINK=yes;;
      no) USE_APEXSINK=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-apexsink" "$LINENO" 5 ;;
    esac
else
   USE_APEXSINK=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_APEXSINK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** apexsink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** apexsink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " APEXSINK " > /dev/null; then
  USE_APEXSINK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** apexsink not ported" >&5
$as_echo "$as_me: WARNING: *** apexsink not ported" >&2;}
fi


if test x$USE_APEXSINK = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_APEXSINK=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for APEXSINK" >&5
$as_echo_n "checking for APEXSINK... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$APEXSINK_CFLAGS"; then
        pkg_cv_APEXSINK_CFLAGS="$APEXSINK_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" openssl >= 0.9.5  libcrypto \""; } >&5
  ($PKG_CONFIG --exists --print-errors " openssl >= 0.9.5  libcrypto ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_APEXSINK_CFLAGS=`$PKG_CONFIG --cflags " openssl >= 0.9.5  libcrypto " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$APEXSINK_LIBS"; then
        pkg_cv_APEXSINK_LIBS="$APEXSINK_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" openssl >= 0.9.5  libcrypto \""; } >&5
  ($PKG_CONFIG --exists --print-errors " openssl >= 0.9.5  libcrypto ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_APEXSINK_LIBS=`$PKG_CONFIG --libs " openssl >= 0.9.5  libcrypto " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        APEXSINK_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " openssl >= 0.9.5  libcrypto "`
        else
	        APEXSINK_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " openssl >= 0.9.5  libcrypto "`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$APEXSINK_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    APEXSINK="no"

elif test $pkg_failed = untried; then

    APEXSINK="no"

else
	APEXSINK_CFLAGS=$pkg_cv_APEXSINK_CFLAGS
	APEXSINK_LIBS=$pkg_cv_APEXSINK_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_APEXSINK="yes"
    saved_LIBS="$LIBS"
    LIBS=""
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5
$as_echo_n "checking for library containing socket... " >&6; }
if ${ac_cv_search_socket+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char socket ();
int
main ()
{
return socket ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' socket; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_socket=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_socket+:} false; then :
  break
fi
done
if ${ac_cv_search_socket+:} false; then :

else
  ac_cv_search_socket=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5
$as_echo "$ac_cv_search_socket" >&6; }
ac_res=$ac_cv_search_socket
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

else
   APEXSINK="no"
fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing gethostbyname" >&5
$as_echo_n "checking for library containing gethostbyname... " >&6; }
if ${ac_cv_search_gethostbyname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_func_search_save_LIBS=$LIBS
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gethostbyname ();
int
main ()
{
return gethostbyname ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' nsl; do
  if test -z "$ac_lib"; then
    ac_res="none required"
  else
    ac_res=-l$ac_lib
    LIBS="-l$ac_lib  $ac_func_search_save_LIBS"
  fi
  if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_search_gethostbyname=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_gethostbyname+:} false; then :
  break
fi
done
if ${ac_cv_search_gethostbyname+:} false; then :

else
  ac_cv_search_gethostbyname=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_gethostbyname" >&5
$as_echo "$ac_cv_search_gethostbyname" >&6; }
ac_res=$ac_cv_search_gethostbyname
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

else
   APEXSINK="no"
fi

    APEXSINK_LIBS="$APEXSINK_LIBS $LIBS"
    LIBS="$saved_LIBS"



fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_APEXSINK = xno; then
    USE_APEXSINK=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: apexsink" >&5
$as_echo "$as_me: *** These plugins will be built: apexsink" >&6;}
  fi
fi
if test x$USE_APEXSINK = xyes; then
  :
  if test "xapexsink" != "x"; then
    GST_PLUGINS_YES="\tapexsink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_APEXSINK /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: apexsink" >&5
$as_echo "$as_me: *** These plugins will not be built: apexsink" >&6;}
  if test "xapexsink" != "x"; then
    GST_PLUGINS_NO="\tapexsink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_APEXSINK = xyes; then
  USE_APEXSINK_TRUE=
  USE_APEXSINK_FALSE='#'
else
  USE_APEXSINK_TRUE='#'
  USE_APEXSINK_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: bs2b ***" >&5
$as_echo "$as_me: *** checking feature: bs2b ***" >&6;}
if test "xbs2b" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: bs2b ***" >&5
$as_echo "$as_me: *** for plug-ins: bs2b ***" >&6;}
fi
NOUSE=
if test "x$USE_BS2B" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-bs2b was given.
if test "${enable_bs2b+set}" = set; then :
  enableval=$enable_bs2b;  case "${enableval}" in
      yes) USE_BS2B=yes;;
      no) USE_BS2B=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-bs2b" "$LINENO" 5 ;;
    esac
else
   USE_BS2B=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_BS2B="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bs2b pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** bs2b pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " BS2B " > /dev/null; then
  USE_BS2B="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bs2b not ported" >&5
$as_echo "$as_me: WARNING: *** bs2b not ported" >&2;}
fi


if test x$USE_BS2B = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_BS2B=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BS2B" >&5
$as_echo_n "checking for BS2B... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$BS2B_CFLAGS"; then
        pkg_cv_BS2B_CFLAGS="$BS2B_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbs2b >= 3.1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libbs2b >= 3.1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BS2B_CFLAGS=`$PKG_CONFIG --cflags "libbs2b >= 3.1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$BS2B_LIBS"; then
        pkg_cv_BS2B_LIBS="$BS2B_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libbs2b >= 3.1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libbs2b >= 3.1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_BS2B_LIBS=`$PKG_CONFIG --libs "libbs2b >= 3.1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        BS2B_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libbs2b >= 3.1.0"`
        else
	        BS2B_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libbs2b >= 3.1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$BS2B_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_BS2B="no"

elif test $pkg_failed = untried; then

    HAVE_BS2B="no"

else
	BS2B_CFLAGS=$pkg_cv_BS2B_CFLAGS
	BS2B_LIBS=$pkg_cv_BS2B_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_BS2B="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_BS2B = xno; then
    USE_BS2B=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: bs2b" >&5
$as_echo "$as_me: *** These plugins will be built: bs2b" >&6;}
  fi
fi
if test x$USE_BS2B = xyes; then
  :
  if test "xbs2b" != "x"; then
    GST_PLUGINS_YES="\tbs2b\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_BS2B /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: bs2b" >&5
$as_echo "$as_me: *** These plugins will not be built: bs2b" >&6;}
  if test "xbs2b" != "x"; then
    GST_PLUGINS_NO="\tbs2b\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_BS2B = xyes; then
  USE_BS2B_TRUE=
  USE_BS2B_FALSE='#'
else
  USE_BS2B_TRUE='#'
  USE_BS2B_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: bz2 library ***" >&5
$as_echo "$as_me: *** checking feature: bz2 library ***" >&6;}
if test "xbz2" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: bz2 ***" >&5
$as_echo "$as_me: *** for plug-ins: bz2 ***" >&6;}
fi
NOUSE=
if test "x$USE_BZ2" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-bz2 was given.
if test "${enable_bz2+set}" = set; then :
  enableval=$enable_bz2;  case "${enableval}" in
      yes) USE_BZ2=yes;;
      no) USE_BZ2=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-bz2" "$LINENO" 5 ;;
    esac
else
   USE_BZ2=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_BZ2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bz2 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** bz2 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " BZ2 " > /dev/null; then
  USE_BZ2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** bz2 not ported" >&5
$as_echo "$as_me: WARNING: *** bz2 not ported" >&2;}
fi


if test x$USE_BZ2 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_BZ2=no

  save_LIBS=$LIBS
  LIBS="$LIBS -lbz2"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for BZ2_bzlibVersion in -lbz2" >&5
$as_echo_n "checking for BZ2_bzlibVersion in -lbz2... " >&6; }
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <bzlib.h>
int
main ()
{
const char *version = BZ2_bzlibVersion ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_BZ2=yes
else
  HAVE_BZ2=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_BZ2" >&5
$as_echo "$HAVE_BZ2" >&6; }
  LIBS=$save_LIBS
  if test "x$HAVE_BZ2" = "xyes"; then
    BZ2_LIBS="-lbz2"
  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_BZ2 = xno; then
    USE_BZ2=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: bz2" >&5
$as_echo "$as_me: *** These plugins will be built: bz2" >&6;}
  fi
fi
if test x$USE_BZ2 = xyes; then
  :
  if test "xbz2" != "x"; then
    GST_PLUGINS_YES="\tbz2\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_BZ2 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: bz2" >&5
$as_echo "$as_me: *** These plugins will not be built: bz2" >&6;}
  if test "xbz2" != "x"; then
    GST_PLUGINS_NO="\tbz2\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_BZ2 = xyes; then
  USE_BZ2_TRUE=
  USE_BZ2_FALSE='#'
else
  USE_BZ2_TRUE='#'
  USE_BZ2_FALSE=
fi



#dnl *** cairo ***
#translit(dnm, m, l) AM_CONDITIONAL(USE_CAIRO, true)
#AG_GST_CHECK_FEATURE(CAIRO, [cairo plug-in], cairo, [
#  PKG_CHECK_MODULES(CAIRO, cairo >= 1.0 glitz-glx, HAVE_CAIRO=yes, [
#    HAVE_CAIRO=no
#  ])
#  AC_SUBST(CAIRO_CFLAGS)
#  AC_SUBST(CAIRO_LIBS)
#])

echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: chromaprint ***" >&5
$as_echo "$as_me: *** checking feature: chromaprint ***" >&6;}
if test "xchromaprint" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: chromaprint ***" >&5
$as_echo "$as_me: *** for plug-ins: chromaprint ***" >&6;}
fi
NOUSE=
if test "x$USE_CHROMAPRINT" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-chromaprint was given.
if test "${enable_chromaprint+set}" = set; then :
  enableval=$enable_chromaprint;  case "${enableval}" in
      yes) USE_CHROMAPRINT=yes;;
      no) USE_CHROMAPRINT=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-chromaprint" "$LINENO" 5 ;;
    esac
else
   USE_CHROMAPRINT=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_CHROMAPRINT="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** chromaprint pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** chromaprint pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " CHROMAPRINT " > /dev/null; then
  USE_CHROMAPRINT="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** chromaprint not ported" >&5
$as_echo "$as_me: WARNING: *** chromaprint not ported" >&2;}
fi


if test x$USE_CHROMAPRINT = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_CHROMAPRINT=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CHROMAPRINT" >&5
$as_echo_n "checking for CHROMAPRINT... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CHROMAPRINT_CFLAGS"; then
        pkg_cv_CHROMAPRINT_CFLAGS="$CHROMAPRINT_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libchromaprint\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libchromaprint") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CHROMAPRINT_CFLAGS=`$PKG_CONFIG --cflags "libchromaprint" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CHROMAPRINT_LIBS"; then
        pkg_cv_CHROMAPRINT_LIBS="$CHROMAPRINT_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libchromaprint\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libchromaprint") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CHROMAPRINT_LIBS=`$PKG_CONFIG --libs "libchromaprint" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CHROMAPRINT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libchromaprint"`
        else
	        CHROMAPRINT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libchromaprint"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CHROMAPRINT_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_CHROMAPRINT="no"

elif test $pkg_failed = untried; then

    HAVE_CHROMAPRINT="no"

else
	CHROMAPRINT_CFLAGS=$pkg_cv_CHROMAPRINT_CFLAGS
	CHROMAPRINT_LIBS=$pkg_cv_CHROMAPRINT_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_CHROMAPRINT="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_CHROMAPRINT = xno; then
    USE_CHROMAPRINT=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: chromaprint" >&5
$as_echo "$as_me: *** These plugins will be built: chromaprint" >&6;}
  fi
fi
if test x$USE_CHROMAPRINT = xyes; then
  :
  if test "xchromaprint" != "x"; then
    GST_PLUGINS_YES="\tchromaprint\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_CHROMAPRINT /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: chromaprint" >&5
$as_echo "$as_me: *** These plugins will not be built: chromaprint" >&6;}
  if test "xchromaprint" != "x"; then
    GST_PLUGINS_NO="\tchromaprint\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_CHROMAPRINT = xyes; then
  USE_CHROMAPRINT_TRUE=
  USE_CHROMAPRINT_FALSE='#'
else
  USE_CHROMAPRINT_TRUE='#'
  USE_CHROMAPRINT_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Curl plugin ***" >&5
$as_echo "$as_me: *** checking feature: Curl plugin ***" >&6;}
if test "xcurl" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: curl ***" >&5
$as_echo "$as_me: *** for plug-ins: curl ***" >&6;}
fi
NOUSE=
if test "x$USE_CURL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-curl was given.
if test "${enable_curl+set}" = set; then :
  enableval=$enable_curl;  case "${enableval}" in
      yes) USE_CURL=yes;;
      no) USE_CURL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-curl" "$LINENO" 5 ;;
    esac
else
   USE_CURL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_CURL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** curl pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** curl pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " CURL " > /dev/null; then
  USE_CURL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** curl not ported" >&5
$as_echo "$as_me: WARNING: *** curl not ported" >&2;}
fi


if test x$USE_CURL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_CURL=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CURL" >&5
$as_echo_n "checking for CURL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$CURL_CFLAGS"; then
        pkg_cv_CURL_CFLAGS="$CURL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl >= 7.35.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libcurl >= 7.35.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURL_CFLAGS=`$PKG_CONFIG --cflags "libcurl >= 7.35.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$CURL_LIBS"; then
        pkg_cv_CURL_LIBS="$CURL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libcurl >= 7.35.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libcurl >= 7.35.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_CURL_LIBS=`$PKG_CONFIG --libs "libcurl >= 7.35.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        CURL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libcurl >= 7.35.0"`
        else
	        CURL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libcurl >= 7.35.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$CURL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_CURL="no"

elif test $pkg_failed = untried; then

    HAVE_CURL="no"

else
	CURL_CFLAGS=$pkg_cv_CURL_CFLAGS
	CURL_LIBS=$pkg_cv_CURL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_CURL="yes"
    for ac_header in unistd.h sys/socket.h sys/types.h netinet/in.h netinet/tcp.h fcntl.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

else

      for ac_header in unistd.h sys/types.h winsock2.h ws2tcpip.h fcntl.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

else
  HAVE_CURL="no"
fi

done


fi

done

    for ac_header in netinet/ip.h
do :
  ac_fn_c_check_header_compile "$LINENO" "netinet/ip.h" "ac_cv_header_netinet_ip_h" "#ifdef HAVE_SYS_TYPES_H
     # include <sys/types.h>
     #endif
     #ifdef HAVE_NETINET_IN_H
     # include <netinet/in.h>
     #endif

"
if test "x$ac_cv_header_netinet_ip_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_NETINET_IP_H 1
_ACEOF

else
  HAVE_CURL="no"
fi

done

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for socket support needed by curlsink" >&5
$as_echo_n "checking for socket support needed by curlsink... " >&6; }
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_CURL" >&5
$as_echo "$HAVE_CURL" >&6; }

fi



pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSH2" >&5
$as_echo_n "checking for SSH2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SSH2_CFLAGS"; then
        pkg_cv_SSH2_CFLAGS="$SSH2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libssh2 >= 1.4.3\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libssh2 >= 1.4.3") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SSH2_CFLAGS=`$PKG_CONFIG --cflags "libssh2 >= 1.4.3" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SSH2_LIBS"; then
        pkg_cv_SSH2_LIBS="$SSH2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libssh2 >= 1.4.3\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libssh2 >= 1.4.3") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SSH2_LIBS=`$PKG_CONFIG --libs "libssh2 >= 1.4.3" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SSH2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libssh2 >= 1.4.3"`
        else
	        SSH2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libssh2 >= 1.4.3"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SSH2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_SSH2="no"

elif test $pkg_failed = untried; then

    HAVE_SSH2="no"

else
	SSH2_CFLAGS=$pkg_cv_SSH2_CFLAGS
	SSH2_LIBS=$pkg_cv_SSH2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_SSH2="yes"

$as_echo "#define HAVE_SSH2 1" >>confdefs.h


fi
   if test "x$HAVE_SSH2" = "xyes"; then
  USE_SSH2_TRUE=
  USE_SSH2_FALSE='#'
else
  USE_SSH2_TRUE='#'
  USE_SSH2_FALSE=
fi





  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_CURL = xno; then
    USE_CURL=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: curl" >&5
$as_echo "$as_me: *** These plugins will be built: curl" >&6;}
  fi
fi
if test x$USE_CURL = xyes; then
  :
  if test "xcurl" != "x"; then
    GST_PLUGINS_YES="\tcurl\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_CURL /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: curl" >&5
$as_echo "$as_me: *** These plugins will not be built: curl" >&6;}
  if test "xcurl" != "x"; then
    GST_PLUGINS_NO="\tcurl\n$GST_PLUGINS_NO"
  fi
   if false; then
  USE_SSH2_TRUE=
  USE_SSH2_FALSE='#'
else
  USE_SSH2_TRUE='#'
  USE_SSH2_FALSE=
fi

fi
 if test x$USE_CURL = xyes; then
  USE_CURL_TRUE=
  USE_CURL_FALSE='#'
else
  USE_CURL_TRUE='#'
  USE_CURL_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DASH plug-in ***" >&5
$as_echo "$as_me: *** checking feature: DASH plug-in ***" >&6;}
if test "xdash" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dash ***" >&5
$as_echo "$as_me: *** for plug-ins: dash ***" >&6;}
fi
NOUSE=
if test "x$USE_DASH" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-dash was given.
if test "${enable_dash+set}" = set; then :
  enableval=$enable_dash;  case "${enableval}" in
      yes) USE_DASH=yes;;
      no) USE_DASH=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-dash" "$LINENO" 5 ;;
    esac
else
   USE_DASH=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DASH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dash pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dash pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DASH " > /dev/null; then
  USE_DASH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dash not ported" >&5
$as_echo "$as_me: WARNING: *** dash not ported" >&2;}
fi


if test x$USE_DASH = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DASH=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXML2" >&5
$as_echo_n "checking for LIBXML2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBXML2_CFLAGS"; then
        pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBXML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBXML2_LIBS"; then
        pkg_cv_LIBXML2_LIBS="$LIBXML2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.8\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.8") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBXML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.8" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBXML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libxml-2.0 >= 2.8"`
        else
	        LIBXML2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libxml-2.0 >= 2.8"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBXML2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LIBXML2="no"
    HAVE_DASH="no"
elif test $pkg_failed = untried; then
	HAVE_LIBXML2="no"
    HAVE_DASH="no"
else
	LIBXML2_CFLAGS=$pkg_cv_LIBXML2_CFLAGS
	LIBXML2_LIBS=$pkg_cv_LIBXML2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LIBXML2="yes"
    HAVE_DASH="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DASH = xno; then
    USE_DASH=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dash" >&5
$as_echo "$as_me: *** These plugins will be built: dash" >&6;}
  fi
fi
if test x$USE_DASH = xyes; then
  :
  if test "xdash" != "x"; then
    GST_PLUGINS_YES="\tdash\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DASH /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dash" >&5
$as_echo "$as_me: *** These plugins will not be built: dash" >&6;}
  if test "xdash" != "x"; then
    GST_PLUGINS_NO="\tdash\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DASH = xyes; then
  USE_DASH_TRUE=
  USE_DASH_FALSE='#'
else
  USE_DASH_TRUE='#'
  USE_DASH_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libdc1394 ***" >&5
$as_echo "$as_me: *** checking feature: libdc1394 ***" >&6;}
if test "xdc1394" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dc1394 ***" >&5
$as_echo "$as_me: *** for plug-ins: dc1394 ***" >&6;}
fi
NOUSE=
if test "x$USE_DC1394" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-dc1394 was given.
if test "${enable_dc1394+set}" = set; then :
  enableval=$enable_dc1394;  case "${enableval}" in
      yes) USE_DC1394=yes;;
      no) USE_DC1394=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-dc1394" "$LINENO" 5 ;;
    esac
else
   USE_DC1394=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DC1394="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dc1394 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dc1394 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DC1394 " > /dev/null; then
  USE_DC1394="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dc1394 not ported" >&5
$as_echo "$as_me: WARNING: *** dc1394 not ported" >&2;}
fi


if test x$USE_DC1394 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DC1394=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDC1394" >&5
$as_echo_n "checking for LIBDC1394... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBDC1394_CFLAGS"; then
        pkg_cv_LIBDC1394_CFLAGS="$LIBDC1394_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libdc1394-2 >= 2.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libdc1394-2 >= 2.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBDC1394_CFLAGS=`$PKG_CONFIG --cflags "libdc1394-2 >= 2.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBDC1394_LIBS"; then
        pkg_cv_LIBDC1394_LIBS="$LIBDC1394_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libdc1394-2 >= 2.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libdc1394-2 >= 2.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBDC1394_LIBS=`$PKG_CONFIG --libs "libdc1394-2 >= 2.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBDC1394_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libdc1394-2 >= 2.0.0"`
        else
	        LIBDC1394_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libdc1394-2 >= 2.0.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBDC1394_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

        HAVE_DC1394="no"
	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

elif test $pkg_failed = untried; then

        HAVE_DC1394="no"
	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

else
	LIBDC1394_CFLAGS=$pkg_cv_LIBDC1394_CFLAGS
	LIBDC1394_LIBS=$pkg_cv_LIBDC1394_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

   	if test -z "`$PKG_CONFIG --modversion libdc1394-2 | grep 2.0.0-rc`"; then
		HAVE_DC1394="yes"
	else
		HAVE_DC1394="no"
	fi

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DC1394 = xno; then
    USE_DC1394=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dc1394" >&5
$as_echo "$as_me: *** These plugins will be built: dc1394" >&6;}
  fi
fi
if test x$USE_DC1394 = xyes; then
  :
  if test "xdc1394" != "x"; then
    GST_PLUGINS_YES="\tdc1394\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DC1394 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dc1394" >&5
$as_echo "$as_me: *** These plugins will not be built: dc1394" >&6;}
  if test "xdc1394" != "x"; then
    GST_PLUGINS_NO="\tdc1394\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DC1394 = xyes; then
  USE_DC1394_TRUE=
  USE_DC1394_FALSE='#'
else
  USE_DC1394_TRUE='#'
  USE_DC1394_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: decklink ***" >&5
$as_echo "$as_me: *** checking feature: decklink ***" >&6;}
if test "xdecklink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: decklink ***" >&5
$as_echo "$as_me: *** for plug-ins: decklink ***" >&6;}
fi
NOUSE=
if test "x$USE_DECKLINK" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-decklink was given.
if test "${enable_decklink+set}" = set; then :
  enableval=$enable_decklink;  case "${enableval}" in
      yes) USE_DECKLINK=yes;;
      no) USE_DECKLINK=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-decklink" "$LINENO" 5 ;;
    esac
else
   USE_DECKLINK=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DECKLINK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** decklink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** decklink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DECKLINK " > /dev/null; then
  USE_DECKLINK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** decklink not ported" >&5
$as_echo "$as_me: WARNING: *** decklink not ported" >&2;}
fi


if test x$USE_DECKLINK = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DECKLINK=no

   HAVE_DECKLINK=no
   case "$host" in
     *android*)
       HAVE_DECKLINK=no
       ;;
     *-*linux*)
       if test "x$HAVE_PTHREAD_H" = "xyes"; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :

            HAVE_DECKLINK=yes
            DECKLINK_CXXFLAGS=
            DECKLINK_LIBS="-lpthread -ldl"

fi

       fi
       ;;
     *-*darwin*)
       if test "x$HAVE_PTHREAD_H" = "xyes"; then
         { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
$as_echo_n "checking for dlopen in -ldl... " >&6; }
if ${ac_cv_lib_dl_dlopen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldl  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dlopen ();
int
main ()
{
return dlopen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dl_dlopen=yes
else
  ac_cv_lib_dl_dlopen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
if test "x$ac_cv_lib_dl_dlopen" = xyes; then :

            HAVE_DECKLINK=yes
            DECKLINK_CXXFLAGS=
            DECKLINK_LIBS="-lpthread -ldl"
            HAVE_DECKLINK_OSX=yes

fi

       fi
       ;;
     *)
       HAVE_DECKLINK=no
       ;;
   esac





  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DECKLINK = xno; then
    USE_DECKLINK=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: decklink" >&5
$as_echo "$as_me: *** These plugins will be built: decklink" >&6;}
  fi
fi
if test x$USE_DECKLINK = xyes; then
  :
  if test "xdecklink" != "x"; then
    GST_PLUGINS_YES="\tdecklink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DECKLINK /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: decklink" >&5
$as_echo "$as_me: *** These plugins will not be built: decklink" >&6;}
  if test "xdecklink" != "x"; then
    GST_PLUGINS_NO="\tdecklink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DECKLINK = xyes; then
  USE_DECKLINK_TRUE=
  USE_DECKLINK_FALSE='#'
else
  USE_DECKLINK_TRUE='#'
  USE_DECKLINK_FALSE=
fi


 if test "x$HAVE_DECKLINK_OSX" = xyes; then
  DECKLINK_OSX_TRUE=
  DECKLINK_OSX_FALSE='#'
else
  DECKLINK_OSX_TRUE='#'
  DECKLINK_OSX_FALSE=
fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: directfb ***" >&5
$as_echo "$as_me: *** checking feature: directfb ***" >&6;}
if test "xdfbvideosink " != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dfbvideosink  ***" >&5
$as_echo "$as_me: *** for plug-ins: dfbvideosink  ***" >&6;}
fi
NOUSE=
if test "x$USE_DIRECTFB" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-directfb was given.
if test "${enable_directfb+set}" = set; then :
  enableval=$enable_directfb;  case "${enableval}" in
      yes) USE_DIRECTFB=yes;;
      no) USE_DIRECTFB=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-directfb" "$LINENO" 5 ;;
    esac
else
   USE_DIRECTFB=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DIRECTFB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dfbvideosink  pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dfbvideosink  pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DIRECTFB " > /dev/null; then
  USE_DIRECTFB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dfbvideosink  not ported" >&5
$as_echo "$as_me: WARNING: *** dfbvideosink  not ported" >&2;}
fi


if test x$USE_DIRECTFB = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DIRECTFB=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DIRECTFB" >&5
$as_echo_n "checking for DIRECTFB... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$DIRECTFB_CFLAGS"; then
        pkg_cv_DIRECTFB_CFLAGS="$DIRECTFB_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"directfb >= 0.9.24\""; } >&5
  ($PKG_CONFIG --exists --print-errors "directfb >= 0.9.24") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DIRECTFB_CFLAGS=`$PKG_CONFIG --cflags "directfb >= 0.9.24" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$DIRECTFB_LIBS"; then
        pkg_cv_DIRECTFB_LIBS="$DIRECTFB_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"directfb >= 0.9.24\""; } >&5
  ($PKG_CONFIG --exists --print-errors "directfb >= 0.9.24") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DIRECTFB_LIBS=`$PKG_CONFIG --libs "directfb >= 0.9.24" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        DIRECTFB_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "directfb >= 0.9.24"`
        else
	        DIRECTFB_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "directfb >= 0.9.24"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$DIRECTFB_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_DIRECTFB="no"

elif test $pkg_failed = untried; then

    HAVE_DIRECTFB="no"

else
	DIRECTFB_CFLAGS=$pkg_cv_DIRECTFB_CFLAGS
	DIRECTFB_LIBS=$pkg_cv_DIRECTFB_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_DIRECTFB="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DIRECTFB = xno; then
    USE_DIRECTFB=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dfbvideosink " >&5
$as_echo "$as_me: *** These plugins will be built: dfbvideosink " >&6;}
  fi
fi
if test x$USE_DIRECTFB = xyes; then
  :
  if test "xdfbvideosink " != "x"; then
    GST_PLUGINS_YES="\tdfbvideosink \n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DIRECTFB /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dfbvideosink " >&5
$as_echo "$as_me: *** These plugins will not be built: dfbvideosink " >&6;}
  if test "xdfbvideosink " != "x"; then
    GST_PLUGINS_NO="\tdfbvideosink \n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DIRECTFB = xyes; then
  USE_DIRECTFB_TRUE=
  USE_DIRECTFB_FALSE='#'
else
  USE_DIRECTFB_TRUE='#'
  USE_DIRECTFB_FALSE=
fi



# Extract the first word of "wayland-scanner", so it can be a program name with args.
set dummy wayland-scanner; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_wayland_scanner+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $wayland_scanner in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_wayland_scanner="$wayland_scanner" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_wayland_scanner="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
wayland_scanner=$ac_cv_path_wayland_scanner
if test -n "$wayland_scanner"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $wayland_scanner" >&5
$as_echo "$wayland_scanner" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: wayland sink ***" >&5
$as_echo "$as_me: *** checking feature: wayland sink ***" >&6;}
if test "xwayland " != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wayland  ***" >&5
$as_echo "$as_me: *** for plug-ins: wayland  ***" >&6;}
fi
NOUSE=
if test "x$USE_WAYLAND" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-wayland was given.
if test "${enable_wayland+set}" = set; then :
  enableval=$enable_wayland;  case "${enableval}" in
      yes) USE_WAYLAND=yes;;
      no) USE_WAYLAND=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-wayland" "$LINENO" 5 ;;
    esac
else
   USE_WAYLAND=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WAYLAND="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wayland  pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** wayland  pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WAYLAND " > /dev/null; then
  USE_WAYLAND="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wayland  not ported" >&5
$as_echo "$as_me: WARNING: *** wayland  not ported" >&2;}
fi


if test x$USE_WAYLAND = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WAYLAND=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WAYLAND" >&5
$as_echo_n "checking for WAYLAND... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$WAYLAND_CFLAGS"; then
        pkg_cv_WAYLAND_CFLAGS="$WAYLAND_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.4.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.4.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WAYLAND_CFLAGS=`$PKG_CONFIG --cflags "wayland-client >= 1.4.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$WAYLAND_LIBS"; then
        pkg_cv_WAYLAND_LIBS="$WAYLAND_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"wayland-client >= 1.4.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "wayland-client >= 1.4.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WAYLAND_LIBS=`$PKG_CONFIG --libs "wayland-client >= 1.4.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        WAYLAND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "wayland-client >= 1.4.0"`
        else
	        WAYLAND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "wayland-client >= 1.4.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$WAYLAND_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                 HAVE_WAYLAND="no"

elif test $pkg_failed = untried; then
	 HAVE_WAYLAND="no"

else
	WAYLAND_CFLAGS=$pkg_cv_WAYLAND_CFLAGS
	WAYLAND_LIBS=$pkg_cv_WAYLAND_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    if test "x$wayland_scanner" != "x"; then
      HAVE_WAYLAND="yes"
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: wayland-scanner is required to build the wayland plugin" >&5
$as_echo "wayland-scanner is required to build the wayland plugin" >&6; }
      HAVE_WAYLAND="no"
    fi

fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WAYLAND = xno; then
    USE_WAYLAND=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wayland " >&5
$as_echo "$as_me: *** These plugins will be built: wayland " >&6;}
  fi
fi
if test x$USE_WAYLAND = xyes; then
  :
  if test "xwayland " != "x"; then
    GST_PLUGINS_YES="\twayland \n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WAYLAND /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wayland " >&5
$as_echo "$as_me: *** These plugins will not be built: wayland " >&6;}
  if test "xwayland " != "x"; then
    GST_PLUGINS_NO="\twayland \n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WAYLAND = xyes; then
  USE_WAYLAND_TRUE=
  USE_WAYLAND_FALSE='#'
else
  USE_WAYLAND_TRUE='#'
  USE_WAYLAND_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: WebP ***" >&5
$as_echo "$as_me: *** checking feature: WebP ***" >&6;}
if test "xwebp " != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: webp  ***" >&5
$as_echo "$as_me: *** for plug-ins: webp  ***" >&6;}
fi
NOUSE=
if test "x$USE_WEBP" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-webp was given.
if test "${enable_webp+set}" = set; then :
  enableval=$enable_webp;  case "${enableval}" in
      yes) USE_WEBP=yes;;
      no) USE_WEBP=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-webp" "$LINENO" 5 ;;
    esac
else
   USE_WEBP=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WEBP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** webp  pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** webp  pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WEBP " > /dev/null; then
  USE_WEBP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** webp  not ported" >&5
$as_echo "$as_me: WARNING: *** webp  not ported" >&2;}
fi


if test x$USE_WEBP = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WEBP=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for WEBP" >&5
$as_echo_n "checking for WEBP... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$WEBP_CFLAGS"; then
        pkg_cv_WEBP_CFLAGS="$WEBP_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebp >= 0.2.1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libwebp >= 0.2.1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WEBP_CFLAGS=`$PKG_CONFIG --cflags "libwebp >= 0.2.1" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$WEBP_LIBS"; then
        pkg_cv_WEBP_LIBS="$WEBP_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libwebp >= 0.2.1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libwebp >= 0.2.1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_WEBP_LIBS=`$PKG_CONFIG --libs "libwebp >= 0.2.1" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        WEBP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libwebp >= 0.2.1"`
        else
	        WEBP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libwebp >= 0.2.1"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$WEBP_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                 HAVE_WEBP="no"

elif test $pkg_failed = untried; then
	 HAVE_WEBP="no"

else
	WEBP_CFLAGS=$pkg_cv_WEBP_CFLAGS
	WEBP_LIBS=$pkg_cv_WEBP_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_WEBP="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WEBP = xno; then
    USE_WEBP=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: webp " >&5
$as_echo "$as_me: *** These plugins will be built: webp " >&6;}
  fi
fi
if test x$USE_WEBP = xyes; then
  :
  if test "xwebp " != "x"; then
    GST_PLUGINS_YES="\twebp \n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WEBP /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: webp " >&5
$as_echo "$as_me: *** These plugins will not be built: webp " >&6;}
  if test "xwebp " != "x"; then
    GST_PLUGINS_NO="\twebp \n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WEBP = xyes; then
  USE_WEBP_TRUE=
  USE_WEBP_FALSE='#'
else
  USE_WEBP_TRUE='#'
  USE_WEBP_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: daala ***" >&5
$as_echo "$as_me: *** checking feature: daala ***" >&6;}
if test "xdaala" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: daala ***" >&5
$as_echo "$as_me: *** for plug-ins: daala ***" >&6;}
fi
NOUSE=
if test "x$USE_DAALA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-daala was given.
if test "${enable_daala+set}" = set; then :
  enableval=$enable_daala;  case "${enableval}" in
      yes) USE_DAALA=yes;;
      no) USE_DAALA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-daala" "$LINENO" 5 ;;
    esac
else
   USE_DAALA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DAALA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** daala pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** daala pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DAALA " > /dev/null; then
  USE_DAALA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** daala not ported" >&5
$as_echo "$as_me: WARNING: *** daala not ported" >&2;}
fi


if test x$USE_DAALA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DAALA=no

  if test "x$BUILD_EXPERIMENTAL" = "xyes"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DAALA" >&5
$as_echo_n "checking for DAALA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$DAALA_CFLAGS"; then
        pkg_cv_DAALA_CFLAGS="$DAALA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"daalaenc daaladec\""; } >&5
  ($PKG_CONFIG --exists --print-errors "daalaenc daaladec") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DAALA_CFLAGS=`$PKG_CONFIG --cflags "daalaenc daaladec" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$DAALA_LIBS"; then
        pkg_cv_DAALA_LIBS="$DAALA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"daalaenc daaladec\""; } >&5
  ($PKG_CONFIG --exists --print-errors "daalaenc daaladec") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DAALA_LIBS=`$PKG_CONFIG --libs "daalaenc daaladec" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        DAALA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "daalaenc daaladec"`
        else
	        DAALA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "daalaenc daaladec"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$DAALA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

            HAVE_DAALA="no"

elif test $pkg_failed = untried; then

            HAVE_DAALA="no"

else
	DAALA_CFLAGS=$pkg_cv_DAALA_CFLAGS
	DAALA_LIBS=$pkg_cv_DAALA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

            HAVE_DAALA="yes"

fi


  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DAALA = xno; then
    USE_DAALA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: daala" >&5
$as_echo "$as_me: *** These plugins will be built: daala" >&6;}
  fi
fi
if test x$USE_DAALA = xyes; then
  :
  if test "xdaala" != "x"; then
    GST_PLUGINS_YES="\tdaala\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DAALA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: daala" >&5
$as_echo "$as_me: *** These plugins will not be built: daala" >&6;}
  if test "xdaala" != "x"; then
    GST_PLUGINS_NO="\tdaala\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DAALA = xyes; then
  USE_DAALA_TRUE=
  USE_DAALA_FALSE='#'
else
  USE_DAALA_TRUE='#'
  USE_DAALA_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: dts library ***" >&5
$as_echo "$as_me: *** checking feature: dts library ***" >&6;}
if test "xdtsdec" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dtsdec ***" >&5
$as_echo "$as_me: *** for plug-ins: dtsdec ***" >&6;}
fi
NOUSE=
if test "x$USE_DTS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-dts was given.
if test "${enable_dts+set}" = set; then :
  enableval=$enable_dts;  case "${enableval}" in
      yes) USE_DTS=yes;;
      no) USE_DTS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-dts" "$LINENO" 5 ;;
    esac
else
   USE_DTS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DTS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dtsdec pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dtsdec pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DTS " > /dev/null; then
  USE_DTS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dtsdec not ported" >&5
$as_echo "$as_me: WARNING: *** dtsdec not ported" >&2;}
fi


if test x$USE_DTS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DTS=no

  HAVE_DTS="yes"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dca_init in -ldca" >&5
$as_echo_n "checking for dca_init in -ldca... " >&6; }
if ${ac_cv_lib_dca_dca_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldca $LIBM $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dca_init ();
int
main ()
{
return dca_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dca_dca_init=yes
else
  ac_cv_lib_dca_dca_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dca_dca_init" >&5
$as_echo "$ac_cv_lib_dca_dca_init" >&6; }
if test "x$ac_cv_lib_dca_dca_init" = xyes; then :
  HAVE_DTS=yes
else
  HAVE_DTS=no
fi

  if test "x$HAVE_DTS" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "dca.h" "ac_cv_header_dca_h" "$ac_includes_default"
if test "x$ac_cv_header_dca_h" = xyes; then :
  :
else
  HAVE_DTS=no
fi


    if test "x$HAVE_DTS" = "xyes"; then
            DTS_LIBS="-ldca $LIBM"
    else
      HAVE_DTS="no"
    fi
  else
    HAVE_DTS="no"
  fi



  if test $HAVE_DTS = "no"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dts_init in -ldts_pic" >&5
$as_echo_n "checking for dts_init in -ldts_pic... " >&6; }
if ${ac_cv_lib_dts_pic_dts_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldts_pic $LIBM $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char dts_init ();
int
main ()
{
return dts_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dts_pic_dts_init=yes
else
  ac_cv_lib_dts_pic_dts_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dts_pic_dts_init" >&5
$as_echo "$ac_cv_lib_dts_pic_dts_init" >&6; }
if test "x$ac_cv_lib_dts_pic_dts_init" = xyes; then :
  HAVE_DTS=yes
else
  HAVE_DTS=no
fi

  if test "x$HAVE_DTS" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "dts.h" "ac_cv_header_dts_h" "$ac_includes_default"
if test "x$ac_cv_header_dts_h" = xyes; then :
  :
else
  HAVE_DTS=no
fi


    if test "x$HAVE_DTS" = "xyes"; then
             DTS_LIBS="-ldts_pic $LIBM"

$as_echo "#define DTS_OLD 1" >>confdefs.h


    else
      :
    fi
  else
    :
  fi



  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DTS = xno; then
    USE_DTS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dtsdec" >&5
$as_echo "$as_me: *** These plugins will be built: dtsdec" >&6;}
  fi
fi
if test x$USE_DTS = xyes; then
  :
  if test "xdtsdec" != "x"; then
    GST_PLUGINS_YES="\tdtsdec\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DTS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dtsdec" >&5
$as_echo "$as_me: *** These plugins will not be built: dtsdec" >&6;}
  if test "xdtsdec" != "x"; then
    GST_PLUGINS_NO="\tdtsdec\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DTS = xyes; then
  USE_DTS_TRUE=
  USE_DTS_FALSE='#'
else
  USE_DTS_TRUE='#'
  USE_DTS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: resindvd plugin ***" >&5
$as_echo "$as_me: *** checking feature: resindvd plugin ***" >&6;}
if test "xresindvd" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: resindvd ***" >&5
$as_echo "$as_me: *** for plug-ins: resindvd ***" >&6;}
fi
NOUSE=
if test "x$USE_RESINDVD" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-resindvd was given.
if test "${enable_resindvd+set}" = set; then :
  enableval=$enable_resindvd;  case "${enableval}" in
      yes) USE_RESINDVD=yes;;
      no) USE_RESINDVD=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-resindvd" "$LINENO" 5 ;;
    esac
else
   USE_RESINDVD=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_RESINDVD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** resindvd pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** resindvd pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " RESINDVD " > /dev/null; then
  USE_RESINDVD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** resindvd not ported" >&5
$as_echo "$as_me: WARNING: *** resindvd not ported" >&2;}
fi


if test x$USE_RESINDVD = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_RESINDVD=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DVDNAV" >&5
$as_echo_n "checking for DVDNAV... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$DVDNAV_CFLAGS"; then
        pkg_cv_DVDNAV_CFLAGS="$DVDNAV_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdnav >= 4.1.2 dvdread >= 4.1.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "dvdnav >= 4.1.2 dvdread >= 4.1.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DVDNAV_CFLAGS=`$PKG_CONFIG --cflags "dvdnav >= 4.1.2 dvdread >= 4.1.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$DVDNAV_LIBS"; then
        pkg_cv_DVDNAV_LIBS="$DVDNAV_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"dvdnav >= 4.1.2 dvdread >= 4.1.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "dvdnav >= 4.1.2 dvdread >= 4.1.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DVDNAV_LIBS=`$PKG_CONFIG --libs "dvdnav >= 4.1.2 dvdread >= 4.1.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        DVDNAV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "dvdnav >= 4.1.2 dvdread >= 4.1.2"`
        else
	        DVDNAV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "dvdnav >= 4.1.2 dvdread >= 4.1.2"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$DVDNAV_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_RESINDVD="no"

elif test $pkg_failed = untried; then

    HAVE_RESINDVD="no"

else
	DVDNAV_CFLAGS=$pkg_cv_DVDNAV_CFLAGS
	DVDNAV_LIBS=$pkg_cv_DVDNAV_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_RESINDVD="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_RESINDVD = xno; then
    USE_RESINDVD=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: resindvd" >&5
$as_echo "$as_me: *** These plugins will be built: resindvd" >&6;}
  fi
fi
if test x$USE_RESINDVD = xyes; then
  :
  if test "xresindvd" != "x"; then
    GST_PLUGINS_YES="\tresindvd\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_RESINDVD /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: resindvd" >&5
$as_echo "$as_me: *** These plugins will not be built: resindvd" >&6;}
  if test "xresindvd" != "x"; then
    GST_PLUGINS_NO="\tresindvd\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_RESINDVD = xyes; then
  USE_RESINDVD_TRUE=
  USE_RESINDVD_FALSE='#'
else
  USE_RESINDVD_TRUE='#'
  USE_RESINDVD_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: AAC encoder plug-in ***" >&5
$as_echo "$as_me: *** checking feature: AAC encoder plug-in ***" >&6;}
if test "xfaac" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: faac ***" >&5
$as_echo "$as_me: *** for plug-ins: faac ***" >&6;}
fi
NOUSE=
if test "x$USE_FAAC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-faac was given.
if test "${enable_faac+set}" = set; then :
  enableval=$enable_faac;  case "${enableval}" in
      yes) USE_FAAC=yes;;
      no) USE_FAAC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-faac" "$LINENO" 5 ;;
    esac
else
   USE_FAAC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_FAAC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** faac pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** faac pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FAAC " > /dev/null; then
  USE_FAAC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** faac not ported" >&5
$as_echo "$as_me: WARNING: *** faac not ported" >&2;}
fi


if test x$USE_FAAC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_FAAC=no


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for faacEncOpen in -lfaac" >&5
$as_echo_n "checking for faacEncOpen in -lfaac... " >&6; }
if ${ac_cv_lib_faac_faacEncOpen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lfaac $LIBM $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char faacEncOpen ();
int
main ()
{
return faacEncOpen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_faac_faacEncOpen=yes
else
  ac_cv_lib_faac_faacEncOpen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_faac_faacEncOpen" >&5
$as_echo "$ac_cv_lib_faac_faacEncOpen" >&6; }
if test "x$ac_cv_lib_faac_faacEncOpen" = xyes; then :
  HAVE_FAAC=yes
else
  HAVE_FAAC=no
fi

  if test "x$HAVE_FAAC" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "faac.h" "ac_cv_header_faac_h" "$ac_includes_default"
if test "x$ac_cv_header_faac_h" = xyes; then :
  :
else
  HAVE_FAAC=no
fi


    if test "x$HAVE_FAAC" = "xyes"; then
            FAAC_LIBS="-lfaac $LIBM"
    else
      :
    fi
  else
    :
  fi






  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_FAAC = xno; then
    USE_FAAC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: faac" >&5
$as_echo "$as_me: *** These plugins will be built: faac" >&6;}
  fi
fi
if test x$USE_FAAC = xyes; then
  :
  if test "xfaac" != "x"; then
    GST_PLUGINS_YES="\tfaac\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_FAAC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: faac" >&5
$as_echo "$as_me: *** These plugins will not be built: faac" >&6;}
  if test "xfaac" != "x"; then
    GST_PLUGINS_NO="\tfaac\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_FAAC = xyes; then
  USE_FAAC_TRUE=
  USE_FAAC_FALSE='#'
else
  USE_FAAC_TRUE='#'
  USE_FAAC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: FAAD2 AAC decoder plug-in ***" >&5
$as_echo "$as_me: *** checking feature: FAAD2 AAC decoder plug-in ***" >&6;}
if test "xfaad" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: faad ***" >&5
$as_echo "$as_me: *** for plug-ins: faad ***" >&6;}
fi
NOUSE=
if test "x$USE_FAAD" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-faad was given.
if test "${enable_faad+set}" = set; then :
  enableval=$enable_faad;  case "${enableval}" in
      yes) USE_FAAD=yes;;
      no) USE_FAAD=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-faad" "$LINENO" 5 ;;
    esac
else
   USE_FAAD=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_FAAD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** faad pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** faad pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FAAD " > /dev/null; then
  USE_FAAD="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** faad not ported" >&5
$as_echo "$as_me: WARNING: *** faad not ported" >&2;}
fi


if test x$USE_FAAD = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_FAAD=no


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NeAACDecOpen in -lfaad" >&5
$as_echo_n "checking for NeAACDecOpen in -lfaad... " >&6; }
if ${ac_cv_lib_faad_NeAACDecOpen+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lfaad $LIBM $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char NeAACDecOpen ();
int
main ()
{
return NeAACDecOpen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_faad_NeAACDecOpen=yes
else
  ac_cv_lib_faad_NeAACDecOpen=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_faad_NeAACDecOpen" >&5
$as_echo "$ac_cv_lib_faad_NeAACDecOpen" >&6; }
if test "x$ac_cv_lib_faad_NeAACDecOpen" = xyes; then :
  HAVE_FAAD=yes
else
  HAVE_FAAD=no
fi

  if test "x$HAVE_FAAD" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "neaacdec.h" "ac_cv_header_neaacdec_h" "$ac_includes_default"
if test "x$ac_cv_header_neaacdec_h" = xyes; then :
  :
else
  HAVE_FAAD=no
fi


    if test "x$HAVE_FAAD" = "xyes"; then

    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <faad.h>
int
main ()
{

      #if !defined(FAAD2_VERSION) || !defined(FAAD_FMT_DOUBLE)
      #error Not faad2
      #elif !defined(LATM)
      #error Not faad2 >= 2.7
      #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

      HAVE_FAAD="yes"
      FAAD_LIBS="-lfaad"

else

      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Found libfaad, but version not recent enough. Need faad2 >= 2.7" >&5
$as_echo "$as_me: WARNING: Found libfaad, but version not recent enough. Need faad2 >= 2.7" >&2;}
      HAVE_FAAD="no"

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

    else

      HAVE_FAAD="no"

    fi
  else

      HAVE_FAAD="no"

  fi






  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_FAAD = xno; then
    USE_FAAD=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: faad" >&5
$as_echo "$as_me: *** These plugins will be built: faad" >&6;}
  fi
fi
if test x$USE_FAAD = xyes; then
  :
  if test "xfaad" != "x"; then
    GST_PLUGINS_YES="\tfaad\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_FAAD /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: faad" >&5
$as_echo "$as_me: *** These plugins will not be built: faad" >&6;}
  if test "xfaad" != "x"; then
    GST_PLUGINS_NO="\tfaad\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_FAAD = xyes; then
  USE_FAAD_TRUE=
  USE_FAAD_FALSE='#'
else
  USE_FAAD_TRUE='#'
  USE_FAAD_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: linux framebuffer ***" >&5
$as_echo "$as_me: *** checking feature: linux framebuffer ***" >&6;}
if test "xfbdevsink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: fbdevsink ***" >&5
$as_echo "$as_me: *** for plug-ins: fbdevsink ***" >&6;}
fi
NOUSE=
if test "x$USE_FBDEV" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-fbdev was given.
if test "${enable_fbdev+set}" = set; then :
  enableval=$enable_fbdev;  case "${enableval}" in
      yes) USE_FBDEV=yes;;
      no) USE_FBDEV=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-fbdev" "$LINENO" 5 ;;
    esac
else
   USE_FBDEV=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_FBDEV="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fbdevsink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** fbdevsink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FBDEV " > /dev/null; then
  USE_FBDEV="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fbdevsink not ported" >&5
$as_echo "$as_me: WARNING: *** fbdevsink not ported" >&2;}
fi


if test x$USE_FBDEV = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_FBDEV=no

  if test "x$HAVE_FBDEV" != "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "linux/fb.h" "ac_cv_header_linux_fb_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_fb_h" = xyes; then :
  HAVE_FBDEV=yes
else
  HAVE_FBDEV=no
fi


  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_FBDEV = xno; then
    USE_FBDEV=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: fbdevsink" >&5
$as_echo "$as_me: *** These plugins will be built: fbdevsink" >&6;}
  fi
fi
if test x$USE_FBDEV = xyes; then
  :
  if test "xfbdevsink" != "x"; then
    GST_PLUGINS_YES="\tfbdevsink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_FBDEV /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: fbdevsink" >&5
$as_echo "$as_me: *** These plugins will not be built: fbdevsink" >&6;}
  if test "xfbdevsink" != "x"; then
    GST_PLUGINS_NO="\tfbdevsink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_FBDEV = xyes; then
  USE_FBDEV_TRUE=
  USE_FBDEV_FALSE='#'
else
  USE_FBDEV_TRUE='#'
  USE_FBDEV_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Flite plugin ***" >&5
$as_echo "$as_me: *** checking feature: Flite plugin ***" >&6;}
if test "xflite" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: flite ***" >&5
$as_echo "$as_me: *** for plug-ins: flite ***" >&6;}
fi
NOUSE=
if test "x$USE_FLITE" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-flite was given.
if test "${enable_flite+set}" = set; then :
  enableval=$enable_flite;  case "${enableval}" in
      yes) USE_FLITE=yes;;
      no) USE_FLITE=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-flite" "$LINENO" 5 ;;
    esac
else
   USE_FLITE=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_FLITE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** flite pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** flite pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FLITE " > /dev/null; then
  USE_FLITE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** flite not ported" >&5
$as_echo "$as_me: WARNING: *** flite not ported" >&2;}
fi


if test x$USE_FLITE = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_FLITE=no


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flite_init in -lflite" >&5
$as_echo_n "checking for flite_init in -lflite... " >&6; }
if ${ac_cv_lib_flite_flite_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lflite $LIBM $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char flite_init ();
int
main ()
{
return flite_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_flite_flite_init=yes
else
  ac_cv_lib_flite_flite_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_flite_flite_init" >&5
$as_echo "$ac_cv_lib_flite_flite_init" >&6; }
if test "x$ac_cv_lib_flite_flite_init" = xyes; then :
  HAVE_FLITE=yes
else
  HAVE_FLITE=no
fi

  if test "x$HAVE_FLITE" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "flite/flite.h" "ac_cv_header_flite_flite_h" "$ac_includes_default"
if test "x$ac_cv_header_flite_flite_h" = xyes; then :
  :
else
  HAVE_FLITE=no
fi


    if test "x$HAVE_FLITE" = "xyes"; then
            FLITE_LIBS="-lflite -lflite_cmu_us_kal -lflite_usenglish -lflite_cmulex $LIBM"
    else
      :
    fi
  else
    :
  fi








  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_FLITE = xno; then
    USE_FLITE=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: flite" >&5
$as_echo "$as_me: *** These plugins will be built: flite" >&6;}
  fi
fi
if test x$USE_FLITE = xyes; then
  :
  if test "xflite" != "x"; then
    GST_PLUGINS_YES="\tflite\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_FLITE /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: flite" >&5
$as_echo "$as_me: *** These plugins will not be built: flite" >&6;}
  if test "xflite" != "x"; then
    GST_PLUGINS_NO="\tflite\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_FLITE = xyes; then
  USE_FLITE_TRUE=
  USE_FLITE_FALSE='#'
else
  USE_FLITE_TRUE='#'
  USE_FLITE_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: GSM library ***" >&5
$as_echo "$as_me: *** checking feature: GSM library ***" >&6;}
if test "xgsmenc gsmdec" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gsmenc gsmdec ***" >&5
$as_echo "$as_me: *** for plug-ins: gsmenc gsmdec ***" >&6;}
fi
NOUSE=
if test "x$USE_GSM" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-gsm was given.
if test "${enable_gsm+set}" = set; then :
  enableval=$enable_gsm;  case "${enableval}" in
      yes) USE_GSM=yes;;
      no) USE_GSM=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-gsm" "$LINENO" 5 ;;
    esac
else
   USE_GSM=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_GSM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gsmenc gsmdec pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** gsmenc gsmdec pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " GSM " > /dev/null; then
  USE_GSM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gsmenc gsmdec not ported" >&5
$as_echo "$as_me: WARNING: *** gsmenc gsmdec not ported" >&2;}
fi


if test x$USE_GSM = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_GSM=no


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsm_create in -lgsm" >&5
$as_echo_n "checking for gsm_create in -lgsm... " >&6; }
if ${ac_cv_lib_gsm_gsm_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgsm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gsm_create ();
int
main ()
{
return gsm_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gsm_gsm_create=yes
else
  ac_cv_lib_gsm_gsm_create=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gsm_gsm_create" >&5
$as_echo "$ac_cv_lib_gsm_gsm_create" >&6; }
if test "x$ac_cv_lib_gsm_gsm_create" = xyes; then :
  HAVE_GSM=yes
else
  HAVE_GSM=no
fi

  if test "x$HAVE_GSM" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "gsm.h" "ac_cv_header_gsm_h" "$ac_includes_default"
if test "x$ac_cv_header_gsm_h" = xyes; then :
  :
else
  HAVE_GSM=no
fi


    if test "x$HAVE_GSM" = "xyes"; then
            GSM_LIBS="-lgsm"
    else
      :
    fi
  else
    :
  fi



  if test $HAVE_GSM != "yes"; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gsm_create in -lgsm" >&5
$as_echo_n "checking for gsm_create in -lgsm... " >&6; }
if ${ac_cv_lib_gsm_gsm_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgsm  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gsm_create ();
int
main ()
{
return gsm_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gsm_gsm_create=yes
else
  ac_cv_lib_gsm_gsm_create=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gsm_gsm_create" >&5
$as_echo "$ac_cv_lib_gsm_gsm_create" >&6; }
if test "x$ac_cv_lib_gsm_gsm_create" = xyes; then :
  HAVE_GSM=yes
else
  HAVE_GSM=no
fi

  if test "x$HAVE_GSM" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "gsm/gsm.h" "ac_cv_header_gsm_gsm_h" "$ac_includes_default"
if test "x$ac_cv_header_gsm_gsm_h" = xyes; then :
  :
else
  HAVE_GSM=no
fi


    if test "x$HAVE_GSM" = "xyes"; then
            GSM_LIBS="-lgsm"
    else
      :
    fi
  else
    :
  fi



    if test $HAVE_GSM = "yes"; then

$as_echo "#define GSM_HEADER_IN_SUBDIR 1" >>confdefs.h

    fi
  fi



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_GSM = xno; then
    USE_GSM=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gsmenc gsmdec" >&5
$as_echo "$as_me: *** These plugins will be built: gsmenc gsmdec" >&6;}
  fi
fi
if test x$USE_GSM = xyes; then
  :
  if test "xgsmenc gsmdec" != "x"; then
    GST_PLUGINS_YES="\tgsmenc gsmdec\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_GSM /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gsmenc gsmdec" >&5
$as_echo "$as_me: *** These plugins will not be built: gsmenc gsmdec" >&6;}
  if test "xgsmenc gsmdec" != "x"; then
    GST_PLUGINS_NO="\tgsmenc gsmdec\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_GSM = xyes; then
  USE_GSM_TRUE=
  USE_GSM_FALSE='#'
else
  USE_GSM_TRUE='#'
  USE_GSM_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: fluidsynth ***" >&5
$as_echo "$as_me: *** checking feature: fluidsynth ***" >&6;}
if test "xfluidsynth" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: fluidsynth ***" >&5
$as_echo "$as_me: *** for plug-ins: fluidsynth ***" >&6;}
fi
NOUSE=
if test "x$USE_FLUIDSYNTH" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-fluidsynth was given.
if test "${enable_fluidsynth+set}" = set; then :
  enableval=$enable_fluidsynth;  case "${enableval}" in
      yes) USE_FLUIDSYNTH=yes;;
      no) USE_FLUIDSYNTH=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-fluidsynth" "$LINENO" 5 ;;
    esac
else
   USE_FLUIDSYNTH=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_FLUIDSYNTH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fluidsynth pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** fluidsynth pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " FLUIDSYNTH " > /dev/null; then
  USE_FLUIDSYNTH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** fluidsynth not ported" >&5
$as_echo "$as_me: WARNING: *** fluidsynth not ported" >&2;}
fi


if test x$USE_FLUIDSYNTH = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_FLUIDSYNTH=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FLUIDSYNTH" >&5
$as_echo_n "checking for FLUIDSYNTH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$FLUIDSYNTH_CFLAGS"; then
        pkg_cv_FLUIDSYNTH_CFLAGS="$FLUIDSYNTH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fluidsynth >= 1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "fluidsynth >= 1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_FLUIDSYNTH_CFLAGS=`$PKG_CONFIG --cflags "fluidsynth >= 1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$FLUIDSYNTH_LIBS"; then
        pkg_cv_FLUIDSYNTH_LIBS="$FLUIDSYNTH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"fluidsynth >= 1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "fluidsynth >= 1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_FLUIDSYNTH_LIBS=`$PKG_CONFIG --libs "fluidsynth >= 1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        FLUIDSYNTH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "fluidsynth >= 1.0"`
        else
	        FLUIDSYNTH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "fluidsynth >= 1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$FLUIDSYNTH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_FLUIDSYNTH="no"

elif test $pkg_failed = untried; then

    HAVE_FLUIDSYNTH="no"

else
	FLUIDSYNTH_CFLAGS=$pkg_cv_FLUIDSYNTH_CFLAGS
	FLUIDSYNTH_LIBS=$pkg_cv_FLUIDSYNTH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_FLUIDSYNTH="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_FLUIDSYNTH = xno; then
    USE_FLUIDSYNTH=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: fluidsynth" >&5
$as_echo "$as_me: *** These plugins will be built: fluidsynth" >&6;}
  fi
fi
if test x$USE_FLUIDSYNTH = xyes; then
  :
  if test "xfluidsynth" != "x"; then
    GST_PLUGINS_YES="\tfluidsynth\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_FLUIDSYNTH /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: fluidsynth" >&5
$as_echo "$as_me: *** These plugins will not be built: fluidsynth" >&6;}
  if test "xfluidsynth" != "x"; then
    GST_PLUGINS_NO="\tfluidsynth\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_FLUIDSYNTH = xyes; then
  USE_FLUIDSYNTH_TRUE=
  USE_FLUIDSYNTH_FALSE='#'
else
  USE_FLUIDSYNTH_TRUE='#'
  USE_FLUIDSYNTH_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Kate ***" >&5
$as_echo "$as_me: *** checking feature: Kate ***" >&6;}
if test "xkate" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: kate ***" >&5
$as_echo "$as_me: *** for plug-ins: kate ***" >&6;}
fi
NOUSE=
if test "x$USE_KATE" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-kate was given.
if test "${enable_kate+set}" = set; then :
  enableval=$enable_kate;  case "${enableval}" in
      yes) USE_KATE=yes;;
      no) USE_KATE=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-kate" "$LINENO" 5 ;;
    esac
else
   USE_KATE=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_KATE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** kate pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** kate pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " KATE " > /dev/null; then
  USE_KATE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** kate not ported" >&5
$as_echo "$as_me: WARNING: *** kate not ported" >&2;}
fi


if test x$USE_KATE = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_KATE=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for KATE" >&5
$as_echo_n "checking for KATE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$KATE_CFLAGS"; then
        pkg_cv_KATE_CFLAGS="$KATE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"kate >= 0.1.7\""; } >&5
  ($PKG_CONFIG --exists --print-errors "kate >= 0.1.7") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_KATE_CFLAGS=`$PKG_CONFIG --cflags "kate >= 0.1.7" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$KATE_LIBS"; then
        pkg_cv_KATE_LIBS="$KATE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"kate >= 0.1.7\""; } >&5
  ($PKG_CONFIG --exists --print-errors "kate >= 0.1.7") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_KATE_LIBS=`$PKG_CONFIG --libs "kate >= 0.1.7" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        KATE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "kate >= 0.1.7"`
        else
	        KATE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "kate >= 0.1.7"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$KATE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_KATE="no"

elif test $pkg_failed = untried; then

    HAVE_KATE="no"

else
	KATE_CFLAGS=$pkg_cv_KATE_CFLAGS
	KATE_LIBS=$pkg_cv_KATE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_KATE="yes"
fi



pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIGER" >&5
$as_echo_n "checking for TIGER... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$TIGER_CFLAGS"; then
        pkg_cv_TIGER_CFLAGS="$TIGER_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tiger >= 0.3.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "tiger >= 0.3.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TIGER_CFLAGS=`$PKG_CONFIG --cflags "tiger >= 0.3.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$TIGER_LIBS"; then
        pkg_cv_TIGER_LIBS="$TIGER_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"tiger >= 0.3.2\""; } >&5
  ($PKG_CONFIG --exists --print-errors "tiger >= 0.3.2") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TIGER_LIBS=`$PKG_CONFIG --libs "tiger >= 0.3.2" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        TIGER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "tiger >= 0.3.2"`
        else
	        TIGER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "tiger >= 0.3.2"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$TIGER_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_TIGER="no"


elif test $pkg_failed = untried; then

      HAVE_TIGER="no"


else
	TIGER_CFLAGS=$pkg_cv_TIGER_CFLAGS
	TIGER_LIBS=$pkg_cv_TIGER_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_TIGER="yes"

$as_echo "#define HAVE_TIGER 1" >>confdefs.h


fi
   if test "x$HAVE_TIGER" = "xyes"; then
  USE_TIGER_TRUE=
  USE_TIGER_FALSE='#'
else
  USE_TIGER_TRUE='#'
  USE_TIGER_FALSE=
fi





  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_KATE = xno; then
    USE_KATE=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: kate" >&5
$as_echo "$as_me: *** These plugins will be built: kate" >&6;}
  fi
fi
if test x$USE_KATE = xyes; then
  :
  if test "xkate" != "x"; then
    GST_PLUGINS_YES="\tkate\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_KATE /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: kate" >&5
$as_echo "$as_me: *** These plugins will not be built: kate" >&6;}
  if test "xkate" != "x"; then
    GST_PLUGINS_NO="\tkate\n$GST_PLUGINS_NO"
  fi
   if false; then
  USE_TIGER_TRUE=
  USE_TIGER_FALSE='#'
else
  USE_TIGER_TRUE='#'
  USE_TIGER_FALSE=
fi

fi
 if test x$USE_KATE = xyes; then
  USE_KATE_TRUE=
  USE_KATE_FALSE='#'
else
  USE_KATE_TRUE='#'
  USE_KATE_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ladspa ***" >&5
$as_echo "$as_me: *** checking feature: ladspa ***" >&6;}
if test "xladspa" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ladspa ***" >&5
$as_echo "$as_me: *** for plug-ins: ladspa ***" >&6;}
fi
NOUSE=
if test "x$USE_LADSPA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-ladspa was given.
if test "${enable_ladspa+set}" = set; then :
  enableval=$enable_ladspa;  case "${enableval}" in
      yes) USE_LADSPA=yes;;
      no) USE_LADSPA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-ladspa" "$LINENO" 5 ;;
    esac
else
   USE_LADSPA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LADSPA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ladspa pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** ladspa pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LADSPA " > /dev/null; then
  USE_LADSPA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ladspa not ported" >&5
$as_echo "$as_me: WARNING: *** ladspa not ported" >&2;}
fi


if test x$USE_LADSPA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LADSPA=no

  ac_fn_c_check_header_mongrel "$LINENO" "ladspa.h" "ac_cv_header_ladspa_h" "$ac_includes_default"
if test "x$ac_cv_header_ladspa_h" = xyes; then :
  HAVE_LADSPA="yes"
else
  HAVE_LADSPA="no"
fi




pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LRDF" >&5
$as_echo_n "checking for LRDF... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LRDF_CFLAGS"; then
        pkg_cv_LRDF_CFLAGS="$LRDF_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lrdf\""; } >&5
  ($PKG_CONFIG --exists --print-errors "lrdf") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LRDF_CFLAGS=`$PKG_CONFIG --cflags "lrdf" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LRDF_LIBS"; then
        pkg_cv_LRDF_LIBS="$LRDF_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"lrdf\""; } >&5
  ($PKG_CONFIG --exists --print-errors "lrdf") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LRDF_LIBS=`$PKG_CONFIG --libs "lrdf" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LRDF_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "lrdf"`
        else
	        LRDF_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "lrdf"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LRDF_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LRDF=no
elif test $pkg_failed = untried; then
	HAVE_LRDF=no
else
	LRDF_CFLAGS=$pkg_cv_LRDF_CFLAGS
	LRDF_LIBS=$pkg_cv_LRDF_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LRDF=yes
fi
  if test $HAVE_LRDF = "yes"; then

$as_echo "#define HAVE_LRDF 1" >>confdefs.h

  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LADSPA = xno; then
    USE_LADSPA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ladspa" >&5
$as_echo "$as_me: *** These plugins will be built: ladspa" >&6;}
  fi
fi
if test x$USE_LADSPA = xyes; then
  :
  if test "xladspa" != "x"; then
    GST_PLUGINS_YES="\tladspa\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LADSPA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ladspa" >&5
$as_echo "$as_me: *** These plugins will not be built: ladspa" >&6;}
  if test "xladspa" != "x"; then
    GST_PLUGINS_NO="\tladspa\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LADSPA = xyes; then
  USE_LADSPA_TRUE=
  USE_LADSPA_FALSE='#'
else
  USE_LADSPA_TRUE='#'
  USE_LADSPA_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: lv2 ***" >&5
$as_echo "$as_me: *** checking feature: lv2 ***" >&6;}
if test "xlv2" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: lv2 ***" >&5
$as_echo "$as_me: *** for plug-ins: lv2 ***" >&6;}
fi
NOUSE=
if test "x$USE_LV2" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-lv2 was given.
if test "${enable_lv2+set}" = set; then :
  enableval=$enable_lv2;  case "${enableval}" in
      yes) USE_LV2=yes;;
      no) USE_LV2=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-lv2" "$LINENO" 5 ;;
    esac
else
   USE_LV2=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LV2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** lv2 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** lv2 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LV2 " > /dev/null; then
  USE_LV2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** lv2 not ported" >&5
$as_echo "$as_me: WARNING: *** lv2 not ported" >&2;}
fi


if test x$USE_LV2 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LV2=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SLV2" >&5
$as_echo_n "checking for SLV2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SLV2_CFLAGS"; then
        pkg_cv_SLV2_CFLAGS="$SLV2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"slv2 >= 0.6.6\""; } >&5
  ($PKG_CONFIG --exists --print-errors "slv2 >= 0.6.6") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SLV2_CFLAGS=`$PKG_CONFIG --cflags "slv2 >= 0.6.6" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SLV2_LIBS"; then
        pkg_cv_SLV2_LIBS="$SLV2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"slv2 >= 0.6.6\""; } >&5
  ($PKG_CONFIG --exists --print-errors "slv2 >= 0.6.6") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SLV2_LIBS=`$PKG_CONFIG --libs "slv2 >= 0.6.6" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SLV2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "slv2 >= 0.6.6"`
        else
	        SLV2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "slv2 >= 0.6.6"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SLV2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LV2="no"
elif test $pkg_failed = untried; then
	HAVE_LV2="no"
else
	SLV2_CFLAGS=$pkg_cv_SLV2_CFLAGS
	SLV2_LIBS=$pkg_cv_SLV2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LV2="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LV2 = xno; then
    USE_LV2=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: lv2" >&5
$as_echo "$as_me: *** These plugins will be built: lv2" >&6;}
  fi
fi
if test x$USE_LV2 = xyes; then
  :
  if test "xlv2" != "x"; then
    GST_PLUGINS_YES="\tlv2\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LV2 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: lv2" >&5
$as_echo "$as_me: *** These plugins will not be built: lv2" >&6;}
  if test "xlv2" != "x"; then
    GST_PLUGINS_NO="\tlv2\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LV2 = xyes; then
  USE_LV2_TRUE=
  USE_LV2_FALSE='#'
else
  USE_LV2_TRUE='#'
  USE_LV2_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libde265 HEVC/H.265 decoder ***" >&5
$as_echo "$as_me: *** checking feature: libde265 HEVC/H.265 decoder ***" >&6;}
if test "xlibde265" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: libde265 ***" >&5
$as_echo "$as_me: *** for plug-ins: libde265 ***" >&6;}
fi
NOUSE=
if test "x$USE_LIBDE265" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-libde265 was given.
if test "${enable_libde265+set}" = set; then :
  enableval=$enable_libde265;  case "${enableval}" in
      yes) USE_LIBDE265=yes;;
      no) USE_LIBDE265=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-libde265" "$LINENO" 5 ;;
    esac
else
   USE_LIBDE265=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LIBDE265="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libde265 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** libde265 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LIBDE265 " > /dev/null; then
  USE_LIBDE265="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libde265 not ported" >&5
$as_echo "$as_me: WARNING: *** libde265 not ported" >&2;}
fi


if test x$USE_LIBDE265 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LIBDE265=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBDE265" >&5
$as_echo_n "checking for LIBDE265... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBDE265_CFLAGS"; then
        pkg_cv_LIBDE265_CFLAGS="$LIBDE265_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libde265 >= 0.9\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libde265 >= 0.9") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBDE265_CFLAGS=`$PKG_CONFIG --cflags "libde265 >= 0.9" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBDE265_LIBS"; then
        pkg_cv_LIBDE265_LIBS="$LIBDE265_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libde265 >= 0.9\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libde265 >= 0.9") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBDE265_LIBS=`$PKG_CONFIG --libs "libde265 >= 0.9" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBDE265_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libde265 >= 0.9"`
        else
	        LIBDE265_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libde265 >= 0.9"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBDE265_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LIBDE265="no"
elif test $pkg_failed = untried; then
	HAVE_LIBDE265="no"
else
	LIBDE265_CFLAGS=$pkg_cv_LIBDE265_CFLAGS
	LIBDE265_LIBS=$pkg_cv_LIBDE265_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LIBDE265="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LIBDE265 = xno; then
    USE_LIBDE265=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: libde265" >&5
$as_echo "$as_me: *** These plugins will be built: libde265" >&6;}
  fi
fi
if test x$USE_LIBDE265 = xyes; then
  :
  if test "xlibde265" != "x"; then
    GST_PLUGINS_YES="\tlibde265\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LIBDE265 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: libde265" >&5
$as_echo "$as_me: *** These plugins will not be built: libde265" >&6;}
  if test "xlibde265" != "x"; then
    GST_PLUGINS_NO="\tlibde265\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LIBDE265 = xyes; then
  USE_LIBDE265_TRUE=
  USE_LIBDE265_FALSE='#'
else
  USE_LIBDE265_TRUE='#'
  USE_LIBDE265_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: mms protocol library ***" >&5
$as_echo "$as_me: *** checking feature: mms protocol library ***" >&6;}
if test "xlibmms" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: libmms ***" >&5
$as_echo "$as_me: *** for plug-ins: libmms ***" >&6;}
fi
NOUSE=
if test "x$USE_LIBMMS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-libmms was given.
if test "${enable_libmms+set}" = set; then :
  enableval=$enable_libmms;  case "${enableval}" in
      yes) USE_LIBMMS=yes;;
      no) USE_LIBMMS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-libmms" "$LINENO" 5 ;;
    esac
else
   USE_LIBMMS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LIBMMS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libmms pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** libmms pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LIBMMS " > /dev/null; then
  USE_LIBMMS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libmms not ported" >&5
$as_echo "$as_me: WARNING: *** libmms not ported" >&2;}
fi


if test x$USE_LIBMMS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LIBMMS=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBMMS" >&5
$as_echo_n "checking for LIBMMS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBMMS_CFLAGS"; then
        pkg_cv_LIBMMS_CFLAGS="$LIBMMS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmms >= 0.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmms >= 0.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBMMS_CFLAGS=`$PKG_CONFIG --cflags "libmms >= 0.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBMMS_LIBS"; then
        pkg_cv_LIBMMS_LIBS="$LIBMMS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmms >= 0.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmms >= 0.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBMMS_LIBS=`$PKG_CONFIG --libs "libmms >= 0.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBMMS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libmms >= 0.4"`
        else
	        LIBMMS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libmms >= 0.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBMMS_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_LIBMMS="no"

elif test $pkg_failed = untried; then

    HAVE_LIBMMS="no"

else
	LIBMMS_CFLAGS=$pkg_cv_LIBMMS_CFLAGS
	LIBMMS_LIBS=$pkg_cv_LIBMMS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LIBMMS="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LIBMMS = xno; then
    USE_LIBMMS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: libmms" >&5
$as_echo "$as_me: *** These plugins will be built: libmms" >&6;}
  fi
fi
if test x$USE_LIBMMS = xyes; then
  :
  if test "xlibmms" != "x"; then
    GST_PLUGINS_YES="\tlibmms\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LIBMMS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: libmms" >&5
$as_echo "$as_me: *** These plugins will not be built: libmms" >&6;}
  if test "xlibmms" != "x"; then
    GST_PLUGINS_NO="\tlibmms\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LIBMMS = xyes; then
  USE_LIBMMS_TRUE=
  USE_LIBMMS_FALSE='#'
else
  USE_LIBMMS_TRUE='#'
  USE_LIBMMS_FALSE=
fi





echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: srtp library ***" >&5
$as_echo "$as_me: *** checking feature: srtp library ***" >&6;}
if test "xsrtp" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: srtp ***" >&5
$as_echo "$as_me: *** for plug-ins: srtp ***" >&6;}
fi
NOUSE=
if test "x$USE_SRTP" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-srtp was given.
if test "${enable_srtp+set}" = set; then :
  enableval=$enable_srtp;  case "${enableval}" in
      yes) USE_SRTP=yes;;
      no) USE_SRTP=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-srtp" "$LINENO" 5 ;;
    esac
else
   USE_SRTP=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SRTP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** srtp pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** srtp pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SRTP " > /dev/null; then
  USE_SRTP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** srtp not ported" >&5
$as_echo "$as_me: WARNING: *** srtp not ported" >&2;}
fi


if test x$USE_SRTP = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SRTP=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SRTP" >&5
$as_echo_n "checking for SRTP... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SRTP_CFLAGS"; then
        pkg_cv_SRTP_CFLAGS="$SRTP_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsrtp\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libsrtp") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SRTP_CFLAGS=`$PKG_CONFIG --cflags "libsrtp" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SRTP_LIBS"; then
        pkg_cv_SRTP_LIBS="$SRTP_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsrtp\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libsrtp") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SRTP_LIBS=`$PKG_CONFIG --libs "libsrtp" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SRTP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libsrtp"`
        else
	        SRTP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libsrtp"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SRTP_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for srtp_init in -lsrtp" >&5
$as_echo_n "checking for srtp_init in -lsrtp... " >&6; }
if ${ac_cv_lib_srtp_srtp_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsrtp  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char srtp_init ();
int
main ()
{
return srtp_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_srtp_srtp_init=yes
else
  ac_cv_lib_srtp_srtp_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_srtp_srtp_init" >&5
$as_echo "$ac_cv_lib_srtp_srtp_init" >&6; }
if test "x$ac_cv_lib_srtp_srtp_init" = xyes; then :
  HAVE_SRTP=yes
else
  HAVE_SRTP=no
fi

  if test "x$HAVE_SRTP" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "srtp/srtp.h" "ac_cv_header_srtp_srtp_h" "$ac_includes_default"
if test "x$ac_cv_header_srtp_srtp_h" = xyes; then :
  :
else
  HAVE_SRTP=no
fi


    if test "x$HAVE_SRTP" = "xyes"; then
            SRTP_LIBS="-lsrtp"
    else
      :
    fi
  else
    :
  fi




elif test $pkg_failed = untried; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for srtp_init in -lsrtp" >&5
$as_echo_n "checking for srtp_init in -lsrtp... " >&6; }
if ${ac_cv_lib_srtp_srtp_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsrtp  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char srtp_init ();
int
main ()
{
return srtp_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_srtp_srtp_init=yes
else
  ac_cv_lib_srtp_srtp_init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_srtp_srtp_init" >&5
$as_echo "$ac_cv_lib_srtp_srtp_init" >&6; }
if test "x$ac_cv_lib_srtp_srtp_init" = xyes; then :
  HAVE_SRTP=yes
else
  HAVE_SRTP=no
fi

  if test "x$HAVE_SRTP" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "srtp/srtp.h" "ac_cv_header_srtp_srtp_h" "$ac_includes_default"
if test "x$ac_cv_header_srtp_srtp_h" = xyes; then :
  :
else
  HAVE_SRTP=no
fi


    if test "x$HAVE_SRTP" = "xyes"; then
            SRTP_LIBS="-lsrtp"
    else
      :
    fi
  else
    :
  fi




else
	SRTP_CFLAGS=$pkg_cv_SRTP_CFLAGS
	SRTP_LIBS=$pkg_cv_SRTP_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SRTP="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SRTP = xno; then
    USE_SRTP=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: srtp" >&5
$as_echo "$as_me: *** These plugins will be built: srtp" >&6;}
  fi
fi
if test x$USE_SRTP = xyes; then
  :
  if test "xsrtp" != "x"; then
    GST_PLUGINS_YES="\tsrtp\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SRTP /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: srtp" >&5
$as_echo "$as_me: *** These plugins will not be built: srtp" >&6;}
  if test "xsrtp" != "x"; then
    GST_PLUGINS_NO="\tsrtp\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SRTP = xyes; then
  USE_SRTP_TRUE=
  USE_SRTP_FALSE='#'
else
  USE_SRTP_TRUE='#'
  USE_SRTP_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DTLS plugin ***" >&5
$as_echo "$as_me: *** checking feature: DTLS plugin ***" >&6;}
if test "xdtls" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dtls ***" >&5
$as_echo "$as_me: *** for plug-ins: dtls ***" >&6;}
fi
NOUSE=
if test "x$USE_DTLS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-dtls was given.
if test "${enable_dtls+set}" = set; then :
  enableval=$enable_dtls;  case "${enableval}" in
      yes) USE_DTLS=yes;;
      no) USE_DTLS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-dtls" "$LINENO" 5 ;;
    esac
else
   USE_DTLS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DTLS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dtls pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dtls pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DTLS " > /dev/null; then
  USE_DTLS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dtls not ported" >&5
$as_echo "$as_me: WARNING: *** dtls not ported" >&2;}
fi


if test x$USE_DTLS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DTLS=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for DTLS" >&5
$as_echo_n "checking for DTLS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$DTLS_CFLAGS"; then
        pkg_cv_DTLS_CFLAGS="$DTLS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" openssl >= 1.0.1  libcrypto \""; } >&5
  ($PKG_CONFIG --exists --print-errors " openssl >= 1.0.1  libcrypto ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DTLS_CFLAGS=`$PKG_CONFIG --cflags " openssl >= 1.0.1  libcrypto " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$DTLS_LIBS"; then
        pkg_cv_DTLS_LIBS="$DTLS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \" openssl >= 1.0.1  libcrypto \""; } >&5
  ($PKG_CONFIG --exists --print-errors " openssl >= 1.0.1  libcrypto ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_DTLS_LIBS=`$PKG_CONFIG --libs " openssl >= 1.0.1  libcrypto " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        DTLS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors " openssl >= 1.0.1  libcrypto "`
        else
	        DTLS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors " openssl >= 1.0.1  libcrypto "`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$DTLS_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_DTLS="no"

elif test $pkg_failed = untried; then

    HAVE_DTLS="no"

else
	DTLS_CFLAGS=$pkg_cv_DTLS_CFLAGS
	DTLS_LIBS=$pkg_cv_DTLS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_DTLS="yes"



fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DTLS = xno; then
    USE_DTLS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dtls" >&5
$as_echo "$as_me: *** These plugins will be built: dtls" >&6;}
  fi
fi
if test x$USE_DTLS = xyes; then
  :
  if test "xdtls" != "x"; then
    GST_PLUGINS_YES="\tdtls\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DTLS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dtls" >&5
$as_echo "$as_me: *** These plugins will not be built: dtls" >&6;}
  if test "xdtls" != "x"; then
    GST_PLUGINS_NO="\tdtls\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DTLS = xyes; then
  USE_DTLS_TRUE=
  USE_DTLS_FALSE='#'
else
  USE_DTLS_TRUE='#'
  USE_DTLS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Linear Systems SDI plugin ***" >&5
$as_echo "$as_me: *** checking feature: Linear Systems SDI plugin ***" >&6;}
if test "xlinsys" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: linsys ***" >&5
$as_echo "$as_me: *** for plug-ins: linsys ***" >&6;}
fi
NOUSE=
if test "x$USE_LINSYS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-linsys was given.
if test "${enable_linsys+set}" = set; then :
  enableval=$enable_linsys;  case "${enableval}" in
      yes) USE_LINSYS=yes;;
      no) USE_LINSYS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-linsys" "$LINENO" 5 ;;
    esac
else
   USE_LINSYS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LINSYS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** linsys pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** linsys pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LINSYS " > /dev/null; then
  USE_LINSYS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** linsys not ported" >&5
$as_echo "$as_me: WARNING: *** linsys not ported" >&2;}
fi


if test x$USE_LINSYS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LINSYS=no

  case "$host" in
    *-*linux*)
      HAVE_LINSYS=yes
      ;;
    *)
      HAVE_LINSYS=no
      ;;
  esac


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LINSYS = xno; then
    USE_LINSYS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: linsys" >&5
$as_echo "$as_me: *** These plugins will be built: linsys" >&6;}
  fi
fi
if test x$USE_LINSYS = xyes; then
  :
  if test "xlinsys" != "x"; then
    GST_PLUGINS_YES="\tlinsys\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LINSYS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: linsys" >&5
$as_echo "$as_me: *** These plugins will not be built: linsys" >&6;}
  if test "xlinsys" != "x"; then
    GST_PLUGINS_NO="\tlinsys\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LINSYS = xyes; then
  USE_LINSYS_TRUE=
  USE_LINSYS_FALSE='#'
else
  USE_LINSYS_TRUE='#'
  USE_LINSYS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: modplug ***" >&5
$as_echo "$as_me: *** checking feature: modplug ***" >&6;}
if test "xmodplug" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: modplug ***" >&5
$as_echo "$as_me: *** for plug-ins: modplug ***" >&6;}
fi
NOUSE=
if test "x$USE_MODPLUG" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-modplug was given.
if test "${enable_modplug+set}" = set; then :
  enableval=$enable_modplug;  case "${enableval}" in
      yes) USE_MODPLUG=yes;;
      no) USE_MODPLUG=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-modplug" "$LINENO" 5 ;;
    esac
else
   USE_MODPLUG=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_MODPLUG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** modplug pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** modplug pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " MODPLUG " > /dev/null; then
  USE_MODPLUG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** modplug not ported" >&5
$as_echo "$as_me: WARNING: *** modplug not ported" >&2;}
fi


if test x$USE_MODPLUG = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_MODPLUG=no

  if test "x$HAVE_CXX" != "xyes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Not compiling modplug plugin as it requires a C++ compiler" >&5
$as_echo "$as_me: WARNING: Not compiling modplug plugin as it requires a C++ compiler" >&2;}
    HAVE_MODPLUG="no"
  else

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MODPLUG" >&5
$as_echo_n "checking for MODPLUG... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$MODPLUG_CFLAGS"; then
        pkg_cv_MODPLUG_CFLAGS="$MODPLUG_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmodplug\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmodplug") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MODPLUG_CFLAGS=`$PKG_CONFIG --cflags "libmodplug" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$MODPLUG_LIBS"; then
        pkg_cv_MODPLUG_LIBS="$MODPLUG_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmodplug\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmodplug") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MODPLUG_LIBS=`$PKG_CONFIG --libs "libmodplug" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        MODPLUG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libmodplug"`
        else
	        MODPLUG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libmodplug"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$MODPLUG_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_MODPLUG="no"
elif test $pkg_failed = untried; then
	HAVE_MODPLUG="no"
else
	MODPLUG_CFLAGS=$pkg_cv_MODPLUG_CFLAGS
	MODPLUG_LIBS=$pkg_cv_MODPLUG_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_MODPLUG="yes"
fi
  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_MODPLUG = xno; then
    USE_MODPLUG=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: modplug" >&5
$as_echo "$as_me: *** These plugins will be built: modplug" >&6;}
  fi
fi
if test x$USE_MODPLUG = xyes; then
  :
  if test "xmodplug" != "x"; then
    GST_PLUGINS_YES="\tmodplug\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_MODPLUG /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: modplug" >&5
$as_echo "$as_me: *** These plugins will not be built: modplug" >&6;}
  if test "xmodplug" != "x"; then
    GST_PLUGINS_NO="\tmodplug\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_MODPLUG = xyes; then
  USE_MODPLUG_TRUE=
  USE_MODPLUG_FALSE='#'
else
  USE_MODPLUG_TRUE='#'
  USE_MODPLUG_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libmimic library ***" >&5
$as_echo "$as_me: *** checking feature: libmimic library ***" >&6;}
if test "xmimic" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: mimic ***" >&5
$as_echo "$as_me: *** for plug-ins: mimic ***" >&6;}
fi
NOUSE=
if test "x$USE_MIMIC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-mimic was given.
if test "${enable_mimic+set}" = set; then :
  enableval=$enable_mimic;  case "${enableval}" in
      yes) USE_MIMIC=yes;;
      no) USE_MIMIC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-mimic" "$LINENO" 5 ;;
    esac
else
   USE_MIMIC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_MIMIC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mimic pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** mimic pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " MIMIC " > /dev/null; then
  USE_MIMIC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mimic not ported" >&5
$as_echo "$as_me: WARNING: *** mimic not ported" >&2;}
fi


if test x$USE_MIMIC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_MIMIC=no

  MIMIC_REQUIRED=1.0

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MIMIC" >&5
$as_echo_n "checking for MIMIC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$MIMIC_CFLAGS"; then
        pkg_cv_MIMIC_CFLAGS="$MIMIC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmimic >= \$MIMIC_REQUIRED\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmimic >= $MIMIC_REQUIRED") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MIMIC_CFLAGS=`$PKG_CONFIG --cflags "libmimic >= $MIMIC_REQUIRED" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$MIMIC_LIBS"; then
        pkg_cv_MIMIC_LIBS="$MIMIC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libmimic >= \$MIMIC_REQUIRED\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libmimic >= $MIMIC_REQUIRED") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MIMIC_LIBS=`$PKG_CONFIG --libs "libmimic >= $MIMIC_REQUIRED" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        MIMIC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libmimic >= $MIMIC_REQUIRED"`
        else
	        MIMIC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libmimic >= $MIMIC_REQUIRED"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$MIMIC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_MIMIC=no
elif test $pkg_failed = untried; then
	HAVE_MIMIC=no
else
	MIMIC_CFLAGS=$pkg_cv_MIMIC_CFLAGS
	MIMIC_LIBS=$pkg_cv_MIMIC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_MIMIC=yes
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_MIMIC = xno; then
    USE_MIMIC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: mimic" >&5
$as_echo "$as_me: *** These plugins will be built: mimic" >&6;}
  fi
fi
if test x$USE_MIMIC = xyes; then
  :
  if test "xmimic" != "x"; then
    GST_PLUGINS_YES="\tmimic\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_MIMIC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: mimic" >&5
$as_echo "$as_me: *** These plugins will not be built: mimic" >&6;}
  if test "xmimic" != "x"; then
    GST_PLUGINS_NO="\tmimic\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_MIMIC = xyes; then
  USE_MIMIC_TRUE=
  USE_MIMIC_FALSE='#'
else
  USE_MIMIC_TRUE='#'
  USE_MIMIC_FALSE=
fi



echo
if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.6.1.93 mjpegtools < 1.8.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.6.1.93 mjpegtools < 1.8.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

  mjpegtools_api=10601

else

  if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.8.0 mjpegtools < 1.9.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.8.0 mjpegtools < 1.9.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

    mjpegtools_api=10800

else

    if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 2.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 2.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then

      mjpegtools_api=20000

else


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MJPEG" >&5
$as_echo_n "checking for MJPEG... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$MJPEG_CFLAGS"; then
        pkg_cv_MJPEG_CFLAGS="$MJPEG_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.9.0 mjpegtools < 2.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.9.0 mjpegtools < 2.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MJPEG_CFLAGS=`$PKG_CONFIG --cflags "mjpegtools >= 1.9.0 mjpegtools < 2.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$MJPEG_LIBS"; then
        pkg_cv_MJPEG_LIBS="$MJPEG_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.9.0 mjpegtools < 2.0.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.9.0 mjpegtools < 2.0.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MJPEG_LIBS=`$PKG_CONFIG --libs "mjpegtools >= 1.9.0 mjpegtools < 2.0.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        MJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mjpegtools >= 1.9.0 mjpegtools < 2.0.0"`
        else
	        MJPEG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mjpegtools >= 1.9.0 mjpegtools < 2.0.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$MJPEG_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

        mjpegtools_api=0

elif test $pkg_failed = untried; then

        mjpegtools_api=0

else
	MJPEG_CFLAGS=$pkg_cv_MJPEG_CFLAGS
	MJPEG_LIBS=$pkg_cv_MJPEG_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

                OLD_CFLAGS="$CFLAGS"
        OLD_LIBS="$LIBS"
        CFLAGS="$MJPEG_CFLAGS"
        LIBS="$LIBS $MJPEG_LIBS -lmjpegutils $LIBM $PTHREAD_LIBS"
        ac_fn_c_check_func "$LINENO" "mjpeg_loglev_t" "ac_cv_func_mjpeg_loglev_t"
if test "x$ac_cv_func_mjpeg_loglev_t" = xyes; then :

          mjpegtools_api=10903

else

          mjpegtools_api=10900

fi

        CFLAGS="$OLD_CFLAGS"
        LIBS="$OLD_LIBS"

fi

fi

fi

fi

cat >>confdefs.h <<_ACEOF
#define GST_MJPEGTOOLS_API $mjpegtools_api
_ACEOF



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: mpeg2enc ***" >&5
$as_echo "$as_me: *** checking feature: mpeg2enc ***" >&6;}
if test "xmpeg2enc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: mpeg2enc ***" >&5
$as_echo "$as_me: *** for plug-ins: mpeg2enc ***" >&6;}
fi
NOUSE=
if test "x$USE_MPEG2ENC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-mpeg2enc was given.
if test "${enable_mpeg2enc+set}" = set; then :
  enableval=$enable_mpeg2enc;  case "${enableval}" in
      yes) USE_MPEG2ENC=yes;;
      no) USE_MPEG2ENC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-mpeg2enc" "$LINENO" 5 ;;
    esac
else
   USE_MPEG2ENC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_MPEG2ENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mpeg2enc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** mpeg2enc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " MPEG2ENC " > /dev/null; then
  USE_MPEG2ENC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mpeg2enc not ported" >&5
$as_echo "$as_me: WARNING: *** mpeg2enc not ported" >&2;}
fi


if test x$USE_MPEG2ENC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_MPEG2ENC=no

  HAVE_MPEG2ENC="no"
    if  test x$HAVE_CXX = xyes ; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPEG2ENC" >&5
$as_echo_n "checking for MPEG2ENC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$MPEG2ENC_CFLAGS"; then
        pkg_cv_MPEG2ENC_CFLAGS="$MPEG2ENC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.6.1.93\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.6.1.93") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MPEG2ENC_CFLAGS=`$PKG_CONFIG --cflags "mjpegtools >= 1.6.1.93" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$MPEG2ENC_LIBS"; then
        pkg_cv_MPEG2ENC_LIBS="$MPEG2ENC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.6.1.93\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.6.1.93") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MPEG2ENC_LIBS=`$PKG_CONFIG --libs "mjpegtools >= 1.6.1.93" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        MPEG2ENC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mjpegtools >= 1.6.1.93"`
        else
	        MPEG2ENC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mjpegtools >= 1.6.1.93"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$MPEG2ENC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_MPEG2ENC="no"

elif test $pkg_failed = untried; then

      HAVE_MPEG2ENC="no"

else
	MPEG2ENC_CFLAGS=$pkg_cv_MPEG2ENC_CFLAGS
	MPEG2ENC_LIBS=$pkg_cv_MPEG2ENC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

            touch config.h
            ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      OLD_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS_GOOD="$CPPFLAGS $MPEG2ENC_CFLAGS"
      CPPFLAGS="$CPPFLAGS_GOOD -I."
            mpeg2enc_headers_ok=no
      ac_fn_cxx_check_header_mongrel "$LINENO" "mpeg2encoder.hh" "ac_cv_header_mpeg2encoder_hh" "$ac_includes_default"
if test "x$ac_cv_header_mpeg2encoder_hh" = xyes; then :

        MPEG2ENC_LIBS="$MPEG2ENC_LIBS -lmpeg2encpp $LIBM $PTHREAD_LIBS"
        OLD_LIBS="$LIBS"
        LIBS="$LIBS $MPEG2ENC_LIBS"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for valid mpeg2enc objects" >&5
$as_echo_n "checking for valid mpeg2enc objects... " >&6; }
        if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

          #include <mpeg2encoder.hh>
          #include <mpeg2encoptions.hh>

          int
          main (int   argc,
                char *argv[])
          {
            MPEG2EncOptions *options = new MPEG2EncOptions ();
            MPEG2Encoder *encoder = new MPEG2Encoder (*options);
            return 0;
          }

_ACEOF
if ac_fn_cxx_try_run "$LINENO"; then :

          { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
                                                            if test "$mjpegtools_api" -ge "10800"; then
            ac_fn_cxx_check_header_mongrel "$LINENO" "mpeg2syntaxcodes.h" "ac_cv_header_mpeg2syntaxcodes_h" "$ac_includes_default"
if test "x$ac_cv_header_mpeg2syntaxcodes_h" = xyes; then :

                mpeg2enc_headers_ok=yes

else

                mpeg2enc_headers_ok=no

fi


          else
            mpeg2enc_headers_ok=yes
          fi
          if test "x$mpeg2enc_headers_ok" = "xyes"; then
            HAVE_MPEG2ENC="yes"
          fi
          CPPFLAGS="$CPPFLAGS_GOOD"



else

          { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

        LIBS="$OLD_LIBS"

fi



      CPPFLAGS="$OLD_CPPFLAGS"
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_MPEG2ENC = xno; then
    USE_MPEG2ENC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: mpeg2enc" >&5
$as_echo "$as_me: *** These plugins will be built: mpeg2enc" >&6;}
  fi
fi
if test x$USE_MPEG2ENC = xyes; then
  :
  if test "xmpeg2enc" != "x"; then
    GST_PLUGINS_YES="\tmpeg2enc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_MPEG2ENC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: mpeg2enc" >&5
$as_echo "$as_me: *** These plugins will not be built: mpeg2enc" >&6;}
  if test "xmpeg2enc" != "x"; then
    GST_PLUGINS_NO="\tmpeg2enc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_MPEG2ENC = xyes; then
  USE_MPEG2ENC_TRUE=
  USE_MPEG2ENC_FALSE='#'
else
  USE_MPEG2ENC_TRUE='#'
  USE_MPEG2ENC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: mplex ***" >&5
$as_echo "$as_me: *** checking feature: mplex ***" >&6;}
if test "xmplex" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: mplex ***" >&5
$as_echo "$as_me: *** for plug-ins: mplex ***" >&6;}
fi
NOUSE=
if test "x$USE_MPLEX" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-mplex was given.
if test "${enable_mplex+set}" = set; then :
  enableval=$enable_mplex;  case "${enableval}" in
      yes) USE_MPLEX=yes;;
      no) USE_MPLEX=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-mplex" "$LINENO" 5 ;;
    esac
else
   USE_MPLEX=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_MPLEX="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mplex pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** mplex pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " MPLEX " > /dev/null; then
  USE_MPLEX="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** mplex not ported" >&5
$as_echo "$as_me: WARNING: *** mplex not ported" >&2;}
fi


if test x$USE_MPLEX = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_MPLEX=no

  HAVE_MPLEX="no"
    if  test x$HAVE_CXX = xyes ; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for MPLEX" >&5
$as_echo_n "checking for MPLEX... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$MPLEX_CFLAGS"; then
        pkg_cv_MPLEX_CFLAGS="$MPLEX_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.9.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.9.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MPLEX_CFLAGS=`$PKG_CONFIG --cflags "mjpegtools >= 1.9.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$MPLEX_LIBS"; then
        pkg_cv_MPLEX_LIBS="$MPLEX_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"mjpegtools >= 1.9.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "mjpegtools >= 1.9.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_MPLEX_LIBS=`$PKG_CONFIG --libs "mjpegtools >= 1.9.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        MPLEX_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "mjpegtools >= 1.9.0"`
        else
	        MPLEX_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "mjpegtools >= 1.9.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$MPLEX_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_MPLEX="no"
elif test $pkg_failed = untried; then
	HAVE_MPLEX="no"
else
	MPLEX_CFLAGS=$pkg_cv_MPLEX_CFLAGS
	MPLEX_LIBS=$pkg_cv_MPLEX_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

            touch config.h
            ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

      OLD_CPPFLAGS="$CPPFLAGS"
            CPPFLAGS_GOOD="$CPPFLAGS $MPLEX_CFLAGS"
      CPPFLAGS="$CPPFLAGS_GOOD -I."
      ac_fn_cxx_check_header_mongrel "$LINENO" "interact.hpp" "ac_cv_header_interact_hpp" "$ac_includes_default"
if test "x$ac_cv_header_interact_hpp" = xyes; then :

        MPLEX_LIBS="$MPLEX_LIBS -lmplex2 $LIBM"
        OLD_LIBS="$LIBS"
        LIBS="$LIBS $MPLEX_LIBS"
        OLD_LDFLAGS="$LDFLAGS"
        LDFLAGS="$LDFLAGS $MPLEX_LDFLAGS"
                        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for valid mplex objects" >&5
$as_echo_n "checking for valid mplex objects... " >&6; }
        if test "$cross_compiling" = yes; then :
  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
as_fn_error $? "cannot run test program while cross compiling
See \`config.log' for more details" "$LINENO" 5; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */


#include <interact.hpp>
#include <outputstrm.hpp>
#include <multiplexor.hpp>
int
main (int   argc,
      char *argv[])
{
  class TestOutputStream : public OutputStream {
  public:
    TestOutputStream () : OutputStream () { }
    void Write (uint8_t *a, unsigned int b) { }
    void NextSegment () { }
    uint64_t SegmentSize () { }
    void Close () { }
    int Open () { }
};
  MultiplexJob *job = new MultiplexJob ();
  vector<IBitStream *> inputs;
  job->SetupInputStreams (inputs);
  TestOutputStream *out = new TestOutputStream ();
  Multiplexor *mux = new Multiplexor(*job, *out, NULL);
  return 0;
}

_ACEOF
if ac_fn_cxx_try_run "$LINENO"; then :

          HAVE_MPLEX="yes"
          CPPFLAGS="$CPPFLAGS_GOOD"



          { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

        LIBS="$OLD_LIBS"
        LDFLAGS="$OLD_LDFLAGS"

fi


      CPPFLAGS="$OLD_CPPFLAGS"
      ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


fi
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_MPLEX = xno; then
    USE_MPLEX=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: mplex" >&5
$as_echo "$as_me: *** These plugins will be built: mplex" >&6;}
  fi
fi
if test x$USE_MPLEX = xyes; then
  :
  if test "xmplex" != "x"; then
    GST_PLUGINS_YES="\tmplex\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_MPLEX /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: mplex" >&5
$as_echo "$as_me: *** These plugins will not be built: mplex" >&6;}
  if test "xmplex" != "x"; then
    GST_PLUGINS_NO="\tmplex\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_MPLEX = xyes; then
  USE_MPLEX_TRUE=
  USE_MPLEX_FALSE='#'
else
  USE_MPLEX_TRUE='#'
  USE_MPLEX_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: musepackdec ***" >&5
$as_echo "$as_me: *** checking feature: musepackdec ***" >&6;}
if test "xmusepack" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: musepack ***" >&5
$as_echo "$as_me: *** for plug-ins: musepack ***" >&6;}
fi
NOUSE=
if test "x$USE_MUSEPACK" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-musepack was given.
if test "${enable_musepack+set}" = set; then :
  enableval=$enable_musepack;  case "${enableval}" in
      yes) USE_MUSEPACK=yes;;
      no) USE_MUSEPACK=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-musepack" "$LINENO" 5 ;;
    esac
else
   USE_MUSEPACK=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_MUSEPACK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** musepack pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** musepack pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " MUSEPACK " > /dev/null; then
  USE_MUSEPACK="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** musepack not ported" >&5
$as_echo "$as_me: WARNING: *** musepack not ported" >&2;}
fi


if test x$USE_MUSEPACK = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_MUSEPACK=no

  ac_fn_c_check_header_mongrel "$LINENO" "mpc/mpcdec.h" "ac_cv_header_mpc_mpcdec_h" "$ac_includes_default"
if test "x$ac_cv_header_mpc_mpcdec_h" = xyes; then :

    HAVE_MUSEPACK="yes"
    MUSEPACK_LIBS="-lmpcdec"


else
  ac_fn_c_check_header_mongrel "$LINENO" "mpcdec/mpcdec.h" "ac_cv_header_mpcdec_mpcdec_h" "$ac_includes_default"
if test "x$ac_cv_header_mpcdec_mpcdec_h" = xyes; then :

      HAVE_MUSEPACK="yes"
      MUSEPACK_LIBS="-lmpcdec"

$as_echo "#define MPC_IS_OLD_API 1" >>confdefs.h



else
  HAVE_MUSEPACK="no"
fi


fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_MUSEPACK = xno; then
    USE_MUSEPACK=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: musepack" >&5
$as_echo "$as_me: *** These plugins will be built: musepack" >&6;}
  fi
fi
if test x$USE_MUSEPACK = xyes; then
  :
  if test "xmusepack" != "x"; then
    GST_PLUGINS_YES="\tmusepack\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_MUSEPACK /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: musepack" >&5
$as_echo "$as_me: *** These plugins will not be built: musepack" >&6;}
  if test "xmusepack" != "x"; then
    GST_PLUGINS_NO="\tmusepack\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_MUSEPACK = xyes; then
  USE_MUSEPACK_TRUE=
  USE_MUSEPACK_FALSE='#'
else
  USE_MUSEPACK_TRUE='#'
  USE_MUSEPACK_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: nas plug-in ***" >&5
$as_echo "$as_me: *** checking feature: nas plug-in ***" >&6;}
if test "xnassink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: nassink ***" >&5
$as_echo "$as_me: *** for plug-ins: nassink ***" >&6;}
fi
NOUSE=
if test "x$USE_NAS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-nas was given.
if test "${enable_nas+set}" = set; then :
  enableval=$enable_nas;  case "${enableval}" in
      yes) USE_NAS=yes;;
      no) USE_NAS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-nas" "$LINENO" 5 ;;
    esac
else
   USE_NAS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_NAS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nassink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** nassink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " NAS " > /dev/null; then
  USE_NAS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nassink not ported" >&5
$as_echo "$as_me: WARNING: *** nassink not ported" >&2;}
fi


if test x$USE_NAS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_NAS=no

  HAVE_NAS="no"
  if test "x$HAVE_X" = "xyes"; then
    save_cppflags=$CFLAGS
    CPPFLAGS="$CPPFLAGS $X_CFLAGS"

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for AuOpenServer in -laudio" >&5
$as_echo_n "checking for AuOpenServer in -laudio... " >&6; }
if ${ac_cv_lib_audio_AuOpenServer+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-laudio $X_LIBS $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char AuOpenServer ();
int
main ()
{
return AuOpenServer ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_audio_AuOpenServer=yes
else
  ac_cv_lib_audio_AuOpenServer=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_audio_AuOpenServer" >&5
$as_echo "$ac_cv_lib_audio_AuOpenServer" >&6; }
if test "x$ac_cv_lib_audio_AuOpenServer" = xyes; then :
  HAVE_NAS=yes
else
  HAVE_NAS=no
fi

  if test "x$HAVE_NAS" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "audio/audiolib.h" "ac_cv_header_audio_audiolib_h" "$ac_includes_default"
if test "x$ac_cv_header_audio_audiolib_h" = xyes; then :
  :
else
  HAVE_NAS=no
fi


    if test "x$HAVE_NAS" = "xyes"; then
            NAS_LIBS="$X_LIBS -laudio" NAS_CFLAGS="$X_CFLAGS"
    else
      :
    fi
  else
    :
  fi



    CPPFLAGS="$save_cppflags"
  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_NAS = xno; then
    USE_NAS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: nassink" >&5
$as_echo "$as_me: *** These plugins will be built: nassink" >&6;}
  fi
fi
if test x$USE_NAS = xyes; then
  :
  if test "xnassink" != "x"; then
    GST_PLUGINS_YES="\tnassink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_NAS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: nassink" >&5
$as_echo "$as_me: *** These plugins will not be built: nassink" >&6;}
  if test "xnassink" != "x"; then
    GST_PLUGINS_NO="\tnassink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_NAS = xyes; then
  USE_NAS_TRUE=
  USE_NAS_FALSE='#'
else
  USE_NAS_TRUE='#'
  USE_NAS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: neon http client plugins ***" >&5
$as_echo "$as_me: *** checking feature: neon http client plugins ***" >&6;}
if test "xneonhttpsrc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: neonhttpsrc ***" >&5
$as_echo "$as_me: *** for plug-ins: neonhttpsrc ***" >&6;}
fi
NOUSE=
if test "x$USE_NEON" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-neon was given.
if test "${enable_neon+set}" = set; then :
  enableval=$enable_neon;  case "${enableval}" in
      yes) USE_NEON=yes;;
      no) USE_NEON=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-neon" "$LINENO" 5 ;;
    esac
else
   USE_NEON=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_NEON="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** neonhttpsrc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** neonhttpsrc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " NEON " > /dev/null; then
  USE_NEON="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** neonhttpsrc not ported" >&5
$as_echo "$as_me: WARNING: *** neonhttpsrc not ported" >&2;}
fi


if test x$USE_NEON = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_NEON=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NEON" >&5
$as_echo_n "checking for NEON... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$NEON_CFLAGS"; then
        pkg_cv_NEON_CFLAGS="$NEON_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"neon >= 0.27.0  neon <= 0.30.99\""; } >&5
  ($PKG_CONFIG --exists --print-errors "neon >= 0.27.0  neon <= 0.30.99") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NEON_CFLAGS=`$PKG_CONFIG --cflags "neon >= 0.27.0  neon <= 0.30.99" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$NEON_LIBS"; then
        pkg_cv_NEON_LIBS="$NEON_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"neon >= 0.27.0  neon <= 0.30.99\""; } >&5
  ($PKG_CONFIG --exists --print-errors "neon >= 0.27.0  neon <= 0.30.99") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NEON_LIBS=`$PKG_CONFIG --libs "neon >= 0.27.0  neon <= 0.30.99" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        NEON_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "neon >= 0.27.0  neon <= 0.30.99"`
        else
	        NEON_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "neon >= 0.27.0  neon <= 0.30.99"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$NEON_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_NEON="no"

elif test $pkg_failed = untried; then

    HAVE_NEON="no"

else
	NEON_CFLAGS=$pkg_cv_NEON_CFLAGS
	NEON_LIBS=$pkg_cv_NEON_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_NEON="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_NEON = xno; then
    USE_NEON=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: neonhttpsrc" >&5
$as_echo "$as_me: *** These plugins will be built: neonhttpsrc" >&6;}
  fi
fi
if test x$USE_NEON = xyes; then
  :
  if test "xneonhttpsrc" != "x"; then
    GST_PLUGINS_YES="\tneonhttpsrc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_NEON /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: neonhttpsrc" >&5
$as_echo "$as_me: *** These plugins will not be built: neonhttpsrc" >&6;}
  if test "xneonhttpsrc" != "x"; then
    GST_PLUGINS_NO="\tneonhttpsrc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_NEON = xyes; then
  USE_NEON_TRUE=
  USE_NEON_FALSE='#'
else
  USE_NEON_TRUE='#'
  USE_NEON_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ofa plugins ***" >&5
$as_echo "$as_me: *** checking feature: ofa plugins ***" >&6;}
if test "xofa" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: ofa ***" >&5
$as_echo "$as_me: *** for plug-ins: ofa ***" >&6;}
fi
NOUSE=
if test "x$USE_OFA" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-ofa was given.
if test "${enable_ofa+set}" = set; then :
  enableval=$enable_ofa;  case "${enableval}" in
      yes) USE_OFA=yes;;
      no) USE_OFA=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-ofa" "$LINENO" 5 ;;
    esac
else
   USE_OFA=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OFA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ofa pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** ofa pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OFA " > /dev/null; then
  USE_OFA="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** ofa not ported" >&5
$as_echo "$as_me: WARNING: *** ofa not ported" >&2;}
fi


if test x$USE_OFA = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OFA=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OFA" >&5
$as_echo_n "checking for OFA... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OFA_CFLAGS"; then
        pkg_cv_OFA_CFLAGS="$OFA_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libofa >= 0.9.3\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libofa >= 0.9.3") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OFA_CFLAGS=`$PKG_CONFIG --cflags "libofa >= 0.9.3" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OFA_LIBS"; then
        pkg_cv_OFA_LIBS="$OFA_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libofa >= 0.9.3\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libofa >= 0.9.3") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OFA_LIBS=`$PKG_CONFIG --libs "libofa >= 0.9.3" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OFA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libofa >= 0.9.3"`
        else
	        OFA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libofa >= 0.9.3"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OFA_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_OFA="no"

elif test $pkg_failed = untried; then

    HAVE_OFA="no"

else
	OFA_CFLAGS=$pkg_cv_OFA_CFLAGS
	OFA_LIBS=$pkg_cv_OFA_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_OFA="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OFA = xno; then
    USE_OFA=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: ofa" >&5
$as_echo "$as_me: *** These plugins will be built: ofa" >&6;}
  fi
fi
if test x$USE_OFA = xyes; then
  :
  if test "xofa" != "x"; then
    GST_PLUGINS_YES="\tofa\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OFA /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: ofa" >&5
$as_echo "$as_me: *** These plugins will not be built: ofa" >&6;}
  if test "xofa" != "x"; then
    GST_PLUGINS_NO="\tofa\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OFA = xyes; then
  USE_OFA_TRUE=
  USE_OFA_FALSE='#'
else
  USE_OFA_TRUE='#'
  USE_OFA_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: OpenAL plugin ***" >&5
$as_echo "$as_me: *** checking feature: OpenAL plugin ***" >&6;}
if test "xopenal" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: openal ***" >&5
$as_echo "$as_me: *** for plug-ins: openal ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENAL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-openal was given.
if test "${enable_openal+set}" = set; then :
  enableval=$enable_openal;  case "${enableval}" in
      yes) USE_OPENAL=yes;;
      no) USE_OPENAL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-openal" "$LINENO" 5 ;;
    esac
else
   USE_OPENAL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openal pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** openal pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENAL " > /dev/null; then
  USE_OPENAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openal not ported" >&5
$as_echo "$as_me: WARNING: *** openal not ported" >&2;}
fi


if test x$USE_OPENAL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENAL=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENAL" >&5
$as_echo_n "checking for OPENAL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENAL_CFLAGS"; then
        pkg_cv_OPENAL_CFLAGS="$OPENAL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openal >= 1.14\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openal >= 1.14") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENAL_CFLAGS=`$PKG_CONFIG --cflags "openal >= 1.14" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENAL_LIBS"; then
        pkg_cv_OPENAL_LIBS="$OPENAL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openal >= 1.14\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openal >= 1.14") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENAL_LIBS=`$PKG_CONFIG --libs "openal >= 1.14" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openal >= 1.14"`
        else
	        OPENAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openal >= 1.14"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENAL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_OPENAL="no"

elif test $pkg_failed = untried; then

    HAVE_OPENAL="no"

else
	OPENAL_CFLAGS=$pkg_cv_OPENAL_CFLAGS
	OPENAL_LIBS=$pkg_cv_OPENAL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_OPENAL="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENAL = xno; then
    USE_OPENAL=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: openal" >&5
$as_echo "$as_me: *** These plugins will be built: openal" >&6;}
  fi
fi
if test x$USE_OPENAL = xyes; then
  :
  if test "xopenal" != "x"; then
    GST_PLUGINS_YES="\topenal\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENAL /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: openal" >&5
$as_echo "$as_me: *** These plugins will not be built: openal" >&6;}
  if test "xopenal" != "x"; then
    GST_PLUGINS_NO="\topenal\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENAL = xyes; then
  USE_OPENAL_TRUE=
  USE_OPENAL_FALSE='#'
else
  USE_OPENAL_TRUE='#'
  USE_OPENAL_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: opencv plugins ***" >&5
$as_echo "$as_me: *** checking feature: opencv plugins ***" >&6;}
if test "xopencv" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: opencv ***" >&5
$as_echo "$as_me: *** for plug-ins: opencv ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENCV" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-opencv was given.
if test "${enable_opencv+set}" = set; then :
  enableval=$enable_opencv;  case "${enableval}" in
      yes) USE_OPENCV=yes;;
      no) USE_OPENCV=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-opencv" "$LINENO" 5 ;;
    esac
else
   USE_OPENCV=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENCV="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opencv pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** opencv pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENCV " > /dev/null; then
  USE_OPENCV="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opencv not ported" >&5
$as_echo "$as_me: WARNING: *** opencv not ported" >&2;}
fi


if test x$USE_OPENCV = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENCV=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENCV" >&5
$as_echo_n "checking for OPENCV... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENCV_CFLAGS"; then
        pkg_cv_OPENCV_CFLAGS="$OPENCV_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv < 2.5.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv < 2.5.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENCV_CFLAGS=`$PKG_CONFIG --cflags "opencv >= 2.3.0 opencv < 2.5.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENCV_LIBS"; then
        pkg_cv_OPENCV_LIBS="$OPENCV_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opencv >= 2.3.0 opencv < 2.5.0 \""; } >&5
  ($PKG_CONFIG --exists --print-errors "opencv >= 2.3.0 opencv < 2.5.0 ") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENCV_LIBS=`$PKG_CONFIG --libs "opencv >= 2.3.0 opencv < 2.5.0 " 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENCV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv < 2.5.0 "`
        else
	        OPENCV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "opencv >= 2.3.0 opencv < 2.5.0 "`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENCV_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_OPENCV="no"

elif test $pkg_failed = untried; then

    HAVE_OPENCV="no"

else
	OPENCV_CFLAGS=$pkg_cv_OPENCV_CFLAGS
	OPENCV_LIBS=$pkg_cv_OPENCV_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
if test -z "$CXX"; then
  if test -n "$CCC"; then
    CXX=$CCC
  else
    if test -n "$ac_tool_prefix"; then
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
  do
    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
set dummy $ac_tool_prefix$ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_CXX="$ac_tool_prefix$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
CXX=$ac_cv_prog_CXX
if test -n "$CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
$as_echo "$CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


    test -n "$CXX" && break
  done
fi
if test -z "$CXX"; then
  ac_ct_CXX=$CXX
  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_prog_ac_ct_CXX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CXX"; then
  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test.
else
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_prog_ac_ct_CXX="$ac_prog"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

fi
fi
ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
if test -n "$ac_ct_CXX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
$as_echo "$ac_ct_CXX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ac_ct_CXX" && break
done

  if test "x$ac_ct_CXX" = x; then
    CXX="g++"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    CXX=$ac_ct_CXX
  fi
fi

  fi
fi
# Provide some information about the compiler.
$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
set X $ac_compile
ac_compiler=$2
for ac_option in --version -v -V -qversion; do
  { { ac_try="$ac_compiler $ac_option >&5"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
$as_echo "$ac_try_echo"; } >&5
  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
  ac_status=$?
  if test -s conftest.err; then
    sed '10a\
... rest of stderr output deleted ...
         10q' conftest.err >conftest.er1
    cat conftest.er1 >&5
  fi
  rm -f conftest.er1 conftest.err
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }
done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
if ${ac_cv_cxx_compiler_gnu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
#ifndef __GNUC__
       choke me
#endif

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_compiler_gnu=yes
else
  ac_compiler_gnu=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
ac_cv_cxx_compiler_gnu=$ac_compiler_gnu

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
if test $ac_compiler_gnu = yes; then
  GXX=yes
else
  GXX=
fi
ac_test_CXXFLAGS=${CXXFLAGS+set}
ac_save_CXXFLAGS=$CXXFLAGS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
$as_echo_n "checking whether $CXX accepts -g... " >&6; }
if ${ac_cv_prog_cxx_g+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
   ac_cxx_werror_flag=yes
   ac_cv_prog_cxx_g=no
   CXXFLAGS="-g"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
else
  CXXFLAGS=""
      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :

else
  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
	 CXXFLAGS="-g"
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"; then :
  ac_cv_prog_cxx_g=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
   ac_cxx_werror_flag=$ac_save_cxx_werror_flag
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
$as_echo "$ac_cv_prog_cxx_g" >&6; }
if test "$ac_test_CXXFLAGS" = set; then
  CXXFLAGS=$ac_save_CXXFLAGS
elif test $ac_cv_prog_cxx_g = yes; then
  if test "$GXX" = yes; then
    CXXFLAGS="-g -O2"
  else
    CXXFLAGS="-g"
  fi
else
  if test "$GXX" = yes; then
    CXXFLAGS="-O2"
  else
    CXXFLAGS=
  fi
fi
ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu

depcc="$CXX"  am_compiler_list=

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
$as_echo_n "checking dependency style of $depcc... " >&6; }
if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
  # We make a subdir and do the tests there.  Otherwise we can end up
  # making bogus files that we don't know about and never remove.  For
  # instance it was reported that on HP-UX the gcc test will end up
  # making a dummy file named 'D' -- because '-MD' means "put the output
  # in D".
  rm -rf conftest.dir
  mkdir conftest.dir
  # Copy depcomp to subdir because otherwise we won't find it if we're
  # using a relative directory.
  cp "$am_depcomp" conftest.dir
  cd conftest.dir
  # We will build objects and dependencies in a subdirectory because
  # it helps to detect inapplicable dependency modes.  For instance
  # both Tru64's cc and ICC support -MD to output dependencies as a
  # side effect of compilation, but ICC will put the dependencies in
  # the current directory while Tru64 will put them in the object
  # directory.
  mkdir sub

  am_cv_CXX_dependencies_compiler_type=none
  if test "$am_compiler_list" = ""; then
     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
  fi
  am__universal=false
  case " $depcc " in #(
     *\ -arch\ *\ -arch\ *) am__universal=true ;;
     esac

  for depmode in $am_compiler_list; do
    # Setup a source with many dependencies, because some compilers
    # like to wrap large dependency lists on column 80 (with \), and
    # we should not choose a depcomp mode which is confused by this.
    #
    # We need to recreate these files for each test, as the compiler may
    # overwrite some of them when testing with obscure command lines.
    # This happens at least with the AIX C compiler.
    : > sub/conftest.c
    for i in 1 2 3 4 5 6; do
      echo '#include "conftst'$i'.h"' >> sub/conftest.c
      # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with
      # Solaris 10 /bin/sh.
      echo '/* dummy */' > sub/conftst$i.h
    done
    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf

    # We check with '-c' and '-o' for the sake of the "dashmstdout"
    # mode.  It turns out that the SunPro C++ compiler does not properly
    # handle '-M -o', and we need to detect this.  Also, some Intel
    # versions had trouble with output in subdirs.
    am__obj=sub/conftest.${OBJEXT-o}
    am__minus_obj="-o $am__obj"
    case $depmode in
    gcc)
      # This depmode causes a compiler race in universal mode.
      test "$am__universal" = false || continue
      ;;
    nosideeffect)
      # After this tag, mechanisms are not by side-effect, so they'll
      # only be used when explicitly requested.
      if test "x$enable_dependency_tracking" = xyes; then
	continue
      else
	break
      fi
      ;;
    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
      # This compiler won't grok '-c -o', but also, the minuso test has
      # not run yet.  These depmodes are late enough in the game, and
      # so weak that their functioning should not be impacted.
      am__obj=conftest.${OBJEXT-o}
      am__minus_obj=
      ;;
    none) break ;;
    esac
    if depmode=$depmode \
       source=sub/conftest.c object=$am__obj \
       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
         >/dev/null 2>conftest.err &&
       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&
       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
      # icc doesn't choke on unknown options, it will just issue warnings
      # or remarks (even with -Werror).  So we grep stderr for any message
      # that says an option was ignored or not supported.
      # When given -MP, icc 7.0 and 7.1 complain thusly:
      #   icc: Command line warning: ignoring option '-M'; no argument required
      # The diagnosis changed in icc 8.0:
      #   icc: Command line remark: option '-MP' not supported
      if (grep 'ignoring option' conftest.err ||
          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
        am_cv_CXX_dependencies_compiler_type=$depmode
        break
      fi
    fi
  done

  cd ..
  rm -rf conftest.dir
else
  am_cv_CXX_dependencies_compiler_type=none
fi

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type

 if
  test "x$enable_dependency_tracking" != xno \
  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
  am__fastdepCXX_TRUE=
  am__fastdepCXX_FALSE='#'
else
  am__fastdepCXX_TRUE='#'
  am__fastdepCXX_FALSE=
fi


    ac_ext=cpp
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu

    OLD_CPPFLAGS=$CPPFLAGS
    CPPFLAGS=$OPENCV_CFLAGS
    something_not_found=no
    for ac_header in opencv2/contrib/contrib.hpp \
                      opencv2/core/core_c.h \
                      opencv2/core/types_c.h \
                      opencv2/core/version.hpp \
                      opencv2/highgui/highgui_c.h \
                      opencv2/imgproc/imgproc.hpp \
                      opencv2/imgproc/imgproc_c.h \
                      opencv2/legacy/compat.hpp \
                      opencv2/legacy/legacy.hpp \
                      opencv2/objdetect/objdetect.hpp \
                      opencv2/video/background_segm.hpp
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_cxx_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF

else
  something_not_found=yes
fi

done

    CPPFLAGS=$OLD_CPPFLAGS
    ac_ext=c
ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu


    if test $something_not_found = "yes"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: not all opencv2 headers were found" >&5
$as_echo "not all opencv2 headers were found" >&6; }
      HAVE_OPENCV="no"
    else
      HAVE_OPENCV="yes"
    fi

fi
  OPENCV_PREFIX="`$PKG_CONFIG --variable=prefix opencv`"

cat >>confdefs.h <<_ACEOF
#define OPENCV_PREFIX "$OPENCV_PREFIX"
_ACEOF




          if test -d "$PKG_CONFIG_SYSROOT_DIR/$OPENCV_PREFIX/share/opencv/"; then

cat >>confdefs.h <<_ACEOF
#define OPENCV_PATH_NAME "opencv"
_ACEOF

  else

cat >>confdefs.h <<_ACEOF
#define OPENCV_PATH_NAME "OpenCV"
_ACEOF

  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENCV = xno; then
    USE_OPENCV=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: opencv" >&5
$as_echo "$as_me: *** These plugins will be built: opencv" >&6;}
  fi
fi
if test x$USE_OPENCV = xyes; then
  :
  if test "xopencv" != "x"; then
    GST_PLUGINS_YES="\topencv\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENCV /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: opencv" >&5
$as_echo "$as_me: *** These plugins will not be built: opencv" >&6;}
  if test "xopencv" != "x"; then
    GST_PLUGINS_NO="\topencv\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENCV = xyes; then
  USE_OPENCV_TRUE=
  USE_OPENCV_FALSE='#'
else
  USE_OPENCV_TRUE='#'
  USE_OPENCV_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: openexr library ***" >&5
$as_echo "$as_me: *** checking feature: openexr library ***" >&6;}
if test "xopenexr" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: openexr ***" >&5
$as_echo "$as_me: *** for plug-ins: openexr ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENEXR" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-openexr was given.
if test "${enable_openexr+set}" = set; then :
  enableval=$enable_openexr;  case "${enableval}" in
      yes) USE_OPENEXR=yes;;
      no) USE_OPENEXR=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-openexr" "$LINENO" 5 ;;
    esac
else
   USE_OPENEXR=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENEXR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openexr pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** openexr pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENEXR " > /dev/null; then
  USE_OPENEXR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openexr not ported" >&5
$as_echo "$as_me: WARNING: *** openexr not ported" >&2;}
fi


if test x$USE_OPENEXR = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENEXR=no


  which="OpenEXR"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENEXR" >&5
$as_echo_n "checking for OPENEXR... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENEXR_CFLAGS"; then
        pkg_cv_OPENEXR_CFLAGS="$OPENEXR_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENEXR_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENEXR_LIBS"; then
        pkg_cv_OPENEXR_LIBS="$OPENEXR_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENEXR_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENEXR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        OPENEXR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENEXR_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_OPENEXR="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$OPENEXR_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $OPENEXR_PKG_ERRORS" >&5
$as_echo "$as_me: $OPENEXR_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_OPENEXR="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$OPENEXR_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $OPENEXR_PKG_ERRORS" >&5
$as_echo "$as_me: $OPENEXR_PKG_ERRORS" >&6;}
      fi

else
	OPENEXR_CFLAGS=$pkg_cv_OPENEXR_CFLAGS
	OPENEXR_LIBS=$pkg_cv_OPENEXR_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_OPENEXR="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENEXR = xno; then
    USE_OPENEXR=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: openexr" >&5
$as_echo "$as_me: *** These plugins will be built: openexr" >&6;}
  fi
fi
if test x$USE_OPENEXR = xyes; then
  :
  if test "xopenexr" != "x"; then
    GST_PLUGINS_YES="\topenexr\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENEXR /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: openexr" >&5
$as_echo "$as_me: *** These plugins will not be built: openexr" >&6;}
  if test "xopenexr" != "x"; then
    GST_PLUGINS_NO="\topenexr\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENEXR = xyes; then
  USE_OPENEXR_TRUE=
  USE_OPENEXR_FALSE='#'
else
  USE_OPENEXR_TRUE='#'
  USE_OPENEXR_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: openh264 library ***" >&5
$as_echo "$as_me: *** checking feature: openh264 library ***" >&6;}
if test "xopenh264" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: openh264 ***" >&5
$as_echo "$as_me: *** for plug-ins: openh264 ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENH264" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-openh264 was given.
if test "${enable_openh264+set}" = set; then :
  enableval=$enable_openh264;  case "${enableval}" in
      yes) USE_OPENH264=yes;;
      no) USE_OPENH264=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-openh264" "$LINENO" 5 ;;
    esac
else
   USE_OPENH264=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENH264="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openh264 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** openh264 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENH264 " > /dev/null; then
  USE_OPENH264="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openh264 not ported" >&5
$as_echo "$as_me: WARNING: *** openh264 not ported" >&2;}
fi


if test x$USE_OPENH264 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENH264=no


  which="openh264 >= 1.3.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENH264" >&5
$as_echo_n "checking for OPENH264... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENH264_CFLAGS"; then
        pkg_cv_OPENH264_CFLAGS="$OPENH264_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENH264_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENH264_LIBS"; then
        pkg_cv_OPENH264_LIBS="$OPENH264_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENH264_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENH264_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        OPENH264_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENH264_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_OPENH264="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$OPENH264_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $OPENH264_PKG_ERRORS" >&5
$as_echo "$as_me: $OPENH264_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_OPENH264="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$OPENH264_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $OPENH264_PKG_ERRORS" >&5
$as_echo "$as_me: $OPENH264_PKG_ERRORS" >&6;}
      fi

else
	OPENH264_CFLAGS=$pkg_cv_OPENH264_CFLAGS
	OPENH264_LIBS=$pkg_cv_OPENH264_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_OPENH264="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENH264 = xno; then
    USE_OPENH264=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: openh264" >&5
$as_echo "$as_me: *** These plugins will be built: openh264" >&6;}
  fi
fi
if test x$USE_OPENH264 = xyes; then
  :
  if test "xopenh264" != "x"; then
    GST_PLUGINS_YES="\topenh264\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENH264 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: openh264" >&5
$as_echo "$as_me: *** These plugins will not be built: openh264" >&6;}
  if test "xopenh264" != "x"; then
    GST_PLUGINS_NO="\topenh264\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENH264 = xyes; then
  USE_OPENH264_TRUE=
  USE_OPENH264_FALSE='#'
else
  USE_OPENH264_TRUE='#'
  USE_OPENH264_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: openjpeg library ***" >&5
$as_echo "$as_me: *** checking feature: openjpeg library ***" >&6;}
if test "xopenjpeg" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: openjpeg ***" >&5
$as_echo "$as_me: *** for plug-ins: openjpeg ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENJPEG" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-openjpeg was given.
if test "${enable_openjpeg+set}" = set; then :
  enableval=$enable_openjpeg;  case "${enableval}" in
      yes) USE_OPENJPEG=yes;;
      no) USE_OPENJPEG=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-openjpeg" "$LINENO" 5 ;;
    esac
else
   USE_OPENJPEG=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENJPEG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openjpeg pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** openjpeg pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENJPEG " > /dev/null; then
  USE_OPENJPEG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openjpeg not ported" >&5
$as_echo "$as_me: WARNING: *** openjpeg not ported" >&2;}
fi


if test x$USE_OPENJPEG = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENJPEG=no

  HAVE_OPENJPEG="no"

  save_LIBS="$LIBS"
  save_CFLAGS="$CFLAGS"
  OPENJPEG_LIBS="-lopenjp2"
  LIBS="$LIBS $OPENJPEG_LIBS"
  CFLAGS="$CFLAGS $OPENJPEG_CFLAGS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

    #include <openjpeg-2.0/openjpeg.h>
int
main ()
{
return (int) *opj_version ();
  ;
  return 0;
}

_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  HAVE_OPENJPEG=yes
else
  HAVE_OPENJPEG=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS="$save_LIBS"
  CFLAGS="$save_CFLAGS"

  if test x"$HAVE_OPENJPEG" = x"no"; then
    OPENJPEG_LIBS=""

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENJPEG" >&5
$as_echo_n "checking for OPENJPEG... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENJPEG_CFLAGS"; then
        pkg_cv_OPENJPEG_CFLAGS="$OPENJPEG_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libopenjpeg1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENJPEG_CFLAGS=`$PKG_CONFIG --cflags "libopenjpeg1" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENJPEG_LIBS"; then
        pkg_cv_OPENJPEG_LIBS="$OPENJPEG_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenjpeg1\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libopenjpeg1") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENJPEG_LIBS=`$PKG_CONFIG --libs "libopenjpeg1" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENJPEG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libopenjpeg1"`
        else
	        OPENJPEG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libopenjpeg1"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENJPEG_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_version in -lopenjpeg" >&5
$as_echo_n "checking for opj_version in -lopenjpeg... " >&6; }
if ${ac_cv_lib_openjpeg_opj_version+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lopenjpeg  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char opj_version ();
int
main ()
{
return opj_version ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_openjpeg_opj_version=yes
else
  ac_cv_lib_openjpeg_opj_version=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_version" >&5
$as_echo "$ac_cv_lib_openjpeg_opj_version" >&6; }
if test "x$ac_cv_lib_openjpeg_opj_version" = xyes; then :
  HAVE_OPENJPEG=yes
else
  HAVE_OPENJPEG=no
fi

  if test "x$HAVE_OPENJPEG" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
if test "x$ac_cv_header_openjpeg_h" = xyes; then :
  :
else
  HAVE_OPENJPEG=no
fi


    if test "x$HAVE_OPENJPEG" = "xyes"; then
            OPENJPEG_LIBS="-lopenjpeg"
    else
      :
    fi
  else
    :
  fi




elif test $pkg_failed = untried; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for opj_version in -lopenjpeg" >&5
$as_echo_n "checking for opj_version in -lopenjpeg... " >&6; }
if ${ac_cv_lib_openjpeg_opj_version+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lopenjpeg  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char opj_version ();
int
main ()
{
return opj_version ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_openjpeg_opj_version=yes
else
  ac_cv_lib_openjpeg_opj_version=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openjpeg_opj_version" >&5
$as_echo "$ac_cv_lib_openjpeg_opj_version" >&6; }
if test "x$ac_cv_lib_openjpeg_opj_version" = xyes; then :
  HAVE_OPENJPEG=yes
else
  HAVE_OPENJPEG=no
fi

  if test "x$HAVE_OPENJPEG" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "openjpeg.h" "ac_cv_header_openjpeg_h" "$ac_includes_default"
if test "x$ac_cv_header_openjpeg_h" = xyes; then :
  :
else
  HAVE_OPENJPEG=no
fi


    if test "x$HAVE_OPENJPEG" = "xyes"; then
            OPENJPEG_LIBS="-lopenjpeg"
    else
      :
    fi
  else
    :
  fi




else
	OPENJPEG_CFLAGS=$pkg_cv_OPENJPEG_CFLAGS
	OPENJPEG_LIBS=$pkg_cv_OPENJPEG_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_OPENJPEG="yes"
fi
    if test x"$HAVE_OPENJPEG" = x"yes"; then

$as_echo "#define HAVE_OPENJPEG_1 1" >>confdefs.h

    fi
  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENJPEG = xno; then
    USE_OPENJPEG=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: openjpeg" >&5
$as_echo "$as_me: *** These plugins will be built: openjpeg" >&6;}
  fi
fi
if test x$USE_OPENJPEG = xyes; then
  :
  if test "xopenjpeg" != "x"; then
    GST_PLUGINS_YES="\topenjpeg\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENJPEG /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: openjpeg" >&5
$as_echo "$as_me: *** These plugins will not be built: openjpeg" >&6;}
  if test "xopenjpeg" != "x"; then
    GST_PLUGINS_NO="\topenjpeg\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENJPEG = xyes; then
  USE_OPENJPEG_TRUE=
  USE_OPENJPEG_FALSE='#'
else
  USE_OPENJPEG_TRUE='#'
  USE_OPENJPEG_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: openni2 library ***" >&5
$as_echo "$as_me: *** checking feature: openni2 library ***" >&6;}
if test "xopenni2" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: openni2 ***" >&5
$as_echo "$as_me: *** for plug-ins: openni2 ***" >&6;}
fi
NOUSE=
if test "x$USE_OPENNI2" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-openni2 was given.
if test "${enable_openni2+set}" = set; then :
  enableval=$enable_openni2;  case "${enableval}" in
      yes) USE_OPENNI2=yes;;
      no) USE_OPENNI2=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-openni2" "$LINENO" 5 ;;
    esac
else
   USE_OPENNI2=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPENNI2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openni2 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** openni2 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPENNI2 " > /dev/null; then
  USE_OPENNI2="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** openni2 not ported" >&5
$as_echo "$as_me: WARNING: *** openni2 not ported" >&2;}
fi


if test x$USE_OPENNI2 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPENNI2=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENNI2" >&5
$as_echo_n "checking for OPENNI2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENNI2_CFLAGS"; then
        pkg_cv_OPENNI2_CFLAGS="$OPENNI2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenni2 >= 0.26\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libopenni2 >= 0.26") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENNI2_CFLAGS=`$PKG_CONFIG --cflags "libopenni2 >= 0.26" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENNI2_LIBS"; then
        pkg_cv_OPENNI2_LIBS="$OPENNI2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libopenni2 >= 0.26\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libopenni2 >= 0.26") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENNI2_LIBS=`$PKG_CONFIG --libs "libopenni2 >= 0.26" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENNI2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libopenni2 >= 0.26"`
        else
	        OPENNI2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libopenni2 >= 0.26"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENNI2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                 HAVE_OPENNI2="no"
elif test $pkg_failed = untried; then
	 HAVE_OPENNI2="no"
else
	OPENNI2_CFLAGS=$pkg_cv_OPENNI2_CFLAGS
	OPENNI2_LIBS=$pkg_cv_OPENNI2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_OPENNI2="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPENNI2 = xno; then
    USE_OPENNI2=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: openni2" >&5
$as_echo "$as_me: *** These plugins will be built: openni2" >&6;}
  fi
fi
if test x$USE_OPENNI2 = xyes; then
  :
  if test "xopenni2" != "x"; then
    GST_PLUGINS_YES="\topenni2\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPENNI2 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: openni2" >&5
$as_echo "$as_me: *** These plugins will not be built: openni2" >&6;}
  if test "xopenni2" != "x"; then
    GST_PLUGINS_NO="\topenni2\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPENNI2 = xyes; then
  USE_OPENNI2_TRUE=
  USE_OPENNI2_FALSE='#'
else
  USE_OPENNI2_TRUE='#'
  USE_OPENNI2_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: opus ***" >&5
$as_echo "$as_me: *** checking feature: opus ***" >&6;}
if test "xopus" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: opus ***" >&5
$as_echo "$as_me: *** for plug-ins: opus ***" >&6;}
fi
NOUSE=
if test "x$USE_OPUS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-opus was given.
if test "${enable_opus+set}" = set; then :
  enableval=$enable_opus;  case "${enableval}" in
      yes) USE_OPUS=yes;;
      no) USE_OPUS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-opus" "$LINENO" 5 ;;
    esac
else
   USE_OPUS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_OPUS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opus pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** opus pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " OPUS " > /dev/null; then
  USE_OPUS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** opus not ported" >&5
$as_echo "$as_me: WARNING: *** opus not ported" >&2;}
fi


if test x$USE_OPUS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_OPUS=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPUS" >&5
$as_echo_n "checking for OPUS... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPUS_CFLAGS"; then
        pkg_cv_OPUS_CFLAGS="$OPUS_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opus >= 0.9.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "opus >= 0.9.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPUS_CFLAGS=`$PKG_CONFIG --cflags "opus >= 0.9.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPUS_LIBS"; then
        pkg_cv_OPUS_LIBS="$OPUS_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"opus >= 0.9.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "opus >= 0.9.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPUS_LIBS=`$PKG_CONFIG --libs "opus >= 0.9.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPUS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "opus >= 0.9.4"`
        else
	        OPUS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "opus >= 0.9.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPUS_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

          HAVE_OPUS="no"

elif test $pkg_failed = untried; then

          HAVE_OPUS="no"

else
	OPUS_CFLAGS=$pkg_cv_OPUS_CFLAGS
	OPUS_LIBS=$pkg_cv_OPUS_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_OPUS 1" >>confdefs.h

          HAVE_OPUS="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_OPUS = xno; then
    USE_OPUS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: opus" >&5
$as_echo "$as_me: *** These plugins will be built: opus" >&6;}
  fi
fi
if test x$USE_OPUS = xyes; then
  :
  if test "xopus" != "x"; then
    GST_PLUGINS_YES="\topus\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_OPUS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: opus" >&5
$as_echo "$as_me: *** These plugins will not be built: opus" >&6;}
  if test "xopus" != "x"; then
    GST_PLUGINS_NO="\topus\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_OPUS = xyes; then
  USE_OPUS_TRUE=
  USE_OPUS_FALSE='#'
else
  USE_OPUS_TRUE='#'
  USE_OPUS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: pvrvideosink ***" >&5
$as_echo "$as_me: *** checking feature: pvrvideosink ***" >&6;}
if test "xpvr" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: pvr ***" >&5
$as_echo "$as_me: *** for plug-ins: pvr ***" >&6;}
fi
NOUSE=
if test "x$USE_PVR" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-pvr was given.
if test "${enable_pvr+set}" = set; then :
  enableval=$enable_pvr;  case "${enableval}" in
      yes) USE_PVR=yes;;
      no) USE_PVR=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-pvr" "$LINENO" 5 ;;
    esac
else
   USE_PVR=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_PVR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pvr pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** pvr pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " PVR " > /dev/null; then
  USE_PVR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** pvr not ported" >&5
$as_echo "$as_me: WARNING: *** pvr not ported" >&2;}
fi


if test x$USE_PVR = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_PVR=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for PVR" >&5
$as_echo_n "checking for PVR... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$PVR_CFLAGS"; then
        pkg_cv_PVR_CFLAGS="$PVR_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtimemmgr\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libtimemmgr") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PVR_CFLAGS=`$PKG_CONFIG --cflags "libtimemmgr" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$PVR_LIBS"; then
        pkg_cv_PVR_LIBS="$PVR_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtimemmgr\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libtimemmgr") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_PVR_LIBS=`$PKG_CONFIG --libs "libtimemmgr" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        PVR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libtimemmgr"`
        else
	        PVR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libtimemmgr"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$PVR_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_PVR=no
elif test $pkg_failed = untried; then
	HAVE_PVR=no
else
	PVR_CFLAGS=$pkg_cv_PVR_CFLAGS
	PVR_LIBS=$pkg_cv_PVR_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_PVR=yes
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_PVR = xno; then
    USE_PVR=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: pvr" >&5
$as_echo "$as_me: *** These plugins will be built: pvr" >&6;}
  fi
fi
if test x$USE_PVR = xyes; then
  :
  if test "xpvr" != "x"; then
    GST_PLUGINS_YES="\tpvr\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_PVR /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: pvr" >&5
$as_echo "$as_me: *** These plugins will not be built: pvr" >&6;}
  if test "xpvr" != "x"; then
    GST_PLUGINS_NO="\tpvr\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_PVR = xyes; then
  USE_PVR_TRUE=
  USE_PVR_FALSE='#'
else
  USE_PVR_TRUE='#'
  USE_PVR_FALSE=
fi




# Check whether --with-pvr-external-headers was given.
if test "${with_pvr_external_headers+set}" = set; then :
  withval=$with_pvr_external_headers; if test "x$with_pvr_external_headers" = "xno"; then :
  PVR_CFLAGS="$PVR_CFLAGS -I\$(srcdir)/pvr_includes"
fi
else
  PVR_CFLAGS="$PVR_CFLAGS -I\$(srcdir)/pvr_includes"
fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: rsvg decoder ***" >&5
$as_echo "$as_me: *** checking feature: rsvg decoder ***" >&6;}
if test "xrsvg" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: rsvg ***" >&5
$as_echo "$as_me: *** for plug-ins: rsvg ***" >&6;}
fi
NOUSE=
if test "x$USE_RSVG" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-rsvg was given.
if test "${enable_rsvg+set}" = set; then :
  enableval=$enable_rsvg;  case "${enableval}" in
      yes) USE_RSVG=yes;;
      no) USE_RSVG=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-rsvg" "$LINENO" 5 ;;
    esac
else
   USE_RSVG=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_RSVG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** rsvg pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** rsvg pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " RSVG " > /dev/null; then
  USE_RSVG="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** rsvg not ported" >&5
$as_echo "$as_me: WARNING: *** rsvg not ported" >&2;}
fi


if test x$USE_RSVG = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_RSVG=no


  which="librsvg-2.0 >= 2.36.2"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RSVG" >&5
$as_echo_n "checking for RSVG... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$RSVG_CFLAGS"; then
        pkg_cv_RSVG_CFLAGS="$RSVG_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_RSVG_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$RSVG_LIBS"; then
        pkg_cv_RSVG_LIBS="$RSVG_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_RSVG_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        RSVG_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        RSVG_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$RSVG_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_RSVG="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$RSVG_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $RSVG_PKG_ERRORS" >&5
$as_echo "$as_me: $RSVG_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_RSVG="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$RSVG_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $RSVG_PKG_ERRORS" >&5
$as_echo "$as_me: $RSVG_PKG_ERRORS" >&6;}
      fi

else
	RSVG_CFLAGS=$pkg_cv_RSVG_CFLAGS
	RSVG_LIBS=$pkg_cv_RSVG_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_RSVG="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_RSVG = xno; then
    USE_RSVG=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: rsvg" >&5
$as_echo "$as_me: *** These plugins will be built: rsvg" >&6;}
  fi
fi
if test x$USE_RSVG = xyes; then
  :
  if test "xrsvg" != "x"; then
    GST_PLUGINS_YES="\trsvg\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_RSVG /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: rsvg" >&5
$as_echo "$as_me: *** These plugins will not be built: rsvg" >&6;}
  if test "xrsvg" != "x"; then
    GST_PLUGINS_NO="\trsvg\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_RSVG = xyes; then
  USE_RSVG_TRUE=
  USE_RSVG_FALSE='#'
else
  USE_RSVG_TRUE='#'
  USE_RSVG_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: gl elements ***" >&5
$as_echo "$as_me: *** checking feature: gl elements ***" >&6;}
if test "xgl" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gl ***" >&5
$as_echo "$as_me: *** for plug-ins: gl ***" >&6;}
fi
NOUSE=
if test "x$USE_GL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-gl was given.
if test "${enable_gl+set}" = set; then :
  enableval=$enable_gl;  case "${enableval}" in
      yes) USE_GL=yes;;
      no) USE_GL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-gl" "$LINENO" 5 ;;
    esac
else
   USE_GL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_GL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gl pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** gl pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " GL " > /dev/null; then
  USE_GL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gl not ported" >&5
$as_echo "$as_me: WARNING: *** gl not ported" >&2;}
fi


if test x$USE_GL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_GL=no

  HAVE_GL="no"

  if test x"$USE_OPENGL" = x"yes" -o x"$USE_GLES2" = x"yes"; then
    HAVE_GL="yes"
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_GL = xno; then
    USE_GL=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gl" >&5
$as_echo "$as_me: *** These plugins will be built: gl" >&6;}
  fi
fi
if test x$USE_GL = xyes; then
  :
  if test "xgl" != "x"; then
    GST_PLUGINS_YES="\tgl\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_GL /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gl" >&5
$as_echo "$as_me: *** These plugins will not be built: gl" >&6;}
  if test "xgl" != "x"; then
    GST_PLUGINS_NO="\tgl\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_GL = xyes; then
  USE_GL_TRUE=
  USE_GL_FALSE='#'
else
  USE_GL_TRUE='#'
  USE_GL_FALSE=
fi



HAVE_GTK3_GL="no"
echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Gtk+ elements ***" >&5
$as_echo "$as_me: *** checking feature: Gtk+ elements ***" >&6;}
if test "xgtk" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gtk ***" >&5
$as_echo "$as_me: *** for plug-ins: gtk ***" >&6;}
fi
NOUSE=
if test "x$USE_GTK3" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-gtk3 was given.
if test "${enable_gtk3+set}" = set; then :
  enableval=$enable_gtk3;  case "${enableval}" in
      yes) USE_GTK3=yes;;
      no) USE_GTK3=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-gtk3" "$LINENO" 5 ;;
    esac
else
   USE_GTK3=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_GTK3="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gtk pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** gtk pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " GTK3 " > /dev/null; then
  USE_GTK3="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gtk not ported" >&5
$as_echo "$as_me: WARNING: *** gtk not ported" >&2;}
fi


if test x$USE_GTK3 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_GTK3=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK3" >&5
$as_echo_n "checking for GTK3... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_CFLAGS"; then
        pkg_cv_GTK3_CFLAGS="$GTK3_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_LIBS"; then
        pkg_cv_GTK3_LIBS="$GTK3_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_LIBS=`$PKG_CONFIG --libs "gtk+-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK3_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0"`
        else
	        GTK3_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK3_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_GTK3="no"

elif test $pkg_failed = untried; then

    HAVE_GTK3="no"

else
	GTK3_CFLAGS=$pkg_cv_GTK3_CFLAGS
	GTK3_LIBS=$pkg_cv_GTK3_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_GTK3 1" >>confdefs.h

    HAVE_GTK3="yes"

fi

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK3_GL" >&5
$as_echo_n "checking for GTK3_GL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_GL_CFLAGS"; then
        pkg_cv_GTK3_GL_CFLAGS="$GTK3_GL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.15.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.15.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_GL_CFLAGS=`$PKG_CONFIG --cflags "gtk+-3.0 >= 3.15.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_GL_LIBS"; then
        pkg_cv_GTK3_GL_LIBS="$GTK3_GL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-3.0 >= 3.15.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-3.0 >= 3.15.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_GL_LIBS=`$PKG_CONFIG --libs "gtk+-3.0 >= 3.15.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK3_GL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-3.0 >= 3.15.0"`
        else
	        GTK3_GL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-3.0 >= 3.15.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK3_GL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_GTK3_GL="no"

elif test $pkg_failed = untried; then

      HAVE_GTK3_GL="no"

else
	GTK3_GL_CFLAGS=$pkg_cv_GTK3_GL_CFLAGS
	GTK3_GL_LIBS=$pkg_cv_GTK3_GL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    GDK_WINDOWING="no"
    if test "x$GST_GL_HAVE_WINDOW_X11" = "x1" -a "x$GST_GL_HAVE_PLATFORM_GLX" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK3_X11" >&5
$as_echo_n "checking for GTK3_X11... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_X11_CFLAGS"; then
        pkg_cv_GTK3_X11_CFLAGS="$GTK3_X11_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-x11-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_X11_CFLAGS=`$PKG_CONFIG --cflags "gtk+-x11-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_X11_LIBS"; then
        pkg_cv_GTK3_X11_LIBS="$GTK3_X11_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-x11-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-x11-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_X11_LIBS=`$PKG_CONFIG --libs "gtk+-x11-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK3_X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-x11-3.0"`
        else
	        GTK3_X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-x11-3.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK3_X11_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Gtk X11 integration" >&5
$as_echo "$as_me: Could not find Gtk X11 integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Gtk X11 integration" >&5
$as_echo "$as_me: Could not find Gtk X11 integration" >&6;}
else
	GTK3_X11_CFLAGS=$pkg_cv_GTK3_X11_CFLAGS
	GTK3_X11_LIBS=$pkg_cv_GTK3_X11_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

        GTK3_CFLAGS="$GTK3_CFLAGS $GTK3_X11_CFLAGS"
        GTK3_LIBS="$GTK3_LIBS $GTK3_X11_LIBS"
        GDK_WINDOWING="yes"

fi
    fi
    if test "x$GST_GL_HAVE_WINDOW_WAYLAND" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GTK3_WAYLAND" >&5
$as_echo_n "checking for GTK3_WAYLAND... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_WAYLAND_CFLAGS"; then
        pkg_cv_GTK3_WAYLAND_CFLAGS="$GTK3_WAYLAND_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-wayland-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-wayland-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_WAYLAND_CFLAGS=`$PKG_CONFIG --cflags "gtk+-wayland-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GTK3_WAYLAND_LIBS"; then
        pkg_cv_GTK3_WAYLAND_LIBS="$GTK3_WAYLAND_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gtk+-wayland-3.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gtk+-wayland-3.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GTK3_WAYLAND_LIBS=`$PKG_CONFIG --libs "gtk+-wayland-3.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GTK3_WAYLAND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gtk+-wayland-3.0"`
        else
	        GTK3_WAYLAND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gtk+-wayland-3.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GTK3_WAYLAND_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Gtk Wayland integration" >&5
$as_echo "$as_me: Could not find Gtk Wayland integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Gtk Wayland integration" >&5
$as_echo "$as_me: Could not find Gtk Wayland integration" >&6;}
else
	GTK3_WAYLAND_CFLAGS=$pkg_cv_GTK3_WAYLAND_CFLAGS
	GTK3_WAYLAND_LIBS=$pkg_cv_GTK3_WAYLAND_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

        GTK3_CFLAGS="$GTK3_CFLAGS $GTK3_WAYLAND_CFLAGS"
        GTK3_LIBS="$GTK3_LIBS $GTK3_WAYLAND_LIBS"
        GDK_WINDOWING="yes"

fi
    fi
    if test "x$GDK_WINDOWING" = "xyes"; then

$as_echo "#define HAVE_GTK3_GL 1" >>confdefs.h

      HAVE_GTK3_GL="yes"
    fi

fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_GTK3 = xno; then
    USE_GTK3=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gtk" >&5
$as_echo "$as_me: *** These plugins will be built: gtk" >&6;}
  fi
fi
if test x$USE_GTK3 = xyes; then
  :
  if test "xgtk" != "x"; then
    GST_PLUGINS_YES="\tgtk\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_GTK3 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gtk" >&5
$as_echo "$as_me: *** These plugins will not be built: gtk" >&6;}
  if test "xgtk" != "x"; then
    GST_PLUGINS_NO="\tgtk\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_GTK3 = xyes; then
  USE_GTK3_TRUE=
  USE_GTK3_FALSE='#'
else
  USE_GTK3_TRUE='#'
  USE_GTK3_FALSE=
fi


 if test "x$HAVE_GTK3_GL" = "xyes"; then
  USE_GTK3_GL_TRUE=
  USE_GTK3_GL_FALSE='#'
else
  USE_GTK3_GL_TRUE='#'
  USE_GTK3_GL_FALSE=
fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Qt elements ***" >&5
$as_echo "$as_me: *** checking feature: Qt elements ***" >&6;}
if test "xqt" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: qt ***" >&5
$as_echo "$as_me: *** for plug-ins: qt ***" >&6;}
fi
NOUSE=
if test "x$USE_QT" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-qt was given.
if test "${enable_qt+set}" = set; then :
  enableval=$enable_qt;  case "${enableval}" in
      yes) USE_QT=yes;;
      no) USE_QT=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-qt" "$LINENO" 5 ;;
    esac
else
   USE_QT=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_QT="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** qt pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** qt pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " QT " > /dev/null; then
  USE_QT="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** qt not ported" >&5
$as_echo "$as_me: WARNING: *** qt not ported" >&2;}
fi


if test x$USE_QT = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_QT=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT" >&5
$as_echo_n "checking for QT... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$QT_CFLAGS"; then
        pkg_cv_QT_CFLAGS="$QT_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$QT_LIBS"; then
        pkg_cv_QT_LIBS="$QT_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0"`
        else
	        QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$QT_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_QT="no"

elif test $pkg_failed = untried; then

      HAVE_QT="no"

else
	QT_CFLAGS=$pkg_cv_QT_CFLAGS
	QT_LIBS=$pkg_cv_QT_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      QT_PATH=`$PKG_CONFIG --variable=exec_prefix Qt5Core`
      QT_HOST_PATH=`$PKG_CONFIG --variable=host_bins Qt5Core`
      for ac_prog in moc-qt5 moc
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_MOC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $MOC in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_MOC="$MOC" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in "${QT_HOST_PATH}" "${QT_PATH}/bin"
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_MOC="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
MOC=$ac_cv_path_MOC
if test -n "$MOC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MOC" >&5
$as_echo "$MOC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$MOC" && break
done
test -n "$MOC" || MOC="moc"

      for ac_prog in rcc-qt5 rcc
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_RCC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $RCC in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_RCC="$RCC" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in "${QT_HOST_PATH}" "${QT_PATH}/bin"
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_RCC="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
RCC=$ac_cv_path_RCC
if test -n "$RCC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RCC" >&5
$as_echo "$RCC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$RCC" && break
done
test -n "$RCC" || RCC="rcc"

      for ac_prog in uic-qt5 uic
do
  # Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_UIC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $UIC in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_UIC="$UIC" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in "${QT_HOST_PATH}" "${QT_PATH}/bin"
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_UIC="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
UIC=$ac_cv_path_UIC
if test -n "$UIC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UIC" >&5
$as_echo "$UIC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$UIC" && break
done
test -n "$UIC" || UIC="uic"

      if test "x$MOC" = "x" || test "x$UIC" = "x" || test "x$RCC" = "x"; then
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: One of the required qt build programs was not found" >&5
$as_echo "$as_me: WARNING: One of the required qt build programs was not found" >&2;}
        HAVE_QT="no"
      else
        HAVE_QT="yes"
        HAVE_QT_WINDOWING="no"
        if test "x$GST_GL_HAVE_WINDOW_X11" = "x1" -a "x$GST_GL_HAVE_PLATFORM_GLX" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_X11" >&5
$as_echo_n "checking for QT_X11... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$QT_X11_CFLAGS"; then
        pkg_cv_QT_X11_CFLAGS="$QT_X11_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5X11Extras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5X11Extras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_X11_CFLAGS=`$PKG_CONFIG --cflags "Qt5X11Extras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$QT_X11_LIBS"; then
        pkg_cv_QT_X11_LIBS="$QT_X11_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5X11Extras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5X11Extras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_X11_LIBS=`$PKG_CONFIG --libs "Qt5X11Extras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        QT_X11_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5X11Extras"`
        else
	        QT_X11_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5X11Extras"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$QT_X11_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt X11 integration" >&5
$as_echo "$as_me: Could not find Qt X11 integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt X11 integration" >&5
$as_echo "$as_me: Could not find Qt X11 integration" >&6;}
else
	QT_X11_CFLAGS=$pkg_cv_QT_X11_CFLAGS
	QT_X11_LIBS=$pkg_cv_QT_X11_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_QT_X11 /**/" >>confdefs.h

            QT_CFLAGS="$QT_CFLAGS $QT_X11_CFLAGS"
            QT_LIBS="$QT_LIBS $QT_X11_LIBS"
            HAVE_QT_WINDOWING="yes"

fi
        fi
        if test "x$GST_GL_HAVE_WINDOW_WAYLAND" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_WAYLAND" >&5
$as_echo_n "checking for QT_WAYLAND... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$QT_WAYLAND_CFLAGS"; then
        pkg_cv_QT_WAYLAND_CFLAGS="$QT_WAYLAND_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5WaylandClient\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5WaylandClient") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_WAYLAND_CFLAGS=`$PKG_CONFIG --cflags "Qt5WaylandClient" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$QT_WAYLAND_LIBS"; then
        pkg_cv_QT_WAYLAND_LIBS="$QT_WAYLAND_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5WaylandClient\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5WaylandClient") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_WAYLAND_LIBS=`$PKG_CONFIG --libs "Qt5WaylandClient" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        QT_WAYLAND_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5WaylandClient"`
        else
	        QT_WAYLAND_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5WaylandClient"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$QT_WAYLAND_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Wayland integration" >&5
$as_echo "$as_me: Could not find Qt Wayland integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Wayland integration" >&5
$as_echo "$as_me: Could not find Qt Wayland integration" >&6;}
else
	QT_WAYLAND_CFLAGS=$pkg_cv_QT_WAYLAND_CFLAGS
	QT_WAYLAND_LIBS=$pkg_cv_QT_WAYLAND_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_QT_WAYLAND /**/" >>confdefs.h

            QT_CFLAGS="$QT_CFLAGS $QT_WAYLAND_CFLAGS"
            QT_LIBS="$QT_LIBS $QT_WAYLAND_LIBS"
            HAVE_QT_WINDOWING="yes"

fi
        fi
        if test "x$GST_GL_HAVE_WINDOW_ANDROID" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_ANDROID" >&5
$as_echo_n "checking for QT_ANDROID... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$QT_ANDROID_CFLAGS"; then
        pkg_cv_QT_ANDROID_CFLAGS="$QT_ANDROID_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5AndroidExtras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5AndroidExtras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_ANDROID_CFLAGS=`$PKG_CONFIG --cflags "Qt5AndroidExtras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$QT_ANDROID_LIBS"; then
        pkg_cv_QT_ANDROID_LIBS="$QT_ANDROID_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5AndroidExtras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5AndroidExtras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_ANDROID_LIBS=`$PKG_CONFIG --libs "Qt5AndroidExtras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        QT_ANDROID_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5AndroidExtras"`
        else
	        QT_ANDROID_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5AndroidExtras"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$QT_ANDROID_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Android integration" >&5
$as_echo "$as_me: Could not find Qt Android integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Android integration" >&5
$as_echo "$as_me: Could not find Qt Android integration" >&6;}
else
	QT_ANDROID_CFLAGS=$pkg_cv_QT_ANDROID_CFLAGS
	QT_ANDROID_LIBS=$pkg_cv_QT_ANDROID_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

            # c++ on android requires a standard library and there are multiple
            # choices.  cerbero provides a pkg-config file the describes a choice
            # so try to use that.  Outside cerbero one has to pass these flags
            # manually for the library one is using

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUSTL" >&5
$as_echo_n "checking for GNUSTL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$GNUSTL_CFLAGS"; then
        pkg_cv_GNUSTL_CFLAGS="$GNUSTL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnustl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnustl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GNUSTL_CFLAGS=`$PKG_CONFIG --cflags "gnustl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$GNUSTL_LIBS"; then
        pkg_cv_GNUSTL_LIBS="$GNUSTL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnustl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "gnustl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_GNUSTL_LIBS=`$PKG_CONFIG --libs "gnustl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        GNUSTL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnustl"`
        else
	        GNUSTL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnustl"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$GNUSTL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

              { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Standard C++ library" >&5
$as_echo "$as_me: Could not find Standard C++ library" >&6;}
elif test $pkg_failed = untried; then

              { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Standard C++ library" >&5
$as_echo "$as_me: Could not find Standard C++ library" >&6;}
else
	GNUSTL_CFLAGS=$pkg_cv_GNUSTL_CFLAGS
	GNUSTL_LIBS=$pkg_cv_GNUSTL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

              QT_CFLAGS="$QT_CFLAGS $GNUSTL_CFLAGS"
              QT_LIBS="$QT_LIBS $GNUSTL_LIBS"

fi


$as_echo "#define HAVE_QT_ANDROID /**/" >>confdefs.h

            QT_CFLAGS="$QT_CFLAGS $QT_ANDROID_CFLAGS"
            QT_LIBS="$QT_LIBS $QT_ANDROID_LIBS"
            HAVE_QT_WINDOWING="yes"

fi
        fi
        if test "x$GST_GL_HAVE_WINDOW_COCOA" = "x1" -a "x$GST_GL_HAVE_PLATFORM_CGL" = "x1"; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_MAC" >&5
$as_echo_n "checking for QT_MAC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$QT_MAC_CFLAGS"; then
        pkg_cv_QT_MAC_CFLAGS="$QT_MAC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5MacExtras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5MacExtras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_MAC_CFLAGS=`$PKG_CONFIG --cflags "Qt5MacExtras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$QT_MAC_LIBS"; then
        pkg_cv_QT_MAC_LIBS="$QT_MAC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5MacExtras\""; } >&5
  ($PKG_CONFIG --exists --print-errors "Qt5MacExtras") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_QT_MAC_LIBS=`$PKG_CONFIG --libs "Qt5MacExtras" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        QT_MAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5MacExtras"`
        else
	        QT_MAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5MacExtras"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$QT_MAC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Mac integration" >&5
$as_echo "$as_me: Could not find Qt Mac integration" >&6;}
elif test $pkg_failed = untried; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Mac integration" >&5
$as_echo "$as_me: Could not find Qt Mac integration" >&6;}
else
	QT_MAC_CFLAGS=$pkg_cv_QT_MAC_CFLAGS
	QT_MAC_LIBS=$pkg_cv_QT_MAC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_QT_MAC /**/" >>confdefs.h

            QT_LIBDIR=`$PKG_CONFIG --variable=libdir Qt5Core`
            QT_CFLAGS="$QT_CFLAGS $QT_MAC_CFLAGS -F$QT_LIBDIR -framework QtCore -framework QtGui -framework QtQuick -framework QtQml -framework QtMacExtras"
            QT_LIBS="$QT_LIBS $QT_MAC_LIBS"
            HAVE_QT_WINDOWING="yes"

fi
        fi
        if test "x$GST_GL_HAVE_WINDOW_EAGL" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EAGL" = "x1"; then
          if test "x$HAVE_IOS" = "xyes"; then
            # iOS doesn't have its own extras package so if we have the core
            # modules we are good to go

$as_echo "#define HAVE_QT_IOS /**/" >>confdefs.h

            HAVE_QT_WINDOWING="yes"
          fi
        fi
        if test "x$HAVE_QT_WINDOWING" = "xno"; then
          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find any Qt Windowing integration" >&5
$as_echo "$as_me: WARNING: Could not find any Qt Windowing integration" >&2;}
          HAVE_QT="no"
        fi


      fi

fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_QT = xno; then
    USE_QT=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: qt" >&5
$as_echo "$as_me: *** These plugins will be built: qt" >&6;}
  fi
fi
if test x$USE_QT = xyes; then
  :
  if test "xqt" != "x"; then
    GST_PLUGINS_YES="\tqt\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_QT /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: qt" >&5
$as_echo "$as_me: *** These plugins will not be built: qt" >&6;}
  if test "xqt" != "x"; then
    GST_PLUGINS_NO="\tqt\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_QT = xyes; then
  USE_QT_TRUE=
  USE_QT_FALSE='#'
else
  USE_QT_TRUE='#'
  USE_QT_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Vulkan elements ***" >&5
$as_echo "$as_me: *** checking feature: Vulkan elements ***" >&6;}
if test "xvulkan" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vulkan ***" >&5
$as_echo "$as_me: *** for plug-ins: vulkan ***" >&6;}
fi
NOUSE=
if test "x$USE_VULKAN" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-vulkan was given.
if test "${enable_vulkan+set}" = set; then :
  enableval=$enable_vulkan;  case "${enableval}" in
      yes) USE_VULKAN=yes;;
      no) USE_VULKAN=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-vulkan" "$LINENO" 5 ;;
    esac
else
   USE_VULKAN=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_VULKAN="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vulkan pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** vulkan pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VULKAN " > /dev/null; then
  USE_VULKAN="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vulkan not ported" >&5
$as_echo "$as_me: WARNING: *** vulkan not ported" >&2;}
fi


if test x$USE_VULKAN = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_VULKAN=no

  HAVE_VULKAN=no
  ac_fn_c_check_header_mongrel "$LINENO" "vulkan/vulkan.h" "ac_cv_header_vulkan_vulkan_h" "$ac_includes_default"
if test "x$ac_cv_header_vulkan_vulkan_h" = xyes; then :

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vkCreateDevice in -lvulkan" >&5
$as_echo_n "checking for vkCreateDevice in -lvulkan... " >&6; }
if ${ac_cv_lib_vulkan_vkCreateDevice+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lvulkan  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char vkCreateDevice ();
int
main ()
{
return vkCreateDevice ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_vulkan_vkCreateDevice=yes
else
  ac_cv_lib_vulkan_vkCreateDevice=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vulkan_vkCreateDevice" >&5
$as_echo "$ac_cv_lib_vulkan_vkCreateDevice" >&6; }
if test "x$ac_cv_lib_vulkan_vkCreateDevice" = xyes; then :

      VULKAN_LIBS="-lvulkan"

            if test "x$HAVE_XCB" = "xyes"; then
        HAVE_VULKAN=yes
      fi

fi


fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_VULKAN = xno; then
    USE_VULKAN=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vulkan" >&5
$as_echo "$as_me: *** These plugins will be built: vulkan" >&6;}
  fi
fi
if test x$USE_VULKAN = xyes; then
  :
  if test "xvulkan" != "x"; then
    GST_PLUGINS_YES="\tvulkan\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_VULKAN /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vulkan" >&5
$as_echo "$as_me: *** These plugins will not be built: vulkan" >&6;}
  if test "xvulkan" != "x"; then
    GST_PLUGINS_NO="\tvulkan\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_VULKAN = xyes; then
  USE_VULKAN_TRUE=
  USE_VULKAN_FALSE='#'
else
  USE_VULKAN_TRUE='#'
  USE_VULKAN_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: libvisual visualization library ***" >&5
$as_echo "$as_me: *** checking feature: libvisual visualization library ***" >&6;}
if test "xlibvisual" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: libvisual ***" >&5
$as_echo "$as_me: *** for plug-ins: libvisual ***" >&6;}
fi
NOUSE=
if test "x$USE_LIBVISUAL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-libvisual was given.
if test "${enable_libvisual+set}" = set; then :
  enableval=$enable_libvisual;  case "${enableval}" in
      yes) USE_LIBVISUAL=yes;;
      no) USE_LIBVISUAL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-libvisual" "$LINENO" 5 ;;
    esac
else
   USE_LIBVISUAL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_LIBVISUAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libvisual pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** libvisual pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " LIBVISUAL " > /dev/null; then
  USE_LIBVISUAL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** libvisual not ported" >&5
$as_echo "$as_me: WARNING: *** libvisual not ported" >&2;}
fi


if test x$USE_LIBVISUAL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_LIBVISUAL=no


  which="libvisual-0.4 >= 0.4.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBVISUAL" >&5
$as_echo_n "checking for LIBVISUAL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBVISUAL_CFLAGS"; then
        pkg_cv_LIBVISUAL_CFLAGS="$LIBVISUAL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBVISUAL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBVISUAL_LIBS"; then
        pkg_cv_LIBVISUAL_LIBS="$LIBVISUAL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBVISUAL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        LIBVISUAL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBVISUAL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_LIBVISUAL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_LIBVISUAL="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$LIBVISUAL_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $LIBVISUAL_PKG_ERRORS" >&5
$as_echo "$as_me: $LIBVISUAL_PKG_ERRORS" >&6;}
      fi

else
	LIBVISUAL_CFLAGS=$pkg_cv_LIBVISUAL_CFLAGS
	LIBVISUAL_LIBS=$pkg_cv_LIBVISUAL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_LIBVISUAL="yes"

fi


  if test x$HAVE_LIBVISUAL = xyes; then
    LIBVIS_PLUGINSDIR="`$PKG_CONFIG --variable=pluginsbasedir libvisual-0.4`"
  fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: libvisual pluginsdir: $LIBVIS_PLUGINSDIR" >&5
$as_echo "$as_me: libvisual pluginsdir: $LIBVIS_PLUGINSDIR" >&6;}
  if test x$LIBVIS_PLUGINSDIR != x; then

cat >>confdefs.h <<_ACEOF
#define LIBVISUAL_PLUGINSBASEDIR "$LIBVIS_PLUGINSDIR"
_ACEOF

  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_LIBVISUAL = xno; then
    USE_LIBVISUAL=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: libvisual" >&5
$as_echo "$as_me: *** These plugins will be built: libvisual" >&6;}
  fi
fi
if test x$USE_LIBVISUAL = xyes; then
  :
  if test "xlibvisual" != "x"; then
    GST_PLUGINS_YES="\tlibvisual\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_LIBVISUAL /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: libvisual" >&5
$as_echo "$as_me: *** These plugins will not be built: libvisual" >&6;}
  if test "xlibvisual" != "x"; then
    GST_PLUGINS_NO="\tlibvisual\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_LIBVISUAL = xyes; then
  USE_LIBVISUAL_TRUE=
  USE_LIBVISUAL_FALSE='#'
else
  USE_LIBVISUAL_TRUE='#'
  USE_LIBVISUAL_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: timidity midi soft synth plugin ***" >&5
$as_echo "$as_me: *** checking feature: timidity midi soft synth plugin ***" >&6;}
if test "xtimidity" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: timidity ***" >&5
$as_echo "$as_me: *** for plug-ins: timidity ***" >&6;}
fi
NOUSE=
if test "x$USE_TIMIDITY" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-timidity was given.
if test "${enable_timidity+set}" = set; then :
  enableval=$enable_timidity;  case "${enableval}" in
      yes) USE_TIMIDITY=yes;;
      no) USE_TIMIDITY=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-timidity" "$LINENO" 5 ;;
    esac
else
   USE_TIMIDITY=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_TIMIDITY="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** timidity pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** timidity pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " TIMIDITY " > /dev/null; then
  USE_TIMIDITY="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** timidity not ported" >&5
$as_echo "$as_me: WARNING: *** timidity not ported" >&2;}
fi


if test x$USE_TIMIDITY = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_TIMIDITY=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TIMIDITY" >&5
$as_echo_n "checking for TIMIDITY... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$TIMIDITY_CFLAGS"; then
        pkg_cv_TIMIDITY_CFLAGS="$TIMIDITY_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtimidity\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libtimidity") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TIMIDITY_CFLAGS=`$PKG_CONFIG --cflags "libtimidity" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$TIMIDITY_LIBS"; then
        pkg_cv_TIMIDITY_LIBS="$TIMIDITY_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libtimidity\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libtimidity") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TIMIDITY_LIBS=`$PKG_CONFIG --libs "libtimidity" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        TIMIDITY_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libtimidity"`
        else
	        TIMIDITY_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libtimidity"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$TIMIDITY_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_TIMIDITY="no"

elif test $pkg_failed = untried; then

    HAVE_TIMIDITY="no"

else
	TIMIDITY_CFLAGS=$pkg_cv_TIMIDITY_CFLAGS
	TIMIDITY_LIBS=$pkg_cv_TIMIDITY_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_TIMIDITY="yes",
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for timidity.cfg" >&5
$as_echo_n "checking for timidity.cfg... " >&6; }
	timidity_cfg=""
	if test -r /etc/timidity.cfg; then
	  timidity_cfg=/etc/timidity.cfg
	elif test -r /etc/timidity/timidity.cfg; then
	  timidity_cfg=/etc/timidity/timidity.cfg
	elif test -r /usr/share/timidity/timidity.cfg; then
	  timidity_cfg=/usr/share/timidity/timidity.cfg
	elif test -r /usr/local/share/timidity/timidity.cfg; then
	  timidity_cfg=/usr/local/share/timidity/timidity.cfg
	fi
	if test "x$timidity_cfg" != "x"; then
	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $timidity_cfg" >&5
$as_echo "$timidity_cfg" >&6; }

cat >>confdefs.h <<_ACEOF
#define TIMIDITY_CFG "$timidity_cfg"
_ACEOF

	else
	  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
	fi

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_TIMIDITY = xno; then
    USE_TIMIDITY=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: timidity" >&5
$as_echo "$as_me: *** These plugins will be built: timidity" >&6;}
  fi
fi
if test x$USE_TIMIDITY = xyes; then
  :
  if test "xtimidity" != "x"; then
    GST_PLUGINS_YES="\ttimidity\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_TIMIDITY /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: timidity" >&5
$as_echo "$as_me: *** These plugins will not be built: timidity" >&6;}
  if test "xtimidity" != "x"; then
    GST_PLUGINS_NO="\ttimidity\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_TIMIDITY = xyes; then
  USE_TIMIDITY_TRUE=
  USE_TIMIDITY_FALSE='#'
else
  USE_TIMIDITY_TRUE='#'
  USE_TIMIDITY_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Teletext decoder ***" >&5
$as_echo "$as_me: *** checking feature: Teletext decoder ***" >&6;}
if test "xteletextdec" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: teletextdec ***" >&5
$as_echo "$as_me: *** for plug-ins: teletextdec ***" >&6;}
fi
NOUSE=
if test "x$USE_TELETEXTDEC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-teletextdec was given.
if test "${enable_teletextdec+set}" = set; then :
  enableval=$enable_teletextdec;  case "${enableval}" in
      yes) USE_TELETEXTDEC=yes;;
      no) USE_TELETEXTDEC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-teletextdec" "$LINENO" 5 ;;
    esac
else
   USE_TELETEXTDEC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_TELETEXTDEC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** teletextdec pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** teletextdec pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " TELETEXTDEC " > /dev/null; then
  USE_TELETEXTDEC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** teletextdec not ported" >&5
$as_echo "$as_me: WARNING: *** teletextdec not ported" >&2;}
fi


if test x$USE_TELETEXTDEC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_TELETEXTDEC=no


  which="zvbi-0.2"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for TELETEXTDEC" >&5
$as_echo_n "checking for TELETEXTDEC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$TELETEXTDEC_CFLAGS"; then
        pkg_cv_TELETEXTDEC_CFLAGS="$TELETEXTDEC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TELETEXTDEC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$TELETEXTDEC_LIBS"; then
        pkg_cv_TELETEXTDEC_LIBS="$TELETEXTDEC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_TELETEXTDEC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        TELETEXTDEC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        TELETEXTDEC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$TELETEXTDEC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_TELETEXTDEC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$TELETEXTDEC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $TELETEXTDEC_PKG_ERRORS" >&5
$as_echo "$as_me: $TELETEXTDEC_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_TELETEXTDEC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$TELETEXTDEC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $TELETEXTDEC_PKG_ERRORS" >&5
$as_echo "$as_me: $TELETEXTDEC_PKG_ERRORS" >&6;}
      fi

else
	TELETEXTDEC_CFLAGS=$pkg_cv_TELETEXTDEC_CFLAGS
	TELETEXTDEC_LIBS=$pkg_cv_TELETEXTDEC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_TELETEXTDEC="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_TELETEXTDEC = xno; then
    USE_TELETEXTDEC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: teletextdec" >&5
$as_echo "$as_me: *** These plugins will be built: teletextdec" >&6;}
  fi
fi
if test x$USE_TELETEXTDEC = xyes; then
  :
  if test "xteletextdec" != "x"; then
    GST_PLUGINS_YES="\tteletextdec\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_TELETEXTDEC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: teletextdec" >&5
$as_echo "$as_me: *** These plugins will not be built: teletextdec" >&6;}
  if test "xteletextdec" != "x"; then
    GST_PLUGINS_NO="\tteletextdec\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_TELETEXTDEC = xyes; then
  USE_TELETEXTDEC_TRUE=
  USE_TELETEXTDEC_FALSE='#'
else
  USE_TELETEXTDEC_TRUE='#'
  USE_TELETEXTDEC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: wildmidi midi soft synth plugin ***" >&5
$as_echo "$as_me: *** checking feature: wildmidi midi soft synth plugin ***" >&6;}
if test "xwildmidi" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wildmidi ***" >&5
$as_echo "$as_me: *** for plug-ins: wildmidi ***" >&6;}
fi
NOUSE=
if test "x$USE_WILDMIDI" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-wildmidi was given.
if test "${enable_wildmidi+set}" = set; then :
  enableval=$enable_wildmidi;  case "${enableval}" in
      yes) USE_WILDMIDI=yes;;
      no) USE_WILDMIDI=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-wildmidi" "$LINENO" 5 ;;
    esac
else
   USE_WILDMIDI=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WILDMIDI="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wildmidi pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** wildmidi pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WILDMIDI " > /dev/null; then
  USE_WILDMIDI="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wildmidi not ported" >&5
$as_echo "$as_me: WARNING: *** wildmidi not ported" >&2;}
fi


if test x$USE_WILDMIDI = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WILDMIDI=no


  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WildMidi_Init in -lWildMidi" >&5
$as_echo_n "checking for WildMidi_Init in -lWildMidi... " >&6; }
if ${ac_cv_lib_WildMidi_WildMidi_Init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lWildMidi  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char WildMidi_Init ();
int
main ()
{
return WildMidi_Init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_WildMidi_WildMidi_Init=yes
else
  ac_cv_lib_WildMidi_WildMidi_Init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_WildMidi_WildMidi_Init" >&5
$as_echo "$ac_cv_lib_WildMidi_WildMidi_Init" >&6; }
if test "x$ac_cv_lib_WildMidi_WildMidi_Init" = xyes; then :
  HAVE_WILDMIDI=yes
else
  HAVE_WILDMIDI=no
fi

  if test "x$HAVE_WILDMIDI" = "xyes"; then
    ac_fn_c_check_header_mongrel "$LINENO" "wildmidi_lib.h" "ac_cv_header_wildmidi_lib_h" "$ac_includes_default"
if test "x$ac_cv_header_wildmidi_lib_h" = xyes; then :
  :
else
  HAVE_WILDMIDI=no
fi


    if test "x$HAVE_WILDMIDI" = "xyes"; then
            WILDMIDI_LIBS="-lWildMidi"
    else
      :
    fi
  else
    :
  fi



  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for WildMidi_LoadSamples in -lWildMidi" >&5
$as_echo_n "checking for WildMidi_LoadSamples in -lWildMidi... " >&6; }
if ${ac_cv_lib_WildMidi_WildMidi_LoadSamples+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lWildMidi  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char WildMidi_LoadSamples ();
int
main ()
{
return WildMidi_LoadSamples ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_WildMidi_WildMidi_LoadSamples=yes
else
  ac_cv_lib_WildMidi_WildMidi_LoadSamples=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_WildMidi_WildMidi_LoadSamples" >&5
$as_echo "$ac_cv_lib_WildMidi_WildMidi_LoadSamples" >&6; }
if test "x$ac_cv_lib_WildMidi_WildMidi_LoadSamples" = xyes; then :

$as_echo "#define HAVE_WILDMIDI_0_2_2 1" >>confdefs.h

fi


  if test "x$HAVE_WILDMIDI" = "xyes"; then
	 WILDMIDI_CFLAGS=
	 WILDMIDI_LIBS=-lWildMidi
	 { $as_echo "$as_me:${as_lineno-$LINENO}: compiling gstWildMidi" >&5
$as_echo "$as_me: compiling gstWildMidi" >&6;}
  else
	 WILDMIDI_CFLAGS=
	 WILDMIDI_LIBS=
	 { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no WildMidi library found (libWildMidi)" >&5
$as_echo "$as_me: WARNING: no WildMidi library found (libWildMidi)" >&2;}
  fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WILDMIDI = xno; then
    USE_WILDMIDI=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wildmidi" >&5
$as_echo "$as_me: *** These plugins will be built: wildmidi" >&6;}
  fi
fi
if test x$USE_WILDMIDI = xyes; then
  :
  if test "xwildmidi" != "x"; then
    GST_PLUGINS_YES="\twildmidi\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WILDMIDI /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wildmidi" >&5
$as_echo "$as_me: *** These plugins will not be built: wildmidi" >&6;}
  if test "xwildmidi" != "x"; then
    GST_PLUGINS_NO="\twildmidi\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WILDMIDI = xyes; then
  USE_WILDMIDI_TRUE=
  USE_WILDMIDI_FALSE='#'
else
  USE_WILDMIDI_TRUE='#'
  USE_WILDMIDI_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: SDL plug-in ***" >&5
$as_echo "$as_me: *** checking feature: SDL plug-in ***" >&6;}
if test "xsdlvideosink sdlaudiosink" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sdlvideosink sdlaudiosink ***" >&5
$as_echo "$as_me: *** for plug-ins: sdlvideosink sdlaudiosink ***" >&6;}
fi
NOUSE=
if test "x$USE_SDL" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-sdl was given.
if test "${enable_sdl+set}" = set; then :
  enableval=$enable_sdl;  case "${enableval}" in
      yes) USE_SDL=yes;;
      no) USE_SDL=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-sdl" "$LINENO" 5 ;;
    esac
else
   USE_SDL=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SDL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sdlvideosink sdlaudiosink pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** sdlvideosink sdlaudiosink pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SDL " > /dev/null; then
  USE_SDL="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sdlvideosink sdlaudiosink not ported" >&5
$as_echo "$as_me: WARNING: *** sdlvideosink sdlaudiosink not ported" >&2;}
fi


if test x$USE_SDL = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SDL=no


# Check whether --with-sdl-prefix was given.
if test "${with_sdl_prefix+set}" = set; then :
  withval=$with_sdl_prefix; sdl_prefix="$withval"
else
  sdl_prefix=""
fi



# Check whether --with-sdl-exec-prefix was given.
if test "${with_sdl_exec_prefix+set}" = set; then :
  withval=$with_sdl_exec_prefix; sdl_exec_prefix="$withval"
else
  sdl_exec_prefix=""
fi


# Check whether --enable-sdltest was given.
if test "${enable_sdltest+set}" = set; then :
  enableval=$enable_sdltest;
else
  enable_sdltest=yes
fi


  if test x$sdl_exec_prefix != x ; then
     sdl_args="$sdl_args --exec-prefix=$sdl_exec_prefix"
     if test x${SDL_CONFIG+set} != xset ; then
        SDL_CONFIG=$sdl_exec_prefix/bin/sdl-config
     fi
  fi
  if test x$sdl_prefix != x ; then
     sdl_args="$sdl_args --prefix=$sdl_prefix"
     if test x${SDL_CONFIG+set} != xset ; then
        SDL_CONFIG=$sdl_prefix/bin/sdl-config
     fi
  fi

  # Extract the first word of "sdl-config", so it can be a program name with args.
set dummy sdl-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_SDL_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $SDL_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_SDL_CONFIG="$SDL_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_SDL_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  test -z "$ac_cv_path_SDL_CONFIG" && ac_cv_path_SDL_CONFIG="no"
  ;;
esac
fi
SDL_CONFIG=$ac_cv_path_SDL_CONFIG
if test -n "$SDL_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SDL_CONFIG" >&5
$as_echo "$SDL_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  min_sdl_version=0.11.0
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for SDL - version >= $min_sdl_version" >&5
$as_echo_n "checking for SDL - version >= $min_sdl_version... " >&6; }
  no_sdl=""
  if test "$SDL_CONFIG" = "no" ; then
    no_sdl=yes
  else
    SDL_CFLAGS=`$SDL_CONFIG $sdlconf_args --cflags`
    SDL_LIBS=`$SDL_CONFIG $sdlconf_args --libs`
    SDL_STATIC_LIBS=`$SDL_CONFIG $sdlconf_args --static-libs`


    sdl_major_version=`$SDL_CONFIG $sdl_args --version | \
           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\1/'`
    sdl_minor_version=`$SDL_CONFIG $sdl_args --version | \
           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\2/'`
    sdl_micro_version=`$SDL_CONFIG $sdl_config_args --version | \
           sed 's/\([0-9]*\).\([0-9]*\).\([0-9]*\)/\3/'`
    if test "x$enable_sdltest" = "xyes" ; then
      ac_save_CFLAGS="$CFLAGS"
      ac_save_LIBS="$LIBS"
      CFLAGS="$CFLAGS $SDL_CFLAGS"
      LIBS="$LIBS $SDL_STATIC_LIBS"
      rm -f conf.sdltest
      if test "$cross_compiling" = yes; then :
  echo $ac_n "cross compiling; assumed OK... $ac_c"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "SDL.h"

char*
my_strdup (char *str)
{
  char *new_str;

  if (str)
    {
      new_str = (char *)malloc ((strlen (str) + 1) * sizeof(char));
      strcpy (new_str, str);
    }
  else
    new_str = NULL;

  return new_str;
}

int main (int argc, char *argv[])
{
  int major, minor, micro;
  char *tmp_version;

  /* This hangs on some systems (?)
  system ("touch conf.sdltest");
  */
  { FILE *fp = fopen("conf.sdltest", "a"); if ( fp ) fclose(fp); }

  /* HP/UX 9 (%@#!) writes to sscanf strings */
  tmp_version = my_strdup("$min_sdl_version");
  if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
     printf("%s, bad version string\n", "$min_sdl_version");
     exit(1);
   }

   if (($sdl_major_version > major) ||
      (($sdl_major_version == major) && ($sdl_minor_version > minor)) ||
      (($sdl_major_version == major) && ($sdl_minor_version == minor) && ($sdl_micro_version >= micro)))
    {
      return 0;
    }
  else
    {
      printf("\n*** 'sdl-config --version' returned %d.%d.%d, but the minimum version\n", $sdl_major_version, $sdl_minor_version, $sdl_micro_version);
      printf("*** of SDL required is %d.%d.%d. If sdl-config is correct, then it is\n", major, minor, micro);
      printf("*** best to upgrade to the required version.\n");
      printf("*** If sdl-config was wrong, set the environment variable SDL_CONFIG\n");
      printf("*** to point to the correct copy of sdl-config, and remove the file\n");
      printf("*** config.cache before re-running configure\n");
      return 1;
    }
}


_ACEOF
if ac_fn_c_try_run "$LINENO"; then :

else
  no_sdl=yes
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

       CFLAGS="$ac_save_CFLAGS"
       LIBS="$ac_save_LIBS"
     fi
  fi
  if test "x$no_sdl" = x ; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
     HAVE_SDL=yes
  else
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
     if test "$SDL_CONFIG" = "no" ; then
       echo "*** The sdl-config script installed by SDL could not be found"
       echo "*** If SDL was installed in PREFIX, make sure PREFIX/bin is in"
       echo "*** your path, or set the SDL_CONFIG environment variable to the"
       echo "*** full path to sdl-config."
     else
       if test -f conf.sdltest ; then
        :
       else
          echo "*** Could not run SDL test program, checking why..."
          CFLAGS="$CFLAGS $SDL_CFLAGS"
          LIBS="$LIBS $SDL_LIBS"
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

#include <stdio.h>
#include "SDL.h"

int main(int argc, char *argv[])
{ return 0; }
#undef  main
#define main K_and_R_C_main

int
main ()
{
 return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
   echo "*** The test program compiled, but did not run. This usually means"
          echo "*** that the run-time linker is not finding SDL or finding the wrong"
          echo "*** version of SDL. If it is not finding SDL, you'll need to set your"
          echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
          echo "*** to the installed location  Also, make sure you have run ldconfig if that"
          echo "*** is required on your system"
	  echo "***"
          echo "*** If you have an old version installed, it is best to remove it, although"
          echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"
else
   echo "*** The test program failed to compile or link. See the file config.log for the"
          echo "*** exact error that occured. This usually means SDL was incorrectly installed"
          echo "*** or that you have moved SDL since it was installed. In the latter case, you"
          echo "*** may want to edit the sdl-config script: $SDL_CONFIG"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
          CFLAGS="$ac_save_CFLAGS"
          LIBS="$ac_save_LIBS"
       fi
     fi
     SDL_CFLAGS=""
     SDL_LIBS=""
     HAVE_SDL=no
  fi


  rm -f conf.sdltest



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SDL = xno; then
    USE_SDL=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sdlvideosink sdlaudiosink" >&5
$as_echo "$as_me: *** These plugins will be built: sdlvideosink sdlaudiosink" >&6;}
  fi
fi
if test x$USE_SDL = xyes; then
  :
  if test "xsdlvideosink sdlaudiosink" != "x"; then
    GST_PLUGINS_YES="\tsdlvideosink sdlaudiosink\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SDL /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sdlvideosink sdlaudiosink" >&5
$as_echo "$as_me: *** These plugins will not be built: sdlvideosink sdlaudiosink" >&6;}
  if test "xsdlvideosink sdlaudiosink" != "x"; then
    GST_PLUGINS_NO="\tsdlvideosink sdlaudiosink\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SDL = xyes; then
  USE_SDL_TRUE=
  USE_SDL_FALSE='#'
else
  USE_SDL_TRUE='#'
  USE_SDL_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Smooth Streaming plug-in ***" >&5
$as_echo "$as_me: *** checking feature: Smooth Streaming plug-in ***" >&6;}
if test "xsmoothstreaming" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: smoothstreaming ***" >&5
$as_echo "$as_me: *** for plug-ins: smoothstreaming ***" >&6;}
fi
NOUSE=
if test "x$USE_SMOOTHSTREAMING" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-smoothstreaming was given.
if test "${enable_smoothstreaming+set}" = set; then :
  enableval=$enable_smoothstreaming;  case "${enableval}" in
      yes) USE_SMOOTHSTREAMING=yes;;
      no) USE_SMOOTHSTREAMING=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-smoothstreaming" "$LINENO" 5 ;;
    esac
else
   USE_SMOOTHSTREAMING=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SMOOTHSTREAMING="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** smoothstreaming pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** smoothstreaming pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SMOOTHSTREAMING " > /dev/null; then
  USE_SMOOTHSTREAMING="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** smoothstreaming not ported" >&5
$as_echo "$as_me: WARNING: *** smoothstreaming not ported" >&2;}
fi


if test x$USE_SMOOTHSTREAMING = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SMOOTHSTREAMING=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBXML2" >&5
$as_echo_n "checking for LIBXML2... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$LIBXML2_CFLAGS"; then
        pkg_cv_LIBXML2_CFLAGS="$LIBXML2_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBXML2_CFLAGS=`$PKG_CONFIG --cflags "libxml-2.0 >= 2.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$LIBXML2_LIBS"; then
        pkg_cv_LIBXML2_LIBS="$LIBXML2_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libxml-2.0 >= 2.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libxml-2.0 >= 2.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_LIBXML2_LIBS=`$PKG_CONFIG --libs "libxml-2.0 >= 2.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        LIBXML2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libxml-2.0 >= 2.4"`
        else
	        LIBXML2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libxml-2.0 >= 2.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$LIBXML2_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_LIBXML2="no"
     HAVE_SMOOTHSTREAMING="no"
elif test $pkg_failed = untried; then
	HAVE_LIBXML2="no"
     HAVE_SMOOTHSTREAMING="no"
else
	LIBXML2_CFLAGS=$pkg_cv_LIBXML2_CFLAGS
	LIBXML2_LIBS=$pkg_cv_LIBXML2_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_LIBXML2="yes"
     HAVE_SMOOTHSTREAMING="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SMOOTHSTREAMING = xno; then
    USE_SMOOTHSTREAMING=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: smoothstreaming" >&5
$as_echo "$as_me: *** These plugins will be built: smoothstreaming" >&6;}
  fi
fi
if test x$USE_SMOOTHSTREAMING = xyes; then
  :
  if test "xsmoothstreaming" != "x"; then
    GST_PLUGINS_YES="\tsmoothstreaming\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SMOOTHSTREAMING /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: smoothstreaming" >&5
$as_echo "$as_me: *** These plugins will not be built: smoothstreaming" >&6;}
  if test "xsmoothstreaming" != "x"; then
    GST_PLUGINS_NO="\tsmoothstreaming\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SMOOTHSTREAMING = xyes; then
  USE_SMOOTHSTREAMING_TRUE=
  USE_SMOOTHSTREAMING_FALSE='#'
else
  USE_SMOOTHSTREAMING_TRUE='#'
  USE_SMOOTHSTREAMING_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: sndfile plug-in ***" >&5
$as_echo "$as_me: *** checking feature: sndfile plug-in ***" >&6;}
if test "xsfdec sfenc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sfdec sfenc ***" >&5
$as_echo "$as_me: *** for plug-ins: sfdec sfenc ***" >&6;}
fi
NOUSE=
if test "x$USE_SNDFILE" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-sndfile was given.
if test "${enable_sndfile+set}" = set; then :
  enableval=$enable_sndfile;  case "${enableval}" in
      yes) USE_SNDFILE=yes;;
      no) USE_SNDFILE=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-sndfile" "$LINENO" 5 ;;
    esac
else
   USE_SNDFILE=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SNDFILE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sfdec sfenc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** sfdec sfenc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SNDFILE " > /dev/null; then
  USE_SNDFILE="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sfdec sfenc not ported" >&5
$as_echo "$as_me: WARNING: *** sfdec sfenc not ported" >&2;}
fi


if test x$USE_SNDFILE = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SNDFILE=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SNDFILE" >&5
$as_echo_n "checking for SNDFILE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SNDFILE_CFLAGS"; then
        pkg_cv_SNDFILE_CFLAGS="$SNDFILE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.16\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.16") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SNDFILE_CFLAGS=`$PKG_CONFIG --cflags "sndfile >= 1.0.16" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SNDFILE_LIBS"; then
        pkg_cv_SNDFILE_LIBS="$SNDFILE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"sndfile >= 1.0.16\""; } >&5
  ($PKG_CONFIG --exists --print-errors "sndfile >= 1.0.16") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SNDFILE_LIBS=`$PKG_CONFIG --libs "sndfile >= 1.0.16" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SNDFILE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "sndfile >= 1.0.16"`
        else
	        SNDFILE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "sndfile >= 1.0.16"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SNDFILE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SNDFILE="no"
elif test $pkg_failed = untried; then
	HAVE_SNDFILE="no"
else
	SNDFILE_CFLAGS=$pkg_cv_SNDFILE_CFLAGS
	SNDFILE_LIBS=$pkg_cv_SNDFILE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SNDFILE="yes"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SNDFILE = xno; then
    USE_SNDFILE=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sfdec sfenc" >&5
$as_echo "$as_me: *** These plugins will be built: sfdec sfenc" >&6;}
  fi
fi
if test x$USE_SNDFILE = xyes; then
  :
  if test "xsfdec sfenc" != "x"; then
    GST_PLUGINS_YES="\tsfdec sfenc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SNDFILE /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sfdec sfenc" >&5
$as_echo "$as_me: *** These plugins will not be built: sfdec sfenc" >&6;}
  if test "xsfdec sfenc" != "x"; then
    GST_PLUGINS_NO="\tsfdec sfenc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SNDFILE = xyes; then
  USE_SNDFILE_TRUE=
  USE_SNDFILE_FALSE='#'
else
  USE_SNDFILE_TRUE='#'
  USE_SNDFILE_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: soundtouch plug-in ***" >&5
$as_echo "$as_me: *** checking feature: soundtouch plug-in ***" >&6;}
if test "xsoundtouch" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: soundtouch ***" >&5
$as_echo "$as_me: *** for plug-ins: soundtouch ***" >&6;}
fi
NOUSE=
if test "x$USE_SOUNDTOUCH" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-soundtouch was given.
if test "${enable_soundtouch+set}" = set; then :
  enableval=$enable_soundtouch;  case "${enableval}" in
      yes) USE_SOUNDTOUCH=yes;;
      no) USE_SOUNDTOUCH=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-soundtouch" "$LINENO" 5 ;;
    esac
else
   USE_SOUNDTOUCH=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SOUNDTOUCH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** soundtouch pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** soundtouch pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SOUNDTOUCH " > /dev/null; then
  USE_SOUNDTOUCH="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** soundtouch not ported" >&5
$as_echo "$as_me: WARNING: *** soundtouch not ported" >&2;}
fi


if test x$USE_SOUNDTOUCH = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SOUNDTOUCH=no

        HAVE_SOUNDTOUCH_1_4=yes

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.0"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
          HAVE_SOUNDTOUCH_1_4=no
          SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.0"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
          HAVE_SOUNDTOUCH_1_4=no
          SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.0"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
          HAVE_SOUNDTOUCH_1_4=no
          SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"soundtouch-1.0\""; } >&5
  ($PKG_CONFIG --exists --print-errors "soundtouch-1.0") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "soundtouch-1.0" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "soundtouch-1.0"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "soundtouch-1.0"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch >= 1.4\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch >= 1.4") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch >= 1.4" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch >= 1.4"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
elif test $pkg_failed = untried; then

pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SOUNDTOUCH" >&5
$as_echo_n "checking for SOUNDTOUCH... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_CFLAGS"; then
        pkg_cv_SOUNDTOUCH_CFLAGS="$SOUNDTOUCH_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_CFLAGS=`$PKG_CONFIG --cflags "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SOUNDTOUCH_LIBS"; then
        pkg_cv_SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libSoundTouch\""; } >&5
  ($PKG_CONFIG --exists --print-errors "libSoundTouch") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SOUNDTOUCH_LIBS=`$PKG_CONFIG --libs "libSoundTouch" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libSoundTouch"`
        else
	        SOUNDTOUCH_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libSoundTouch"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SOUNDTOUCH_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                HAVE_SOUNDTOUCH=no
elif test $pkg_failed = untried; then
	HAVE_SOUNDTOUCH=no
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
              HAVE_SOUNDTOUCH_1_4=no
              SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
          HAVE_SOUNDTOUCH_1_4=no
          SOUNDTOUCH_LIBS="$SOUNDTOUCH_LIBS -lBPM"
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi
else
	SOUNDTOUCH_CFLAGS=$pkg_cv_SOUNDTOUCH_CFLAGS
	SOUNDTOUCH_LIBS=$pkg_cv_SOUNDTOUCH_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_SOUNDTOUCH=yes
fi


  if test "x$HAVE_CXX" != "xyes"; then
    USE_SOUNDTOUCH=false
    { $as_echo "$as_me:${as_lineno-$LINENO}: Not building soundtouch plugin: no C++ compiler found" >&5
$as_echo "$as_me: Not building soundtouch plugin: no C++ compiler found" >&6;}
  fi
  if test "x$HAVE_SOUNDTOUCH" = "xyes" -a "x$HAVE_SOUNDTOUCH_1_4" = "xyes"; then

$as_echo "#define HAVE_SOUNDTOUCH_1_4 1" >>confdefs.h

  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SOUNDTOUCH = xno; then
    USE_SOUNDTOUCH=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: soundtouch" >&5
$as_echo "$as_me: *** These plugins will be built: soundtouch" >&6;}
  fi
fi
if test x$USE_SOUNDTOUCH = xyes; then
  :
  if test "xsoundtouch" != "x"; then
    GST_PLUGINS_YES="\tsoundtouch\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SOUNDTOUCH /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: soundtouch" >&5
$as_echo "$as_me: *** These plugins will not be built: soundtouch" >&6;}
  if test "xsoundtouch" != "x"; then
    GST_PLUGINS_NO="\tsoundtouch\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SOUNDTOUCH = xyes; then
  USE_SOUNDTOUCH_TRUE=
  USE_SOUNDTOUCH_FALSE='#'
else
  USE_SOUNDTOUCH_TRUE='#'
  USE_SOUNDTOUCH_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: spc decoder ***" >&5
$as_echo "$as_me: *** checking feature: spc decoder ***" >&6;}
if test "xspc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: spc ***" >&5
$as_echo "$as_me: *** for plug-ins: spc ***" >&6;}
fi
NOUSE=
if test "x$USE_SPC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-spc was given.
if test "${enable_spc+set}" = set; then :
  enableval=$enable_spc;  case "${enableval}" in
      yes) USE_SPC=yes;;
      no) USE_SPC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-spc" "$LINENO" 5 ;;
    esac
else
   USE_SPC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SPC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** spc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** spc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SPC " > /dev/null; then
  USE_SPC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** spc not ported" >&5
$as_echo "$as_me: WARNING: *** spc not ported" >&2;}
fi


if test x$USE_SPC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SPC=no

  ac_fn_c_check_header_mongrel "$LINENO" "openspc.h" "ac_cv_header_openspc_h" "$ac_includes_default"
if test "x$ac_cv_header_openspc_h" = xyes; then :

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for OSPC_Init in -lopenspc" >&5
$as_echo_n "checking for OSPC_Init in -lopenspc... " >&6; }
if ${ac_cv_lib_openspc_OSPC_Init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lopenspc  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char OSPC_Init ();
int
main ()
{
return OSPC_Init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_openspc_OSPC_Init=yes
else
  ac_cv_lib_openspc_OSPC_Init=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_openspc_OSPC_Init" >&5
$as_echo "$ac_cv_lib_openspc_OSPC_Init" >&6; }
if test "x$ac_cv_lib_openspc_OSPC_Init" = xyes; then :

      SPC_LIBS="-lopenspc"

      HAVE_SPC=yes

else

      HAVE_SPC=no

fi


else

    HAVE_SPC=no

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SPC = xno; then
    USE_SPC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: spc" >&5
$as_echo "$as_me: *** These plugins will be built: spc" >&6;}
  fi
fi
if test x$USE_SPC = xyes; then
  :
  if test "xspc" != "x"; then
    GST_PLUGINS_YES="\tspc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SPC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: spc" >&5
$as_echo "$as_me: *** These plugins will not be built: spc" >&6;}
  if test "xspc" != "x"; then
    GST_PLUGINS_NO="\tspc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SPC = xyes; then
  USE_SPC_TRUE=
  USE_SPC_FALSE='#'
else
  USE_SPC_TRUE='#'
  USE_SPC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: gme decoder ***" >&5
$as_echo "$as_me: *** checking feature: gme decoder ***" >&6;}
if test "xgme" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: gme ***" >&5
$as_echo "$as_me: *** for plug-ins: gme ***" >&6;}
fi
NOUSE=
if test "x$USE_GME" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-gme was given.
if test "${enable_gme+set}" = set; then :
  enableval=$enable_gme;  case "${enableval}" in
      yes) USE_GME=yes;;
      no) USE_GME=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-gme" "$LINENO" 5 ;;
    esac
else
   USE_GME=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_GME="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gme pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** gme pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " GME " > /dev/null; then
  USE_GME="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** gme not ported" >&5
$as_echo "$as_me: WARNING: *** gme not ported" >&2;}
fi


if test x$USE_GME = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_GME=no

  ac_fn_c_check_header_mongrel "$LINENO" "gme/gme.h" "ac_cv_header_gme_gme_h" "$ac_includes_default"
if test "x$ac_cv_header_gme_gme_h" = xyes; then :

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gme_new_emu in -lgme" >&5
$as_echo_n "checking for gme_new_emu in -lgme... " >&6; }
if ${ac_cv_lib_gme_gme_new_emu+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgme  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gme_new_emu ();
int
main ()
{
return gme_new_emu ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gme_gme_new_emu=yes
else
  ac_cv_lib_gme_gme_new_emu=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gme_gme_new_emu" >&5
$as_echo "$ac_cv_lib_gme_gme_new_emu" >&6; }
if test "x$ac_cv_lib_gme_gme_new_emu" = xyes; then :

      GME_LIBS="-lgme"

      HAVE_GME=yes

else

      HAVE_GME=no

fi


else

    HAVE_GME=no

fi



  if test "x$HAVE_GME" = "xyes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gme_enable_accuracy in -lgme" >&5
$as_echo_n "checking for gme_enable_accuracy in -lgme... " >&6; }
if ${ac_cv_lib_gme_gme_enable_accuracy+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgme  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char gme_enable_accuracy ();
int
main ()
{
return gme_enable_accuracy ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gme_gme_enable_accuracy=yes
else
  ac_cv_lib_gme_gme_enable_accuracy=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_gme_gme_enable_accuracy" >&5
$as_echo "$ac_cv_lib_gme_gme_enable_accuracy" >&6; }
if test "x$ac_cv_lib_gme_gme_enable_accuracy" = xyes; then :


$as_echo "#define HAVE_LIBGME_ACCURACY 1" >>confdefs.h


fi

  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_GME = xno; then
    USE_GME=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: gme" >&5
$as_echo "$as_me: *** These plugins will be built: gme" >&6;}
  fi
fi
if test x$USE_GME = xyes; then
  :
  if test "xgme" != "x"; then
    GST_PLUGINS_YES="\tgme\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_GME /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: gme" >&5
$as_echo "$as_me: *** These plugins will not be built: gme" >&6;}
  if test "xgme" != "x"; then
    GST_PLUGINS_NO="\tgme\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_GME = xyes; then
  USE_GME_TRUE=
  USE_GME_FALSE='#'
else
  USE_GME_TRUE='#'
  USE_GME_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: xvid plugins ***" >&5
$as_echo "$as_me: *** checking feature: xvid plugins ***" >&6;}
if test "xxvid" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: xvid ***" >&5
$as_echo "$as_me: *** for plug-ins: xvid ***" >&6;}
fi
NOUSE=
if test "x$USE_XVID" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-xvid was given.
if test "${enable_xvid+set}" = set; then :
  enableval=$enable_xvid;  case "${enableval}" in
      yes) USE_XVID=yes;;
      no) USE_XVID=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-xvid" "$LINENO" 5 ;;
    esac
else
   USE_XVID=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_XVID="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** xvid pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** xvid pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " XVID " > /dev/null; then
  USE_XVID="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** xvid not ported" >&5
$as_echo "$as_me: WARNING: *** xvid not ported" >&2;}
fi


if test x$USE_XVID = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_XVID=no

  HAVE_XVID=no
  ac_fn_c_check_header_mongrel "$LINENO" "xvid.h" "ac_cv_header_xvid_h" "$ac_includes_default"
if test "x$ac_cv_header_xvid_h" = xyes; then :

    OLD_LIBS="$LIBS"
    LIBS="$PTHREAD_LIBS $LIBM"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xvid_encore in -lxvidcore" >&5
$as_echo_n "checking for xvid_encore in -lxvidcore... " >&6; }
if ${ac_cv_lib_xvidcore_xvid_encore+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxvidcore  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char xvid_encore ();
int
main ()
{
return xvid_encore ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xvidcore_xvid_encore=yes
else
  ac_cv_lib_xvidcore_xvid_encore=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xvidcore_xvid_encore" >&5
$as_echo "$ac_cv_lib_xvidcore_xvid_encore" >&6; }
if test "x$ac_cv_lib_xvidcore_xvid_encore" = xyes; then :

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xvid_decore in -lxvidcore" >&5
$as_echo_n "checking for xvid_decore in -lxvidcore... " >&6; }
if ${ac_cv_lib_xvidcore_xvid_decore+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxvidcore  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char xvid_decore ();
int
main ()
{
return xvid_decore ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xvidcore_xvid_decore=yes
else
  ac_cv_lib_xvidcore_xvid_decore=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xvidcore_xvid_decore" >&5
$as_echo "$ac_cv_lib_xvidcore_xvid_decore" >&6; }
if test "x$ac_cv_lib_xvidcore_xvid_decore" = xyes; then :

        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xvid_global in -lxvidcore" >&5
$as_echo_n "checking for xvid_global in -lxvidcore... " >&6; }
if ${ac_cv_lib_xvidcore_xvid_global+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxvidcore  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char xvid_global ();
int
main ()
{
return xvid_global ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xvidcore_xvid_global=yes
else
  ac_cv_lib_xvidcore_xvid_global=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_xvidcore_xvid_global" >&5
$as_echo "$ac_cv_lib_xvidcore_xvid_global" >&6; }
if test "x$ac_cv_lib_xvidcore_xvid_global" = xyes; then :

          { $as_echo "$as_me:${as_lineno-$LINENO}: checking for up-to-date XviD API version" >&5
$as_echo_n "checking for up-to-date XviD API version... " >&6; }
          cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <xvid.h>
int
main ()
{

              #if XVID_API_MAJOR(XVID_API) != 4
              #error "Incompatible XviD API version"
              #endif
	      #if XVID_API_MAJOR(XVID_API) == 4 && XVID_API_MINOR(XVID_API) < 3
              #error "Incompatible XviD API version"
	      #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
            XVID_LIBS="-lxvidcore $LIBM"

            HAVE_XVID=yes

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

fi


fi


fi

    LIBS="$OLD_LIBS"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_XVID = xno; then
    USE_XVID=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: xvid" >&5
$as_echo "$as_me: *** These plugins will be built: xvid" >&6;}
  fi
fi
if test x$USE_XVID = xyes; then
  :
  if test "xxvid" != "x"; then
    GST_PLUGINS_YES="\txvid\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_XVID /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: xvid" >&5
$as_echo "$as_me: *** These plugins will not be built: xvid" >&6;}
  if test "xxvid" != "x"; then
    GST_PLUGINS_NO="\txvid\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_XVID = xyes; then
  USE_XVID_TRUE=
  USE_XVID_FALSE='#'
else
  USE_XVID_TRUE='#'
  USE_XVID_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: DVB Source ***" >&5
$as_echo "$as_me: *** checking feature: DVB Source ***" >&6;}
if test "xdvb" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: dvb ***" >&5
$as_echo "$as_me: *** for plug-ins: dvb ***" >&6;}
fi
NOUSE=
if test "x$USE_DVB" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-dvb was given.
if test "${enable_dvb+set}" = set; then :
  enableval=$enable_dvb;  case "${enableval}" in
      yes) USE_DVB=yes;;
      no) USE_DVB=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-dvb" "$LINENO" 5 ;;
    esac
else
   USE_DVB=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_DVB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dvb pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** dvb pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " DVB " > /dev/null; then
  USE_DVB="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** dvb not ported" >&5
$as_echo "$as_me: WARNING: *** dvb not ported" >&2;}
fi


if test x$USE_DVB = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_DVB=no

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for up to date dvb installation" >&5
$as_echo_n "checking Checking for up to date dvb installation... " >&6; }
  ac_fn_c_check_header_mongrel "$LINENO" "linux/dvb/version.h" "ac_cv_header_linux_dvb_version_h" "$ac_includes_default"
if test "x$ac_cv_header_linux_dvb_version_h" = xyes; then :

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for up-to-date dvb API" >&5
$as_echo_n "checking for up-to-date dvb API... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <linux/dvb/version.h>
int
main ()
{

        #if DVB_API_VERSION < 5 || (DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR <= 4)
        #error "Incompatible dvb API"
        #endif

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
      HAVE_DVB="yes"

else
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
      HAVE_DVB="no"

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

else
  HAVE_DVB="no"
fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_DVB = xno; then
    USE_DVB=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: dvb" >&5
$as_echo "$as_me: *** These plugins will be built: dvb" >&6;}
  fi
fi
if test x$USE_DVB = xyes; then
  :
  if test "xdvb" != "x"; then
    GST_PLUGINS_YES="\tdvb\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_DVB /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: dvb" >&5
$as_echo "$as_me: *** These plugins will not be built: dvb" >&6;}
  if test "xdvb" != "x"; then
    GST_PLUGINS_NO="\tdvb\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_DVB = xyes; then
  USE_DVB_TRUE=
  USE_DVB_FALSE='#'
else
  USE_DVB_TRUE='#'
  USE_DVB_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Windows internet library ***" >&5
$as_echo "$as_me: *** checking feature: Windows internet library ***" >&6;}
if test "xwininet" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: wininet ***" >&5
$as_echo "$as_me: *** for plug-ins: wininet ***" >&6;}
fi
NOUSE=
if test "x$USE_WININET" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-wininet was given.
if test "${enable_wininet+set}" = set; then :
  enableval=$enable_wininet;  case "${enableval}" in
      yes) USE_WININET=yes;;
      no) USE_WININET=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-wininet" "$LINENO" 5 ;;
    esac
else
   USE_WININET=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_WININET="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wininet pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** wininet pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " WININET " > /dev/null; then
  USE_WININET="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** wininet not ported" >&5
$as_echo "$as_me: WARNING: *** wininet not ported" >&2;}
fi


if test x$USE_WININET = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_WININET=no

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for windows internet support" >&5
$as_echo_n "checking Checking for windows internet support... " >&6; }
  for ac_header in windows.h wininet.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
#include <windows.h>
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
 HAVE_WININET="yes"
else
  HAVE_WININET="no"
fi

done



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_WININET = xno; then
    USE_WININET=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: wininet" >&5
$as_echo "$as_me: *** These plugins will be built: wininet" >&6;}
  fi
fi
if test x$USE_WININET = xyes; then
  :
  if test "xwininet" != "x"; then
    GST_PLUGINS_YES="\twininet\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_WININET /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: wininet" >&5
$as_echo "$as_me: *** These plugins will not be built: wininet" >&6;}
  if test "xwininet" != "x"; then
    GST_PLUGINS_NO="\twininet\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_WININET = xyes; then
  USE_WININET_TRUE=
  USE_WININET_FALSE='#'
else
  USE_WININET_TRUE='#'
  USE_WININET_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Windows ACM library ***" >&5
$as_echo "$as_me: *** checking feature: Windows ACM library ***" >&6;}
if test "xacm" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: acm ***" >&5
$as_echo "$as_me: *** for plug-ins: acm ***" >&6;}
fi
NOUSE=
if test "x$USE_ACM" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-acm was given.
if test "${enable_acm+set}" = set; then :
  enableval=$enable_acm;  case "${enableval}" in
      yes) USE_ACM=yes;;
      no) USE_ACM=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-acm" "$LINENO" 5 ;;
    esac
else
   USE_ACM=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_ACM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** acm pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** acm pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ACM " > /dev/null; then
  USE_ACM="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** acm not ported" >&5
$as_echo "$as_me: WARNING: *** acm not ported" >&2;}
fi


if test x$USE_ACM = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_ACM=no

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking Checking for ACM support" >&5
$as_echo_n "checking Checking for ACM support... " >&6; }
  for ac_header in windows.h msacm.h
do :
  as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
#include <windows.h>
"
if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
_ACEOF
 HAVE_ACM="yes"



else
  HAVE_ACM="no"
fi

done



  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_ACM = xno; then
    USE_ACM=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: acm" >&5
$as_echo "$as_me: *** These plugins will be built: acm" >&6;}
  fi
fi
if test x$USE_ACM = xyes; then
  :
  if test "xacm" != "x"; then
    GST_PLUGINS_YES="\tacm\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_ACM /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: acm" >&5
$as_echo "$as_me: *** These plugins will not be built: acm" >&6;}
  if test "xacm" != "x"; then
    GST_PLUGINS_NO="\tacm\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_ACM = xyes; then
  USE_ACM_TRUE=
  USE_ACM_FALSE='#'
else
  USE_ACM_TRUE='#'
  USE_ACM_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: VDPAU ***" >&5
$as_echo "$as_me: *** checking feature: VDPAU ***" >&6;}
if test "xvdpau" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: vdpau ***" >&5
$as_echo "$as_me: *** for plug-ins: vdpau ***" >&6;}
fi
NOUSE=
if test "x$USE_VDPAU" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-vdpau was given.
if test "${enable_vdpau+set}" = set; then :
  enableval=$enable_vdpau;  case "${enableval}" in
      yes) USE_VDPAU=yes;;
      no) USE_VDPAU=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-vdpau" "$LINENO" 5 ;;
    esac
else
   USE_VDPAU=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_VDPAU="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vdpau pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** vdpau pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " VDPAU " > /dev/null; then
  USE_VDPAU="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** vdpau not ported" >&5
$as_echo "$as_me: WARNING: *** vdpau not ported" >&2;}
fi


if test x$USE_VDPAU = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_VDPAU=no

  VDPAU_CFLAGS=
  VDPAU_LIBS=-lvdpau
  HAVE_VDPAU=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for VDPAU" >&5
$as_echo_n "checking for VDPAU... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$VDPAU_CFLAGS"; then
        pkg_cv_VDPAU_CFLAGS="$VDPAU_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vdpau\""; } >&5
  ($PKG_CONFIG --exists --print-errors "vdpau") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VDPAU_CFLAGS=`$PKG_CONFIG --cflags "vdpau" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$VDPAU_LIBS"; then
        pkg_cv_VDPAU_LIBS="$VDPAU_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"vdpau\""; } >&5
  ($PKG_CONFIG --exists --print-errors "vdpau") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_VDPAU_LIBS=`$PKG_CONFIG --libs "vdpau" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        VDPAU_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "vdpau"`
        else
	        VDPAU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "vdpau"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$VDPAU_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    if test "$HAVE_VDPAU" = "no"; then
      saved_CPPFLAGS="$CPPFLAGS"
      ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau.h" "ac_cv_header_vdpau_vdpau_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_h" = xyes; then :
  HAVE_VDPAU_H=yes
fi



      if test -z "$HAVE_VDPAU_H"; then
                        { $as_echo "$as_me:${as_lineno-$LINENO}: VDPAU header not in standard path. Checking /usr/include/nvidia" >&5
$as_echo "$as_me: VDPAU header not in standard path. Checking /usr/include/nvidia" >&6;}
        unset ac_cv_header_vdpau_vdpau_h
        unset ac_cv_header_vdpau_vdpau_x11_h
        VDPAU_CFLAGS="-I/usr/include/nvidia"
        VDPAU_LIBS="-L/usr/lib/nvidia -lvdpau"
        CPPFLAGS="$VDPAU_CFLAGS $saved_CPPFLAGS"
        ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau.h" "ac_cv_header_vdpau_vdpau_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_h" = xyes; then :
  HAVE_VDPAU_H=yes
fi


      fi

      ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau_x11.h" "ac_cv_header_vdpau_vdpau_x11_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_x11_h" = xyes; then :
  HAVE_VDPAU_X11_H=yes
fi



      if test "x$HAVE_VDPAU_H" = "xyes" -a "x$HAVE_VDPAU_X11_H" = "xyes"; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: VDPAU headers found. Checking libraries" >&5
$as_echo "$as_me: VDPAU headers found. Checking libraries" >&6;}
        saved_LIBS="$LIBS"
        LIBS="$VDPAU_LIBS $saved_LIBS"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vdp_device_create_x11 in -lvdpau" >&5
$as_echo_n "checking for vdp_device_create_x11 in -lvdpau... " >&6; }
if ${ac_cv_lib_vdpau_vdp_device_create_x11+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lvdpau  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char vdp_device_create_x11 ();
int
main ()
{
return vdp_device_create_x11 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_vdpau_vdp_device_create_x11=yes
else
  ac_cv_lib_vdpau_vdp_device_create_x11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vdpau_vdp_device_create_x11" >&5
$as_echo "$ac_cv_lib_vdpau_vdp_device_create_x11" >&6; }
if test "x$ac_cv_lib_vdpau_vdp_device_create_x11" = xyes; then :
  HAVE_VDPAU="yes"
fi

        LIBS="$saved_LIBS"
      fi
    fi

elif test $pkg_failed = untried; then

    if test "$HAVE_VDPAU" = "no"; then
      saved_CPPFLAGS="$CPPFLAGS"
      ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau.h" "ac_cv_header_vdpau_vdpau_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_h" = xyes; then :
  HAVE_VDPAU_H=yes
fi



      if test -z "$HAVE_VDPAU_H"; then
                        { $as_echo "$as_me:${as_lineno-$LINENO}: VDPAU header not in standard path. Checking /usr/include/nvidia" >&5
$as_echo "$as_me: VDPAU header not in standard path. Checking /usr/include/nvidia" >&6;}
        unset ac_cv_header_vdpau_vdpau_h
        unset ac_cv_header_vdpau_vdpau_x11_h
        VDPAU_CFLAGS="-I/usr/include/nvidia"
        VDPAU_LIBS="-L/usr/lib/nvidia -lvdpau"
        CPPFLAGS="$VDPAU_CFLAGS $saved_CPPFLAGS"
        ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau.h" "ac_cv_header_vdpau_vdpau_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_h" = xyes; then :
  HAVE_VDPAU_H=yes
fi


      fi

      ac_fn_c_check_header_mongrel "$LINENO" "vdpau/vdpau_x11.h" "ac_cv_header_vdpau_vdpau_x11_h" "$ac_includes_default"
if test "x$ac_cv_header_vdpau_vdpau_x11_h" = xyes; then :
  HAVE_VDPAU_X11_H=yes
fi



      if test "x$HAVE_VDPAU_H" = "xyes" -a "x$HAVE_VDPAU_X11_H" = "xyes"; then
                { $as_echo "$as_me:${as_lineno-$LINENO}: VDPAU headers found. Checking libraries" >&5
$as_echo "$as_me: VDPAU headers found. Checking libraries" >&6;}
        saved_LIBS="$LIBS"
        LIBS="$VDPAU_LIBS $saved_LIBS"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for vdp_device_create_x11 in -lvdpau" >&5
$as_echo_n "checking for vdp_device_create_x11 in -lvdpau... " >&6; }
if ${ac_cv_lib_vdpau_vdp_device_create_x11+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lvdpau  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char vdp_device_create_x11 ();
int
main ()
{
return vdp_device_create_x11 ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_vdpau_vdp_device_create_x11=yes
else
  ac_cv_lib_vdpau_vdp_device_create_x11=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_vdpau_vdp_device_create_x11" >&5
$as_echo "$ac_cv_lib_vdpau_vdp_device_create_x11" >&6; }
if test "x$ac_cv_lib_vdpau_vdp_device_create_x11" = xyes; then :
  HAVE_VDPAU="yes"
fi

        LIBS="$saved_LIBS"
      fi
    fi

else
	VDPAU_CFLAGS=$pkg_cv_VDPAU_CFLAGS
	VDPAU_LIBS=$pkg_cv_VDPAU_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
	HAVE_VDPAU="yes"
fi

  if test "$HAVE_VDPAU" = "yes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: Found up to date VDPAU installation" >&5
$as_echo "$as_me: Found up to date VDPAU installation" >&6;}


  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_VDPAU = xno; then
    USE_VDPAU=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: vdpau" >&5
$as_echo "$as_me: *** These plugins will be built: vdpau" >&6;}
  fi
fi
if test x$USE_VDPAU = xyes; then
  :
  if test "xvdpau" != "x"; then
    GST_PLUGINS_YES="\tvdpau\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_VDPAU /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: vdpau" >&5
$as_echo "$as_me: *** These plugins will not be built: vdpau" >&6;}
  if test "xvdpau" != "x"; then
    GST_PLUGINS_NO="\tvdpau\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_VDPAU = xyes; then
  USE_VDPAU_TRUE=
  USE_VDPAU_FALSE='#'
else
  USE_VDPAU_TRUE='#'
  USE_VDPAU_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: SBC bluetooth audio codec ***" >&5
$as_echo "$as_me: *** checking feature: SBC bluetooth audio codec ***" >&6;}
if test "xsbc" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sbc ***" >&5
$as_echo "$as_me: *** for plug-ins: sbc ***" >&6;}
fi
NOUSE=
if test "x$USE_SBC" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-sbc was given.
if test "${enable_sbc+set}" = set; then :
  enableval=$enable_sbc;  case "${enableval}" in
      yes) USE_SBC=yes;;
      no) USE_SBC=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-sbc" "$LINENO" 5 ;;
    esac
else
   USE_SBC=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SBC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sbc pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** sbc pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SBC " > /dev/null; then
  USE_SBC="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sbc not ported" >&5
$as_echo "$as_me: WARNING: *** sbc not ported" >&2;}
fi


if test x$USE_SBC = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SBC=no


  which="sbc >= 1.0"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SBC" >&5
$as_echo_n "checking for SBC... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SBC_CFLAGS"; then
        pkg_cv_SBC_CFLAGS="$SBC_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SBC_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SBC_LIBS"; then
        pkg_cv_SBC_LIBS="$SBC_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SBC_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SBC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        SBC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SBC_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_SBC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$SBC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $SBC_PKG_ERRORS" >&5
$as_echo "$as_me: $SBC_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_SBC="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$SBC_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $SBC_PKG_ERRORS" >&5
$as_echo "$as_me: $SBC_PKG_ERRORS" >&6;}
      fi

else
	SBC_CFLAGS=$pkg_cv_SBC_CFLAGS
	SBC_LIBS=$pkg_cv_SBC_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_SBC="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SBC = xno; then
    USE_SBC=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sbc" >&5
$as_echo "$as_me: *** These plugins will be built: sbc" >&6;}
  fi
fi
if test x$USE_SBC = xyes; then
  :
  if test "xsbc" != "x"; then
    GST_PLUGINS_YES="\tsbc\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SBC /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sbc" >&5
$as_echo "$as_me: *** These plugins will not be built: sbc" >&6;}
  if test "xsbc" != "x"; then
    GST_PLUGINS_NO="\tsbc\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SBC = xyes; then
  USE_SBC_TRUE=
  USE_SBC_FALSE='#'
else
  USE_SBC_TRUE='#'
  USE_SBC_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Schroedinger video codec ***" >&5
$as_echo "$as_me: *** checking feature: Schroedinger video codec ***" >&6;}
if test "xschro" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: schro ***" >&5
$as_echo "$as_me: *** for plug-ins: schro ***" >&6;}
fi
NOUSE=
if test "x$USE_SCHRO" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-schro was given.
if test "${enable_schro+set}" = set; then :
  enableval=$enable_schro;  case "${enableval}" in
      yes) USE_SCHRO=yes;;
      no) USE_SCHRO=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-schro" "$LINENO" 5 ;;
    esac
else
   USE_SCHRO=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SCHRO="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** schro pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** schro pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SCHRO " > /dev/null; then
  USE_SCHRO="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** schro not ported" >&5
$as_echo "$as_me: WARNING: *** schro not ported" >&2;}
fi


if test x$USE_SCHRO = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SCHRO=no


  which="schroedinger-1.0 >= 1.0.10"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SCHRO" >&5
$as_echo_n "checking for SCHRO... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SCHRO_CFLAGS"; then
        pkg_cv_SCHRO_CFLAGS="$SCHRO_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SCHRO_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SCHRO_LIBS"; then
        pkg_cv_SCHRO_LIBS="$SCHRO_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SCHRO_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SCHRO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        SCHRO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SCHRO_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_SCHRO="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$SCHRO_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $SCHRO_PKG_ERRORS" >&5
$as_echo "$as_me: $SCHRO_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_SCHRO="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$SCHRO_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $SCHRO_PKG_ERRORS" >&5
$as_echo "$as_me: $SCHRO_PKG_ERRORS" >&6;}
      fi

else
	SCHRO_CFLAGS=$pkg_cv_SCHRO_CFLAGS
	SCHRO_LIBS=$pkg_cv_SCHRO_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_SCHRO="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SCHRO = xno; then
    USE_SCHRO=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: schro" >&5
$as_echo "$as_me: *** These plugins will be built: schro" >&6;}
  fi
fi
if test x$USE_SCHRO = xyes; then
  :
  if test "xschro" != "x"; then
    GST_PLUGINS_YES="\tschro\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SCHRO /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: schro" >&5
$as_echo "$as_me: *** These plugins will not be built: schro" >&6;}
  if test "xschro" != "x"; then
    GST_PLUGINS_NO="\tschro\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SCHRO = xyes; then
  USE_SCHRO_TRUE=
  USE_SCHRO_FALSE='#'
else
  USE_SCHRO_TRUE='#'
  USE_SCHRO_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: ZBar barcode detector ***" >&5
$as_echo "$as_me: *** checking feature: ZBar barcode detector ***" >&6;}
if test "xzbar" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: zbar ***" >&5
$as_echo "$as_me: *** for plug-ins: zbar ***" >&6;}
fi
NOUSE=
if test "x$USE_ZBAR" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-zbar was given.
if test "${enable_zbar+set}" = set; then :
  enableval=$enable_zbar;  case "${enableval}" in
      yes) USE_ZBAR=yes;;
      no) USE_ZBAR=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-zbar" "$LINENO" 5 ;;
    esac
else
   USE_ZBAR=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_ZBAR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** zbar pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** zbar pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " ZBAR " > /dev/null; then
  USE_ZBAR="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** zbar not ported" >&5
$as_echo "$as_me: WARNING: *** zbar not ported" >&2;}
fi


if test x$USE_ZBAR = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_ZBAR=no


  which="zbar >= 0.9"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ZBAR" >&5
$as_echo_n "checking for ZBAR... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$ZBAR_CFLAGS"; then
        pkg_cv_ZBAR_CFLAGS="$ZBAR_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ZBAR_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$ZBAR_LIBS"; then
        pkg_cv_ZBAR_LIBS="$ZBAR_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_ZBAR_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        ZBAR_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        ZBAR_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$ZBAR_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_ZBAR="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$ZBAR_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $ZBAR_PKG_ERRORS" >&5
$as_echo "$as_me: $ZBAR_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_ZBAR="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$ZBAR_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $ZBAR_PKG_ERRORS" >&5
$as_echo "$as_me: $ZBAR_PKG_ERRORS" >&6;}
      fi

else
	ZBAR_CFLAGS=$pkg_cv_ZBAR_CFLAGS
	ZBAR_LIBS=$pkg_cv_ZBAR_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_ZBAR="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_ZBAR = xno; then
    USE_ZBAR=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: zbar" >&5
$as_echo "$as_me: *** These plugins will be built: zbar" >&6;}
  fi
fi
if test x$USE_ZBAR = xyes; then
  :
  if test "xzbar" != "x"; then
    GST_PLUGINS_YES="\tzbar\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_ZBAR /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: zbar" >&5
$as_echo "$as_me: *** These plugins will not be built: zbar" >&6;}
  if test "xzbar" != "x"; then
    GST_PLUGINS_NO="\tzbar\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_ZBAR = xyes; then
  USE_ZBAR_TRUE=
  USE_ZBAR_FALSE='#'
else
  USE_ZBAR_TRUE='#'
  USE_ZBAR_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: rtmp library ***" >&5
$as_echo "$as_me: *** checking feature: rtmp library ***" >&6;}
if test "xrtmp" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: rtmp ***" >&5
$as_echo "$as_me: *** for plug-ins: rtmp ***" >&6;}
fi
NOUSE=
if test "x$USE_RTMP" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-rtmp was given.
if test "${enable_rtmp+set}" = set; then :
  enableval=$enable_rtmp;  case "${enableval}" in
      yes) USE_RTMP=yes;;
      no) USE_RTMP=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-rtmp" "$LINENO" 5 ;;
    esac
else
   USE_RTMP=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_RTMP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** rtmp pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** rtmp pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " RTMP " > /dev/null; then
  USE_RTMP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** rtmp not ported" >&5
$as_echo "$as_me: WARNING: *** rtmp not ported" >&2;}
fi


if test x$USE_RTMP = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_RTMP=no


  which="librtmp"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RTMP" >&5
$as_echo_n "checking for RTMP... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$RTMP_CFLAGS"; then
        pkg_cv_RTMP_CFLAGS="$RTMP_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_RTMP_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$RTMP_LIBS"; then
        pkg_cv_RTMP_LIBS="$RTMP_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_RTMP_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        RTMP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        RTMP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$RTMP_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_RTMP="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$RTMP_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $RTMP_PKG_ERRORS" >&5
$as_echo "$as_me: $RTMP_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_RTMP="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$RTMP_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $RTMP_PKG_ERRORS" >&5
$as_echo "$as_me: $RTMP_PKG_ERRORS" >&6;}
      fi

else
	RTMP_CFLAGS=$pkg_cv_RTMP_CFLAGS
	RTMP_LIBS=$pkg_cv_RTMP_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_RTMP="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_RTMP = xno; then
    USE_RTMP=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: rtmp" >&5
$as_echo "$as_me: *** These plugins will be built: rtmp" >&6;}
  fi
fi
if test x$USE_RTMP = xyes; then
  :
  if test "xrtmp" != "x"; then
    GST_PLUGINS_YES="\trtmp\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_RTMP /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: rtmp" >&5
$as_echo "$as_me: *** These plugins will not be built: rtmp" >&6;}
  if test "xrtmp" != "x"; then
    GST_PLUGINS_NO="\trtmp\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_RTMP = xyes; then
  USE_RTMP_TRUE=
  USE_RTMP_FALSE='#'
else
  USE_RTMP_TRUE='#'
  USE_RTMP_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: Spandsp ***" >&5
$as_echo "$as_me: *** checking feature: Spandsp ***" >&6;}
if test "xspandsp" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: spandsp ***" >&5
$as_echo "$as_me: *** for plug-ins: spandsp ***" >&6;}
fi
NOUSE=
if test "x$USE_SPANDSP" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-spandsp was given.
if test "${enable_spandsp+set}" = set; then :
  enableval=$enable_spandsp;  case "${enableval}" in
      yes) USE_SPANDSP=yes;;
      no) USE_SPANDSP=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-spandsp" "$LINENO" 5 ;;
    esac
else
   USE_SPANDSP=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SPANDSP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** spandsp pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** spandsp pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SPANDSP " > /dev/null; then
  USE_SPANDSP="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** spandsp not ported" >&5
$as_echo "$as_me: WARNING: *** spandsp not ported" >&2;}
fi


if test x$USE_SPANDSP = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SPANDSP=no


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SPANDSP" >&5
$as_echo_n "checking for SPANDSP... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$SPANDSP_CFLAGS"; then
        pkg_cv_SPANDSP_CFLAGS="$SPANDSP_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"spandsp >= 0.0.6\""; } >&5
  ($PKG_CONFIG --exists --print-errors "spandsp >= 0.0.6") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SPANDSP_CFLAGS=`$PKG_CONFIG --cflags "spandsp >= 0.0.6" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$SPANDSP_LIBS"; then
        pkg_cv_SPANDSP_LIBS="$SPANDSP_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"spandsp >= 0.0.6\""; } >&5
  ($PKG_CONFIG --exists --print-errors "spandsp >= 0.0.6") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_SPANDSP_LIBS=`$PKG_CONFIG --libs "spandsp >= 0.0.6" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        SPANDSP_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "spandsp >= 0.0.6"`
        else
	        SPANDSP_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "spandsp >= 0.0.6"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$SPANDSP_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

    HAVE_SPANDSP="no"

elif test $pkg_failed = untried; then

    HAVE_SPANDSP="no"

else
	SPANDSP_CFLAGS=$pkg_cv_SPANDSP_CFLAGS
	SPANDSP_LIBS=$pkg_cv_SPANDSP_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

    HAVE_SPANDSP="yes"
fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SPANDSP = xno; then
    USE_SPANDSP=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: spandsp" >&5
$as_echo "$as_me: *** These plugins will be built: spandsp" >&6;}
  fi
fi
if test x$USE_SPANDSP = xyes; then
  :
  if test "xspandsp" != "x"; then
    GST_PLUGINS_YES="\tspandsp\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SPANDSP /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: spandsp" >&5
$as_echo "$as_me: *** These plugins will not be built: spandsp" >&6;}
  if test "xspandsp" != "x"; then
    GST_PLUGINS_NO="\tspandsp\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SPANDSP = xyes; then
  USE_SPANDSP_TRUE=
  USE_SPANDSP_FALSE='#'
else
  USE_SPANDSP_TRUE='#'
  USE_SPANDSP_FALSE=
fi





echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: sndio audio ***" >&5
$as_echo "$as_me: *** checking feature: sndio audio ***" >&6;}
if test "xsndio" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: sndio ***" >&5
$as_echo "$as_me: *** for plug-ins: sndio ***" >&6;}
fi
NOUSE=
if test "x$USE_SNDIO" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-sndio was given.
if test "${enable_sndio+set}" = set; then :
  enableval=$enable_sndio;  case "${enableval}" in
      yes) USE_SNDIO=yes;;
      no) USE_SNDIO=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-sndio" "$LINENO" 5 ;;
    esac
else
   USE_SNDIO=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_SNDIO="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sndio pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** sndio pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " SNDIO " > /dev/null; then
  USE_SNDIO="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** sndio not ported" >&5
$as_echo "$as_me: WARNING: *** sndio not ported" >&2;}
fi


if test x$USE_SNDIO = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_SNDIO=no

  ac_fn_c_check_header_mongrel "$LINENO" "sndio.h" "ac_cv_header_sndio_h" "$ac_includes_default"
if test "x$ac_cv_header_sndio_h" = xyes; then :
  HAVE_SNDIO="yes"
else
  HAVE_SNDIO="no"
fi


  if test "x$HAVE_SNDIO" = "xyes"; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sio_open in -lsndio" >&5
$as_echo_n "checking for sio_open in -lsndio... " >&6; }
if ${ac_cv_lib_sndio_sio_open+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsndio  $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

/* Override any GCC internal prototype to avoid an error.
   Use char because int might match the return type of a GCC
   builtin and then its argument prototype would still apply.  */
#ifdef __cplusplus
extern "C"
#endif
char sio_open ();
int
main ()
{
return sio_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_sndio_sio_open=yes
else
  ac_cv_lib_sndio_sio_open=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sndio_sio_open" >&5
$as_echo "$ac_cv_lib_sndio_sio_open" >&6; }
if test "x$ac_cv_lib_sndio_sio_open" = xyes; then :
  HAVE_SNDIO="yes"
else
  HAVE_SNDIO="no"
fi

    if test "x$HAVE_SNDIO" = "xyes"; then
      SNDIO_LIBS=-lsndio

    fi
  fi


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_SNDIO = xno; then
    USE_SNDIO=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: sndio" >&5
$as_echo "$as_me: *** These plugins will be built: sndio" >&6;}
  fi
fi
if test x$USE_SNDIO = xyes; then
  :
  if test "xsndio" != "x"; then
    GST_PLUGINS_YES="\tsndio\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_SNDIO /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: sndio" >&5
$as_echo "$as_me: *** These plugins will not be built: sndio" >&6;}
  if test "xsndio" != "x"; then
    GST_PLUGINS_NO="\tsndio\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_SNDIO = xyes; then
  USE_SNDIO_TRUE=
  USE_SNDIO_FALSE='#'
else
  USE_SNDIO_TRUE='#'
  USE_SNDIO_FALSE=
fi




# Check whether --with-hls-crypto was given.
if test "${with_hls_crypto+set}" = set; then :
  withval=$with_hls_crypto;
    case $with_hls_crypto in #(
  nettle) :
     ;; #(
  libgcrypt) :
     ;; #(
  openssl) :
     ;; #(
  *) :
    with_hls_crypto=auto
     ;;
esac


fi


echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: http live streaming plugin ***" >&5
$as_echo "$as_me: *** checking feature: http live streaming plugin ***" >&6;}
if test "xhls" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: hls ***" >&5
$as_echo "$as_me: *** for plug-ins: hls ***" >&6;}
fi
NOUSE=
if test "x$USE_HLS" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-hls was given.
if test "${enable_hls+set}" = set; then :
  enableval=$enable_hls;  case "${enableval}" in
      yes) USE_HLS=yes;;
      no) USE_HLS=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-hls" "$LINENO" 5 ;;
    esac
else
   USE_HLS=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_HLS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** hls pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** hls pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " HLS " > /dev/null; then
  USE_HLS="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** hls not ported" >&5
$as_echo "$as_me: WARNING: *** hls not ported" >&2;}
fi


if test x$USE_HLS = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_HLS=no

  case $with_hls_crypto in #(
  nettle) :


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NETTLE" >&5
$as_echo_n "checking for NETTLE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$NETTLE_CFLAGS"; then
        pkg_cv_NETTLE_CFLAGS="$NETTLE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NETTLE_CFLAGS=`$PKG_CONFIG --cflags "nettle" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$NETTLE_LIBS"; then
        pkg_cv_NETTLE_LIBS="$NETTLE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NETTLE_LIBS=`$PKG_CONFIG --libs "nettle" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "nettle"`
        else
	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "nettle"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$NETTLE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                as_fn_error $? "Could not find nettle library" "$LINENO" 5
elif test $pkg_failed = untried; then
	as_fn_error $? "Could not find nettle library" "$LINENO" 5
else
	NETTLE_CFLAGS=$pkg_cv_NETTLE_CFLAGS
	NETTLE_LIBS=$pkg_cv_NETTLE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_NETTLE 1" >>confdefs.h

        HAVE_HLS="yes"

fi
     ;; #(
  libgcrypt) :



# Check whether --with-libgcrypt-prefix was given.
if test "${with_libgcrypt_prefix+set}" = set; then :
  withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval"
else
  libgcrypt_config_prefix=""
fi

  if test x$libgcrypt_config_prefix != x ; then
     if test x${LIBGCRYPT_CONFIG+set} != xset ; then
        LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
     fi
  fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG
if test -n "$LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5
$as_echo "$LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LIBGCRYPT_CONFIG"; then
  ac_pt_LIBGCRYPT_CONFIG=$LIBGCRYPT_CONFIG
  # Extract the first word of "libgcrypt-config", so it can be a program name with args.
set dummy libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$ac_pt_LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_LIBGCRYPT_CONFIG=$ac_cv_path_ac_pt_LIBGCRYPT_CONFIG
if test -n "$ac_pt_LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPT_CONFIG" >&5
$as_echo "$ac_pt_LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_LIBGCRYPT_CONFIG" = x; then
    LIBGCRYPT_CONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LIBGCRYPT_CONFIG=$ac_pt_LIBGCRYPT_CONFIG
  fi
else
  LIBGCRYPT_CONFIG="$ac_cv_path_LIBGCRYPT_CONFIG"
fi

  tmp=1.2.0
  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
     req_libgcrypt_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
     min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
  else
     req_libgcrypt_api=0
     min_libgcrypt_version="$tmp"
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5
$as_echo_n "checking for LIBGCRYPT - version >= $min_libgcrypt_version... " >&6; }
  ok=no
  if test "$LIBGCRYPT_CONFIG" != "no" ; then
    req_major=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
    req_minor=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
    req_micro=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
    libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
    major=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
    minor=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
    micro=`echo $libgcrypt_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
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($libgcrypt_config_version)" >&5
$as_echo "yes ($libgcrypt_config_version)" >&6; }
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  fi
  if test $ok = yes; then
     # If we have a recent libgcrypt, we should also check that the
     # API is compatible
     if test "$req_libgcrypt_api" -gt 0 ; then
        tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
        if test "$tmp" -gt 0 ; then
           { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBGCRYPT API version" >&5
$as_echo_n "checking LIBGCRYPT API version... " >&6; }
           if test "$req_libgcrypt_api" -eq "$tmp" ; then
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
$as_echo "okay" >&6; }
           else
             ok=no
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: does not match. want=$req_libgcrypt_api got=$tmp" >&5
$as_echo "does not match. want=$req_libgcrypt_api got=$tmp" >&6; }
           fi
        fi
     fi
  fi
  if test $ok = yes; then
    LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
    LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`


$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h

        HAVE_HLS="yes"

    libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
    if test x"$libgcrypt_config_host" != xnone ; then
      if test x"$libgcrypt_config_host" != x"$host" ; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&5
$as_echo "$as_me: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&2;}
      fi
    fi
  else
    LIBGCRYPT_CFLAGS=""
    LIBGCRYPT_LIBS=""
    as_fn_error $? "Could not find libgcrypt library" "$LINENO" 5
  fi



     ;; #(
  openssl) :


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
$as_echo_n "checking for OPENSSL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_CFLAGS"; then
        pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_LIBS"; then
        pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openssl"`
        else
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openssl"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENSSL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                as_fn_error $? "Could not find openssl library" "$LINENO" 5
elif test $pkg_failed = untried; then
	as_fn_error $? "Could not find openssl library" "$LINENO" 5
else
	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
	OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h

        HAVE_HLS="yes"

fi
     ;; #(
  *) :


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NETTLE" >&5
$as_echo_n "checking for NETTLE... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$NETTLE_CFLAGS"; then
        pkg_cv_NETTLE_CFLAGS="$NETTLE_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NETTLE_CFLAGS=`$PKG_CONFIG --cflags "nettle" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$NETTLE_LIBS"; then
        pkg_cv_NETTLE_LIBS="$NETTLE_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_NETTLE_LIBS=`$PKG_CONFIG --libs "nettle" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "nettle"`
        else
	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "nettle"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$NETTLE_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }



# Check whether --with-libgcrypt-prefix was given.
if test "${with_libgcrypt_prefix+set}" = set; then :
  withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval"
else
  libgcrypt_config_prefix=""
fi

  if test x$libgcrypt_config_prefix != x ; then
     if test x${LIBGCRYPT_CONFIG+set} != xset ; then
        LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
     fi
  fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG
if test -n "$LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5
$as_echo "$LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LIBGCRYPT_CONFIG"; then
  ac_pt_LIBGCRYPT_CONFIG=$LIBGCRYPT_CONFIG
  # Extract the first word of "libgcrypt-config", so it can be a program name with args.
set dummy libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$ac_pt_LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_LIBGCRYPT_CONFIG=$ac_cv_path_ac_pt_LIBGCRYPT_CONFIG
if test -n "$ac_pt_LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPT_CONFIG" >&5
$as_echo "$ac_pt_LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_LIBGCRYPT_CONFIG" = x; then
    LIBGCRYPT_CONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LIBGCRYPT_CONFIG=$ac_pt_LIBGCRYPT_CONFIG
  fi
else
  LIBGCRYPT_CONFIG="$ac_cv_path_LIBGCRYPT_CONFIG"
fi

  tmp=1.2.0
  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
     req_libgcrypt_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
     min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
  else
     req_libgcrypt_api=0
     min_libgcrypt_version="$tmp"
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5
$as_echo_n "checking for LIBGCRYPT - version >= $min_libgcrypt_version... " >&6; }
  ok=no
  if test "$LIBGCRYPT_CONFIG" != "no" ; then
    req_major=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
    req_minor=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
    req_micro=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
    libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
    major=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
    minor=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
    micro=`echo $libgcrypt_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
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($libgcrypt_config_version)" >&5
$as_echo "yes ($libgcrypt_config_version)" >&6; }
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  fi
  if test $ok = yes; then
     # If we have a recent libgcrypt, we should also check that the
     # API is compatible
     if test "$req_libgcrypt_api" -gt 0 ; then
        tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
        if test "$tmp" -gt 0 ; then
           { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBGCRYPT API version" >&5
$as_echo_n "checking LIBGCRYPT API version... " >&6; }
           if test "$req_libgcrypt_api" -eq "$tmp" ; then
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
$as_echo "okay" >&6; }
           else
             ok=no
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: does not match. want=$req_libgcrypt_api got=$tmp" >&5
$as_echo "does not match. want=$req_libgcrypt_api got=$tmp" >&6; }
           fi
        fi
     fi
  fi
  if test $ok = yes; then
    LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
    LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`


$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h

          HAVE_HLS="yes"

    libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
    if test x"$libgcrypt_config_host" != xnone ; then
      if test x"$libgcrypt_config_host" != x"$host" ; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&5
$as_echo "$as_me: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&2;}
      fi
    fi
  else
    LIBGCRYPT_CFLAGS=""
    LIBGCRYPT_LIBS=""


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
$as_echo_n "checking for OPENSSL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_CFLAGS"; then
        pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_LIBS"; then
        pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openssl"`
        else
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openssl"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENSSL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

            HAVE_HLS="no"

elif test $pkg_failed = untried; then

            HAVE_HLS="no"

else
	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
	OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h

            HAVE_HLS="yes"

fi

  fi




elif test $pkg_failed = untried; then



# Check whether --with-libgcrypt-prefix was given.
if test "${with_libgcrypt_prefix+set}" = set; then :
  withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval"
else
  libgcrypt_config_prefix=""
fi

  if test x$libgcrypt_config_prefix != x ; then
     if test x${LIBGCRYPT_CONFIG+set} != xset ; then
        LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
     fi
  fi

  if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
set dummy ${ac_tool_prefix}libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG
if test -n "$LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5
$as_echo "$LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_path_LIBGCRYPT_CONFIG"; then
  ac_pt_LIBGCRYPT_CONFIG=$LIBGCRYPT_CONFIG
  # Extract the first word of "libgcrypt-config", so it can be a program name with args.
set dummy libgcrypt-config; ac_word=$2
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
$as_echo_n "checking for $ac_word... " >&6; }
if ${ac_cv_path_ac_pt_LIBGCRYPT_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $ac_pt_LIBGCRYPT_CONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$ac_pt_LIBGCRYPT_CONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    for ac_exec_ext in '' $ac_executable_extensions; do
  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
    ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
    break 2
  fi
done
  done
IFS=$as_save_IFS

  ;;
esac
fi
ac_pt_LIBGCRYPT_CONFIG=$ac_cv_path_ac_pt_LIBGCRYPT_CONFIG
if test -n "$ac_pt_LIBGCRYPT_CONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPT_CONFIG" >&5
$as_echo "$ac_pt_LIBGCRYPT_CONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_pt_LIBGCRYPT_CONFIG" = x; then
    LIBGCRYPT_CONFIG="no"
  else
    case $cross_compiling:$ac_tool_warned in
yes:)
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
ac_tool_warned=yes ;;
esac
    LIBGCRYPT_CONFIG=$ac_pt_LIBGCRYPT_CONFIG
  fi
else
  LIBGCRYPT_CONFIG="$ac_cv_path_LIBGCRYPT_CONFIG"
fi

  tmp=1.2.0
  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
     req_libgcrypt_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
     min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
  else
     req_libgcrypt_api=0
     min_libgcrypt_version="$tmp"
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5
$as_echo_n "checking for LIBGCRYPT - version >= $min_libgcrypt_version... " >&6; }
  ok=no
  if test "$LIBGCRYPT_CONFIG" != "no" ; then
    req_major=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
    req_minor=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
    req_micro=`echo $min_libgcrypt_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
    libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
    major=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
    minor=`echo $libgcrypt_config_version | \
               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
    micro=`echo $libgcrypt_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
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($libgcrypt_config_version)" >&5
$as_echo "yes ($libgcrypt_config_version)" >&6; }
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
  fi
  if test $ok = yes; then
     # If we have a recent libgcrypt, we should also check that the
     # API is compatible
     if test "$req_libgcrypt_api" -gt 0 ; then
        tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
        if test "$tmp" -gt 0 ; then
           { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBGCRYPT API version" >&5
$as_echo_n "checking LIBGCRYPT API version... " >&6; }
           if test "$req_libgcrypt_api" -eq "$tmp" ; then
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
$as_echo "okay" >&6; }
           else
             ok=no
             { $as_echo "$as_me:${as_lineno-$LINENO}: result: does not match. want=$req_libgcrypt_api got=$tmp" >&5
$as_echo "does not match. want=$req_libgcrypt_api got=$tmp" >&6; }
           fi
        fi
     fi
  fi
  if test $ok = yes; then
    LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
    LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`


$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h

          HAVE_HLS="yes"

    libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
    if test x"$libgcrypt_config_host" != xnone ; then
      if test x"$libgcrypt_config_host" != x"$host" ; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&5
$as_echo "$as_me: WARNING:
***
*** The config script $LIBGCRYPT_CONFIG was
*** built for $libgcrypt_config_host and thus may not match the
*** used host $host.
*** You may want to use the configure option --with-libgcrypt-prefix
*** to specify a matching config script.
***" >&2;}
      fi
    fi
  else
    LIBGCRYPT_CFLAGS=""
    LIBGCRYPT_LIBS=""


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
$as_echo_n "checking for OPENSSL... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_CFLAGS"; then
        pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$OPENSSL_LIBS"; then
        pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openssl"`
        else
	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openssl"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$OPENSSL_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

            HAVE_HLS="no"

elif test $pkg_failed = untried; then

            HAVE_HLS="no"

else
	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
	OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h

            HAVE_HLS="yes"

fi

  fi




else
	NETTLE_CFLAGS=$pkg_cv_NETTLE_CFLAGS
	NETTLE_LIBS=$pkg_cv_NETTLE_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }


$as_echo "#define HAVE_NETTLE 1" >>confdefs.h

        HAVE_HLS="yes"

fi

   ;;
esac


  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_HLS = xno; then
    USE_HLS=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: hls" >&5
$as_echo "$as_me: *** These plugins will be built: hls" >&6;}
  fi
fi
if test x$USE_HLS = xyes; then
  :
  if test "xhls" != "x"; then
    GST_PLUGINS_YES="\thls\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_HLS /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: hls" >&5
$as_echo "$as_me: *** These plugins will not be built: hls" >&6;}
  if test "xhls" != "x"; then
    GST_PLUGINS_NO="\thls\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_HLS = xyes; then
  USE_HLS_TRUE=
  USE_HLS_FALSE='#'
else
  USE_HLS_TRUE='#'
  USE_HLS_FALSE=
fi



echo
{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: x265 plug-in ***" >&5
$as_echo "$as_me: *** checking feature: x265 plug-in ***" >&6;}
if test "xx265" != "x"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: x265 ***" >&5
$as_echo "$as_me: *** for plug-ins: x265 ***" >&6;}
fi
NOUSE=
if test "x$USE_X265" = "xno"; then
  NOUSE="yes"
fi
# Check whether --enable-x265 was given.
if test "${enable_x265+set}" = set; then :
  enableval=$enable_x265;  case "${enableval}" in
      yes) USE_X265=yes;;
      no) USE_X265=no;;
      *) as_fn_error $? "bad value ${enableval} for --enable-x265" "$LINENO" 5 ;;
    esac
else
   USE_X265=yes
fi

if test "x$NOUSE" = "xyes"; then
  USE_X265="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** x265 pre-configured not to be built" >&5
$as_echo "$as_me: WARNING: *** x265 pre-configured not to be built" >&2;}
fi
NOUSE=

if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " X265 " > /dev/null; then
  USE_X265="no"
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** x265 not ported" >&5
$as_echo "$as_me: WARNING: *** x265 not ported" >&2;}
fi


if test x$USE_X265 = xyes; then

  gst_check_save_LIBS=$LIBS
  gst_check_save_LDFLAGS=$LDFLAGS
  gst_check_save_CFLAGS=$CFLAGS
  gst_check_save_CPPFLAGS=$CPPFLAGS
  gst_check_save_CXXFLAGS=$CXXFLAGS

  HAVE_X265=no


  which="x265"
    required="no"


pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for X265" >&5
$as_echo_n "checking for X265... " >&6; }

if test -n "$PKG_CONFIG"; then
    if test -n "$X265_CFLAGS"; then
        pkg_cv_X265_CFLAGS="$X265_CFLAGS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X265_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi
if test -n "$PKG_CONFIG"; then
    if test -n "$X265_LIBS"; then
        pkg_cv_X265_LIBS="$X265_LIBS"
    else
        if test -n "$PKG_CONFIG" && \
    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; then
  pkg_cv_X265_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
else
  pkg_failed=yes
fi
    fi
else
	pkg_failed=untried
fi



if test $pkg_failed = yes; then

if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
        _pkg_short_errors_supported=yes
else
        _pkg_short_errors_supported=no
fi
        if test $_pkg_short_errors_supported = yes; then
	        X265_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
        else
	        X265_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
        fi
	# Put the nasty error message in config.log where it belongs
	echo "$X265_PKG_ERRORS" >&5

	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }

      HAVE_X265="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$X265_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $X265_PKG_ERRORS" >&5
$as_echo "$as_me: $X265_PKG_ERRORS" >&6;}
      fi

elif test $pkg_failed = untried; then

      HAVE_X265="no"
      if test "x$required" = "xyes"; then
        as_fn_error $? "$X265_PKG_ERRORS" "$LINENO" 5
      else
        { $as_echo "$as_me:${as_lineno-$LINENO}: $X265_PKG_ERRORS" >&5
$as_echo "$as_me: $X265_PKG_ERRORS" >&6;}
      fi

else
	X265_CFLAGS=$pkg_cv_X265_CFLAGS
	X265_LIBS=$pkg_cv_X265_LIBS
        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }

      HAVE_X265="yes"

fi




  LIBS=$gst_check_save_LIBS
  LDFLAGS=$gst_check_save_LDFLAGS
  CFLAGS=$gst_check_save_CFLAGS
  CPPFLAGS=$gst_check_save_CPPFLAGS
  CXXFLAGS=$gst_check_save_CXXFLAGS

    if test x$HAVE_X265 = xno; then
    USE_X265=no
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: x265" >&5
$as_echo "$as_me: *** These plugins will be built: x265" >&6;}
  fi
fi
if test x$USE_X265 = xyes; then
  :
  if test "xx265" != "x"; then
    GST_PLUGINS_YES="\tx265\n$GST_PLUGINS_YES"
  fi

$as_echo "#define HAVE_X265 /**/" >>confdefs.h

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: x265" >&5
$as_echo "$as_me: *** These plugins will not be built: x265" >&6;}
  if test "xx265" != "x"; then
    GST_PLUGINS_NO="\tx265\n$GST_PLUGINS_NO"
  fi
  :
fi
 if test x$USE_X265 = xyes; then
  USE_X265_TRUE=
  USE_X265_FALSE='#'
else
  USE_X265_TRUE='#'
  USE_X265_FALSE=
fi



else


 if false; then
  USE_ASSRENDER_TRUE=
  USE_ASSRENDER_FALSE='#'
else
  USE_ASSRENDER_TRUE='#'
  USE_ASSRENDER_FALSE=
fi

 if false; then
  USE_VOAMRWBENC_TRUE=
  USE_VOAMRWBENC_FALSE='#'
else
  USE_VOAMRWBENC_TRUE='#'
  USE_VOAMRWBENC_FALSE=
fi

 if false; then
  USE_VOAACENC_TRUE=
  USE_VOAACENC_FALSE='#'
else
  USE_VOAACENC_TRUE='#'
  USE_VOAACENC_FALSE=
fi

 if false; then
  USE_APEXSINK_TRUE=
  USE_APEXSINK_FALSE='#'
else
  USE_APEXSINK_TRUE='#'
  USE_APEXSINK_FALSE=
fi

 if false; then
  USE_BS2B_TRUE=
  USE_BS2B_FALSE='#'
else
  USE_BS2B_TRUE='#'
  USE_BS2B_FALSE=
fi

 if false; then
  USE_BZ2_TRUE=
  USE_BZ2_FALSE='#'
else
  USE_BZ2_TRUE='#'
  USE_BZ2_FALSE=
fi

 if false; then
  USE_CHROMAPRINT_TRUE=
  USE_CHROMAPRINT_FALSE='#'
else
  USE_CHROMAPRINT_TRUE='#'
  USE_CHROMAPRINT_FALSE=
fi

 if false; then
  USE_CURL_TRUE=
  USE_CURL_FALSE='#'
else
  USE_CURL_TRUE='#'
  USE_CURL_FALSE=
fi

 if false; then
  USE_SSH2_TRUE=
  USE_SSH2_FALSE='#'
else
  USE_SSH2_TRUE='#'
  USE_SSH2_FALSE=
fi

 if false; then
  USE_DASH_TRUE=
  USE_DASH_FALSE='#'
else
  USE_DASH_TRUE='#'
  USE_DASH_FALSE=
fi

 if false; then
  USE_DC1394_TRUE=
  USE_DC1394_FALSE='#'
else
  USE_DC1394_TRUE='#'
  USE_DC1394_FALSE=
fi

 if false; then
  USE_DECKLINK_TRUE=
  USE_DECKLINK_FALSE='#'
else
  USE_DECKLINK_TRUE='#'
  USE_DECKLINK_FALSE=
fi

 if false; then
  DECKLINK_OSX_TRUE=
  DECKLINK_OSX_FALSE='#'
else
  DECKLINK_OSX_TRUE='#'
  DECKLINK_OSX_FALSE=
fi

 if false; then
  USE_DIRECTFB_TRUE=
  USE_DIRECTFB_FALSE='#'
else
  USE_DIRECTFB_TRUE='#'
  USE_DIRECTFB_FALSE=
fi

 if false; then
  USE_WAYLAND_TRUE=
  USE_WAYLAND_FALSE='#'
else
  USE_WAYLAND_TRUE='#'
  USE_WAYLAND_FALSE=
fi

 if false; then
  USE_DAALA_TRUE=
  USE_DAALA_FALSE='#'
else
  USE_DAALA_TRUE='#'
  USE_DAALA_FALSE=
fi

 if false; then
  USE_DTS_TRUE=
  USE_DTS_FALSE='#'
else
  USE_DTS_TRUE='#'
  USE_DTS_FALSE=
fi

 if false; then
  USE_EXIF_TRUE=
  USE_EXIF_FALSE='#'
else
  USE_EXIF_TRUE='#'
  USE_EXIF_FALSE=
fi

 if false; then
  USE_RESINDVD_TRUE=
  USE_RESINDVD_FALSE='#'
else
  USE_RESINDVD_TRUE='#'
  USE_RESINDVD_FALSE=
fi

 if false; then
  USE_FAAC_TRUE=
  USE_FAAC_FALSE='#'
else
  USE_FAAC_TRUE='#'
  USE_FAAC_FALSE=
fi

 if false; then
  USE_FAAD_TRUE=
  USE_FAAD_FALSE='#'
else
  USE_FAAD_TRUE='#'
  USE_FAAD_FALSE=
fi

 if false; then
  USE_FBDEV_TRUE=
  USE_FBDEV_FALSE='#'
else
  USE_FBDEV_TRUE='#'
  USE_FBDEV_FALSE=
fi

 if false; then
  USE_FLITE_TRUE=
  USE_FLITE_FALSE='#'
else
  USE_FLITE_TRUE='#'
  USE_FLITE_FALSE=
fi

 if false; then
  USE_FLUIDSYNTH_TRUE=
  USE_FLUIDSYNTH_FALSE='#'
else
  USE_FLUIDSYNTH_TRUE='#'
  USE_FLUIDSYNTH_FALSE=
fi

 if false; then
  USE_GL_TRUE=
  USE_GL_FALSE='#'
else
  USE_GL_TRUE='#'
  USE_GL_FALSE=
fi

 if false; then
  USE_GSM_TRUE=
  USE_GSM_FALSE='#'
else
  USE_GSM_TRUE='#'
  USE_GSM_FALSE=
fi

 if false; then
  USE_GTK3_TRUE=
  USE_GTK3_FALSE='#'
else
  USE_GTK3_TRUE='#'
  USE_GTK3_FALSE=
fi

 if false; then
  USE_GTK3_GL_TRUE=
  USE_GTK3_GL_FALSE='#'
else
  USE_GTK3_GL_TRUE='#'
  USE_GTK3_GL_FALSE=
fi

 if false; then
  USE_HLS_TRUE=
  USE_HLS_FALSE='#'
else
  USE_HLS_TRUE='#'
  USE_HLS_FALSE=
fi

 if false; then
  USE_KATE_TRUE=
  USE_KATE_FALSE='#'
else
  USE_KATE_TRUE='#'
  USE_KATE_FALSE=
fi

 if false; then
  USE_TIGER_TRUE=
  USE_TIGER_FALSE='#'
else
  USE_TIGER_TRUE='#'
  USE_TIGER_FALSE=
fi

 if false; then
  USE_LADSPA_TRUE=
  USE_LADSPA_FALSE='#'
else
  USE_LADSPA_TRUE='#'
  USE_LADSPA_FALSE=
fi

 if false; then
  USE_LV2_TRUE=
  USE_LV2_FALSE='#'
else
  USE_LV2_TRUE='#'
  USE_LV2_FALSE=
fi

 if false; then
  USE_LIBDE265_TRUE=
  USE_LIBDE265_FALSE='#'
else
  USE_LIBDE265_TRUE='#'
  USE_LIBDE265_FALSE=
fi

 if false; then
  USE_LIBMMS_TRUE=
  USE_LIBMMS_FALSE='#'
else
  USE_LIBMMS_TRUE='#'
  USE_LIBMMS_FALSE=
fi

 if false; then
  USE_LINSYS_TRUE=
  USE_LINSYS_FALSE='#'
else
  USE_LINSYS_TRUE='#'
  USE_LINSYS_FALSE=
fi

 if false; then
  USE_MODPLUG_TRUE=
  USE_MODPLUG_FALSE='#'
else
  USE_MODPLUG_TRUE='#'
  USE_MODPLUG_FALSE=
fi

 if false; then
  USE_MIMIC_TRUE=
  USE_MIMIC_FALSE='#'
else
  USE_MIMIC_TRUE='#'
  USE_MIMIC_FALSE=
fi

 if false; then
  USE_MPEG2ENC_TRUE=
  USE_MPEG2ENC_FALSE='#'
else
  USE_MPEG2ENC_TRUE='#'
  USE_MPEG2ENC_FALSE=
fi

 if false; then
  USE_MPLEX_TRUE=
  USE_MPLEX_FALSE='#'
else
  USE_MPLEX_TRUE='#'
  USE_MPLEX_FALSE=
fi

 if false; then
  USE_MUSEPACK_TRUE=
  USE_MUSEPACK_FALSE='#'
else
  USE_MUSEPACK_TRUE='#'
  USE_MUSEPACK_FALSE=
fi

 if false; then
  USE_NAS_TRUE=
  USE_NAS_FALSE='#'
else
  USE_NAS_TRUE='#'
  USE_NAS_FALSE=
fi

 if false; then
  USE_NEON_TRUE=
  USE_NEON_FALSE='#'
else
  USE_NEON_TRUE='#'
  USE_NEON_FALSE=
fi

 if false; then
  USE_OFA_TRUE=
  USE_OFA_FALSE='#'
else
  USE_OFA_TRUE='#'
  USE_OFA_FALSE=
fi

 if false; then
  USE_OPENAL_TRUE=
  USE_OPENAL_FALSE='#'
else
  USE_OPENAL_TRUE='#'
  USE_OPENAL_FALSE=
fi

 if false; then
  USE_OPENCV_TRUE=
  USE_OPENCV_FALSE='#'
else
  USE_OPENCV_TRUE='#'
  USE_OPENCV_FALSE=
fi

 if false; then
  USE_OPENEXR_TRUE=
  USE_OPENEXR_FALSE='#'
else
  USE_OPENEXR_TRUE='#'
  USE_OPENEXR_FALSE=
fi

 if false; then
  USE_OPENJPEG_TRUE=
  USE_OPENJPEG_FALSE='#'
else
  USE_OPENJPEG_TRUE='#'
  USE_OPENJPEG_FALSE=
fi

 if false; then
  USE_OPENNI2_TRUE=
  USE_OPENNI2_FALSE='#'
else
  USE_OPENNI2_TRUE='#'
  USE_OPENNI2_FALSE=
fi

 if false; then
  USE_OPUS_TRUE=
  USE_OPUS_FALSE='#'
else
  USE_OPUS_TRUE='#'
  USE_OPUS_FALSE=
fi

 if false; then
  USE_PVR_TRUE=
  USE_PVR_FALSE='#'
else
  USE_PVR_TRUE='#'
  USE_PVR_FALSE=
fi

 if false; then
  USE_QT_TRUE=
  USE_QT_FALSE='#'
else
  USE_QT_TRUE='#'
  USE_QT_FALSE=
fi

 if false; then
  USE_LIBVISUAL_TRUE=
  USE_LIBVISUAL_FALSE='#'
else
  USE_LIBVISUAL_TRUE='#'
  USE_LIBVISUAL_FALSE=
fi

 if false; then
  USE_TIMIDITY_TRUE=
  USE_TIMIDITY_FALSE='#'
else
  USE_TIMIDITY_TRUE='#'
  USE_TIMIDITY_FALSE=
fi

 if false; then
  USE_WILDMIDI_TRUE=
  USE_WILDMIDI_FALSE='#'
else
  USE_WILDMIDI_TRUE='#'
  USE_WILDMIDI_FALSE=
fi

 if false; then
  USE_SDL_TRUE=
  USE_SDL_FALSE='#'
else
  USE_SDL_TRUE='#'
  USE_SDL_FALSE=
fi

 if false; then
  USE_SMOOTHSTREAMING_TRUE=
  USE_SMOOTHSTREAMING_FALSE='#'
else
  USE_SMOOTHSTREAMING_TRUE='#'
  USE_SMOOTHSTREAMING_FALSE=
fi

 if false; then
  USE_SNDFILE_TRUE=
  USE_SNDFILE_FALSE='#'
else
  USE_SNDFILE_TRUE='#'
  USE_SNDFILE_FALSE=
fi

 if false; then
  USE_SOUNDTOUCH_TRUE=
  USE_SOUNDTOUCH_FALSE='#'
else
  USE_SOUNDTOUCH_TRUE='#'
  USE_SOUNDTOUCH_FALSE=
fi

 if false; then
  USE_SPANDSP_TRUE=
  USE_SPANDSP_FALSE='#'
else
  USE_SPANDSP_TRUE='#'
  USE_SPANDSP_FALSE=
fi

 if false; then
  USE_SPC_TRUE=
  USE_SPC_FALSE='#'
else
  USE_SPC_TRUE='#'
  USE_SPC_FALSE=
fi

 if false; then
  USE_SRTP_TRUE=
  USE_SRTP_FALSE='#'
else
  USE_SRTP_TRUE='#'
  USE_SRTP_FALSE=
fi

 if false; then
  USE_GME_TRUE=
  USE_GME_FALSE='#'
else
  USE_GME_TRUE='#'
  USE_GME_FALSE=
fi

 if false; then
  USE_XVID_TRUE=
  USE_XVID_FALSE='#'
else
  USE_XVID_TRUE='#'
  USE_XVID_FALSE=
fi

 if false; then
  USE_DVB_TRUE=
  USE_DVB_FALSE='#'
else
  USE_DVB_TRUE='#'
  USE_DVB_FALSE=
fi

 if false; then
  USE_WININET_TRUE=
  USE_WININET_FALSE='#'
else
  USE_WININET_TRUE='#'
  USE_WININET_FALSE=
fi

 if false; then
  USE_ACM_TRUE=
  USE_ACM_FALSE='#'
else
  USE_ACM_TRUE='#'
  USE_ACM_FALSE=
fi

 if false; then
  USE_VDPAU_TRUE=
  USE_VDPAU_FALSE='#'
else
  USE_VDPAU_TRUE='#'
  USE_VDPAU_FALSE=
fi

 if false; then
  USE_SBC_TRUE=
  USE_SBC_FALSE='#'
else
  USE_SBC_TRUE='#'
  USE_SBC_FALSE=
fi

 if false; then
  USE_SCHRO_TRUE=
  USE_SCHRO_FALSE='#'
else
  USE_SCHRO_TRUE='#'
  USE_SCHRO_FALSE=
fi

 if false; then
  USE_ZBAR_TRUE=
  USE_ZBAR_FALSE='#'
else
  USE_ZBAR_TRUE='#'
  USE_ZBAR_FALSE=
fi

 if false; then
  USE_RSVG_TRUE=
  USE_RSVG_FALSE='#'
else
  USE_RSVG_TRUE='#'
  USE_RSVG_FALSE=
fi

 if false; then
  USE_RTMP_TRUE=
  USE_RTMP_FALSE='#'
else
  USE_RTMP_TRUE='#'
  USE_RTMP_FALSE=
fi

 if false; then
  USE_TELETEXTDEC_TRUE=
  USE_TELETEXTDEC_FALSE='#'
else
  USE_TELETEXTDEC_TRUE='#'
  USE_TELETEXTDEC_FALSE=
fi

 if false; then
  USE_SNDIO_TRUE=
  USE_SNDIO_FALSE='#'
else
  USE_SNDIO_TRUE='#'
  USE_SNDIO_FALSE=
fi

 if false; then
  USE_UVCH264_TRUE=
  USE_UVCH264_FALSE='#'
else
  USE_UVCH264_TRUE='#'
  USE_UVCH264_FALSE=
fi

 if false; then
  USE_WEBP_TRUE=
  USE_WEBP_FALSE='#'
else
  USE_WEBP_TRUE='#'
  USE_WEBP_FALSE=
fi

 if false; then
  USE_OPENH264_TRUE=
  USE_OPENH264_FALSE='#'
else
  USE_OPENH264_TRUE='#'
  USE_OPENH264_FALSE=
fi

 if false; then
  USE_X265_TRUE=
  USE_X265_FALSE='#'
else
  USE_X265_TRUE='#'
  USE_X265_FALSE=
fi

 if false; then
  USE_DTLS_TRUE=
  USE_DTLS_FALSE='#'
else
  USE_DTLS_TRUE='#'
  USE_DTLS_FALSE=
fi


fi


if test "x$USE_DEBUG" = xyes; then
   PROFILE_CFLAGS="-g"
fi


if test "x$PACKAGE_VERSION_NANO" = "x1"; then
    DEPRECATED_CFLAGS="-DGST_DISABLE_DEPRECATED"
else
  DEPRECATED_CFLAGS=""
fi


GST_OPTION_CFLAGS="\$(WARNING_CFLAGS) \$(ERROR_CFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)"
GST_OPTION_CXXFLAGS="\$(WARNING_CXXFLAGS) \$(ERROR_CXXFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)"
GST_OPTION_OBJCFLAGS="\$(WARNING_OBJCFLAGS) \$(ERROR_OBJCFLAGS) \$(DEBUG_CFLAGS) \$(PROFILE_CFLAGS) \$(GCOV_CFLAGS) \$(OPT_CFLAGS) \$(DEPRECATED_CFLAGS)"




GST_CFLAGS="$GST_CFLAGS -DGST_USE_UNSTABLE_API"
GST_CXXFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CXXFLAGS)"
GST_OBJCFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_OBJCFLAGS)"
GST_CFLAGS="$GST_CFLAGS $GLIB_EXTRA_CFLAGS \$(GST_OPTION_CFLAGS)"




GST_PLUGINS_BAD_CXXFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs"
GST_PLUGINS_BAD_OBJCFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs"
GST_PLUGINS_BAD_CFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs"




GST_ALL_LDFLAGS="-no-undefined"
if test "x${enable_Bsymbolic}" = "xyes"; then
  GST_ALL_LDFLAGS="$GST_ALL_LDFLAGS -Wl,-Bsymbolic-functions"
fi


GST_LIB_LDFLAGS="-export-symbols-regex ^_?\(gst_\|Gst\|GST_\).*"


GST_PLUGIN_LDFLAGS="-module -avoid-version -export-symbols-regex '^_*gst_plugin_.*' $GST_ALL_LDFLAGS"



$MKDIR_P tests/check/orc


ac_config_files="$ac_config_files Makefile common/Makefile common/m4/Makefile gst-plugins-bad.spec gst/Makefile gst/accurip/Makefile gst/adpcmdec/Makefile gst/adpcmenc/Makefile gst/aiff/Makefile gst/videoframe_audiolevel/Makefile gst/asfmux/Makefile gst/audiofxbad/Makefile gst/audiomixer/Makefile gst/audiovisualizers/Makefile gst/autoconvert/Makefile gst/bayer/Makefile gst/camerabin2/Makefile gst/cdxaparse/Makefile gst/coloreffects/Makefile gst/dataurisrc/Makefile gst/dccp/Makefile gst/debugutils/Makefile gst/dvbsuboverlay/Makefile gst/dvdspu/Makefile gst/faceoverlay/Makefile gst/festival/Makefile gst/fieldanalysis/Makefile gst/freeverb/Makefile gst/frei0r/Makefile gst/gaudieffects/Makefile gst/geometrictransform/Makefile gst/gdp/Makefile gst/hdvparse/Makefile gst/id3tag/Makefile gst/inter/Makefile gst/interlace/Makefile gst/ivfparse/Makefile gst/ivtc/Makefile gst/jp2kdecimator/Makefile gst/jpegformat/Makefile gst/librfb/Makefile gst/midi/Makefile gst/mpegdemux/Makefile gst/mpegtsdemux/Makefile gst/mpegtsmux/Makefile gst/mpegtsmux/tsmux/Makefile gst/mpegpsmux/Makefile gst/mve/Makefile gst/mxf/Makefile gst/netsim/Makefile gst/nuvdemux/Makefile gst/onvif/Makefile gst/patchdetect/Makefile gst/pcapparse/Makefile gst/pnm/Makefile gst/rawparse/Makefile gst/removesilence/Makefile gst/sdi/Makefile gst/sdp/Makefile gst/segmentclip/Makefile gst/siren/Makefile gst/smooth/Makefile gst/speed/Makefile gst/subenc/Makefile gst/stereo/Makefile gst/tta/Makefile gst/videofilters/Makefile gst/videomeasure/Makefile gst/videoparsers/Makefile gst/videosignal/Makefile gst/vmnc/Makefile gst/y4m/Makefile gst/yadif/Makefile gst/compositor/Makefile gst-libs/Makefile gst-libs/gst/Makefile gst-libs/gst/adaptivedemux/Makefile gst-libs/gst/basecamerabinsrc/Makefile gst-libs/gst/gl/Makefile gst-libs/gst/gl/android/Makefile gst-libs/gst/gl/cocoa/Makefile gst-libs/gst/gl/dispmanx/Makefile gst-libs/gst/gl/glprototypes/Makefile gst-libs/gst/gl/eagl/Makefile gst-libs/gst/gl/egl/Makefile gst-libs/gst/gl/wayland/Makefile gst-libs/gst/gl/win32/Makefile gst-libs/gst/gl/x11/Makefile gst-libs/gst/insertbin/Makefile gst-libs/gst/interfaces/Makefile gst-libs/gst/codecparsers/Makefile gst-libs/gst/mpegts/Makefile gst-libs/gst/uridownloader/Makefile gst-libs/gst/wayland/Makefile gst-libs/gst/base/Makefile gst-libs/gst/player/Makefile gst-libs/gst/video/Makefile gst-libs/gst/audio/Makefile sys/Makefile sys/dshowdecwrapper/Makefile sys/acmenc/Makefile sys/acmmp3dec/Makefile sys/androidmedia/Makefile sys/applemedia/Makefile sys/applemedia-nonpublic/Makefile sys/avc/Makefile sys/bluez/Makefile sys/d3dvideosink/Makefile sys/decklink/Makefile sys/directsound/Makefile sys/dshowsrcwrapper/Makefile sys/dshowvideosink/Makefile sys/dvb/Makefile sys/fbdev/Makefile sys/linsys/Makefile sys/nvenc/Makefile sys/opensles/Makefile sys/shm/Makefile sys/tinyalsa/Makefile sys/uvch264/Makefile sys/vcd/Makefile sys/vdpau/Makefile sys/pvr2d/Makefile sys/wasapi/Makefile sys/wininet/Makefile sys/winks/Makefile sys/winscreencap/Makefile tests/Makefile tests/check/Makefile tests/files/Makefile tests/examples/Makefile tests/examples/avsamplesink/Makefile tests/examples/camerabin2/Makefile tests/examples/codecparsers/Makefile tests/examples/directfb/Makefile tests/examples/gl/Makefile tests/examples/gl/cocoa/Makefile tests/examples/gl/clutter/Makefile tests/examples/gl/generic/Makefile tests/examples/gl/generic/cube/Makefile tests/examples/gl/generic/cubeyuv/Makefile tests/examples/gl/generic/doublecube/Makefile tests/examples/gl/generic/recordgraphic/Makefile tests/examples/gl/gtk/Makefile tests/examples/gl/gtk/gtkvideooverlay/Makefile tests/examples/gl/gtk/3dvideo/Makefile tests/examples/gl/gtk/filternovideooverlay/Makefile tests/examples/gl/gtk/filtervideooverlay/Makefile tests/examples/gl/gtk/fxtest/Makefile tests/examples/gl/gtk/switchvideooverlay/Makefile tests/examples/gl/qt/Makefile tests/examples/gl/sdl/Makefile tests/examples/gtk/Makefile tests/examples/mpegts/Makefile tests/examples/mxf/Makefile tests/examples/opencv/Makefile tests/examples/uvch264/Makefile tests/examples/waylandsink/Makefile tests/icles/Makefile ext/voamrwbenc/Makefile ext/voaacenc/Makefile ext/assrender/Makefile ext/apexsink/Makefile ext/bs2b/Makefile ext/bz2/Makefile ext/chromaprint/Makefile ext/curl/Makefile ext/dash/Makefile ext/dc1394/Makefile ext/directfb/Makefile ext/wayland/Makefile ext/daala/Makefile ext/dts/Makefile ext/gl/Makefile ext/gtk/Makefile ext/faac/Makefile ext/faad/Makefile ext/flite/Makefile ext/fluidsynth/Makefile ext/gsm/Makefile ext/hls/Makefile ext/kate/Makefile ext/ladspa/Makefile ext/lv2/Makefile ext/libde265/Makefile ext/libmms/Makefile ext/libvisual/Makefile ext/Makefile ext/modplug/Makefile ext/mpeg2enc/Makefile ext/mimic/Makefile ext/mplex/Makefile ext/musepack/Makefile ext/nas/Makefile ext/neon/Makefile ext/ofa/Makefile ext/openal/Makefile ext/opencv/Makefile ext/openexr/Makefile ext/openh264/Makefile ext/openjpeg/Makefile ext/openni2/Makefile ext/opus/Makefile ext/qt/Makefile ext/rsvg/Makefile ext/resindvd/Makefile ext/rtmp/Makefile ext/sbc/Makefile ext/schroedinger/Makefile ext/sdl/Makefile ext/smoothstreaming/Makefile ext/sndfile/Makefile ext/soundtouch/Makefile ext/spandsp/Makefile ext/sndio/Makefile ext/srtp/Makefile ext/teletextdec/Makefile ext/gme/Makefile ext/spc/Makefile ext/timidity/Makefile ext/vulkan/Makefile ext/vulkan/xcb/Makefile ext/webp/Makefile ext/x265/Makefile ext/xvid/Makefile ext/zbar/Makefile ext/dtls/Makefile po/Makefile.in docs/Makefile docs/plugins/Makefile docs/libs/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-bad.pc pkgconfig/gstreamer-plugins-bad-uninstalled.pc pkgconfig/gstreamer-codecparsers.pc pkgconfig/gstreamer-codecparsers-uninstalled.pc pkgconfig/gstreamer-insertbin.pc pkgconfig/gstreamer-insertbin-uninstalled.pc pkgconfig/gstreamer-gl.pc pkgconfig/gstreamer-gl-uninstalled.pc pkgconfig/gstreamer-mpegts.pc pkgconfig/gstreamer-mpegts-uninstalled.pc pkgconfig/gstreamer-player.pc pkgconfig/gstreamer-player-uninstalled.pc pkgconfig/gstreamer-wayland.pc pkgconfig/gstreamer-wayland-uninstalled.pc pkgconfig/gstreamer-bad-base.pc pkgconfig/gstreamer-bad-base-uninstalled.pc pkgconfig/gstreamer-bad-video.pc pkgconfig/gstreamer-bad-video-uninstalled.pc pkgconfig/gstreamer-bad-audio.pc pkgconfig/gstreamer-bad-audio-uninstalled.pc tools/Makefile m4/Makefile"


sed \
    -e 's/.*config.h.in.*autoheader.*/\/* Autogenerated config.h created for win32 Visual Studio builds *\/\n\n\/* PREFIX -- specifically added for Windows for easier moving *\/\n#define PREFIX "C:\\\\gstreamer"/' \
    -e 's/.* GETTEXT_PACKAGE$/#define GETTEXT_PACKAGE "'$GETTEXT_PACKAGE'"/' \
    -e 's/.* GST_DATADIR$/#define GST_DATADIR PREFIX "\\\\share"/' \
    -e 's/.* GST_LEVEL_DEFAULT$/#define GST_LEVEL_DEFAULT GST_LEVEL_ERROR/' \
    -e 's/.* GST_LICENSE$/#define GST_LICENSE "'$GST_LICENSE'"/' \
    -e 's/.* GST_API_VERSION$/#define GST_API_VERSION "'$GST_API_VERSION'"/' \
    -e "s,.* GST_PACKAGE_NAME$,#define GST_PACKAGE_NAME \"${GST_PACKAGE_NAME}\"," \
    -e 's/.* GST_PACKAGE_ORIGIN$/#define GST_PACKAGE_ORIGIN "Unknown package origin"/' \
    -e "s,.* GST_PACKAGE_RELEASE_DATETIME$,#define GST_PACKAGE_RELEASE_DATETIME \"${GST_PACKAGE_RELEASE_DATETIME}\"," \
    -e 's/.* HAVE_CPU_I386$/#define HAVE_CPU_I386 1/' \
    -e 's/.* HAVE_STDLIB_H$/#define HAVE_STDLIB_H 1/' \
    -e 's/.* HAVE_STRING_H$/#define HAVE_STRING_H 1/' \
    -e 's/.* HAVE_SYS_STAT_H$/#define HAVE_SYS_STAT_H 1/' \
    -e 's/.* HAVE_SYS_TYPES_H$/#define HAVE_SYS_TYPES_H 1/' \
    -e 's/.* HAVE_WIN32$/#define HAVE_WIN32 1/' \
    -e 's/.* HOST_CPU$/#define HOST_CPU "i686"/' \
    -e 's/.* LIBDIR$/#ifdef _DEBUG\n#  define LIBDIR PREFIX "\\\\debug\\\\lib"\n#else\n#  define LIBDIR PREFIX "\\\\lib"\n#endif/' \
    -e 's/.* LOCALEDIR$/#define LOCALEDIR PREFIX "\\\\share\\\\locale"/' \
    -e "s/.* PACKAGE$/#define PACKAGE \"$PACKAGE\"/" \
    -e 's/.* PACKAGE_BUGREPORT$/#define PACKAGE_BUGREPORT "http:\/\/bugzilla.gnome.org\/enter_bug.cgi?product=GStreamer"/' \
    -e "s/.* PACKAGE_NAME$/#define PACKAGE_NAME \"$PACKAGE_NAME\"/" \
    -e "s/.* PACKAGE_STRING$/#define PACKAGE_STRING \"$PACKAGE_STRING\"/" \
    -e 's/.* PACKAGE_TARNAME$/#define PACKAGE_TARNAME "'$PACKAGE_TARNAME'"/' \
    -e 's/.* PACKAGE_VERSION$/#define PACKAGE_VERSION "'$PACKAGE_VERSION'"/' \
    -e 's/.* PLUGINDIR$/#ifdef _DEBUG\n#  define PLUGINDIR PREFIX "\\\\debug\\\\lib\\\\gstreamer-0.11"\n#else\n#  define PLUGINDIR PREFIX "\\\\lib\\\\gstreamer-0.11"\n#endif/' \
    -e 's/.* VERSION$/#define VERSION "'$VERSION'"/' \
    -e "s/.* DEFAULT_AUDIOSINK$/#define DEFAULT_AUDIOSINK \"directsoundsink\"/" \
    -e "s/.* DEFAULT_AUDIOSRC$/#define DEFAULT_AUDIOSRC \"audiotestsrc\"/" \
    -e "s/.* DEFAULT_VIDEOSRC$/#define DEFAULT_VIDEOSRC \"videotestsrc\"/" \
    -e "s/.* DEFAULT_VISUALIZER$/#define DEFAULT_VISUALIZER \"goom\"/" \
    -e 's/.* HAVE_WINDOWS_H$/#define HAVE_WINDOWS_H 1/' \
    -e 's/.* HAVE_WININET_H$/#define HAVE_WININET_H 1/' \
    -e 's/.* HAVE_WINSOCK2_H$/#define HAVE_WINSOCK2_H 1/' \
    -e 's/.* HAVE_WS2TCPIP_H$/#define HAVE_WS2TCPIP_H 1/' \
    config.h.in >win32/common/config.h-new

cat >confcache <<\_ACEOF
# This file is a shell script that caches the results of configure
# tests run on this system so they can be shared between configure
# scripts and configure runs, see configure's option --config-cache.
# It is not useful on other systems.  If it contains results you don't
# want to keep, you may remove or edit it.
#
# config.status only pays attention to the cache file if you give it
# the --recheck option to rerun configure.
#
# `ac_cv_env_foo' variables (set or unset) will be overridden when
# loading this file, other *unset* `ac_cv_foo' will be assigned the
# following values.

_ACEOF

# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, we kill variables containing newlines.
# Ultrix sh set writes to stderr and can't be redirected directly,
# and sets the high bit in the cache file unless we assign to the vars.
(
  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
    eval ac_val=\$$ac_var
    case $ac_val in #(
    *${as_nl}*)
      case $ac_var in #(
      *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
      esac
      case $ac_var in #(
      _ | IFS | as_nl) ;; #(
      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
      *) { eval $ac_var=; unset $ac_var;} ;;
      esac ;;
    esac
  done

  (set) 2>&1 |
    case $as_nl`(ac_space=' '; set) 2>&1` in #(
    *${as_nl}ac_space=\ *)
      # `set' does not quote correctly, so add quotes: double-quote
      # substitution turns \\\\ into \\, and sed turns \\ into \.
      sed -n \
	"s/'/'\\\\''/g;
	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
      ;; #(
    *)
      # `set' quotes correctly as required by POSIX, so do not add quotes.
      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
      ;;
    esac |
    sort
) |
  sed '
     /^ac_cv_env_/b end
     t clear
     :clear
     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
     t end
     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
     :end' >>confcache
if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
  if test -w "$cache_file"; then
    if test "x$cache_file" != "x/dev/null"; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
$as_echo "$as_me: updating cache $cache_file" >&6;}
      if test ! -f "$cache_file" || test -h "$cache_file"; then
	cat confcache >"$cache_file"
      else
        case $cache_file in #(
        */* | ?:*)
	  mv -f confcache "$cache_file"$$ &&
	  mv -f "$cache_file"$$ "$cache_file" ;; #(
        *)
	  mv -f confcache "$cache_file" ;;
	esac
      fi
    fi
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
  fi
fi
rm -f confcache

test "x$prefix" = xNONE && prefix=$ac_default_prefix
# Let make expand exec_prefix.
test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'

DEFS=-DHAVE_CONFIG_H

ac_libobjs=
ac_ltlibobjs=
U=
for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
  # 1. Remove the extension, and $U if already installed.
  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
  ac_i=`$as_echo "$ac_i" | sed "$ac_script"`
  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
  #    will be set to the directory where LIBOBJS objects are built.
  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
done
LIBOBJS=$ac_libobjs

LTLIBOBJS=$ac_ltlibobjs


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5
$as_echo_n "checking that generated files are newer than configure... " >&6; }
   if test -n "$am_sleep_pid"; then
     # Hide warnings about reused PIDs.
     wait $am_sleep_pid 2>/dev/null
   fi
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5
$as_echo "done" >&6; }
 if test -n "$EXEEXT"; then
  am__EXEEXT_TRUE=
  am__EXEEXT_FALSE='#'
else
  am__EXEEXT_TRUE='#'
  am__EXEEXT_FALSE=
fi

if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then
  as_fn_error $? "conditional \"MAINTAINER_MODE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
  as_fn_error $? "conditional \"AMDEP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GST_GCOV_ENABLED_TRUE}" && test -z "${GST_GCOV_ENABLED_FALSE}"; then
  as_fn_error $? "conditional \"GST_GCOV_ENABLED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_EXAMPLES_TRUE}" && test -z "${BUILD_EXAMPLES_FALSE}"; then
  as_fn_error $? "conditional \"BUILD_EXAMPLES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EXTERNAL_TRUE}" && test -z "${USE_EXTERNAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_EXTERNAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_EXTERNAL_TRUE}" && test -z "${BUILD_EXTERNAL_FALSE}"; then
  as_fn_error $? "conditional \"BUILD_EXTERNAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EXPERIMENTAL_TRUE}" && test -z "${USE_EXPERIMENTAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_EXPERIMENTAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${BUILD_EXPERIMENTAL_TRUE}" && test -z "${BUILD_EXPERIMENTAL_FALSE}"; then
  as_fn_error $? "conditional \"BUILD_EXPERIMENTAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

if test -z "${HAVE_CPU_I386_TRUE}" && test -z "${HAVE_CPU_I386_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_I386\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_PPC_TRUE}" && test -z "${HAVE_CPU_PPC_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_PPC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_PPC64_TRUE}" && test -z "${HAVE_CPU_PPC64_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_PPC64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_ALPHA_TRUE}" && test -z "${HAVE_CPU_ALPHA_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_ALPHA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_ARC_TRUE}" && test -z "${HAVE_CPU_ARC_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_ARC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_ARM_TRUE}" && test -z "${HAVE_CPU_ARM_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_ARM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_SPARC_TRUE}" && test -z "${HAVE_CPU_SPARC_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_SPARC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_HPPA_TRUE}" && test -z "${HAVE_CPU_HPPA_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_HPPA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_MIPS_TRUE}" && test -z "${HAVE_CPU_MIPS_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_MIPS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_S390_TRUE}" && test -z "${HAVE_CPU_S390_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_S390\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_IA64_TRUE}" && test -z "${HAVE_CPU_IA64_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_IA64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_M68K_TRUE}" && test -z "${HAVE_CPU_M68K_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_M68K\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_X86_64_TRUE}" && test -z "${HAVE_CPU_X86_64_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_X86_64\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_CRIS_TRUE}" && test -z "${HAVE_CPU_CRIS_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_CRIS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CPU_CRISV32_TRUE}" && test -z "${HAVE_CPU_CRISV32_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CPU_CRISV32\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepOBJC_TRUE}" && test -z "${am__fastdepOBJC_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepOBJC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_VALGRIND_TRUE}" && test -z "${HAVE_VALGRIND_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_VALGRIND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_INTROSPECTION_TRUE}" && test -z "${HAVE_INTROSPECTION_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_INTROSPECTION\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_GTK_DOC_TRUE}" && test -z "${ENABLE_GTK_DOC_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_GTK_DOC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GTK_DOC_BUILD_HTML_TRUE}" && test -z "${GTK_DOC_BUILD_HTML_FALSE}"; then
  as_fn_error $? "conditional \"GTK_DOC_BUILD_HTML\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GTK_DOC_BUILD_PDF_TRUE}" && test -z "${GTK_DOC_BUILD_PDF_FALSE}"; then
  as_fn_error $? "conditional \"GTK_DOC_BUILD_PDF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GTK_DOC_USE_LIBTOOL_TRUE}" && test -z "${GTK_DOC_USE_LIBTOOL_FALSE}"; then
  as_fn_error $? "conditional \"GTK_DOC_USE_LIBTOOL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_PLUGIN_DOCS_TRUE}" && test -z "${ENABLE_PLUGIN_DOCS_FALSE}"; then
  as_fn_error $? "conditional \"ENABLE_PLUGIN_DOCS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_UNISTD_H_TRUE}" && test -z "${HAVE_UNISTD_H_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_UNISTD_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_PTHREAD_H_TRUE}" && test -z "${HAVE_PTHREAD_H_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_PTHREAD_H\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_GST_CHECK_TRUE}" && test -z "${HAVE_GST_CHECK_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_GST_CHECK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_GTK_TRUE}" && test -z "${HAVE_GTK_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_GTK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_GTK3_TRUE}" && test -z "${HAVE_GTK3_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_GTK3\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CLUTTER_TRUE}" && test -z "${HAVE_CLUTTER_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CLUTTER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CLUTTER_GLX_TRUE}" && test -z "${HAVE_CLUTTER_GLX_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CLUTTER_GLX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_CLUTTER_X11_TRUE}" && test -z "${HAVE_CLUTTER_X11_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_CLUTTER_X11\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_XCOMPOSITE_TRUE}" && test -z "${HAVE_XCOMPOSITE_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_XCOMPOSITE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_GRAPHENE_TRUE}" && test -z "${HAVE_GRAPHENE_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_GRAPHENE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_SDL_TRUE}" && test -z "${HAVE_SDL_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_SDL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_X11_TRUE}" && test -z "${HAVE_X11_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_X11\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EXIF_TRUE}" && test -z "${USE_EXIF_FALSE}"; then
  as_fn_error $? "conditional \"USE_EXIF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_ORC_TRUE}" && test -z "${HAVE_ORC_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_ORC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_ORCC_TRUE}" && test -z "${HAVE_ORCC_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_ORCC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${GST_PLUGIN_BUILD_STATIC_TRUE}" && test -z "${GST_PLUGIN_BUILD_STATIC_FALSE}"; then
  as_fn_error $? "conditional \"GST_PLUGIN_BUILD_STATIC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${WITH_GST_PLAYER_TESTS_TRUE}" && test -z "${WITH_GST_PLAYER_TESTS_FALSE}"; then
  as_fn_error $? "conditional \"WITH_GST_PLAYER_TESTS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ACCURIP_TRUE}" && test -z "${USE_PLUGIN_ACCURIP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ACCURIP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ADPCMDEC_TRUE}" && test -z "${USE_PLUGIN_ADPCMDEC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ADPCMDEC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ADPCMENC_TRUE}" && test -z "${USE_PLUGIN_ADPCMENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ADPCMENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_AIFF_TRUE}" && test -z "${USE_PLUGIN_AIFF_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_AIFF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE}" && test -z "${USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ASFMUX_TRUE}" && test -z "${USE_PLUGIN_ASFMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ASFMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_AUDIOFXBAD_TRUE}" && test -z "${USE_PLUGIN_AUDIOFXBAD_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_AUDIOFXBAD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_AUDIOMIXER_TRUE}" && test -z "${USE_PLUGIN_AUDIOMIXER_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_AUDIOMIXER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_COMPOSITOR_TRUE}" && test -z "${USE_PLUGIN_COMPOSITOR_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_COMPOSITOR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_AUDIOVISUALIZERS_TRUE}" && test -z "${USE_PLUGIN_AUDIOVISUALIZERS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_AUDIOVISUALIZERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_AUTOCONVERT_TRUE}" && test -z "${USE_PLUGIN_AUTOCONVERT_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_AUTOCONVERT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_BAYER_TRUE}" && test -z "${USE_PLUGIN_BAYER_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_BAYER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_CAMERABIN2_TRUE}" && test -z "${USE_PLUGIN_CAMERABIN2_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_CAMERABIN2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_CDXAPARSE_TRUE}" && test -z "${USE_PLUGIN_CDXAPARSE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_CDXAPARSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_COLOREFFECTS_TRUE}" && test -z "${USE_PLUGIN_COLOREFFECTS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_COLOREFFECTS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DATAURISRC_TRUE}" && test -z "${USE_PLUGIN_DATAURISRC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DATAURISRC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DCCP_TRUE}" && test -z "${USE_PLUGIN_DCCP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DCCP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DEBUGUTILS_TRUE}" && test -z "${USE_PLUGIN_DEBUGUTILS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DEBUGUTILS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DVBSUBOVERLAY_TRUE}" && test -z "${USE_PLUGIN_DVBSUBOVERLAY_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DVBSUBOVERLAY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DVDSPU_TRUE}" && test -z "${USE_PLUGIN_DVDSPU_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DVDSPU\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_FACEOVERLAY_TRUE}" && test -z "${USE_PLUGIN_FACEOVERLAY_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_FACEOVERLAY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_FESTIVAL_TRUE}" && test -z "${USE_PLUGIN_FESTIVAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_FESTIVAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_FIELDANALYSIS_TRUE}" && test -z "${USE_PLUGIN_FIELDANALYSIS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_FIELDANALYSIS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_FREEVERB_TRUE}" && test -z "${USE_PLUGIN_FREEVERB_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_FREEVERB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_FREI0R_TRUE}" && test -z "${USE_PLUGIN_FREI0R_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_FREI0R\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_GAUDIEFFECTS_TRUE}" && test -z "${USE_PLUGIN_GAUDIEFFECTS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_GAUDIEFFECTS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_GEOMETRICTRANSFORM_TRUE}" && test -z "${USE_PLUGIN_GEOMETRICTRANSFORM_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_GEOMETRICTRANSFORM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_GDP_TRUE}" && test -z "${USE_PLUGIN_GDP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_GDP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_HDVPARSE_TRUE}" && test -z "${USE_PLUGIN_HDVPARSE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_HDVPARSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ID3TAG_TRUE}" && test -z "${USE_PLUGIN_ID3TAG_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ID3TAG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_INTER_TRUE}" && test -z "${USE_PLUGIN_INTER_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_INTER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_INTERLACE_TRUE}" && test -z "${USE_PLUGIN_INTERLACE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_INTERLACE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_IVFPARSE_TRUE}" && test -z "${USE_PLUGIN_IVFPARSE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_IVFPARSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_IVTC_TRUE}" && test -z "${USE_PLUGIN_IVTC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_IVTC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_JP2KDECIMATOR_TRUE}" && test -z "${USE_PLUGIN_JP2KDECIMATOR_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_JP2KDECIMATOR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_JPEGFORMAT_TRUE}" && test -z "${USE_PLUGIN_JPEGFORMAT_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_JPEGFORMAT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_LIBRFB_TRUE}" && test -z "${USE_PLUGIN_LIBRFB_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_LIBRFB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MIDI_TRUE}" && test -z "${USE_PLUGIN_MIDI_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MIDI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MPEGDEMUX_TRUE}" && test -z "${USE_PLUGIN_MPEGDEMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MPEGDEMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MPEGTSDEMUX_TRUE}" && test -z "${USE_PLUGIN_MPEGTSDEMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MPEGTSDEMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MPEGTSMUX_TRUE}" && test -z "${USE_PLUGIN_MPEGTSMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MPEGTSMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MPEGPSMUX_TRUE}" && test -z "${USE_PLUGIN_MPEGPSMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MPEGPSMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MVE_TRUE}" && test -z "${USE_PLUGIN_MVE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MVE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_MXF_TRUE}" && test -z "${USE_PLUGIN_MXF_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_MXF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_NETSIM_TRUE}" && test -z "${USE_PLUGIN_NETSIM_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_NETSIM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_NUVDEMUX_TRUE}" && test -z "${USE_PLUGIN_NUVDEMUX_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_NUVDEMUX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_ONVIF_TRUE}" && test -z "${USE_PLUGIN_ONVIF_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_ONVIF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_PATCHDETECT_TRUE}" && test -z "${USE_PLUGIN_PATCHDETECT_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_PATCHDETECT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_PCAPPARSE_TRUE}" && test -z "${USE_PLUGIN_PCAPPARSE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_PCAPPARSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_PNM_TRUE}" && test -z "${USE_PLUGIN_PNM_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_PNM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_RAWPARSE_TRUE}" && test -z "${USE_PLUGIN_RAWPARSE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_RAWPARSE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_REMOVESILENCE_TRUE}" && test -z "${USE_PLUGIN_REMOVESILENCE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_REMOVESILENCE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SDI_TRUE}" && test -z "${USE_PLUGIN_SDI_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SDI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SDP_TRUE}" && test -z "${USE_PLUGIN_SDP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SDP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SEGMENTCLIP_TRUE}" && test -z "${USE_PLUGIN_SEGMENTCLIP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SEGMENTCLIP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SIREN_TRUE}" && test -z "${USE_PLUGIN_SIREN_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SIREN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SMOOTH_TRUE}" && test -z "${USE_PLUGIN_SMOOTH_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SMOOTH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SPEED_TRUE}" && test -z "${USE_PLUGIN_SPEED_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SPEED\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_SUBENC_TRUE}" && test -z "${USE_PLUGIN_SUBENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_SUBENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_STEREO_TRUE}" && test -z "${USE_PLUGIN_STEREO_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_STEREO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_TTA_TRUE}" && test -z "${USE_PLUGIN_TTA_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_TTA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VIDEOFILTERS_TRUE}" && test -z "${USE_PLUGIN_VIDEOFILTERS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOFILTERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VIDEOMEASURE_TRUE}" && test -z "${USE_PLUGIN_VIDEOMEASURE_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOMEASURE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VIDEOPARSERS_TRUE}" && test -z "${USE_PLUGIN_VIDEOPARSERS_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOPARSERS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VIDEOSIGNAL_TRUE}" && test -z "${USE_PLUGIN_VIDEOSIGNAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOSIGNAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_VMNC_TRUE}" && test -z "${USE_PLUGIN_VMNC_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_VMNC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_Y4M_TRUE}" && test -z "${USE_PLUGIN_Y4M_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_Y4M\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_YADIF_TRUE}" && test -z "${USE_PLUGIN_YADIF_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_YADIF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_AVFOUNDATION_TRUE}" && test -z "${HAVE_AVFOUNDATION_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_AVFOUNDATION\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_IOS_TRUE}" && test -z "${HAVE_IOS_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_IOS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_VIDEOTOOLBOX_TRUE}" && test -z "${HAVE_VIDEOTOOLBOX_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_VIDEOTOOLBOX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PLUGIN_DCCP_TRUE}" && test -z "${USE_PLUGIN_DCCP_FALSE}"; then
  as_fn_error $? "conditional \"USE_PLUGIN_DCCP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_X11_TRUE}" && test -z "${HAVE_WINDOW_X11_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_X11\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_COCOA_TRUE}" && test -z "${HAVE_WINDOW_COCOA_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_COCOA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_WIN32_TRUE}" && test -z "${HAVE_WINDOW_WIN32_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_WIN32\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_DISPMANX_TRUE}" && test -z "${HAVE_WINDOW_DISPMANX_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_DISPMANX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_WAYLAND_TRUE}" && test -z "${HAVE_WINDOW_WAYLAND_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_WAYLAND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_ANDROID_TRUE}" && test -z "${HAVE_WINDOW_ANDROID_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_ANDROID\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_WINDOW_EAGL_TRUE}" && test -z "${HAVE_WINDOW_EAGL_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_WINDOW_EAGL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENGL_TRUE}" && test -z "${USE_OPENGL_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENGL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GLES2_TRUE}" && test -z "${USE_GLES2_FALSE}"; then
  as_fn_error $? "conditional \"USE_GLES2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GLX_TRUE}" && test -z "${USE_GLX_FALSE}"; then
  as_fn_error $? "conditional \"USE_GLX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EGL_TRUE}" && test -z "${USE_EGL_FALSE}"; then
  as_fn_error $? "conditional \"USE_EGL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WGL_TRUE}" && test -z "${USE_WGL_FALSE}"; then
  as_fn_error $? "conditional \"USE_WGL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_COCOA_TRUE}" && test -z "${USE_COCOA_FALSE}"; then
  as_fn_error $? "conditional \"USE_COCOA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EGL_MALI_TRUE}" && test -z "${USE_EGL_MALI_FALSE}"; then
  as_fn_error $? "conditional \"USE_EGL_MALI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EGL_RPI_TRUE}" && test -z "${USE_EGL_RPI_FALSE}"; then
  as_fn_error $? "conditional \"USE_EGL_RPI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EAGL_TRUE}" && test -z "${USE_EAGL_FALSE}"; then
  as_fn_error $? "conditional \"USE_EAGL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_GST_GL_TRUE}" && test -z "${HAVE_GST_GL_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_GST_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_PNG_TRUE}" && test -z "${HAVE_PNG_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_PNG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${HAVE_JPEG_TRUE}" && test -z "${HAVE_JPEG_FALSE}"; then
  as_fn_error $? "conditional \"HAVE_JPEG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_XCB_TRUE}" && test -z "${USE_XCB_FALSE}"; then
  as_fn_error $? "conditional \"USE_XCB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DIRECTSOUND_TRUE}" && test -z "${USE_DIRECTSOUND_FALSE}"; then
  as_fn_error $? "conditional \"USE_DIRECTSOUND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WASAPI_TRUE}" && test -z "${USE_WASAPI_FALSE}"; then
  as_fn_error $? "conditional \"USE_WASAPI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DIRECT3D_TRUE}" && test -z "${USE_DIRECT3D_FALSE}"; then
  as_fn_error $? "conditional \"USE_DIRECT3D\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WINSCREENCAP_TRUE}" && test -z "${USE_WINSCREENCAP_FALSE}"; then
  as_fn_error $? "conditional \"USE_WINSCREENCAP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WINKS_TRUE}" && test -z "${USE_WINKS_FALSE}"; then
  as_fn_error $? "conditional \"USE_WINKS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ANDROID_MEDIA_TRUE}" && test -z "${USE_ANDROID_MEDIA_FALSE}"; then
  as_fn_error $? "conditional \"USE_ANDROID_MEDIA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_APPLE_MEDIA_TRUE}" && test -z "${USE_APPLE_MEDIA_FALSE}"; then
  as_fn_error $? "conditional \"USE_APPLE_MEDIA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_BLUEZ_TRUE}" && test -z "${USE_BLUEZ_FALSE}"; then
  as_fn_error $? "conditional \"USE_BLUEZ\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_AVC_TRUE}" && test -z "${USE_AVC_FALSE}"; then
  as_fn_error $? "conditional \"USE_AVC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SHM_TRUE}" && test -z "${USE_SHM_FALSE}"; then
  as_fn_error $? "conditional \"USE_SHM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VCD_TRUE}" && test -z "${USE_VCD_FALSE}"; then
  as_fn_error $? "conditional \"USE_VCD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENSLES_TRUE}" && test -z "${USE_OPENSLES_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENSLES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_UVCH264_TRUE}" && test -z "${USE_UVCH264_FALSE}"; then
  as_fn_error $? "conditional \"USE_UVCH264\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NVENC_TRUE}" && test -z "${USE_NVENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_NVENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NVENC_GST_GL_TRUE}" && test -z "${USE_NVENC_GST_GL_FALSE}"; then
  as_fn_error $? "conditional \"USE_NVENC_GST_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TINYALSA_TRUE}" && test -z "${USE_TINYALSA_FALSE}"; then
  as_fn_error $? "conditional \"USE_TINYALSA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ASSRENDER_TRUE}" && test -z "${USE_ASSRENDER_FALSE}"; then
  as_fn_error $? "conditional \"USE_ASSRENDER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VOAMRWBENC_TRUE}" && test -z "${USE_VOAMRWBENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_VOAMRWBENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VOAACENC_TRUE}" && test -z "${USE_VOAACENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_VOAACENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_APEXSINK_TRUE}" && test -z "${USE_APEXSINK_FALSE}"; then
  as_fn_error $? "conditional \"USE_APEXSINK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_BS2B_TRUE}" && test -z "${USE_BS2B_FALSE}"; then
  as_fn_error $? "conditional \"USE_BS2B\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then
  as_fn_error $? "conditional \"USE_BZ2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_CHROMAPRINT_TRUE}" && test -z "${USE_CHROMAPRINT_FALSE}"; then
  as_fn_error $? "conditional \"USE_CHROMAPRINT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SSH2_TRUE}" && test -z "${USE_SSH2_FALSE}"; then
  as_fn_error $? "conditional \"USE_SSH2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SSH2_TRUE}" && test -z "${USE_SSH2_FALSE}"; then
  as_fn_error $? "conditional \"USE_SSH2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_CURL_TRUE}" && test -z "${USE_CURL_FALSE}"; then
  as_fn_error $? "conditional \"USE_CURL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DASH_TRUE}" && test -z "${USE_DASH_FALSE}"; then
  as_fn_error $? "conditional \"USE_DASH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DC1394_TRUE}" && test -z "${USE_DC1394_FALSE}"; then
  as_fn_error $? "conditional \"USE_DC1394\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DECKLINK_TRUE}" && test -z "${USE_DECKLINK_FALSE}"; then
  as_fn_error $? "conditional \"USE_DECKLINK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${DECKLINK_OSX_TRUE}" && test -z "${DECKLINK_OSX_FALSE}"; then
  as_fn_error $? "conditional \"DECKLINK_OSX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DIRECTFB_TRUE}" && test -z "${USE_DIRECTFB_FALSE}"; then
  as_fn_error $? "conditional \"USE_DIRECTFB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WAYLAND_TRUE}" && test -z "${USE_WAYLAND_FALSE}"; then
  as_fn_error $? "conditional \"USE_WAYLAND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WEBP_TRUE}" && test -z "${USE_WEBP_FALSE}"; then
  as_fn_error $? "conditional \"USE_WEBP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DAALA_TRUE}" && test -z "${USE_DAALA_FALSE}"; then
  as_fn_error $? "conditional \"USE_DAALA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DTS_TRUE}" && test -z "${USE_DTS_FALSE}"; then
  as_fn_error $? "conditional \"USE_DTS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RESINDVD_TRUE}" && test -z "${USE_RESINDVD_FALSE}"; then
  as_fn_error $? "conditional \"USE_RESINDVD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FAAC_TRUE}" && test -z "${USE_FAAC_FALSE}"; then
  as_fn_error $? "conditional \"USE_FAAC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FAAD_TRUE}" && test -z "${USE_FAAD_FALSE}"; then
  as_fn_error $? "conditional \"USE_FAAD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FBDEV_TRUE}" && test -z "${USE_FBDEV_FALSE}"; then
  as_fn_error $? "conditional \"USE_FBDEV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FLITE_TRUE}" && test -z "${USE_FLITE_FALSE}"; then
  as_fn_error $? "conditional \"USE_FLITE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GSM_TRUE}" && test -z "${USE_GSM_FALSE}"; then
  as_fn_error $? "conditional \"USE_GSM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FLUIDSYNTH_TRUE}" && test -z "${USE_FLUIDSYNTH_FALSE}"; then
  as_fn_error $? "conditional \"USE_FLUIDSYNTH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TIGER_TRUE}" && test -z "${USE_TIGER_FALSE}"; then
  as_fn_error $? "conditional \"USE_TIGER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TIGER_TRUE}" && test -z "${USE_TIGER_FALSE}"; then
  as_fn_error $? "conditional \"USE_TIGER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_KATE_TRUE}" && test -z "${USE_KATE_FALSE}"; then
  as_fn_error $? "conditional \"USE_KATE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LADSPA_TRUE}" && test -z "${USE_LADSPA_FALSE}"; then
  as_fn_error $? "conditional \"USE_LADSPA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LV2_TRUE}" && test -z "${USE_LV2_FALSE}"; then
  as_fn_error $? "conditional \"USE_LV2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBDE265_TRUE}" && test -z "${USE_LIBDE265_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBDE265\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBMMS_TRUE}" && test -z "${USE_LIBMMS_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBMMS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SRTP_TRUE}" && test -z "${USE_SRTP_FALSE}"; then
  as_fn_error $? "conditional \"USE_SRTP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DTLS_TRUE}" && test -z "${USE_DTLS_FALSE}"; then
  as_fn_error $? "conditional \"USE_DTLS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LINSYS_TRUE}" && test -z "${USE_LINSYS_FALSE}"; then
  as_fn_error $? "conditional \"USE_LINSYS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MODPLUG_TRUE}" && test -z "${USE_MODPLUG_FALSE}"; then
  as_fn_error $? "conditional \"USE_MODPLUG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MIMIC_TRUE}" && test -z "${USE_MIMIC_FALSE}"; then
  as_fn_error $? "conditional \"USE_MIMIC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MPEG2ENC_TRUE}" && test -z "${USE_MPEG2ENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_MPEG2ENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MPLEX_TRUE}" && test -z "${USE_MPLEX_FALSE}"; then
  as_fn_error $? "conditional \"USE_MPLEX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MUSEPACK_TRUE}" && test -z "${USE_MUSEPACK_FALSE}"; then
  as_fn_error $? "conditional \"USE_MUSEPACK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NAS_TRUE}" && test -z "${USE_NAS_FALSE}"; then
  as_fn_error $? "conditional \"USE_NAS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NEON_TRUE}" && test -z "${USE_NEON_FALSE}"; then
  as_fn_error $? "conditional \"USE_NEON\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OFA_TRUE}" && test -z "${USE_OFA_FALSE}"; then
  as_fn_error $? "conditional \"USE_OFA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENAL_TRUE}" && test -z "${USE_OPENAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENCV_TRUE}" && test -z "${USE_OPENCV_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENCV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENEXR_TRUE}" && test -z "${USE_OPENEXR_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENEXR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENH264_TRUE}" && test -z "${USE_OPENH264_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENH264\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENJPEG_TRUE}" && test -z "${USE_OPENJPEG_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENJPEG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENNI2_TRUE}" && test -z "${USE_OPENNI2_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENNI2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPUS_TRUE}" && test -z "${USE_OPUS_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPUS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PVR_TRUE}" && test -z "${USE_PVR_FALSE}"; then
  as_fn_error $? "conditional \"USE_PVR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RSVG_TRUE}" && test -z "${USE_RSVG_FALSE}"; then
  as_fn_error $? "conditional \"USE_RSVG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GL_TRUE}" && test -z "${USE_GL_FALSE}"; then
  as_fn_error $? "conditional \"USE_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GTK3_TRUE}" && test -z "${USE_GTK3_FALSE}"; then
  as_fn_error $? "conditional \"USE_GTK3\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GTK3_GL_TRUE}" && test -z "${USE_GTK3_GL_FALSE}"; then
  as_fn_error $? "conditional \"USE_GTK3_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_QT_TRUE}" && test -z "${USE_QT_FALSE}"; then
  as_fn_error $? "conditional \"USE_QT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VULKAN_TRUE}" && test -z "${USE_VULKAN_FALSE}"; then
  as_fn_error $? "conditional \"USE_VULKAN\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBVISUAL_TRUE}" && test -z "${USE_LIBVISUAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBVISUAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TIMIDITY_TRUE}" && test -z "${USE_TIMIDITY_FALSE}"; then
  as_fn_error $? "conditional \"USE_TIMIDITY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TELETEXTDEC_TRUE}" && test -z "${USE_TELETEXTDEC_FALSE}"; then
  as_fn_error $? "conditional \"USE_TELETEXTDEC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WILDMIDI_TRUE}" && test -z "${USE_WILDMIDI_FALSE}"; then
  as_fn_error $? "conditional \"USE_WILDMIDI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SDL_TRUE}" && test -z "${USE_SDL_FALSE}"; then
  as_fn_error $? "conditional \"USE_SDL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SMOOTHSTREAMING_TRUE}" && test -z "${USE_SMOOTHSTREAMING_FALSE}"; then
  as_fn_error $? "conditional \"USE_SMOOTHSTREAMING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SNDFILE_TRUE}" && test -z "${USE_SNDFILE_FALSE}"; then
  as_fn_error $? "conditional \"USE_SNDFILE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SOUNDTOUCH_TRUE}" && test -z "${USE_SOUNDTOUCH_FALSE}"; then
  as_fn_error $? "conditional \"USE_SOUNDTOUCH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SPC_TRUE}" && test -z "${USE_SPC_FALSE}"; then
  as_fn_error $? "conditional \"USE_SPC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GME_TRUE}" && test -z "${USE_GME_FALSE}"; then
  as_fn_error $? "conditional \"USE_GME\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_XVID_TRUE}" && test -z "${USE_XVID_FALSE}"; then
  as_fn_error $? "conditional \"USE_XVID\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DVB_TRUE}" && test -z "${USE_DVB_FALSE}"; then
  as_fn_error $? "conditional \"USE_DVB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WININET_TRUE}" && test -z "${USE_WININET_FALSE}"; then
  as_fn_error $? "conditional \"USE_WININET\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ACM_TRUE}" && test -z "${USE_ACM_FALSE}"; then
  as_fn_error $? "conditional \"USE_ACM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VDPAU_TRUE}" && test -z "${USE_VDPAU_FALSE}"; then
  as_fn_error $? "conditional \"USE_VDPAU\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SBC_TRUE}" && test -z "${USE_SBC_FALSE}"; then
  as_fn_error $? "conditional \"USE_SBC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SCHRO_TRUE}" && test -z "${USE_SCHRO_FALSE}"; then
  as_fn_error $? "conditional \"USE_SCHRO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ZBAR_TRUE}" && test -z "${USE_ZBAR_FALSE}"; then
  as_fn_error $? "conditional \"USE_ZBAR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RTMP_TRUE}" && test -z "${USE_RTMP_FALSE}"; then
  as_fn_error $? "conditional \"USE_RTMP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SPANDSP_TRUE}" && test -z "${USE_SPANDSP_FALSE}"; then
  as_fn_error $? "conditional \"USE_SPANDSP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SNDIO_TRUE}" && test -z "${USE_SNDIO_FALSE}"; then
  as_fn_error $? "conditional \"USE_SNDIO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_HLS_TRUE}" && test -z "${USE_HLS_FALSE}"; then
  as_fn_error $? "conditional \"USE_HLS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_X265_TRUE}" && test -z "${USE_X265_FALSE}"; then
  as_fn_error $? "conditional \"USE_X265\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ASSRENDER_TRUE}" && test -z "${USE_ASSRENDER_FALSE}"; then
  as_fn_error $? "conditional \"USE_ASSRENDER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VOAMRWBENC_TRUE}" && test -z "${USE_VOAMRWBENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_VOAMRWBENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VOAACENC_TRUE}" && test -z "${USE_VOAACENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_VOAACENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_APEXSINK_TRUE}" && test -z "${USE_APEXSINK_FALSE}"; then
  as_fn_error $? "conditional \"USE_APEXSINK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_BS2B_TRUE}" && test -z "${USE_BS2B_FALSE}"; then
  as_fn_error $? "conditional \"USE_BS2B\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_BZ2_TRUE}" && test -z "${USE_BZ2_FALSE}"; then
  as_fn_error $? "conditional \"USE_BZ2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_CHROMAPRINT_TRUE}" && test -z "${USE_CHROMAPRINT_FALSE}"; then
  as_fn_error $? "conditional \"USE_CHROMAPRINT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_CURL_TRUE}" && test -z "${USE_CURL_FALSE}"; then
  as_fn_error $? "conditional \"USE_CURL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SSH2_TRUE}" && test -z "${USE_SSH2_FALSE}"; then
  as_fn_error $? "conditional \"USE_SSH2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DASH_TRUE}" && test -z "${USE_DASH_FALSE}"; then
  as_fn_error $? "conditional \"USE_DASH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DC1394_TRUE}" && test -z "${USE_DC1394_FALSE}"; then
  as_fn_error $? "conditional \"USE_DC1394\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DECKLINK_TRUE}" && test -z "${USE_DECKLINK_FALSE}"; then
  as_fn_error $? "conditional \"USE_DECKLINK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${DECKLINK_OSX_TRUE}" && test -z "${DECKLINK_OSX_FALSE}"; then
  as_fn_error $? "conditional \"DECKLINK_OSX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DIRECTFB_TRUE}" && test -z "${USE_DIRECTFB_FALSE}"; then
  as_fn_error $? "conditional \"USE_DIRECTFB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WAYLAND_TRUE}" && test -z "${USE_WAYLAND_FALSE}"; then
  as_fn_error $? "conditional \"USE_WAYLAND\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DAALA_TRUE}" && test -z "${USE_DAALA_FALSE}"; then
  as_fn_error $? "conditional \"USE_DAALA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DTS_TRUE}" && test -z "${USE_DTS_FALSE}"; then
  as_fn_error $? "conditional \"USE_DTS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_EXIF_TRUE}" && test -z "${USE_EXIF_FALSE}"; then
  as_fn_error $? "conditional \"USE_EXIF\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RESINDVD_TRUE}" && test -z "${USE_RESINDVD_FALSE}"; then
  as_fn_error $? "conditional \"USE_RESINDVD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FAAC_TRUE}" && test -z "${USE_FAAC_FALSE}"; then
  as_fn_error $? "conditional \"USE_FAAC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FAAD_TRUE}" && test -z "${USE_FAAD_FALSE}"; then
  as_fn_error $? "conditional \"USE_FAAD\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FBDEV_TRUE}" && test -z "${USE_FBDEV_FALSE}"; then
  as_fn_error $? "conditional \"USE_FBDEV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FLITE_TRUE}" && test -z "${USE_FLITE_FALSE}"; then
  as_fn_error $? "conditional \"USE_FLITE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_FLUIDSYNTH_TRUE}" && test -z "${USE_FLUIDSYNTH_FALSE}"; then
  as_fn_error $? "conditional \"USE_FLUIDSYNTH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GL_TRUE}" && test -z "${USE_GL_FALSE}"; then
  as_fn_error $? "conditional \"USE_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GSM_TRUE}" && test -z "${USE_GSM_FALSE}"; then
  as_fn_error $? "conditional \"USE_GSM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GTK3_TRUE}" && test -z "${USE_GTK3_FALSE}"; then
  as_fn_error $? "conditional \"USE_GTK3\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GTK3_GL_TRUE}" && test -z "${USE_GTK3_GL_FALSE}"; then
  as_fn_error $? "conditional \"USE_GTK3_GL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_HLS_TRUE}" && test -z "${USE_HLS_FALSE}"; then
  as_fn_error $? "conditional \"USE_HLS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_KATE_TRUE}" && test -z "${USE_KATE_FALSE}"; then
  as_fn_error $? "conditional \"USE_KATE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TIGER_TRUE}" && test -z "${USE_TIGER_FALSE}"; then
  as_fn_error $? "conditional \"USE_TIGER\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LADSPA_TRUE}" && test -z "${USE_LADSPA_FALSE}"; then
  as_fn_error $? "conditional \"USE_LADSPA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LV2_TRUE}" && test -z "${USE_LV2_FALSE}"; then
  as_fn_error $? "conditional \"USE_LV2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBDE265_TRUE}" && test -z "${USE_LIBDE265_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBDE265\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBMMS_TRUE}" && test -z "${USE_LIBMMS_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBMMS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LINSYS_TRUE}" && test -z "${USE_LINSYS_FALSE}"; then
  as_fn_error $? "conditional \"USE_LINSYS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MODPLUG_TRUE}" && test -z "${USE_MODPLUG_FALSE}"; then
  as_fn_error $? "conditional \"USE_MODPLUG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MIMIC_TRUE}" && test -z "${USE_MIMIC_FALSE}"; then
  as_fn_error $? "conditional \"USE_MIMIC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MPEG2ENC_TRUE}" && test -z "${USE_MPEG2ENC_FALSE}"; then
  as_fn_error $? "conditional \"USE_MPEG2ENC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MPLEX_TRUE}" && test -z "${USE_MPLEX_FALSE}"; then
  as_fn_error $? "conditional \"USE_MPLEX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_MUSEPACK_TRUE}" && test -z "${USE_MUSEPACK_FALSE}"; then
  as_fn_error $? "conditional \"USE_MUSEPACK\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NAS_TRUE}" && test -z "${USE_NAS_FALSE}"; then
  as_fn_error $? "conditional \"USE_NAS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_NEON_TRUE}" && test -z "${USE_NEON_FALSE}"; then
  as_fn_error $? "conditional \"USE_NEON\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OFA_TRUE}" && test -z "${USE_OFA_FALSE}"; then
  as_fn_error $? "conditional \"USE_OFA\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENAL_TRUE}" && test -z "${USE_OPENAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENCV_TRUE}" && test -z "${USE_OPENCV_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENCV\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENEXR_TRUE}" && test -z "${USE_OPENEXR_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENEXR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENJPEG_TRUE}" && test -z "${USE_OPENJPEG_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENJPEG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENNI2_TRUE}" && test -z "${USE_OPENNI2_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENNI2\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPUS_TRUE}" && test -z "${USE_OPUS_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPUS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_PVR_TRUE}" && test -z "${USE_PVR_FALSE}"; then
  as_fn_error $? "conditional \"USE_PVR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_QT_TRUE}" && test -z "${USE_QT_FALSE}"; then
  as_fn_error $? "conditional \"USE_QT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_LIBVISUAL_TRUE}" && test -z "${USE_LIBVISUAL_FALSE}"; then
  as_fn_error $? "conditional \"USE_LIBVISUAL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TIMIDITY_TRUE}" && test -z "${USE_TIMIDITY_FALSE}"; then
  as_fn_error $? "conditional \"USE_TIMIDITY\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WILDMIDI_TRUE}" && test -z "${USE_WILDMIDI_FALSE}"; then
  as_fn_error $? "conditional \"USE_WILDMIDI\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SDL_TRUE}" && test -z "${USE_SDL_FALSE}"; then
  as_fn_error $? "conditional \"USE_SDL\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SMOOTHSTREAMING_TRUE}" && test -z "${USE_SMOOTHSTREAMING_FALSE}"; then
  as_fn_error $? "conditional \"USE_SMOOTHSTREAMING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SNDFILE_TRUE}" && test -z "${USE_SNDFILE_FALSE}"; then
  as_fn_error $? "conditional \"USE_SNDFILE\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SOUNDTOUCH_TRUE}" && test -z "${USE_SOUNDTOUCH_FALSE}"; then
  as_fn_error $? "conditional \"USE_SOUNDTOUCH\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SPANDSP_TRUE}" && test -z "${USE_SPANDSP_FALSE}"; then
  as_fn_error $? "conditional \"USE_SPANDSP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SPC_TRUE}" && test -z "${USE_SPC_FALSE}"; then
  as_fn_error $? "conditional \"USE_SPC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SRTP_TRUE}" && test -z "${USE_SRTP_FALSE}"; then
  as_fn_error $? "conditional \"USE_SRTP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_GME_TRUE}" && test -z "${USE_GME_FALSE}"; then
  as_fn_error $? "conditional \"USE_GME\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_XVID_TRUE}" && test -z "${USE_XVID_FALSE}"; then
  as_fn_error $? "conditional \"USE_XVID\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DVB_TRUE}" && test -z "${USE_DVB_FALSE}"; then
  as_fn_error $? "conditional \"USE_DVB\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WININET_TRUE}" && test -z "${USE_WININET_FALSE}"; then
  as_fn_error $? "conditional \"USE_WININET\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ACM_TRUE}" && test -z "${USE_ACM_FALSE}"; then
  as_fn_error $? "conditional \"USE_ACM\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_VDPAU_TRUE}" && test -z "${USE_VDPAU_FALSE}"; then
  as_fn_error $? "conditional \"USE_VDPAU\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SBC_TRUE}" && test -z "${USE_SBC_FALSE}"; then
  as_fn_error $? "conditional \"USE_SBC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SCHRO_TRUE}" && test -z "${USE_SCHRO_FALSE}"; then
  as_fn_error $? "conditional \"USE_SCHRO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_ZBAR_TRUE}" && test -z "${USE_ZBAR_FALSE}"; then
  as_fn_error $? "conditional \"USE_ZBAR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RSVG_TRUE}" && test -z "${USE_RSVG_FALSE}"; then
  as_fn_error $? "conditional \"USE_RSVG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_RTMP_TRUE}" && test -z "${USE_RTMP_FALSE}"; then
  as_fn_error $? "conditional \"USE_RTMP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_TELETEXTDEC_TRUE}" && test -z "${USE_TELETEXTDEC_FALSE}"; then
  as_fn_error $? "conditional \"USE_TELETEXTDEC\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_SNDIO_TRUE}" && test -z "${USE_SNDIO_FALSE}"; then
  as_fn_error $? "conditional \"USE_SNDIO\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_UVCH264_TRUE}" && test -z "${USE_UVCH264_FALSE}"; then
  as_fn_error $? "conditional \"USE_UVCH264\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_WEBP_TRUE}" && test -z "${USE_WEBP_FALSE}"; then
  as_fn_error $? "conditional \"USE_WEBP\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_OPENH264_TRUE}" && test -z "${USE_OPENH264_FALSE}"; then
  as_fn_error $? "conditional \"USE_OPENH264\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_X265_TRUE}" && test -z "${USE_X265_FALSE}"; then
  as_fn_error $? "conditional \"USE_X265\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${USE_DTLS_TRUE}" && test -z "${USE_DTLS_FALSE}"; then
  as_fn_error $? "conditional \"USE_DTLS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi

: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
ac_clean_files_save=$ac_clean_files
ac_clean_files="$ac_clean_files $CONFIG_STATUS"
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
as_write_fail=0
cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
#! $SHELL
# Generated by $as_me.
# Run this file to recreate the current configuration.
# Compiler output produced by configure, useful for debugging
# configure, is in config.log if it exists.

debug=false
ac_cs_recheck=false
ac_cs_silent=false

SHELL=\${CONFIG_SHELL-$SHELL}
export SHELL
_ASEOF
cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
## -------------------- ##
## M4sh Initialization. ##
## -------------------- ##

# Be more Bourne compatible
DUALCASE=1; export DUALCASE # for MKS sh
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
  emulate sh
  NULLCMD=:
  # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
  # is contrary to our usage.  Disable this feature.
  alias -g '${1+"$@"}'='"$@"'
  setopt NO_GLOB_SUBST
else
  case `(set -o) 2>/dev/null` in #(
  *posix*) :
    set -o posix ;; #(
  *) :
     ;;
esac
fi


as_nl='
'
export as_nl
# Printing a long string crashes Solaris 7 /usr/bin/printf.
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
# Prefer a ksh shell builtin over an external printf program on Solaris,
# but without wasting forks for bash or zsh.
if test -z "$BASH_VERSION$ZSH_VERSION" \
    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='print -r --'
  as_echo_n='print -rn --'
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
  as_echo='printf %s\n'
  as_echo_n='printf %s'
else
  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
    as_echo_n='/usr/ucb/echo -n'
  else
    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
    as_echo_n_body='eval
      arg=$1;
      case $arg in #(
      *"$as_nl"*)
	expr "X$arg" : "X\\(.*\\)$as_nl";
	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
      esac;
      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
    '
    export as_echo_n_body
    as_echo_n='sh -c $as_echo_n_body as_echo'
  fi
  export as_echo_body
  as_echo='sh -c $as_echo_body as_echo'
fi

# The user is always right.
if test "${PATH_SEPARATOR+set}" != set; then
  PATH_SEPARATOR=:
  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
      PATH_SEPARATOR=';'
  }
fi


# IFS
# We need space, tab and new line, in precisely that order.  Quoting is
# there to prevent editors from complaining about space-tab.
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
# splitting by setting IFS to empty value.)
IFS=" ""	$as_nl"

# Find who we are.  Look in the path if we contain no directory separator.
as_myself=
case $0 in #((
  *[\\/]* ) as_myself=$0 ;;
  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in $PATH
do
  IFS=$as_save_IFS
  test -z "$as_dir" && as_dir=.
    test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
  done
IFS=$as_save_IFS

     ;;
esac
# We did not find ourselves, most probably we were run as `sh COMMAND'
# in which case we are not to be found in the path.
if test "x$as_myself" = x; then
  as_myself=$0
fi
if test ! -f "$as_myself"; then
  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
  exit 1
fi

# Unset variables that we do not need and which cause bugs (e.g. in
# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
# suppresses any "Segmentation fault" message there.  '((' could
# trigger a bug in pdksh 5.2.14.
for as_var in BASH_ENV ENV MAIL MAILPATH
do eval test x\${$as_var+set} = xset \
  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
done
PS1='$ '
PS2='> '
PS4='+ '

# NLS nuisances.
LC_ALL=C
export LC_ALL
LANGUAGE=C
export LANGUAGE

# CDPATH.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH


# as_fn_error STATUS ERROR [LINENO LOG_FD]
# ----------------------------------------
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
# script with STATUS, using 1 if that was 0.
as_fn_error ()
{
  as_status=$1; test $as_status -eq 0 && as_status=1
  if test "$4"; then
    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
  fi
  $as_echo "$as_me: error: $2" >&2
  as_fn_exit $as_status
} # as_fn_error


# as_fn_set_status STATUS
# -----------------------
# Set $? to STATUS, without forking.
as_fn_set_status ()
{
  return $1
} # as_fn_set_status

# as_fn_exit STATUS
# -----------------
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
as_fn_exit ()
{
  set +e
  as_fn_set_status $1
  exit $1
} # as_fn_exit

# as_fn_unset VAR
# ---------------
# Portably unset VAR.
as_fn_unset ()
{
  { eval $1=; unset $1;}
}
as_unset=as_fn_unset
# as_fn_append VAR VALUE
# ----------------------
# Append the text in VALUE to the end of the definition contained in VAR. Take
# advantage of any shell optimizations that allow amortized linear growth over
# repeated appends, instead of the typical quadratic growth present in naive
# implementations.
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
  eval 'as_fn_append ()
  {
    eval $1+=\$2
  }'
else
  as_fn_append ()
  {
    eval $1=\$$1\$2
  }
fi # as_fn_append

# as_fn_arith ARG...
# ------------------
# Perform arithmetic evaluation on the ARGs, and store the result in the
# global $as_val. Take advantage of shells that can avoid forks. The arguments
# must be portable across $(()) and expr.
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
  eval 'as_fn_arith ()
  {
    as_val=$(( $* ))
  }'
else
  as_fn_arith ()
  {
    as_val=`expr "$@" || test $? -eq 1`
  }
fi # as_fn_arith


if expr a : '\(a\)' >/dev/null 2>&1 &&
   test "X`expr 00001 : '.*\(...\)'`" = X001; then
  as_expr=expr
else
  as_expr=false
fi

if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
  as_basename=basename
else
  as_basename=false
fi

if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
  as_dirname=dirname
else
  as_dirname=false
fi

as_me=`$as_basename -- "$0" ||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
	 X"$0" : 'X\(//\)$' \| \
	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X/"$0" |
    sed '/^.*\/\([^/][^/]*\)\/*$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\/\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`

# Avoid depending upon Character Ranges.
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
as_cr_digits='0123456789'
as_cr_alnum=$as_cr_Letters$as_cr_digits

ECHO_C= ECHO_N= ECHO_T=
case `echo -n x` in #(((((
-n*)
  case `echo 'xy\c'` in
  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
  xy)  ECHO_C='\c';;
  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
       ECHO_T='	';;
  esac;;
*)
  ECHO_N='-n';;
esac

rm -f conf$$ conf$$.exe conf$$.file
if test -d conf$$.dir; then
  rm -f conf$$.dir/conf$$.file
else
  rm -f conf$$.dir
  mkdir conf$$.dir 2>/dev/null
fi
if (echo >conf$$.file) 2>/dev/null; then
  if ln -s conf$$.file conf$$ 2>/dev/null; then
    as_ln_s='ln -s'
    # ... but there are two gotchas:
    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
    # In both cases, we have to default to `cp -pR'.
    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
      as_ln_s='cp -pR'
  elif ln conf$$.file conf$$ 2>/dev/null; then
    as_ln_s=ln
  else
    as_ln_s='cp -pR'
  fi
else
  as_ln_s='cp -pR'
fi
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
rmdir conf$$.dir 2>/dev/null


# as_fn_mkdir_p
# -------------
# Create "$as_dir" as a directory, including parents if necessary.
as_fn_mkdir_p ()
{

  case $as_dir in #(
  -*) as_dir=./$as_dir;;
  esac
  test -d "$as_dir" || eval $as_mkdir_p || {
    as_dirs=
    while :; do
      case $as_dir in #(
      *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
      *) as_qdir=$as_dir;;
      esac
      as_dirs="'$as_qdir' $as_dirs"
      as_dir=`$as_dirname -- "$as_dir" ||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$as_dir" : 'X\(//\)[^/]' \| \
	 X"$as_dir" : 'X\(//\)$' \| \
	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$as_dir" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      test -d "$as_dir" && break
    done
    test -z "$as_dirs" || eval "mkdir $as_dirs"
  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"


} # as_fn_mkdir_p
if mkdir -p . 2>/dev/null; then
  as_mkdir_p='mkdir -p "$as_dir"'
else
  test -d ./-p && rmdir ./-p
  as_mkdir_p=false
fi


# as_fn_executable_p FILE
# -----------------------
# Test if FILE is an executable regular file.
as_fn_executable_p ()
{
  test -f "$1" && test -x "$1"
} # as_fn_executable_p
as_test_x='test -x'
as_executable_p=as_fn_executable_p

# Sed expression to map a string onto a valid CPP name.
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"

# Sed expression to map a string onto a valid variable name.
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"


exec 6>&1
## ----------------------------------- ##
## Main body of $CONFIG_STATUS script. ##
## ----------------------------------- ##
_ASEOF
test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# Save the log message, to keep $0 and so on meaningful, and to
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
This file was extended by GStreamer Bad Plug-ins $as_me 1.8.0, which was
generated by GNU Autoconf 2.69.  Invocation command line was

  CONFIG_FILES    = $CONFIG_FILES
  CONFIG_HEADERS  = $CONFIG_HEADERS
  CONFIG_LINKS    = $CONFIG_LINKS
  CONFIG_COMMANDS = $CONFIG_COMMANDS
  $ $0 $@

on `(hostname || uname -n) 2>/dev/null | sed 1q`
"

_ACEOF

case $ac_config_files in *"
"*) set x $ac_config_files; shift; ac_config_files=$*;;
esac

case $ac_config_headers in *"
"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
esac


cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
# Files that config.status was made for.
config_files="$ac_config_files"
config_headers="$ac_config_headers"
config_commands="$ac_config_commands"

_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
ac_cs_usage="\
\`$as_me' instantiates files and other configuration actions
from templates according to the current configuration.  Unless the files
and actions are specified as TAGs, all are instantiated by default.

Usage: $0 [OPTION]... [TAG]...

  -h, --help       print this help, then exit
  -V, --version    print version number and configuration settings, then exit
      --config     print configuration, then exit
  -q, --quiet, --silent
                   do not print progress messages
  -d, --debug      don't remove temporary files
      --recheck    update $as_me by reconfiguring in the same conditions
      --file=FILE[:TEMPLATE]
                   instantiate the configuration file FILE
      --header=FILE[:TEMPLATE]
                   instantiate the configuration header FILE

Configuration files:
$config_files

Configuration headers:
$config_headers

Configuration commands:
$config_commands

Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
GStreamer Bad Plug-ins config.status 1.8.0
configured by $0, generated by GNU Autoconf 2.69,
  with options \\"\$ac_cs_config\\"

Copyright (C) 2012 Free Software Foundation, Inc.
This config.status script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it."

ac_pwd='$ac_pwd'
srcdir='$srcdir'
INSTALL='$INSTALL'
MKDIR_P='$MKDIR_P'
AWK='$AWK'
test -n "\$AWK" || AWK=awk
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# The default lists apply if the user does not specify any file.
ac_need_defaults=:
while test $# != 0
do
  case $1 in
  --*=?*)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
    ac_shift=:
    ;;
  --*=)
    ac_option=`expr "X$1" : 'X\([^=]*\)='`
    ac_optarg=
    ac_shift=:
    ;;
  *)
    ac_option=$1
    ac_optarg=$2
    ac_shift=shift
    ;;
  esac

  case $ac_option in
  # Handling of the options.
  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
    ac_cs_recheck=: ;;
  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
    $as_echo "$ac_cs_version"; exit ;;
  --config | --confi | --conf | --con | --co | --c )
    $as_echo "$ac_cs_config"; exit ;;
  --debug | --debu | --deb | --de | --d | -d )
    debug=: ;;
  --file | --fil | --fi | --f )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    '') as_fn_error $? "missing file argument" ;;
    esac
    as_fn_append CONFIG_FILES " '$ac_optarg'"
    ac_need_defaults=false;;
  --header | --heade | --head | --hea )
    $ac_shift
    case $ac_optarg in
    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
    esac
    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
    ac_need_defaults=false;;
  --he | --h)
    # Conflict between --help and --header
    as_fn_error $? "ambiguous option: \`$1'
Try \`$0 --help' for more information.";;
  --help | --hel | -h )
    $as_echo "$ac_cs_usage"; exit ;;
  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
  | -silent | --silent | --silen | --sile | --sil | --si | --s)
    ac_cs_silent=: ;;

  # This is an error.
  -*) as_fn_error $? "unrecognized option: \`$1'
Try \`$0 --help' for more information." ;;

  *) as_fn_append ac_config_targets " $1"
     ac_need_defaults=false ;;

  esac
  shift
done

ac_configure_extra_args=

if $ac_cs_silent; then
  exec 6>/dev/null
  ac_configure_extra_args="$ac_configure_extra_args --silent"
fi

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
if \$ac_cs_recheck; then
  set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
  shift
  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
  CONFIG_SHELL='$SHELL'
  export CONFIG_SHELL
  exec "\$@"
fi

_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
exec 5>>config.log
{
  echo
  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## Running $as_me. ##
_ASBOX
  $as_echo "$ac_log"
} >&5

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
#
# INIT-COMMANDS
#
AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"


# The HP-UX ksh and POSIX shell print the target directory to stdout
# if CDPATH is set.
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH

sed_quote_subst='$sed_quote_subst'
double_quote_subst='$double_quote_subst'
delay_variable_subst='$delay_variable_subst'
macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
AS='`$ECHO "$AS" | $SED "$delay_single_quote_subst"`'
DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
shared_archive_member_spec='`$ECHO "$shared_archive_member_spec" | $SED "$delay_single_quote_subst"`'
SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_import='`$ECHO "$lt_cv_sys_global_symbol_to_import" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
lt_cv_nm_interface='`$ECHO "$lt_cv_nm_interface" | $SED "$delay_single_quote_subst"`'
nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
lt_cv_truncate_bin='`$ECHO "$lt_cv_truncate_bin" | $SED "$delay_single_quote_subst"`'
objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
configure_time_dlsearch_path='`$ECHO "$configure_time_dlsearch_path" | $SED "$delay_single_quote_subst"`'
configure_time_lt_sys_library_path='`$ECHO "$configure_time_lt_sys_library_path" | $SED "$delay_single_quote_subst"`'
hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'

LTCC='$LTCC'
LTCFLAGS='$LTCFLAGS'
compiler='$compiler_DEFAULT'

# A function that is used when there is no print builtin or printf.
func_fallback_echo ()
{
  eval 'cat <<_LTECHO_EOF
\$1
_LTECHO_EOF'
}

# Quote evaled strings.
for var in AS \
DLLTOOL \
OBJDUMP \
SHELL \
ECHO \
PATH_SEPARATOR \
SED \
GREP \
EGREP \
FGREP \
LD \
NM \
LN_S \
lt_SP2NL \
lt_NL2SP \
reload_flag \
deplibs_check_method \
file_magic_cmd \
file_magic_glob \
want_nocaseglob \
sharedlib_from_linklib_cmd \
AR \
AR_FLAGS \
archiver_list_spec \
STRIP \
RANLIB \
CC \
CFLAGS \
compiler \
lt_cv_sys_global_symbol_pipe \
lt_cv_sys_global_symbol_to_cdecl \
lt_cv_sys_global_symbol_to_import \
lt_cv_sys_global_symbol_to_c_name_address \
lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
lt_cv_nm_interface \
nm_file_list_spec \
lt_cv_truncate_bin \
lt_prog_compiler_no_builtin_flag \
lt_prog_compiler_pic \
lt_prog_compiler_wl \
lt_prog_compiler_static \
lt_cv_prog_compiler_c_o \
need_locks \
MANIFEST_TOOL \
DSYMUTIL \
NMEDIT \
LIPO \
OTOOL \
OTOOL64 \
shrext_cmds \
export_dynamic_flag_spec \
whole_archive_flag_spec \
compiler_needs_object \
with_gnu_ld \
allow_undefined_flag \
no_undefined_flag \
hardcode_libdir_flag_spec \
hardcode_libdir_separator \
exclude_expsyms \
include_expsyms \
file_list_spec \
variables_saved_for_relink \
libname_spec \
library_names_spec \
soname_spec \
install_override_mode \
finish_eval \
old_striplib \
striplib \
compiler_lib_search_dirs \
predep_objects \
postdep_objects \
predeps \
postdeps \
compiler_lib_search_path \
LD_CXX \
reload_flag_CXX \
compiler_CXX \
lt_prog_compiler_no_builtin_flag_CXX \
lt_prog_compiler_pic_CXX \
lt_prog_compiler_wl_CXX \
lt_prog_compiler_static_CXX \
lt_cv_prog_compiler_c_o_CXX \
export_dynamic_flag_spec_CXX \
whole_archive_flag_spec_CXX \
compiler_needs_object_CXX \
with_gnu_ld_CXX \
allow_undefined_flag_CXX \
no_undefined_flag_CXX \
hardcode_libdir_flag_spec_CXX \
hardcode_libdir_separator_CXX \
exclude_expsyms_CXX \
include_expsyms_CXX \
file_list_spec_CXX \
compiler_lib_search_dirs_CXX \
predep_objects_CXX \
postdep_objects_CXX \
predeps_CXX \
postdeps_CXX \
compiler_lib_search_path_CXX; do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[\\\\\\\`\\"\\\$]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

# Double-quote double-evaled strings.
for var in reload_cmds \
old_postinstall_cmds \
old_postuninstall_cmds \
old_archive_cmds \
extract_expsyms_cmds \
old_archive_from_new_cmds \
old_archive_from_expsyms_cmds \
archive_cmds \
archive_expsym_cmds \
module_cmds \
module_expsym_cmds \
export_symbols_cmds \
prelink_cmds \
postlink_cmds \
postinstall_cmds \
postuninstall_cmds \
finish_cmds \
sys_lib_search_path_spec \
configure_time_dlsearch_path \
configure_time_lt_sys_library_path \
reload_cmds_CXX \
old_archive_cmds_CXX \
old_archive_from_new_cmds_CXX \
old_archive_from_expsyms_cmds_CXX \
archive_cmds_CXX \
archive_expsym_cmds_CXX \
module_cmds_CXX \
module_expsym_cmds_CXX \
export_symbols_cmds_CXX \
prelink_cmds_CXX \
postlink_cmds_CXX; do
    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
    *[\\\\\\\`\\"\\\$]*)
      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
      ;;
    *)
      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
      ;;
    esac
done

ac_aux_dir='$ac_aux_dir'

# See if we are running on zsh, and set the options that allow our
# commands through without removal of \ escapes INIT.
if test -n "\${ZSH_VERSION+set}"; then
   setopt NO_GLOB_SUBST
fi


    PACKAGE='$PACKAGE'
    VERSION='$VERSION'
    RM='$RM'
    ofile='$ofile'





# Capture the value of obsolete ALL_LINGUAS because we need it to compute
    # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it
    # from automake < 1.5.
    eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"'
    # Capture the value of LINGUAS because we need it to compute CATALOGS.
    LINGUAS="${LINGUAS-%UNSET%}"

# variables for create stdint.h replacement
PACKAGE="$PACKAGE"
VERSION="$VERSION"
ac_stdint_h="$ac_stdint_h"
_ac_stdint_h=`$as_echo "_$PACKAGE-$ac_stdint_h" | $as_tr_cpp`
ac_cv_stdint_message="$ac_cv_stdint_message"
ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
ac_cv_char_data_model="$ac_cv_char_data_model"
ac_cv_long_data_model="$ac_cv_long_data_model"
ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
ac_cv_type_intmax_t="$ac_cv_type_intmax_t"


gl_config_defines='$GL_CONFIG_DEFINES'


vulkan_config_defines='$VULKAN_CONFIG_DEFINES'


_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1

# Handling of arguments.
for ac_config_target in $ac_config_targets
do
  case $ac_config_target in
    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
    "po-directories") CONFIG_COMMANDS="$CONFIG_COMMANDS po-directories" ;;
    "$ac_stdint_h") CONFIG_COMMANDS="$CONFIG_COMMANDS $ac_stdint_h" ;;
    "gst-libs/gst/gl/gstglconfig.h") CONFIG_COMMANDS="$CONFIG_COMMANDS gst-libs/gst/gl/gstglconfig.h" ;;
    "ext/vulkan/vkconfig.h") CONFIG_COMMANDS="$CONFIG_COMMANDS ext/vulkan/vkconfig.h" ;;
    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
    "common/Makefile") CONFIG_FILES="$CONFIG_FILES common/Makefile" ;;
    "common/m4/Makefile") CONFIG_FILES="$CONFIG_FILES common/m4/Makefile" ;;
    "gst-plugins-bad.spec") CONFIG_FILES="$CONFIG_FILES gst-plugins-bad.spec" ;;
    "gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst/Makefile" ;;
    "gst/accurip/Makefile") CONFIG_FILES="$CONFIG_FILES gst/accurip/Makefile" ;;
    "gst/adpcmdec/Makefile") CONFIG_FILES="$CONFIG_FILES gst/adpcmdec/Makefile" ;;
    "gst/adpcmenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/adpcmenc/Makefile" ;;
    "gst/aiff/Makefile") CONFIG_FILES="$CONFIG_FILES gst/aiff/Makefile" ;;
    "gst/videoframe_audiolevel/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoframe_audiolevel/Makefile" ;;
    "gst/asfmux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/asfmux/Makefile" ;;
    "gst/audiofxbad/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiofxbad/Makefile" ;;
    "gst/audiomixer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiomixer/Makefile" ;;
    "gst/audiovisualizers/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiovisualizers/Makefile" ;;
    "gst/autoconvert/Makefile") CONFIG_FILES="$CONFIG_FILES gst/autoconvert/Makefile" ;;
    "gst/bayer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/bayer/Makefile" ;;
    "gst/camerabin2/Makefile") CONFIG_FILES="$CONFIG_FILES gst/camerabin2/Makefile" ;;
    "gst/cdxaparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/cdxaparse/Makefile" ;;
    "gst/coloreffects/Makefile") CONFIG_FILES="$CONFIG_FILES gst/coloreffects/Makefile" ;;
    "gst/dataurisrc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/dataurisrc/Makefile" ;;
    "gst/dccp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/dccp/Makefile" ;;
    "gst/debugutils/Makefile") CONFIG_FILES="$CONFIG_FILES gst/debugutils/Makefile" ;;
    "gst/dvbsuboverlay/Makefile") CONFIG_FILES="$CONFIG_FILES gst/dvbsuboverlay/Makefile" ;;
    "gst/dvdspu/Makefile") CONFIG_FILES="$CONFIG_FILES gst/dvdspu/Makefile" ;;
    "gst/faceoverlay/Makefile") CONFIG_FILES="$CONFIG_FILES gst/faceoverlay/Makefile" ;;
    "gst/festival/Makefile") CONFIG_FILES="$CONFIG_FILES gst/festival/Makefile" ;;
    "gst/fieldanalysis/Makefile") CONFIG_FILES="$CONFIG_FILES gst/fieldanalysis/Makefile" ;;
    "gst/freeverb/Makefile") CONFIG_FILES="$CONFIG_FILES gst/freeverb/Makefile" ;;
    "gst/frei0r/Makefile") CONFIG_FILES="$CONFIG_FILES gst/frei0r/Makefile" ;;
    "gst/gaudieffects/Makefile") CONFIG_FILES="$CONFIG_FILES gst/gaudieffects/Makefile" ;;
    "gst/geometrictransform/Makefile") CONFIG_FILES="$CONFIG_FILES gst/geometrictransform/Makefile" ;;
    "gst/gdp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/gdp/Makefile" ;;
    "gst/hdvparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/hdvparse/Makefile" ;;
    "gst/id3tag/Makefile") CONFIG_FILES="$CONFIG_FILES gst/id3tag/Makefile" ;;
    "gst/inter/Makefile") CONFIG_FILES="$CONFIG_FILES gst/inter/Makefile" ;;
    "gst/interlace/Makefile") CONFIG_FILES="$CONFIG_FILES gst/interlace/Makefile" ;;
    "gst/ivfparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/ivfparse/Makefile" ;;
    "gst/ivtc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/ivtc/Makefile" ;;
    "gst/jp2kdecimator/Makefile") CONFIG_FILES="$CONFIG_FILES gst/jp2kdecimator/Makefile" ;;
    "gst/jpegformat/Makefile") CONFIG_FILES="$CONFIG_FILES gst/jpegformat/Makefile" ;;
    "gst/librfb/Makefile") CONFIG_FILES="$CONFIG_FILES gst/librfb/Makefile" ;;
    "gst/midi/Makefile") CONFIG_FILES="$CONFIG_FILES gst/midi/Makefile" ;;
    "gst/mpegdemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegdemux/Makefile" ;;
    "gst/mpegtsdemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegtsdemux/Makefile" ;;
    "gst/mpegtsmux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegtsmux/Makefile" ;;
    "gst/mpegtsmux/tsmux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegtsmux/tsmux/Makefile" ;;
    "gst/mpegpsmux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegpsmux/Makefile" ;;
    "gst/mve/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mve/Makefile" ;;
    "gst/mxf/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mxf/Makefile" ;;
    "gst/netsim/Makefile") CONFIG_FILES="$CONFIG_FILES gst/netsim/Makefile" ;;
    "gst/nuvdemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/nuvdemux/Makefile" ;;
    "gst/onvif/Makefile") CONFIG_FILES="$CONFIG_FILES gst/onvif/Makefile" ;;
    "gst/patchdetect/Makefile") CONFIG_FILES="$CONFIG_FILES gst/patchdetect/Makefile" ;;
    "gst/pcapparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/pcapparse/Makefile" ;;
    "gst/pnm/Makefile") CONFIG_FILES="$CONFIG_FILES gst/pnm/Makefile" ;;
    "gst/rawparse/Makefile") CONFIG_FILES="$CONFIG_FILES gst/rawparse/Makefile" ;;
    "gst/removesilence/Makefile") CONFIG_FILES="$CONFIG_FILES gst/removesilence/Makefile" ;;
    "gst/sdi/Makefile") CONFIG_FILES="$CONFIG_FILES gst/sdi/Makefile" ;;
    "gst/sdp/Makefile") CONFIG_FILES="$CONFIG_FILES gst/sdp/Makefile" ;;
    "gst/segmentclip/Makefile") CONFIG_FILES="$CONFIG_FILES gst/segmentclip/Makefile" ;;
    "gst/siren/Makefile") CONFIG_FILES="$CONFIG_FILES gst/siren/Makefile" ;;
    "gst/smooth/Makefile") CONFIG_FILES="$CONFIG_FILES gst/smooth/Makefile" ;;
    "gst/speed/Makefile") CONFIG_FILES="$CONFIG_FILES gst/speed/Makefile" ;;
    "gst/subenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/subenc/Makefile" ;;
    "gst/stereo/Makefile") CONFIG_FILES="$CONFIG_FILES gst/stereo/Makefile" ;;
    "gst/tta/Makefile") CONFIG_FILES="$CONFIG_FILES gst/tta/Makefile" ;;
    "gst/videofilters/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videofilters/Makefile" ;;
    "gst/videomeasure/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videomeasure/Makefile" ;;
    "gst/videoparsers/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoparsers/Makefile" ;;
    "gst/videosignal/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videosignal/Makefile" ;;
    "gst/vmnc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/vmnc/Makefile" ;;
    "gst/y4m/Makefile") CONFIG_FILES="$CONFIG_FILES gst/y4m/Makefile" ;;
    "gst/yadif/Makefile") CONFIG_FILES="$CONFIG_FILES gst/yadif/Makefile" ;;
    "gst/compositor/Makefile") CONFIG_FILES="$CONFIG_FILES gst/compositor/Makefile" ;;
    "gst-libs/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/Makefile" ;;
    "gst-libs/gst/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/Makefile" ;;
    "gst-libs/gst/adaptivedemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/adaptivedemux/Makefile" ;;
    "gst-libs/gst/basecamerabinsrc/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/basecamerabinsrc/Makefile" ;;
    "gst-libs/gst/gl/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/Makefile" ;;
    "gst-libs/gst/gl/android/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/android/Makefile" ;;
    "gst-libs/gst/gl/cocoa/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/cocoa/Makefile" ;;
    "gst-libs/gst/gl/dispmanx/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/dispmanx/Makefile" ;;
    "gst-libs/gst/gl/glprototypes/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/glprototypes/Makefile" ;;
    "gst-libs/gst/gl/eagl/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/eagl/Makefile" ;;
    "gst-libs/gst/gl/egl/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/egl/Makefile" ;;
    "gst-libs/gst/gl/wayland/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/wayland/Makefile" ;;
    "gst-libs/gst/gl/win32/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/win32/Makefile" ;;
    "gst-libs/gst/gl/x11/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/gl/x11/Makefile" ;;
    "gst-libs/gst/insertbin/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/insertbin/Makefile" ;;
    "gst-libs/gst/interfaces/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/interfaces/Makefile" ;;
    "gst-libs/gst/codecparsers/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/codecparsers/Makefile" ;;
    "gst-libs/gst/mpegts/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/mpegts/Makefile" ;;
    "gst-libs/gst/uridownloader/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/uridownloader/Makefile" ;;
    "gst-libs/gst/wayland/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/wayland/Makefile" ;;
    "gst-libs/gst/base/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/base/Makefile" ;;
    "gst-libs/gst/player/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/player/Makefile" ;;
    "gst-libs/gst/video/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/video/Makefile" ;;
    "gst-libs/gst/audio/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/audio/Makefile" ;;
    "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;;
    "sys/dshowdecwrapper/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dshowdecwrapper/Makefile" ;;
    "sys/acmenc/Makefile") CONFIG_FILES="$CONFIG_FILES sys/acmenc/Makefile" ;;
    "sys/acmmp3dec/Makefile") CONFIG_FILES="$CONFIG_FILES sys/acmmp3dec/Makefile" ;;
    "sys/androidmedia/Makefile") CONFIG_FILES="$CONFIG_FILES sys/androidmedia/Makefile" ;;
    "sys/applemedia/Makefile") CONFIG_FILES="$CONFIG_FILES sys/applemedia/Makefile" ;;
    "sys/applemedia-nonpublic/Makefile") CONFIG_FILES="$CONFIG_FILES sys/applemedia-nonpublic/Makefile" ;;
    "sys/avc/Makefile") CONFIG_FILES="$CONFIG_FILES sys/avc/Makefile" ;;
    "sys/bluez/Makefile") CONFIG_FILES="$CONFIG_FILES sys/bluez/Makefile" ;;
    "sys/d3dvideosink/Makefile") CONFIG_FILES="$CONFIG_FILES sys/d3dvideosink/Makefile" ;;
    "sys/decklink/Makefile") CONFIG_FILES="$CONFIG_FILES sys/decklink/Makefile" ;;
    "sys/directsound/Makefile") CONFIG_FILES="$CONFIG_FILES sys/directsound/Makefile" ;;
    "sys/dshowsrcwrapper/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dshowsrcwrapper/Makefile" ;;
    "sys/dshowvideosink/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dshowvideosink/Makefile" ;;
    "sys/dvb/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dvb/Makefile" ;;
    "sys/fbdev/Makefile") CONFIG_FILES="$CONFIG_FILES sys/fbdev/Makefile" ;;
    "sys/linsys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/linsys/Makefile" ;;
    "sys/nvenc/Makefile") CONFIG_FILES="$CONFIG_FILES sys/nvenc/Makefile" ;;
    "sys/opensles/Makefile") CONFIG_FILES="$CONFIG_FILES sys/opensles/Makefile" ;;
    "sys/shm/Makefile") CONFIG_FILES="$CONFIG_FILES sys/shm/Makefile" ;;
    "sys/tinyalsa/Makefile") CONFIG_FILES="$CONFIG_FILES sys/tinyalsa/Makefile" ;;
    "sys/uvch264/Makefile") CONFIG_FILES="$CONFIG_FILES sys/uvch264/Makefile" ;;
    "sys/vcd/Makefile") CONFIG_FILES="$CONFIG_FILES sys/vcd/Makefile" ;;
    "sys/vdpau/Makefile") CONFIG_FILES="$CONFIG_FILES sys/vdpau/Makefile" ;;
    "sys/pvr2d/Makefile") CONFIG_FILES="$CONFIG_FILES sys/pvr2d/Makefile" ;;
    "sys/wasapi/Makefile") CONFIG_FILES="$CONFIG_FILES sys/wasapi/Makefile" ;;
    "sys/wininet/Makefile") CONFIG_FILES="$CONFIG_FILES sys/wininet/Makefile" ;;
    "sys/winks/Makefile") CONFIG_FILES="$CONFIG_FILES sys/winks/Makefile" ;;
    "sys/winscreencap/Makefile") CONFIG_FILES="$CONFIG_FILES sys/winscreencap/Makefile" ;;
    "tests/Makefile") CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;;
    "tests/check/Makefile") CONFIG_FILES="$CONFIG_FILES tests/check/Makefile" ;;
    "tests/files/Makefile") CONFIG_FILES="$CONFIG_FILES tests/files/Makefile" ;;
    "tests/examples/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/Makefile" ;;
    "tests/examples/avsamplesink/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/avsamplesink/Makefile" ;;
    "tests/examples/camerabin2/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/camerabin2/Makefile" ;;
    "tests/examples/codecparsers/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/codecparsers/Makefile" ;;
    "tests/examples/directfb/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/directfb/Makefile" ;;
    "tests/examples/gl/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/Makefile" ;;
    "tests/examples/gl/cocoa/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/cocoa/Makefile" ;;
    "tests/examples/gl/clutter/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/clutter/Makefile" ;;
    "tests/examples/gl/generic/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/Makefile" ;;
    "tests/examples/gl/generic/cube/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/cube/Makefile" ;;
    "tests/examples/gl/generic/cubeyuv/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/cubeyuv/Makefile" ;;
    "tests/examples/gl/generic/doublecube/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/doublecube/Makefile" ;;
    "tests/examples/gl/generic/recordgraphic/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/generic/recordgraphic/Makefile" ;;
    "tests/examples/gl/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/Makefile" ;;
    "tests/examples/gl/gtk/gtkvideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/gtkvideooverlay/Makefile" ;;
    "tests/examples/gl/gtk/3dvideo/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/3dvideo/Makefile" ;;
    "tests/examples/gl/gtk/filternovideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/filternovideooverlay/Makefile" ;;
    "tests/examples/gl/gtk/filtervideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/filtervideooverlay/Makefile" ;;
    "tests/examples/gl/gtk/fxtest/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/fxtest/Makefile" ;;
    "tests/examples/gl/gtk/switchvideooverlay/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/gtk/switchvideooverlay/Makefile" ;;
    "tests/examples/gl/qt/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/qt/Makefile" ;;
    "tests/examples/gl/sdl/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gl/sdl/Makefile" ;;
    "tests/examples/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/gtk/Makefile" ;;
    "tests/examples/mpegts/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/mpegts/Makefile" ;;
    "tests/examples/mxf/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/mxf/Makefile" ;;
    "tests/examples/opencv/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/opencv/Makefile" ;;
    "tests/examples/uvch264/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/uvch264/Makefile" ;;
    "tests/examples/waylandsink/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/waylandsink/Makefile" ;;
    "tests/icles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/Makefile" ;;
    "ext/voamrwbenc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/voamrwbenc/Makefile" ;;
    "ext/voaacenc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/voaacenc/Makefile" ;;
    "ext/assrender/Makefile") CONFIG_FILES="$CONFIG_FILES ext/assrender/Makefile" ;;
    "ext/apexsink/Makefile") CONFIG_FILES="$CONFIG_FILES ext/apexsink/Makefile" ;;
    "ext/bs2b/Makefile") CONFIG_FILES="$CONFIG_FILES ext/bs2b/Makefile" ;;
    "ext/bz2/Makefile") CONFIG_FILES="$CONFIG_FILES ext/bz2/Makefile" ;;
    "ext/chromaprint/Makefile") CONFIG_FILES="$CONFIG_FILES ext/chromaprint/Makefile" ;;
    "ext/curl/Makefile") CONFIG_FILES="$CONFIG_FILES ext/curl/Makefile" ;;
    "ext/dash/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dash/Makefile" ;;
    "ext/dc1394/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dc1394/Makefile" ;;
    "ext/directfb/Makefile") CONFIG_FILES="$CONFIG_FILES ext/directfb/Makefile" ;;
    "ext/wayland/Makefile") CONFIG_FILES="$CONFIG_FILES ext/wayland/Makefile" ;;
    "ext/daala/Makefile") CONFIG_FILES="$CONFIG_FILES ext/daala/Makefile" ;;
    "ext/dts/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dts/Makefile" ;;
    "ext/gl/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gl/Makefile" ;;
    "ext/gtk/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gtk/Makefile" ;;
    "ext/faac/Makefile") CONFIG_FILES="$CONFIG_FILES ext/faac/Makefile" ;;
    "ext/faad/Makefile") CONFIG_FILES="$CONFIG_FILES ext/faad/Makefile" ;;
    "ext/flite/Makefile") CONFIG_FILES="$CONFIG_FILES ext/flite/Makefile" ;;
    "ext/fluidsynth/Makefile") CONFIG_FILES="$CONFIG_FILES ext/fluidsynth/Makefile" ;;
    "ext/gsm/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gsm/Makefile" ;;
    "ext/hls/Makefile") CONFIG_FILES="$CONFIG_FILES ext/hls/Makefile" ;;
    "ext/kate/Makefile") CONFIG_FILES="$CONFIG_FILES ext/kate/Makefile" ;;
    "ext/ladspa/Makefile") CONFIG_FILES="$CONFIG_FILES ext/ladspa/Makefile" ;;
    "ext/lv2/Makefile") CONFIG_FILES="$CONFIG_FILES ext/lv2/Makefile" ;;
    "ext/libde265/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libde265/Makefile" ;;
    "ext/libmms/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libmms/Makefile" ;;
    "ext/libvisual/Makefile") CONFIG_FILES="$CONFIG_FILES ext/libvisual/Makefile" ;;
    "ext/Makefile") CONFIG_FILES="$CONFIG_FILES ext/Makefile" ;;
    "ext/modplug/Makefile") CONFIG_FILES="$CONFIG_FILES ext/modplug/Makefile" ;;
    "ext/mpeg2enc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/mpeg2enc/Makefile" ;;
    "ext/mimic/Makefile") CONFIG_FILES="$CONFIG_FILES ext/mimic/Makefile" ;;
    "ext/mplex/Makefile") CONFIG_FILES="$CONFIG_FILES ext/mplex/Makefile" ;;
    "ext/musepack/Makefile") CONFIG_FILES="$CONFIG_FILES ext/musepack/Makefile" ;;
    "ext/nas/Makefile") CONFIG_FILES="$CONFIG_FILES ext/nas/Makefile" ;;
    "ext/neon/Makefile") CONFIG_FILES="$CONFIG_FILES ext/neon/Makefile" ;;
    "ext/ofa/Makefile") CONFIG_FILES="$CONFIG_FILES ext/ofa/Makefile" ;;
    "ext/openal/Makefile") CONFIG_FILES="$CONFIG_FILES ext/openal/Makefile" ;;
    "ext/opencv/Makefile") CONFIG_FILES="$CONFIG_FILES ext/opencv/Makefile" ;;
    "ext/openexr/Makefile") CONFIG_FILES="$CONFIG_FILES ext/openexr/Makefile" ;;
    "ext/openh264/Makefile") CONFIG_FILES="$CONFIG_FILES ext/openh264/Makefile" ;;
    "ext/openjpeg/Makefile") CONFIG_FILES="$CONFIG_FILES ext/openjpeg/Makefile" ;;
    "ext/openni2/Makefile") CONFIG_FILES="$CONFIG_FILES ext/openni2/Makefile" ;;
    "ext/opus/Makefile") CONFIG_FILES="$CONFIG_FILES ext/opus/Makefile" ;;
    "ext/qt/Makefile") CONFIG_FILES="$CONFIG_FILES ext/qt/Makefile" ;;
    "ext/rsvg/Makefile") CONFIG_FILES="$CONFIG_FILES ext/rsvg/Makefile" ;;
    "ext/resindvd/Makefile") CONFIG_FILES="$CONFIG_FILES ext/resindvd/Makefile" ;;
    "ext/rtmp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/rtmp/Makefile" ;;
    "ext/sbc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/sbc/Makefile" ;;
    "ext/schroedinger/Makefile") CONFIG_FILES="$CONFIG_FILES ext/schroedinger/Makefile" ;;
    "ext/sdl/Makefile") CONFIG_FILES="$CONFIG_FILES ext/sdl/Makefile" ;;
    "ext/smoothstreaming/Makefile") CONFIG_FILES="$CONFIG_FILES ext/smoothstreaming/Makefile" ;;
    "ext/sndfile/Makefile") CONFIG_FILES="$CONFIG_FILES ext/sndfile/Makefile" ;;
    "ext/soundtouch/Makefile") CONFIG_FILES="$CONFIG_FILES ext/soundtouch/Makefile" ;;
    "ext/spandsp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/spandsp/Makefile" ;;
    "ext/sndio/Makefile") CONFIG_FILES="$CONFIG_FILES ext/sndio/Makefile" ;;
    "ext/srtp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/srtp/Makefile" ;;
    "ext/teletextdec/Makefile") CONFIG_FILES="$CONFIG_FILES ext/teletextdec/Makefile" ;;
    "ext/gme/Makefile") CONFIG_FILES="$CONFIG_FILES ext/gme/Makefile" ;;
    "ext/spc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/spc/Makefile" ;;
    "ext/timidity/Makefile") CONFIG_FILES="$CONFIG_FILES ext/timidity/Makefile" ;;
    "ext/vulkan/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vulkan/Makefile" ;;
    "ext/vulkan/xcb/Makefile") CONFIG_FILES="$CONFIG_FILES ext/vulkan/xcb/Makefile" ;;
    "ext/webp/Makefile") CONFIG_FILES="$CONFIG_FILES ext/webp/Makefile" ;;
    "ext/x265/Makefile") CONFIG_FILES="$CONFIG_FILES ext/x265/Makefile" ;;
    "ext/xvid/Makefile") CONFIG_FILES="$CONFIG_FILES ext/xvid/Makefile" ;;
    "ext/zbar/Makefile") CONFIG_FILES="$CONFIG_FILES ext/zbar/Makefile" ;;
    "ext/dtls/Makefile") CONFIG_FILES="$CONFIG_FILES ext/dtls/Makefile" ;;
    "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
    "docs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/Makefile" ;;
    "docs/plugins/Makefile") CONFIG_FILES="$CONFIG_FILES docs/plugins/Makefile" ;;
    "docs/libs/Makefile") CONFIG_FILES="$CONFIG_FILES docs/libs/Makefile" ;;
    "docs/version.entities") CONFIG_FILES="$CONFIG_FILES docs/version.entities" ;;
    "pkgconfig/Makefile") CONFIG_FILES="$CONFIG_FILES pkgconfig/Makefile" ;;
    "pkgconfig/gstreamer-plugins-bad.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-bad.pc" ;;
    "pkgconfig/gstreamer-plugins-bad-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-plugins-bad-uninstalled.pc" ;;
    "pkgconfig/gstreamer-codecparsers.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-codecparsers.pc" ;;
    "pkgconfig/gstreamer-codecparsers-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-codecparsers-uninstalled.pc" ;;
    "pkgconfig/gstreamer-insertbin.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-insertbin.pc" ;;
    "pkgconfig/gstreamer-insertbin-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-insertbin-uninstalled.pc" ;;
    "pkgconfig/gstreamer-gl.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-gl.pc" ;;
    "pkgconfig/gstreamer-gl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-gl-uninstalled.pc" ;;
    "pkgconfig/gstreamer-mpegts.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-mpegts.pc" ;;
    "pkgconfig/gstreamer-mpegts-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-mpegts-uninstalled.pc" ;;
    "pkgconfig/gstreamer-player.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-player.pc" ;;
    "pkgconfig/gstreamer-player-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-player-uninstalled.pc" ;;
    "pkgconfig/gstreamer-wayland.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-wayland.pc" ;;
    "pkgconfig/gstreamer-wayland-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-wayland-uninstalled.pc" ;;
    "pkgconfig/gstreamer-bad-base.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-base.pc" ;;
    "pkgconfig/gstreamer-bad-base-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-base-uninstalled.pc" ;;
    "pkgconfig/gstreamer-bad-video.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-video.pc" ;;
    "pkgconfig/gstreamer-bad-video-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-video-uninstalled.pc" ;;
    "pkgconfig/gstreamer-bad-audio.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-audio.pc" ;;
    "pkgconfig/gstreamer-bad-audio-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-audio-uninstalled.pc" ;;
    "tools/Makefile") CONFIG_FILES="$CONFIG_FILES tools/Makefile" ;;
    "m4/Makefile") CONFIG_FILES="$CONFIG_FILES m4/Makefile" ;;

  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
  esac
done


# If the user did not use the arguments to specify the items to instantiate,
# then the envvar interface is used.  Set only those that are not.
# We use the long form for the default assignment because of an extremely
# bizarre bug on SunOS 4.1.3.
if $ac_need_defaults; then
  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
fi

# Have a temporary directory for convenience.  Make it in the build tree
# simply because there is no reason against having it here, and in addition,
# creating and moving files from /tmp can sometimes cause problems.
# Hook for its removal unless debugging.
# Note that there is a small window in which the directory will not be cleaned:
# after its creation but before its name has been assigned to `$tmp'.
$debug ||
{
  tmp= ac_tmp=
  trap 'exit_status=$?
  : "${ac_tmp:=$tmp}"
  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
' 0
  trap 'as_fn_exit 1' 1 2 13 15
}
# Create a (secure) tmp directory for tmp files.

{
  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
  test -d "$tmp"
}  ||
{
  tmp=./conf$$-$RANDOM
  (umask 077 && mkdir "$tmp")
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
ac_tmp=$tmp

# Set up the scripts for CONFIG_FILES section.
# No need to generate them if there are no CONFIG_FILES.
# This happens for instance with `./config.status config.h'.
if test -n "$CONFIG_FILES"; then


ac_cr=`echo X | tr X '\015'`
# On cygwin, bash can eat \r inside `` if the user requested igncr.
# But we know of no other shell where ac_cr would be empty at this
# point, so we can use a bashism as a fallback.
if test "x$ac_cr" = x; then
  eval ac_cr=\$\'\\r\'
fi
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
  ac_cs_awk_cr='\\r'
else
  ac_cs_awk_cr=$ac_cr
fi

echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
_ACEOF


{
  echo "cat >conf$$subs.awk <<_ACEOF" &&
  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
  echo "_ACEOF"
} >conf$$subs.sh ||
  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
ac_delim='%!_!# '
for ac_last_try in false false false false false :; do
  . ./conf$$subs.sh ||
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5

  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
  if test $ac_delim_n = $ac_delim_num; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done
rm -f conf$$subs.sh

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
_ACEOF
sed -n '
h
s/^/S["/; s/!.*/"]=/
p
g
s/^[^!]*!//
:repl
t repl
s/'"$ac_delim"'$//
t delim
:nl
h
s/\(.\{148\}\)..*/\1/
t more1
s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
p
n
b repl
:more1
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t nl
:delim
h
s/\(.\{148\}\)..*/\1/
t more2
s/["\\]/\\&/g; s/^/"/; s/$/"/
p
b
:more2
s/["\\]/\\&/g; s/^/"/; s/$/"\\/
p
g
s/.\{148\}//
t delim
' <conf$$subs.awk | sed '
/^[^""]/{
  N
  s/\n//
}
' >>$CONFIG_STATUS || ac_write_fail=1
rm -f conf$$subs.awk
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
_ACAWK
cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
  for (key in S) S_is_set[key] = 1
  FS = ""

}
{
  line = $ 0
  nfields = split(line, field, "@")
  substed = 0
  len = length(field[1])
  for (i = 2; i < nfields; i++) {
    key = field[i]
    keylen = length(key)
    if (S_is_set[key]) {
      value = S[key]
      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
      len += length(value) + length(field[++i])
      substed = 1
    } else
      len += 1 + keylen
  }

  print line
}

_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
else
  cat
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
_ACEOF

# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
# trailing colons and then remove the whole line if VPATH becomes empty
# (actually we leave an empty line to preserve line numbers).
if test "x$srcdir" = x.; then
  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
h
s///
s/^/:/
s/[	 ]*$/:/
s/:\$(srcdir):/:/g
s/:\${srcdir}:/:/g
s/:@srcdir@:/:/g
s/^:*//
s/:*$//
x
s/\(=[	 ]*\).*/\1/
G
s/\n//
s/^[^=]*=[	 ]*$//
}'
fi

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
fi # test -n "$CONFIG_FILES"

# Set up the scripts for CONFIG_HEADERS section.
# No need to generate them if there are no CONFIG_HEADERS.
# This happens for instance with `./config.status Makefile'.
if test -n "$CONFIG_HEADERS"; then
cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
BEGIN {
_ACEOF

# Transform confdefs.h into an awk script `defines.awk', embedded as
# here-document in config.status, that substitutes the proper values into
# config.h.in to produce config.h.

# Create a delimiter string that does not exist in confdefs.h, to ease
# handling of long lines.
ac_delim='%!_!# '
for ac_last_try in false false :; do
  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
  if test -z "$ac_tt"; then
    break
  elif $ac_last_try; then
    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
  else
    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
  fi
done

# For the awk script, D is an array of macro values keyed by name,
# likewise P contains macro parameters if any.  Preserve backslash
# newline sequences.

ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
sed -n '
s/.\{148\}/&'"$ac_delim"'/g
t rset
:rset
s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
t def
d
:def
s/\\$//
t bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3"/p
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
d
:bsnl
s/["\\]/\\&/g
s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
D["\1"]=" \3\\\\\\n"\\/p
t cont
s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
t cont
d
:cont
n
s/.\{148\}/&'"$ac_delim"'/g
t clear
:clear
s/\\$//
t bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/"/p
d
:bsnlc
s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
b cont
' <confdefs.h | sed '
s/'"$ac_delim"'/"\\\
"/g' >>$CONFIG_STATUS || ac_write_fail=1

cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  for (key in D) D_is_set[key] = 1
  FS = ""
}
/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
  line = \$ 0
  split(line, arg, " ")
  if (arg[1] == "#") {
    defundef = arg[2]
    mac1 = arg[3]
  } else {
    defundef = substr(arg[1], 2)
    mac1 = arg[2]
  }
  split(mac1, mac2, "(") #)
  macro = mac2[1]
  prefix = substr(line, 1, index(line, defundef) - 1)
  if (D_is_set[macro]) {
    # Preserve the white space surrounding the "#".
    print prefix "define", macro P[macro] D[macro]
    next
  } else {
    # Replace #undef with comments.  This is necessary, for example,
    # in the case of _POSIX_SOURCE, which is predefined and required
    # on some systems where configure will not decide to define it.
    if (defundef == "undef") {
      print "/*", prefix defundef, macro, "*/"
      next
    }
  }
}
{ print }
_ACAWK
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
fi # test -n "$CONFIG_HEADERS"


eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
shift
for ac_tag
do
  case $ac_tag in
  :[FHLC]) ac_mode=$ac_tag; continue;;
  esac
  case $ac_mode$ac_tag in
  :[FHL]*:*);;
  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
  :[FH]-) ac_tag=-:-;;
  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
  esac
  ac_save_IFS=$IFS
  IFS=:
  set x $ac_tag
  IFS=$ac_save_IFS
  shift
  ac_file=$1
  shift

  case $ac_mode in
  :L) ac_source=$1;;
  :[FH])
    ac_file_inputs=
    for ac_f
    do
      case $ac_f in
      -) ac_f="$ac_tmp/stdin";;
      *) # Look for the file first in the build tree, then in the source tree
	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
	 # because $ac_f cannot contain `:'.
	 test -f "$ac_f" ||
	   case $ac_f in
	   [\\/$]*) false;;
	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
	   esac ||
	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
      esac
      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
      as_fn_append ac_file_inputs " '$ac_f'"
    done

    # Let's still pretend it is `configure' which instantiates (i.e., don't
    # use $as_me), people would be surprised to read:
    #    /* config.h.  Generated by config.status.  */
    configure_input='Generated from '`
	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
	`' by configure.'
    if test x"$ac_file" != x-; then
      configure_input="$ac_file.  $configure_input"
      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
$as_echo "$as_me: creating $ac_file" >&6;}
    fi
    # Neutralize special characters interpreted by sed in replacement strings.
    case $configure_input in #(
    *\&* | *\|* | *\\* )
       ac_sed_conf_input=`$as_echo "$configure_input" |
       sed 's/[\\\\&|]/\\\\&/g'`;; #(
    *) ac_sed_conf_input=$configure_input;;
    esac

    case $ac_tag in
    *:-:* | *:-) cat >"$ac_tmp/stdin" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
    esac
    ;;
  esac

  ac_dir=`$as_dirname -- "$ac_file" ||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_file" : 'X\(//\)[^/]' \| \
	 X"$ac_file" : 'X\(//\)$' \| \
	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
  as_dir="$ac_dir"; as_fn_mkdir_p
  ac_builddir=.

case "$ac_dir" in
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
*)
  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
  # A ".." for each directory in $ac_dir_suffix.
  ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
  case $ac_top_builddir_sub in
  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
  esac ;;
esac
ac_abs_top_builddir=$ac_pwd
ac_abs_builddir=$ac_pwd$ac_dir_suffix
# for backward compatibility:
ac_top_builddir=$ac_top_build_prefix

case $srcdir in
  .)  # We are building in place.
    ac_srcdir=.
    ac_top_srcdir=$ac_top_builddir_sub
    ac_abs_top_srcdir=$ac_pwd ;;
  [\\/]* | ?:[\\/]* )  # Absolute name.
    ac_srcdir=$srcdir$ac_dir_suffix;
    ac_top_srcdir=$srcdir
    ac_abs_top_srcdir=$srcdir ;;
  *) # Relative name.
    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
    ac_top_srcdir=$ac_top_build_prefix$srcdir
    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
esac
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix


  case $ac_mode in
  :F)
  #
  # CONFIG_FILE
  #

  case $INSTALL in
  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
  esac
  ac_MKDIR_P=$MKDIR_P
  case $MKDIR_P in
  [\\/$]* | ?:[\\/]* ) ;;
  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
  esac
_ACEOF

cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# If the template does not know about datarootdir, expand it.
# FIXME: This hack should be removed a few years after 2.60.
ac_datarootdir_hack=; ac_datarootdir_seen=
ac_sed_dataroot='
/datarootdir/ {
  p
  q
}
/@datadir@/p
/@docdir@/p
/@infodir@/p
/@localedir@/p
/@mandir@/p'
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
*datarootdir*) ac_datarootdir_seen=yes;;
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
  ac_datarootdir_hack='
  s&@datadir@&$datadir&g
  s&@docdir@&$docdir&g
  s&@infodir@&$infodir&g
  s&@localedir@&$localedir&g
  s&@mandir@&$mandir&g
  s&\\\${datarootdir}&$datarootdir&g' ;;
esac
_ACEOF

# Neutralize VPATH when `$srcdir' = `.'.
# Shell code in configure.ac might set extrasub.
# FIXME: do we really want to maintain this feature?
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_sed_extra="$ac_vpsub
$extrasub
_ACEOF
cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
:t
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
s|@configure_input@|$ac_sed_conf_input|;t t
s&@top_builddir@&$ac_top_builddir_sub&;t t
s&@top_build_prefix@&$ac_top_build_prefix&;t t
s&@srcdir@&$ac_srcdir&;t t
s&@abs_srcdir@&$ac_abs_srcdir&;t t
s&@top_srcdir@&$ac_top_srcdir&;t t
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
s&@builddir@&$ac_builddir&;t t
s&@abs_builddir@&$ac_abs_builddir&;t t
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
s&@INSTALL@&$ac_INSTALL&;t t
s&@MKDIR_P@&$ac_MKDIR_P&;t t
$ac_datarootdir_hack
"
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5

test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
      "$ac_tmp/out"`; test -z "$ac_out"; } &&
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&5
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
which seems to be undefined.  Please make sure it is defined" >&2;}

  rm -f "$ac_tmp/stdin"
  case $ac_file in
  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
  esac \
  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 ;;
  :H)
  #
  # CONFIG_HEADER
  #
  if test x"$ac_file" != x-; then
    {
      $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
    } >"$ac_tmp/config.h" \
      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
$as_echo "$as_me: $ac_file is unchanged" >&6;}
    else
      rm -f "$ac_file"
      mv "$ac_tmp/config.h" "$ac_file" \
	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
    fi
  else
    $as_echo "/* $configure_input  */" \
      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
      || as_fn_error $? "could not create -" "$LINENO" 5
  fi
# Compute "$ac_file"'s index in $config_headers.
_am_arg="$ac_file"
_am_stamp_count=1
for _am_header in $config_headers :; do
  case $_am_header in
    $_am_arg | $_am_arg:* )
      break ;;
    * )
      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
  esac
done
echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$_am_arg" : 'X\(//\)[^/]' \| \
	 X"$_am_arg" : 'X\(//\)$' \| \
	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$_am_arg" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`/stamp-h$_am_stamp_count
 ;;

  :C)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
$as_echo "$as_me: executing $ac_file commands" >&6;}
 ;;
  esac


  case $ac_file$ac_mode in
    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
  # Older Autoconf quotes --file arguments for eval, but not when files
  # are listed without --file.  Let's play safe and only enable the eval
  # if we detect the quoting.
  case $CONFIG_FILES in
  *\'*) eval set x "$CONFIG_FILES" ;;
  *)   set x $CONFIG_FILES ;;
  esac
  shift
  for mf
  do
    # Strip MF so we end up with the name of the file.
    mf=`echo "$mf" | sed -e 's/:.*$//'`
    # Check whether this is an Automake generated Makefile or not.
    # We used to match only the files named 'Makefile.in', but
    # some people rename them; so instead we look at the file content.
    # Grep'ing the first line is not enough: some people post-process
    # each Makefile.in and add a new line on top of each file to say so.
    # Grep'ing the whole file is not good either: AIX grep has a line
    # limit of 2048, but all sed's we know have understand at least 4000.
    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then
      dirpart=`$as_dirname -- "$mf" ||
$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$mf" : 'X\(//\)[^/]' \| \
	 X"$mf" : 'X\(//\)$' \| \
	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$mf" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
    else
      continue
    fi
    # Extract the definition of DEPDIR, am__include, and am__quote
    # from the Makefile without running 'make'.
    DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
    test -z "$DEPDIR" && continue
    am__include=`sed -n 's/^am__include = //p' < "$mf"`
    test -z "$am__include" && continue
    am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
    # Find all dependency output files, they are included files with
    # $(DEPDIR) in their names.  We invoke sed twice because it is the
    # simplest approach to changing $(DEPDIR) to its actual value in the
    # expansion.
    for file in `sed -n "
      s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
	 sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do
      # Make sure the directory exists.
      test -f "$dirpart/$file" && continue
      fdir=`$as_dirname -- "$file" ||
$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$file" : 'X\(//\)[^/]' \| \
	 X"$file" : 'X\(//\)$' \| \
	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$file" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      as_dir=$dirpart/$fdir; as_fn_mkdir_p
      # echo "creating $dirpart/$file"
      echo '# dummy' > "$dirpart/$file"
    done
  done
}
 ;;
    "libtool":C)

    # See if we are running on zsh, and set the options that allow our
    # commands through without removal of \ escapes.
    if test -n "${ZSH_VERSION+set}"; then
      setopt NO_GLOB_SUBST
    fi

    cfgfile=${ofile}T
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
    $RM "$cfgfile"

    cat <<_LT_EOF >> "$cfgfile"
#! $SHELL
# Generated automatically by $as_me ($PACKAGE) $VERSION
# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
# NOTE: Changes made to this file will be lost: look at ltmain.sh.

# Provide generalized library-building support services.
# Written by Gordon Matzigkeit, 1996

# Copyright (C) 2014 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions.  There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

# GNU Libtool is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of of the License, or
# (at your option) any later version.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program or library that is built
# using GNU Libtool, you may include this file under the  same
# distribution terms that you use for the rest of that program.
#
# GNU Libtool is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


# The names of the tagged configurations supported by this script.
available_tags='CXX '

# Configured defaults for sys_lib_dlsearch_path munging.
: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}

# ### BEGIN LIBTOOL CONFIG

# Which release of libtool.m4 was used?
macro_version=$macro_version
macro_revision=$macro_revision

# Assembler program.
AS=$lt_AS

# DLL creation program.
DLLTOOL=$lt_DLLTOOL

# Object dumper program.
OBJDUMP=$lt_OBJDUMP

# Whether or not to build static libraries.
build_old_libs=$enable_static

# Whether or not to build shared libraries.
build_libtool_libs=$enable_shared

# What type of objects to build.
pic_mode=$pic_mode

# Whether or not to optimize for fast installation.
fast_install=$enable_fast_install

# Shared archive member basename,for filename based shared library versioning on AIX.
shared_archive_member_spec=$shared_archive_member_spec

# Shell to use when invoking shell scripts.
SHELL=$lt_SHELL

# An echo program that protects backslashes.
ECHO=$lt_ECHO

# The PATH separator for the build system.
PATH_SEPARATOR=$lt_PATH_SEPARATOR

# The host system.
host_alias=$host_alias
host=$host
host_os=$host_os

# The build system.
build_alias=$build_alias
build=$build
build_os=$build_os

# A sed program that does not truncate output.
SED=$lt_SED

# Sed that helps us avoid accidentally triggering echo(1) options like -n.
Xsed="\$SED -e 1s/^X//"

# A grep program that handles long lines.
GREP=$lt_GREP

# An ERE matcher.
EGREP=$lt_EGREP

# A literal string matcher.
FGREP=$lt_FGREP

# A BSD- or MS-compatible name lister.
NM=$lt_NM

# Whether we need soft or hard links.
LN_S=$lt_LN_S

# What is the maximum length of a command?
max_cmd_len=$max_cmd_len

# Object file suffix (normally "o").
objext=$ac_objext

# Executable file suffix (normally "").
exeext=$exeext

# whether the shell understands "unset".
lt_unset=$lt_unset

# turn spaces into newlines.
SP2NL=$lt_lt_SP2NL

# turn newlines into spaces.
NL2SP=$lt_lt_NL2SP

# convert \$build file names to \$host format.
to_host_file_cmd=$lt_cv_to_host_file_cmd

# convert \$build files to toolchain format.
to_tool_file_cmd=$lt_cv_to_tool_file_cmd

# Method to check whether dependent libraries are shared objects.
deplibs_check_method=$lt_deplibs_check_method

# Command to use when deplibs_check_method = "file_magic".
file_magic_cmd=$lt_file_magic_cmd

# How to find potential files when deplibs_check_method = "file_magic".
file_magic_glob=$lt_file_magic_glob

# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
want_nocaseglob=$lt_want_nocaseglob

# Command to associate shared and link libraries.
sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd

# The archiver.
AR=$lt_AR

# Flags to create an archive.
AR_FLAGS=$lt_AR_FLAGS

# How to feed a file listing to the archiver.
archiver_list_spec=$lt_archiver_list_spec

# A symbol stripping program.
STRIP=$lt_STRIP

# Commands used to install an old-style archive.
RANLIB=$lt_RANLIB
old_postinstall_cmds=$lt_old_postinstall_cmds
old_postuninstall_cmds=$lt_old_postuninstall_cmds

# Whether to use a lock for old archive extraction.
lock_old_archive_extraction=$lock_old_archive_extraction

# A C compiler.
LTCC=$lt_CC

# LTCC compiler flags.
LTCFLAGS=$lt_CFLAGS

# Take the output of nm and produce a listing of raw symbols and C names.
global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe

# Transform the output of nm in a proper C declaration.
global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl

# Transform the output of nm into a list of symbols to manually relocate.
global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import

# Transform the output of nm in a C name address pair.
global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address

# Transform the output of nm in a C name address pair when lib prefix is needed.
global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix

# The name lister interface.
nm_interface=$lt_lt_cv_nm_interface

# Specify filename containing input files for \$NM.
nm_file_list_spec=$lt_nm_file_list_spec

# The root where to search for dependent libraries,and where our libraries should be installed.
lt_sysroot=$lt_sysroot

# Command to truncate a binary pipe.
lt_truncate_bin=$lt_lt_cv_truncate_bin

# The name of the directory that contains temporary libtool files.
objdir=$objdir

# Used to examine libraries when file_magic_cmd begins with "file".
MAGIC_CMD=$MAGIC_CMD

# Must we lock files when doing compilation?
need_locks=$lt_need_locks

# Manifest tool.
MANIFEST_TOOL=$lt_MANIFEST_TOOL

# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
DSYMUTIL=$lt_DSYMUTIL

# Tool to change global to local symbols on Mac OS X.
NMEDIT=$lt_NMEDIT

# Tool to manipulate fat objects and archives on Mac OS X.
LIPO=$lt_LIPO

# ldd/readelf like tool for Mach-O binaries on Mac OS X.
OTOOL=$lt_OTOOL

# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
OTOOL64=$lt_OTOOL64

# Old archive suffix (normally "a").
libext=$libext

# Shared library suffix (normally ".so").
shrext_cmds=$lt_shrext_cmds

# The commands to extract the exported symbol list from a shared archive.
extract_expsyms_cmds=$lt_extract_expsyms_cmds

# Variables whose values should be saved in libtool wrapper scripts and
# restored at link time.
variables_saved_for_relink=$lt_variables_saved_for_relink

# Do we need the "lib" prefix for modules?
need_lib_prefix=$need_lib_prefix

# Do we need a version for libraries?
need_version=$need_version

# Library versioning type.
version_type=$version_type

# Shared library runtime path variable.
runpath_var=$runpath_var

# Shared library path variable.
shlibpath_var=$shlibpath_var

# Is shlibpath searched before the hard-coded library search path?
shlibpath_overrides_runpath=$shlibpath_overrides_runpath

# Format of library name prefix.
libname_spec=$lt_libname_spec

# List of archive names.  First name is the real one, the rest are links.
# The last name is the one that the linker finds with -lNAME
library_names_spec=$lt_library_names_spec

# The coded name of the library, if different from the real name.
soname_spec=$lt_soname_spec

# Permission mode override for installation of shared libraries.
install_override_mode=$lt_install_override_mode

# Command to use after installation of a shared archive.
postinstall_cmds=$lt_postinstall_cmds

# Command to use after uninstallation of a shared archive.
postuninstall_cmds=$lt_postuninstall_cmds

# Commands used to finish a libtool library installation in a directory.
finish_cmds=$lt_finish_cmds

# As "finish_cmds", except a single script fragment to be evaled but
# not shown.
finish_eval=$lt_finish_eval

# Whether we should hardcode library paths into libraries.
hardcode_into_libs=$hardcode_into_libs

# Compile-time system search path for libraries.
sys_lib_search_path_spec=$lt_sys_lib_search_path_spec

# Detected run-time system search path for libraries.
sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path

# Explicit LT_SYS_LIBRARY_PATH set during ./configure time.
configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path

# Whether dlopen is supported.
dlopen_support=$enable_dlopen

# Whether dlopen of programs is supported.
dlopen_self=$enable_dlopen_self

# Whether dlopen of statically linked programs is supported.
dlopen_self_static=$enable_dlopen_self_static

# Commands to strip libraries.
old_striplib=$lt_old_striplib
striplib=$lt_striplib


# The linker used to build libraries.
LD=$lt_LD

# How to create reloadable object files.
reload_flag=$lt_reload_flag
reload_cmds=$lt_reload_cmds

# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds

# A language specific compiler.
CC=$lt_compiler

# Is the compiler the GNU compiler?
with_gcc=$GCC

# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag

# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic

# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl

# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static

# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o

# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc

# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes

# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec

# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec

# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object

# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds

# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds

# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds
archive_expsym_cmds=$lt_archive_expsym_cmds

# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds
module_expsym_cmds=$lt_module_expsym_cmds

# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld

# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag

# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag

# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec

# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator

# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct

# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute

# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L

# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var

# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic

# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath

# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs

# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols

# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds

# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms

# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms

# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds

# Commands necessary for finishing linking programs.
postlink_cmds=$lt_postlink_cmds

# Specify filename containing input files.
file_list_spec=$lt_file_list_spec

# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action

# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs

# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects
postdep_objects=$lt_postdep_objects
predeps=$lt_predeps
postdeps=$lt_postdeps

# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path

# ### END LIBTOOL CONFIG

_LT_EOF

    cat <<'_LT_EOF' >> "$cfgfile"

# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE

# func_munge_path_list VARIABLE PATH
# -----------------------------------
# VARIABLE is name of variable containing _space_ separated list of
# directories to be munged by the contents of PATH, which is string
# having a format:
# "DIR[:DIR]:"
#       string "DIR[ DIR]" will be prepended to VARIABLE
# ":DIR[:DIR]"
#       string "DIR[ DIR]" will be appended to VARIABLE
# "DIRP[:DIRP]::[DIRA:]DIRA"
#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
#       "DIRA[ DIRA]" will be appended to VARIABLE
# "DIR[:DIR]"
#       VARIABLE will be replaced by "DIR[ DIR]"
func_munge_path_list ()
{
    case x$2 in
    x)
        ;;
    *:)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\"
        ;;
    x:*)
        eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    *::*)
        eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
        eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\"
        ;;
    *)
        eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\"
        ;;
    esac
}


# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
func_cc_basename ()
{
    for cc_temp in $*""; do
      case $cc_temp in
        compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
        distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
        \-*) ;;
        *) break;;
      esac
    done
    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
}


# ### END FUNCTIONS SHARED WITH CONFIGURE

_LT_EOF

  case $host_os in
  aix3*)
    cat <<\_LT_EOF >> "$cfgfile"
# AIX sometimes has problems with the GCC collect2 program.  For some
# reason, if we set the COLLECT_NAMES environment variable, the problems
# vanish in a puff of smoke.
if test set != "${COLLECT_NAMES+set}"; then
  COLLECT_NAMES=
  export COLLECT_NAMES
fi
_LT_EOF
    ;;
  esac


ltmain=$ac_aux_dir/ltmain.sh


  # We use sed instead of cat because bash on DJGPP gets confused if
  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
  # text mode, it properly converts lines to CR/LF.  This bash problem
  # is reportedly fixed, but why not run on old versions too?
  sed '$q' "$ltmain" >> "$cfgfile" \
     || (rm -f "$cfgfile"; exit 1)

   mv -f "$cfgfile" "$ofile" ||
    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
  chmod +x "$ofile"


    cat <<_LT_EOF >> "$ofile"

# ### BEGIN LIBTOOL TAG CONFIG: CXX

# The linker used to build libraries.
LD=$lt_LD_CXX

# How to create reloadable object files.
reload_flag=$lt_reload_flag_CXX
reload_cmds=$lt_reload_cmds_CXX

# Commands used to build an old-style archive.
old_archive_cmds=$lt_old_archive_cmds_CXX

# A language specific compiler.
CC=$lt_compiler_CXX

# Is the compiler the GNU compiler?
with_gcc=$GCC_CXX

# Compiler flag to turn off builtin functions.
no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX

# Additional compiler flags for building library objects.
pic_flag=$lt_lt_prog_compiler_pic_CXX

# How to pass a linker flag through the compiler.
wl=$lt_lt_prog_compiler_wl_CXX

# Compiler flag to prevent dynamic linking.
link_static_flag=$lt_lt_prog_compiler_static_CXX

# Does compiler simultaneously support -c and -o options?
compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX

# Whether or not to add -lc for building shared libraries.
build_libtool_need_lc=$archive_cmds_need_lc_CXX

# Whether or not to disallow shared libs when runtime libs are static.
allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX

# Compiler flag to allow reflexive dlopens.
export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX

# Compiler flag to generate shared objects directly from archives.
whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX

# Whether the compiler copes with passing no objects directly.
compiler_needs_object=$lt_compiler_needs_object_CXX

# Create an old-style archive from a shared archive.
old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX

# Create a temporary old-style archive to link instead of a shared archive.
old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX

# Commands used to build a shared archive.
archive_cmds=$lt_archive_cmds_CXX
archive_expsym_cmds=$lt_archive_expsym_cmds_CXX

# Commands used to build a loadable module if different from building
# a shared archive.
module_cmds=$lt_module_cmds_CXX
module_expsym_cmds=$lt_module_expsym_cmds_CXX

# Whether we are building with GNU ld or not.
with_gnu_ld=$lt_with_gnu_ld_CXX

# Flag that allows shared libraries with undefined symbols to be built.
allow_undefined_flag=$lt_allow_undefined_flag_CXX

# Flag that enforces no undefined symbols.
no_undefined_flag=$lt_no_undefined_flag_CXX

# Flag to hardcode \$libdir into a binary during linking.
# This must work even if \$libdir does not exist
hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX

# Whether we need a single "-rpath" flag with a separated argument.
hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX

# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary.
hardcode_direct=$hardcode_direct_CXX

# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes
# DIR into the resulting binary and the resulting library dependency is
# "absolute",i.e impossible to change by setting \$shlibpath_var if the
# library is relocated.
hardcode_direct_absolute=$hardcode_direct_absolute_CXX

# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
# into the resulting binary.
hardcode_minus_L=$hardcode_minus_L_CXX

# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
# into the resulting binary.
hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX

# Set to "yes" if building a shared library automatically hardcodes DIR
# into the library and all subsequent libraries and executables linked
# against it.
hardcode_automatic=$hardcode_automatic_CXX

# Set to yes if linker adds runtime paths of dependent libraries
# to runtime path list.
inherit_rpath=$inherit_rpath_CXX

# Whether libtool must link a program against all its dependency libraries.
link_all_deplibs=$link_all_deplibs_CXX

# Set to "yes" if exported symbols are required.
always_export_symbols=$always_export_symbols_CXX

# The commands to list exported symbols.
export_symbols_cmds=$lt_export_symbols_cmds_CXX

# Symbols that should not be listed in the preloaded symbols.
exclude_expsyms=$lt_exclude_expsyms_CXX

# Symbols that must always be exported.
include_expsyms=$lt_include_expsyms_CXX

# Commands necessary for linking programs (against libraries) with templates.
prelink_cmds=$lt_prelink_cmds_CXX

# Commands necessary for finishing linking programs.
postlink_cmds=$lt_postlink_cmds_CXX

# Specify filename containing input files.
file_list_spec=$lt_file_list_spec_CXX

# How to hardcode a shared library path into an executable.
hardcode_action=$hardcode_action_CXX

# The directories searched by this compiler when creating a shared library.
compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX

# Dependencies to place before and after the objects being linked to
# create a shared library.
predep_objects=$lt_predep_objects_CXX
postdep_objects=$lt_postdep_objects_CXX
predeps=$lt_predeps_CXX
postdeps=$lt_postdeps_CXX

# The library search path used internally by the compiler when linking
# a shared library.
compiler_lib_search_path=$lt_compiler_lib_search_path_CXX

# ### END LIBTOOL TAG CONFIG: CXX
_LT_EOF

 ;;
    "po-directories":C)
    for ac_file in $CONFIG_FILES; do
      # Support "outfile[:infile[:infile...]]"
      case "$ac_file" in
        *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
      esac
      # PO directories have a Makefile.in generated from Makefile.in.in.
      case "$ac_file" in */Makefile.in)
        # Adjust a relative srcdir.
        ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'`
        ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`"
        ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'`
        # In autoconf-2.13 it is called $ac_given_srcdir.
        # In autoconf-2.50 it is called $srcdir.
        test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir"
        case "$ac_given_srcdir" in
          .)  top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;;
          /*) top_srcdir="$ac_given_srcdir" ;;
          *)  top_srcdir="$ac_dots$ac_given_srcdir" ;;
        esac
        # Treat a directory as a PO directory if and only if it has a
        # POTFILES.in file. This allows packages to have multiple PO
        # directories under different names or in different locations.
        if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then
          rm -f "$ac_dir/POTFILES"
          test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES"
          cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ 	]*\$/d" -e "s,.*,     $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES"
          POMAKEFILEDEPS="POTFILES.in"
          # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend
          # on $ac_dir but don't depend on user-specified configuration
          # parameters.
          if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then
            # The LINGUAS file contains the set of available languages.
            if test -n "$OBSOLETE_ALL_LINGUAS"; then
              test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete"
            fi
            ALL_LINGUAS_=`sed -e "/^#/d" -e "s/#.*//" "$ac_given_srcdir/$ac_dir/LINGUAS"`
            # Hide the ALL_LINGUAS assigment from automake < 1.5.
            eval 'ALL_LINGUAS''=$ALL_LINGUAS_'
            POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS"
          else
            # The set of available languages was given in configure.in.
            # Hide the ALL_LINGUAS assigment from automake < 1.5.
            eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS'
          fi
          # Compute POFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po)
          # Compute UPDATEPOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).po-update)
          # Compute DUMMYPOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(lang).nop)
          # Compute GMOFILES
          # as      $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo)
          case "$ac_given_srcdir" in
            .) srcdirpre= ;;
            *) srcdirpre='$(srcdir)/' ;;
          esac
          POFILES=
          UPDATEPOFILES=
          DUMMYPOFILES=
          GMOFILES=
          for lang in $ALL_LINGUAS; do
            POFILES="$POFILES $srcdirpre$lang.po"
            UPDATEPOFILES="$UPDATEPOFILES $lang.po-update"
            DUMMYPOFILES="$DUMMYPOFILES $lang.nop"
            GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
          done
          # CATALOGS depends on both $ac_dir and the user's LINGUAS
          # environment variable.
          INST_LINGUAS=
          if test -n "$ALL_LINGUAS"; then
            for presentlang in $ALL_LINGUAS; do
              useit=no
              if test "%UNSET%" != "$LINGUAS"; then
                desiredlanguages="$LINGUAS"
              else
                desiredlanguages="$ALL_LINGUAS"
              fi
              for desiredlang in $desiredlanguages; do
                # Use the presentlang catalog if desiredlang is
                #   a. equal to presentlang, or
                #   b. a variant of presentlang (because in this case,
                #      presentlang can be used as a fallback for messages
                #      which are not translated in the desiredlang catalog).
                case "$desiredlang" in
                  "$presentlang"*) useit=yes;;
                esac
              done
              if test $useit = yes; then
                INST_LINGUAS="$INST_LINGUAS $presentlang"
              fi
            done
          fi
          CATALOGS=
          if test -n "$INST_LINGUAS"; then
            for lang in $INST_LINGUAS; do
              CATALOGS="$CATALOGS $lang.gmo"
            done
          fi
          test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile"
          sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile"
          for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do
            if test -f "$f"; then
              case "$f" in
                *.orig | *.bak | *~) ;;
                *) cat "$f" >> "$ac_dir/Makefile" ;;
              esac
            fi
          done
        fi
        ;;
      esac
    done ;;
    "$ac_stdint_h":C)
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_stdint_h : $_ac_stdint_h" >&5
$as_echo "$as_me: creating $ac_stdint_h : $_ac_stdint_h" >&6;}
ac_stdint=$tmp/_stdint.h

echo "#ifndef" $_ac_stdint_h >$ac_stdint
echo "#define" $_ac_stdint_h "1" >>$ac_stdint
echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
if test "_$ac_cv_header_stdint_t" != "_" ; then
echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
echo "#include <stdint.h>" >>$ac_stdint
echo "#endif" >>$ac_stdint
echo "#endif" >>$ac_stdint
else

cat >>$ac_stdint <<STDINT_EOF

/* ................... shortcircuit part ........................... */

#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
#include <stdint.h>
#else
#include <stddef.h>

/* .................... configured part ............................ */

STDINT_EOF

echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
if test "_$ac_cv_header_stdint_x" != "_" ; then
  ac_header="$ac_cv_header_stdint_x"
  echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
else
  echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
fi

echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
if  test "_$ac_cv_header_stdint_o" != "_" ; then
  ac_header="$ac_cv_header_stdint_o"
  echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
else
  echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
fi

echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
if  test "_$ac_cv_header_stdint_u" != "_" ; then
  ac_header="$ac_cv_header_stdint_u"
  echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
else
  echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
fi

echo "" >>$ac_stdint

if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
  echo "#include <$ac_header>" >>$ac_stdint
  echo "" >>$ac_stdint
fi fi

echo "/* which 64bit typedef has been found */" >>$ac_stdint
if test "$ac_cv_type_uint64_t" = "yes" ; then
echo "#define   _STDINT_HAVE_UINT64_T" "1"  >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
fi
if test "$ac_cv_type_u_int64_t" = "yes" ; then
echo "#define   _STDINT_HAVE_U_INT64_T" "1"  >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint

echo "/* which type model has been detected */" >>$ac_stdint
if test "_$ac_cv_char_data_model" != "_" ; then
echo "#define   _STDINT_CHAR_MODEL" "$ac_cv_char_data_model" >>$ac_stdint
echo "#define   _STDINT_LONG_MODEL" "$ac_cv_long_data_model" >>$ac_stdint
else
echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
fi
echo "" >>$ac_stdint

echo "/* whether int_least types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_least32_t" = "yes"; then
echo "#define   _STDINT_HAVE_INT_LEAST32_T" "1"  >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
fi
echo "/* whether int_fast types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_fast32_t" = "yes"; then
echo "#define   _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
fi
echo "/* whether intmax_t type was detected */" >>$ac_stdint
if test "$ac_cv_type_intmax_t" = "yes"; then
echo "#define   _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint

  cat >>$ac_stdint <<STDINT_EOF
/* .................... detections part ............................ */

/* whether we need to define bitspecific types from compiler base types */
#ifndef _STDINT_HEADER_INTPTR
#ifndef _STDINT_HEADER_UINT32
#ifndef _STDINT_HEADER_U_INT32
#define _STDINT_NEED_INT_MODEL_T
#else
#define _STDINT_HAVE_U_INT_TYPES
#endif
#endif
#endif

#ifdef _STDINT_HAVE_U_INT_TYPES
#undef _STDINT_NEED_INT_MODEL_T
#endif

#ifdef  _STDINT_CHAR_MODEL
#if     _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
#ifndef _STDINT_BYTE_MODEL
#define _STDINT_BYTE_MODEL 12
#endif
#endif
#endif

#ifndef _STDINT_HAVE_INT_LEAST32_T
#define _STDINT_NEED_INT_LEAST_T
#endif

#ifndef _STDINT_HAVE_INT_FAST32_T
#define _STDINT_NEED_INT_FAST_T
#endif

#ifndef _STDINT_HEADER_INTPTR
#define _STDINT_NEED_INTPTR_T
#ifndef _STDINT_HAVE_INTMAX_T
#define _STDINT_NEED_INTMAX_T
#endif
#endif


/* .................... definition part ............................ */

/* some system headers have good uint64_t */
#ifndef _HAVE_UINT64_T
#if     defined _STDINT_HAVE_UINT64_T  || defined HAVE_UINT64_T
#define _HAVE_UINT64_T
#elif   defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
#define _HAVE_UINT64_T
typedef u_int64_t uint64_t;
#endif
#endif

#ifndef _HAVE_UINT64_T
/* .. here are some common heuristics using compiler runtime specifics */
#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;

#elif !defined __STRICT_ANSI__
#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
#define _HAVE_UINT64_T
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;

#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
/* note: all ELF-systems seem to have loff-support which needs 64-bit */
#if !defined _NO_LONGLONG
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;
#endif

#elif defined __alpha || (defined __mips && defined _ABIN32)
#if !defined _NO_LONGLONG
typedef long int64_t;
typedef unsigned long uint64_t;
#endif
  /* compiler/cpu type to define int64_t */
#endif
#endif
#endif

#if defined _STDINT_HAVE_U_INT_TYPES
/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
typedef u_int8_t uint8_t;
typedef u_int16_t uint16_t;
typedef u_int32_t uint32_t;

/* glibc compatibility */
#ifndef __int8_t_defined
#define __int8_t_defined
#endif
#endif

#ifdef _STDINT_NEED_INT_MODEL_T
/* we must guess all the basic types. Apart from byte-adressable system, */
/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
/* (btw, those nibble-addressable systems are way off, or so we assume) */


#if defined _STDINT_BYTE_MODEL
#if _STDINT_LONG_MODEL+0 == 242
/* 2:4:2 =  IP16 = a normal 16-bit system                */
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned long   uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef          char    int8_t;
typedef          short   int16_t;
typedef          long    int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
/* 2:4:4 =  LP32 = a 32-bit system derived from a 16-bit */
/* 4:4:4 = ILP32 = a normal 32-bit system                */
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef          char    int8_t;
typedef          short   int16_t;
typedef          int     int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
/* 4:8:4 =  IP32 = a 32-bit system prepared for 64-bit    */
/* 4:8:8 =  LP64 = a normal 64-bit system                 */
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef          char    int8_t;
typedef          short   int16_t;
typedef          int     int32_t;
#endif
/* this system has a "long" of 64bit */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
typedef unsigned long   uint64_t;
typedef          long    int64_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 448
/*      LLP64   a 64-bit system derived from a 32-bit system */
typedef unsigned char   uint8_t;
typedef unsigned short  uint16_t;
typedef unsigned int    uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef          char    int8_t;
typedef          short   int16_t;
typedef          int     int32_t;
#endif
/* assuming the system has a "long long" */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
#define _HAVE_LONGLONG_UINT64_T
typedef unsigned long long uint64_t;
typedef          long long  int64_t;
#endif
#else
#define _STDINT_NO_INT32_T
#endif
#else
#define _STDINT_NO_INT8_T
#define _STDINT_NO_INT32_T
#endif
#endif

/*
 * quote from SunOS-5.8 sys/inttypes.h:
 * Use at your own risk.  As of February 1996, the committee is squarely
 * behind the fixed sized types; the "least" and "fast" types are still being
 * discussed.  The probability that the "fast" types may be removed before
 * the standard is finalized is high enough that they are not currently
 * implemented.
 */

#if defined _STDINT_NEED_INT_LEAST_T
typedef  int8_t    int_least8_t;
typedef  int16_t   int_least16_t;
typedef  int32_t   int_least32_t;
#ifdef _HAVE_UINT64_T
typedef  int64_t   int_least64_t;
#endif

typedef uint8_t   uint_least8_t;
typedef uint16_t  uint_least16_t;
typedef uint32_t  uint_least32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t  uint_least64_t;
#endif
  /* least types */
#endif

#if defined _STDINT_NEED_INT_FAST_T
typedef  int8_t    int_fast8_t;
typedef  int       int_fast16_t;
typedef  int32_t   int_fast32_t;
#ifdef _HAVE_UINT64_T
typedef  int64_t   int_fast64_t;
#endif

typedef uint8_t   uint_fast8_t;
typedef unsigned  uint_fast16_t;
typedef uint32_t  uint_fast32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t  uint_fast64_t;
#endif
  /* fast types */
#endif

#ifdef _STDINT_NEED_INTMAX_T
#ifdef _HAVE_UINT64_T
typedef  int64_t       intmax_t;
typedef uint64_t      uintmax_t;
#else
typedef          long  intmax_t;
typedef unsigned long uintmax_t;
#endif
#endif

#ifdef _STDINT_NEED_INTPTR_T
#ifndef __intptr_t_defined
#define __intptr_t_defined
/* we encourage using "long" to store pointer values, never use "int" ! */
#if   _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
typedef  unsigned int   uintptr_t;
typedef           int    intptr_t;
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
typedef  unsigned long  uintptr_t;
typedef           long   intptr_t;
#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
typedef        uint64_t uintptr_t;
typedef         int64_t  intptr_t;
#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
typedef  unsigned long  uintptr_t;
typedef           long   intptr_t;
#endif
#endif
#endif

/* The ISO C99 standard specifies that in C++ implementations these
   should only be defined if explicitly requested.  */
#if !defined __cplusplus || defined __STDC_CONSTANT_MACROS
#ifndef UINT32_C

/* Signed.  */
# define INT8_C(c)      c
# define INT16_C(c)     c
# define INT32_C(c)     c
# ifdef _HAVE_LONGLONG_UINT64_T
#  define INT64_C(c)    c ## L
# else
#  define INT64_C(c)    c ## LL
# endif

/* Unsigned.  */
# define UINT8_C(c)     c ## U
# define UINT16_C(c)    c ## U
# define UINT32_C(c)    c ## U
# ifdef _HAVE_LONGLONG_UINT64_T
#  define UINT64_C(c)   c ## UL
# else
#  define UINT64_C(c)   c ## ULL
# endif

/* Maximal type.  */
# ifdef _HAVE_LONGLONG_UINT64_T
#  define INTMAX_C(c)   c ## L
#  define UINTMAX_C(c)  c ## UL
# else
#  define INTMAX_C(c)   c ## LL
#  define UINTMAX_C(c)  c ## ULL
# endif

  /* literalnumbers */
#endif
#endif

/* These limits are merily those of a two complement byte-oriented system */

/* Minimum of signed integral types.  */
# define INT8_MIN               (-128)
# define INT16_MIN              (-32767-1)
# define INT32_MIN              (-2147483647-1)
# define INT64_MIN              (-__INT64_C(9223372036854775807)-1)
/* Maximum of signed integral types.  */
# define INT8_MAX               (127)
# define INT16_MAX              (32767)
# define INT32_MAX              (2147483647)
# define INT64_MAX              (__INT64_C(9223372036854775807))

/* Maximum of unsigned integral types.  */
# define UINT8_MAX              (255)
# define UINT16_MAX             (65535)
# define UINT32_MAX             (4294967295U)
# define UINT64_MAX             (__UINT64_C(18446744073709551615))

/* Minimum of signed integral types having a minimum size.  */
# define INT_LEAST8_MIN         INT8_MIN
# define INT_LEAST16_MIN        INT16_MIN
# define INT_LEAST32_MIN        INT32_MIN
# define INT_LEAST64_MIN        INT64_MIN
/* Maximum of signed integral types having a minimum size.  */
# define INT_LEAST8_MAX         INT8_MAX
# define INT_LEAST16_MAX        INT16_MAX
# define INT_LEAST32_MAX        INT32_MAX
# define INT_LEAST64_MAX        INT64_MAX

/* Maximum of unsigned integral types having a minimum size.  */
# define UINT_LEAST8_MAX        UINT8_MAX
# define UINT_LEAST16_MAX       UINT16_MAX
# define UINT_LEAST32_MAX       UINT32_MAX
# define UINT_LEAST64_MAX       UINT64_MAX

  /* shortcircuit*/
#endif
  /* once */
#endif
#endif
STDINT_EOF
fi
    if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_stdint_h is unchanged" >&5
$as_echo "$as_me: $ac_stdint_h is unchanged" >&6;}
    else
      ac_dir=`$as_dirname -- "$ac_stdint_h" ||
$as_expr X"$ac_stdint_h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
	 X"$ac_stdint_h" : 'X\(//\)[^/]' \| \
	 X"$ac_stdint_h" : 'X\(//\)$' \| \
	 X"$ac_stdint_h" : 'X\(/\)' \| . 2>/dev/null ||
$as_echo X"$ac_stdint_h" |
    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)[^/].*/{
	    s//\1/
	    q
	  }
	  /^X\(\/\/\)$/{
	    s//\1/
	    q
	  }
	  /^X\(\/\).*/{
	    s//\1/
	    q
	  }
	  s/.*/./; q'`
      as_dir="$ac_dir"; as_fn_mkdir_p
      rm -f $ac_stdint_h
      mv $ac_stdint $ac_stdint_h
    fi
 ;;
    "gst-libs/gst/gl/gstglconfig.h":C)
	outfile=gstglconfig.h-tmp
	cat > $outfile <<\_______EOF
/* gstglconfig.h
 *
 * This is a generated file.  Please modify `configure.ac'
 */

#ifndef __GST_GL_CONFIG_H__
#define __GST_GL_CONFIG_H__

#include <gst/gst.h>

G_BEGIN_DECLS

_______EOF

	cat >>$outfile <<_______EOF
$gl_config_defines
_______EOF

	cat >>$outfile <<_______EOF

G_END_DECLS

#endif  /* __GST_GL_CONFIG_H__ */
_______EOF


	if cmp -s $outfile gst-libs/gst/gl/gstglconfig.h; then
          { $as_echo "$as_me:${as_lineno-$LINENO}: gst-libs/gst/gl/gstglconfig.h is unchanged" >&5
$as_echo "$as_me: gst-libs/gst/gl/gstglconfig.h is unchanged" >&6;}
	  rm -f $outfile
	else
	  mv $outfile gst-libs/gst/gl/gstglconfig.h
	fi
 ;;
    "ext/vulkan/vkconfig.h":C)
	outfile=vkconfig.h-tmp
	cat > $outfile <<\_______EOF
/* vkconfig.h
 *
 * This is a generated file.  Please modify `configure.ac'
 */

#ifndef __GST_VULKAN_CONFIG_H__
#define __GST_VULKAN_CONFIG_H__

#include <gst/gst.h>

G_BEGIN_DECLS

_______EOF

	cat >>$outfile <<_______EOF
$vulkan_config_defines
_______EOF

	cat >>$outfile <<_______EOF

G_END_DECLS

#endif  /* __GST_VULKAN_CONFIG_H__ */
_______EOF


	if cmp -s $outfile ext/vulkan/vkconfig.h; then
          { $as_echo "$as_me:${as_lineno-$LINENO}: ext/vulkan/vkconfig.h is unchanged" >&5
$as_echo "$as_me: ext/vulkan/vkconfig.h is unchanged" >&6;}
	  rm -f $outfile
	else
	  mv $outfile ext/vulkan/vkconfig.h
	fi
 ;;

  esac
done # for ac_tag


as_fn_exit 0
_ACEOF
ac_clean_files=$ac_clean_files_save

test $ac_write_fail = 0 ||
  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5


# configure is writing to config.log, and then calls config.status.
# config.status does its own redirection, appending to config.log.
# Unfortunately, on DOS this fails, as config.log is still kept open
# by configure, so config.status won't be able to write to it; its
# output is simply discarded.  So we exec the FD to /dev/null,
# effectively closing config.log, so it can be properly (re)opened and
# appended to by config.status.  When coming back to configure, we
# need to make the FD available again.
if test "$no_create" != yes; then
  ac_cs_success=:
  ac_config_status_args=
  test "$silent" = yes &&
    ac_config_status_args="$ac_config_status_args --quiet"
  exec 5>/dev/null
  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
  exec 5>>config.log
  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
  # would make configure fail if this is the last instruction.
  $ac_cs_success || as_fn_exit 1
fi
if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
fi




printf "configure: *** Plug-ins without external dependencies that will be built:\n"
( for i in $GST_PLUGINS_SELECTED; do printf '\t'$i'\n'; done ) | sort
printf "\n"

printf "configure: *** Plug-ins without external dependencies that will NOT be built:\n"
( for i in $GST_PLUGINS_ALL; do
    case " $GST_PLUGINS_SELECTED " in
      *\ $i\ *)
	;;
      *)
	printf '\t'$i'\n'
	;;
    esac
  done ) | sort
printf "\n"

printf "configure: *** Plug-ins that have NOT been ported:\n"
( for i in $GST_PLUGINS_NONPORTED; do
	printf '\t'$i'\n'
  done ) | sort
printf "\n"

if test "x$BUILD_EXTERNAL" = "xno"; then
  printf "configure: *** No plug-ins with external dependencies will be built\n"
else
  printf "configure: *** Plug-ins with dependencies that will be built:"
  printf "$GST_PLUGINS_YES\n" | sort
  printf "\n"
  printf "configure: *** Plug-ins with dependencies that will NOT be built:"
  printf "$GST_PLUGINS_NO\n" | sort
  printf "\n"
fi


  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"


