#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.69 for Wine 1.7.41.
#
# Report bugs to <wine-devel@winehq.org>.
#
#
# 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 \$(( 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: wine-devel@winehq.org about your system, including any
$0: error possibly output before this message. Then install
$0: a modern shell, or manually run the script under such a
$0: shell if you do 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'"


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='Wine'
PACKAGE_TARNAME='wine'
PACKAGE_VERSION='1.7.41'
PACKAGE_STRING='Wine 1.7.41'
PACKAGE_BUGREPORT='wine-devel@winehq.org'
PACKAGE_URL='http://www.winehq.org'

ac_unique_file="server/atom.c"
# 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"

ac_subst_vars='LTLIBOBJS
LIBOBJS
LINGUAS
ALL_VARS_RULES
LDAP_LIBS
RT_LIBS
POLL_LIBS
DL_LIBS
TOOLSEXT
UNWINDFLAGS
BUILTINFLAG
EXTRACFLAGS
PROCSTAT_LIBS
KSTAT_LIBS
MPG123_LIBS
MPG123_CFLAGS
TIFF_LIBS
TIFF_CFLAGS
PNG_LIBS
PNG_CFLAGS
JPEG_LIBS
JPEG_CFLAGS
FONTCONFIG_LIBS
FONTCONFIG_CFLAGS
CUPS_CFLAGS
CAPI20_LIBS
CAPI20_CFLAGS
OSS4_CFLAGS
ALSA_LIBS
GSTREAMER_LIBS
GSTREAMER_CFLAGS
GETTEXTPO_LIBS
Z_LIBS
FREETYPE_LIBS
FREETYPE_CFLAGS
LCMS2_LIBS
LCMS2_CFLAGS
RESOLV_LIBS
GPHOTO2_PORT_LIBS
GPHOTO2_PORT_CFLAGS
GPHOTO2_LIBS
GPHOTO2_CFLAGS
SANE_LIBS
SANE_CFLAGS
GNUTLS_LIBS
GNUTLS_CFLAGS
HAL_LIBS
HAL_CFLAGS
DBUS_LIBS
DBUS_CFLAGS
XSLT_LIBS
XSLT_CFLAGS
XML2_LIBS
XML2_CFLAGS
LIBPCAP
X_EXTRA_LIBS
X_LIBS
X_PRE_LIBS
X_CFLAGS
XMKMF
PTHREAD_LIBS
CROSSCC
CROSSTARGET
PRELINK
CARBON_LIBS
QUICKTIME_LIBS
OPENCL_LIBS
OPENAL_LIBS
COREAUDIO_LIBS
SECURITY_LIBS
DISKARBITRATION_LIBS
APPKIT_LIBS
CORESERVICES_LIBS
APPLICATIONSERVICES_LIBS
FORCEFEEDBACK_LIBS
IOKIT_LIBS
COREFOUNDATION_LIBS
LIBWINE_RULES
SOCKET_LIBS
DLLTOOL
LOADER_RULES
ALL_TEST_RESOURCES
READELF
LDD
LDRPATH_LOCAL
LDRPATH_INSTALL
DLLFLAGS
DLLPREFIX
dlldir
CPP
OPENGL_LIBS
ICOTOOL
CONVERT
RSVG
FONTFORGE
PKG_CONFIG
MSGFMT
LDCONFIG
EGREP
GREP
LN_S
RANLIB
ARFLAGS
STRIP
ac_ct_AR
AR
BISON
FLEX
TOOLSDIR
TARGETFLAGS
LD
CPPBIN
ac_ct_CXX
CXXFLAGS
CXX
OBJEXT
EXEEXT
ac_ct_CC
CPPFLAGS
LDFLAGS
CFLAGS
CC
SET_MAKE
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
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_win16
enable_win64
enable_tests
enable_maintainer_mode
with_alsa
with_capi
with_cms
with_coreaudio
with_cups
with_curses
with_dbus
with_fontconfig
with_freetype
with_gettext
with_gettextpo
with_gphoto
with_glu
with_gnutls
with_gsm
with_gstreamer
with_hal
with_jpeg
with_ldap
with_mpg123
with_netapi
with_openal
with_opencl
with_opengl
with_osmesa
with_oss
with_pcap
with_png
with_pthread
with_sane
with_tiff
with_v4l
with_xcomposite
with_xcursor
with_xinerama
with_xinput
with_xinput2
with_xml
with_xrandr
with_xrender
with_xshape
with_xshm
with_xslt
with_xxf86vm
with_zlib
with_wine_tools
with_wine64
enable_largefile
with_x
enable_acledit
enable_aclui
enable_activeds
enable_actxprxy
enable_advapi32
enable_advpack
enable_amstream
enable_api_ms_win_core_com_l1_1_0
enable_api_ms_win_core_console_l1_1_0
enable_api_ms_win_core_datetime_l1_1_0
enable_api_ms_win_core_datetime_l1_1_1
enable_api_ms_win_core_debug_l1_1_1
enable_api_ms_win_core_errorhandling_l1_1_1
enable_api_ms_win_core_errorhandling_l1_1_2
enable_api_ms_win_core_fibers_l1_1_0
enable_api_ms_win_core_fibers_l1_1_1
enable_api_ms_win_core_file_l1_2_0
enable_api_ms_win_core_file_l2_1_0
enable_api_ms_win_core_file_l2_1_1
enable_api_ms_win_core_handle_l1_1_0
enable_api_ms_win_core_heap_l1_2_0
enable_api_ms_win_core_heap_obsolete_l1_1_0
enable_api_ms_win_core_interlocked_l1_2_0
enable_api_ms_win_core_io_l1_1_1
enable_api_ms_win_core_kernel32_legacy_l1_1_0
enable_api_ms_win_core_libraryloader_l1_1_1
enable_api_ms_win_core_localization_l1_2_0
enable_api_ms_win_core_localization_l1_2_1
enable_api_ms_win_core_localization_obsolete_l1_1_0
enable_api_ms_win_core_localregistry_l1_1_0
enable_api_ms_win_core_memory_l1_1_1
enable_api_ms_win_core_namedpipe_l1_2_0
enable_api_ms_win_core_processenvironment_l1_2_0
enable_api_ms_win_core_processthreads_l1_1_0
enable_api_ms_win_core_processthreads_l1_1_1
enable_api_ms_win_core_processthreads_l1_1_2
enable_api_ms_win_core_profile_l1_1_0
enable_api_ms_win_core_psapi_l1_1_0
enable_api_ms_win_core_registry_l1_1_0
enable_api_ms_win_core_rtlsupport_l1_2_0
enable_api_ms_win_core_shlwapi_legacy_l1_1_0
enable_api_ms_win_core_string_l1_1_0
enable_api_ms_win_core_synch_l1_2_0
enable_api_ms_win_core_sysinfo_l1_2_0
enable_api_ms_win_core_sysinfo_l1_2_1
enable_api_ms_win_core_threadpool_legacy_l1_1_0
enable_api_ms_win_core_timezone_l1_1_0
enable_api_ms_win_core_url_l1_1_0
enable_api_ms_win_core_util_l1_1_0
enable_api_ms_win_core_winrt_error_l1_1_0
enable_api_ms_win_core_winrt_error_l1_1_1
enable_api_ms_win_core_winrt_l1_1_0
enable_api_ms_win_core_winrt_string_l1_1_0
enable_api_ms_win_core_xstate_l2_1_0
enable_api_ms_win_downlevel_advapi32_l1_1_0
enable_api_ms_win_downlevel_advapi32_l2_1_0
enable_api_ms_win_downlevel_normaliz_l1_1_0
enable_api_ms_win_downlevel_ole32_l1_1_0
enable_api_ms_win_downlevel_shell32_l1_1_0
enable_api_ms_win_downlevel_shlwapi_l1_1_0
enable_api_ms_win_downlevel_shlwapi_l2_1_0
enable_api_ms_win_downlevel_user32_l1_1_0
enable_api_ms_win_downlevel_version_l1_1_0
enable_api_ms_win_eventing_provider_l1_1_0
enable_api_ms_win_ntuser_dc_access_l1_1_0
enable_api_ms_win_security_base_l1_1_0
enable_api_ms_win_security_base_l1_2_0
enable_api_ms_win_security_sddl_l1_1_0
enable_api_ms_win_service_core_l1_1_1
enable_api_ms_win_service_management_l1_1_0
enable_api_ms_win_service_winsvc_l1_2_0
enable_apphelp
enable_appwiz_cpl
enable_atl
enable_atl100
enable_atl110
enable_atl80
enable_atl90
enable_authz
enable_avicap32
enable_avifil32
enable_avrt
enable_bcrypt
enable_browseui
enable_cabinet
enable_capi2032
enable_cards
enable_cfgmgr32
enable_clusapi
enable_combase
enable_comcat
enable_comctl32
enable_comdlg32
enable_compstui
enable_comsvcs
enable_connect
enable_credui
enable_crtdll
enable_crypt32
enable_cryptdlg
enable_cryptdll
enable_cryptext
enable_cryptnet
enable_cryptui
enable_ctapi32
enable_ctl3d32
enable_d2d1
enable_d3d10
enable_d3d10_1
enable_d3d10core
enable_d3d11
enable_d3d8
enable_d3d9
enable_d3dcompiler_33
enable_d3dcompiler_34
enable_d3dcompiler_35
enable_d3dcompiler_36
enable_d3dcompiler_37
enable_d3dcompiler_38
enable_d3dcompiler_39
enable_d3dcompiler_40
enable_d3dcompiler_41
enable_d3dcompiler_42
enable_d3dcompiler_43
enable_d3dim
enable_d3drm
enable_d3dx10_33
enable_d3dx10_34
enable_d3dx10_35
enable_d3dx10_36
enable_d3dx10_37
enable_d3dx10_38
enable_d3dx10_39
enable_d3dx10_40
enable_d3dx10_41
enable_d3dx10_42
enable_d3dx10_43
enable_d3dx11_42
enable_d3dx11_43
enable_d3dx9_24
enable_d3dx9_25
enable_d3dx9_26
enable_d3dx9_27
enable_d3dx9_28
enable_d3dx9_29
enable_d3dx9_30
enable_d3dx9_31
enable_d3dx9_32
enable_d3dx9_33
enable_d3dx9_34
enable_d3dx9_35
enable_d3dx9_36
enable_d3dx9_37
enable_d3dx9_38
enable_d3dx9_39
enable_d3dx9_40
enable_d3dx9_41
enable_d3dx9_42
enable_d3dx9_43
enable_d3dxof
enable_dbgeng
enable_dbghelp
enable_dciman32
enable_ddraw
enable_ddrawex
enable_devenum
enable_dhcpcsvc
enable_difxapi
enable_dinput
enable_dinput8
enable_dispex
enable_dmband
enable_dmcompos
enable_dmime
enable_dmloader
enable_dmscript
enable_dmstyle
enable_dmsynth
enable_dmusic
enable_dmusic32
enable_dnsapi
enable_dplay
enable_dplayx
enable_dpnaddr
enable_dpnet
enable_dpnhpast
enable_dpnlobby
enable_dpvoice
enable_dpwsockx
enable_drmclien
enable_dsound
enable_dssenh
enable_dswave
enable_dwmapi
enable_dwrite
enable_dxdiagn
enable_dxgi
enable_dxva2
enable_evr
enable_explorerframe
enable_ext_ms_win_gdi_devcaps_l1_1_0
enable_faultrep
enable_fltlib
enable_fntcache
enable_fontsub
enable_fusion
enable_fwpuclnt
enable_gameux
enable_gdi32
enable_gdiplus
enable_glu32
enable_gphoto2_ds
enable_gpkcsp
enable_hal
enable_hhctrl_ocx
enable_hid
enable_hlink
enable_hnetcfg
enable_httpapi
enable_iccvid
enable_icmp
enable_ieframe
enable_imaadp32_acm
enable_imagehlp
enable_imm32
enable_inetcomm
enable_inetcpl_cpl
enable_inetmib1
enable_infosoft
enable_initpki
enable_inkobj
enable_inseng
enable_iphlpapi
enable_itircl
enable_itss
enable_joy_cpl
enable_jscript
enable_jsproxy
enable_kernel32
enable_ksuser
enable_ktmw32
enable_loadperf
enable_localspl
enable_localui
enable_lz32
enable_mapi32
enable_mapistub
enable_mciavi32
enable_mcicda
enable_mciqtz32
enable_mciseq
enable_mciwave
enable_mf
enable_mfplat
enable_mfreadwrite
enable_mgmtapi
enable_midimap
enable_mlang
enable_mmcndmgr
enable_mmdevapi
enable_mountmgr_sys
enable_mpr
enable_mprapi
enable_msacm32_drv
enable_msacm32
enable_msadp32_acm
enable_msasn1
enable_mscat32
enable_mscms
enable_mscoree
enable_msctf
enable_msdaps
enable_msdmo
enable_msftedit
enable_msg711_acm
enable_msgsm32_acm
enable_mshtml_tlb
enable_mshtml
enable_msi
enable_msident
enable_msimg32
enable_msimsg
enable_msimtf
enable_msisip
enable_msisys_ocx
enable_msls31
enable_msnet32
enable_mspatcha
enable_msrle32
enable_mssign32
enable_mssip32
enable_mstask
enable_msvcirt
enable_msvcm80
enable_msvcm90
enable_msvcp100
enable_msvcp110
enable_msvcp120
enable_msvcp120_app
enable_msvcp60
enable_msvcp70
enable_msvcp71
enable_msvcp80
enable_msvcp90
enable_msvcr100
enable_msvcr110
enable_msvcr120
enable_msvcr120_app
enable_msvcr70
enable_msvcr71
enable_msvcr80
enable_msvcr90
enable_msvcrt
enable_msvcrt20
enable_msvcrt40
enable_msvcrtd
enable_msvfw32
enable_msvidc32
enable_mswsock
enable_msxml
enable_msxml2
enable_msxml3
enable_msxml4
enable_msxml6
enable_nddeapi
enable_ndis_sys
enable_netapi32
enable_netcfgx
enable_netprofm
enable_newdev
enable_normaliz
enable_npmshtml
enable_npptools
enable_ntdll
enable_ntdsapi
enable_ntoskrnl_exe
enable_ntprint
enable_objsel
enable_odbc32
enable_odbccp32
enable_odbccu32
enable_ole32
enable_oleacc
enable_oleaut32
enable_olecli32
enable_oledb32
enable_oledlg
enable_olepro32
enable_olesvr32
enable_olethk32
enable_openal32
enable_opencl
enable_opengl32
enable_packager
enable_pdh
enable_photometadatahandler
enable_pidgen
enable_powrprof
enable_printui
enable_prntvpt
enable_propsys
enable_psapi
enable_pstorec
enable_qcap
enable_qedit
enable_qmgr
enable_qmgrprxy
enable_quartz
enable_query
enable_rasapi32
enable_rasdlg
enable_regapi
enable_resutils
enable_riched20
enable_riched32
enable_rpcrt4
enable_rsabase
enable_rsaenh
enable_rstrtmgr
enable_rtutils
enable_samlib
enable_sane_ds
enable_scarddlg
enable_sccbase
enable_schannel
enable_schedsvc
enable_scrrun
enable_scsiport_sys
enable_secur32
enable_security
enable_sensapi
enable_serialui
enable_setupapi
enable_sfc
enable_sfc_os
enable_shdoclc
enable_shdocvw
enable_shell32
enable_shfolder
enable_shlwapi
enable_slbcsp
enable_slc
enable_snmpapi
enable_softpub
enable_spoolss
enable_stdole2_tlb
enable_stdole32_tlb
enable_sti
enable_svrapi
enable_sxs
enable_t2embed
enable_tapi32
enable_taskschd
enable_traffic
enable_twain_32
enable_unicows
enable_updspapi
enable_url
enable_urlmon
enable_usbd_sys
enable_user32
enable_userenv
enable_usp10
enable_uxtheme
enable_vbscript
enable_vcomp
enable_vcomp100
enable_vcomp90
enable_vdmdbg
enable_version
enable_vssapi
enable_wbemdisp
enable_wbemprox
enable_webservices
enable_wer
enable_wevtapi
enable_wiaservc
enable_windowscodecs
enable_windowscodecsext
enable_winealsa_drv
enable_winecoreaudio_drv
enable_wined3d
enable_winegstreamer
enable_winejoystick_drv
enable_winemac_drv
enable_winemapi
enable_winemp3_acm
enable_wineoss_drv
enable_wineps_drv
enable_wineqtdecoder
enable_winex11_drv
enable_wing32
enable_winhttp
enable_wininet
enable_winmm
enable_winnls32
enable_winscard
enable_winspool_drv
enable_winsta
enable_wintab32
enable_wintrust
enable_wlanapi
enable_wldap32
enable_wmi
enable_wmiutils
enable_wmp
enable_wmvcore
enable_wnaspi32
enable_wpcap
enable_ws2_32
enable_wshom_ocx
enable_wsnmp32
enable_wsock32
enable_wtsapi32
enable_wuapi
enable_wuaueng
enable_x3daudio1_1
enable_x3daudio1_2
enable_x3daudio1_3
enable_x3daudio1_4
enable_x3daudio1_5
enable_x3daudio1_6
enable_x3daudio1_7
enable_xapofx1_1
enable_xapofx1_3
enable_xapofx1_4
enable_xapofx1_5
enable_xaudio2_7
enable_xinput1_1
enable_xinput1_2
enable_xinput1_3
enable_xinput1_4
enable_xinput9_1_0
enable_xmllite
enable_xolehlp
enable_xpsprint
enable_xpssvcs
enable_documentation
enable_fonts
enable_include
enable_libs_port
enable_libs_wine
enable_libs_wpp
enable_loader
enable_arp
enable_aspnet_regiis
enable_attrib
enable_cabarc
enable_cacls
enable_clock
enable_cmd
enable_conhost
enable_control
enable_cscript
enable_dpnsvr
enable_dxdiag
enable_eject
enable_expand
enable_explorer
enable_extrac32
enable_findstr
enable_hh
enable_hostname
enable_icinfo
enable_iexplore
enable_ipconfig
enable_lodctr
enable_mofcomp
enable_mshta
enable_msiexec
enable_net
enable_netsh
enable_netstat
enable_ngen
enable_notepad
enable_oleview
enable_ping
enable_plugplay
enable_presentationfontcache
enable_progman
enable_reg
enable_regasm
enable_regedit
enable_regsvcs
enable_regsvr32
enable_rpcss
enable_rundll32
enable_sc
enable_schtasks
enable_sdbinst
enable_secedit
enable_servicemodelreg
enable_services
enable_spoolsv
enable_start
enable_svchost
enable_systeminfo
enable_taskkill
enable_tasklist
enable_taskmgr
enable_termsv
enable_uninstaller
enable_unlodctr
enable_view
enable_wevtutil
enable_wineboot
enable_winebrowser
enable_winecfg
enable_wineconsole
enable_winedbg
enable_winedevice
enable_winefile
enable_winemenubuilder
enable_winemine
enable_winemsibuilder
enable_winepath
enable_winetest
enable_winhlp32
enable_winver
enable_wmic
enable_wordpad
enable_write
enable_wscript
enable_wusa
enable_xcopy
enable_server
enable_tools
'
      ac_precious_vars='build_alias
host_alias
target_alias
CC
CFLAGS
LDFLAGS
LIBS
CPPFLAGS
CXX
CXXFLAGS
CCC
CPP
XMKMF
XML2_CFLAGS
XML2_LIBS
XSLT_CFLAGS
XSLT_LIBS
DBUS_CFLAGS
DBUS_LIBS
HAL_CFLAGS
HAL_LIBS
GNUTLS_CFLAGS
GNUTLS_LIBS
SANE_CFLAGS
SANE_LIBS
GPHOTO2_CFLAGS
GPHOTO2_LIBS
GPHOTO2_PORT_CFLAGS
GPHOTO2_PORT_LIBS
LCMS2_CFLAGS
LCMS2_LIBS
FREETYPE_CFLAGS
FREETYPE_LIBS
GSTREAMER_CFLAGS
GSTREAMER_LIBS
CAPI20_CFLAGS
CAPI20_LIBS
FONTCONFIG_CFLAGS
FONTCONFIG_LIBS
JPEG_CFLAGS
JPEG_LIBS
PNG_CFLAGS
PNG_LIBS
TIFF_CFLAGS
TIFF_LIBS
MPG123_CFLAGS
MPG123_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'
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 ;;

  -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
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 Wine 1.7.41 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]
  --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/wine]
  --htmldir=DIR           html documentation [DOCDIR]
  --dvidir=DIR            dvi documentation [DOCDIR]
  --pdfdir=DIR            pdf documentation [DOCDIR]
  --psdir=DIR             ps documentation [DOCDIR]
_ACEOF

  cat <<\_ACEOF

X features:
  --x-includes=DIR    X include files are in DIR
  --x-libraries=DIR   X library files are in DIR

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

if test -n "$ac_init_help"; then
  case $ac_init_help in
     short | recursive ) echo "Configuration of Wine 1.7.41:";;
   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]
  --disable-win16         do not include Win16 support
  --enable-win64          build a Win64 emulator on AMD64 (won't run Win32
                          binaries)
  --disable-tests         do not build the regression tests
  --enable-maintainer-mode
                          enable maintainer-specific build rules
  --disable-largefile     omit support for large files

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --without-alsa          do not use the Alsa sound support
  --without-capi          do not use CAPI (ISDN support)
  --without-cms           do not use CMS (color management support)
  --without-coreaudio     do not use the CoreAudio sound support
  --without-cups          do not use CUPS
  --without-curses        do not use (n)curses
  --without-dbus          do not use DBus (dynamic device support)
  --without-fontconfig    do not use fontconfig
  --without-freetype      do not use the FreeType library
  --without-gettext       do not use gettext
  --with-gettextpo        use the GetTextPO library to rebuild po files
  --without-gphoto        do not use gphoto (Digital Camera support)
  --without-glu           do not use the GLU library
  --without-gnutls        do not use GnuTLS (schannel support)
  --without-gsm           do not use libgsm (GSM 06.10 codec support)
  --without-gstreamer     do not use GStreamer (codecs support)
  --without-hal           do not use HAL (dynamic device support)
  --without-jpeg          do not use JPEG
  --without-ldap          do not use LDAP
  --without-mpg123        do not use the mpg123 library
  --without-netapi        do not use the Samba NetAPI library
  --without-openal        do not use OpenAL
  --without-opencl        do not use OpenCL
  --without-opengl        do not use OpenGL
  --without-osmesa        do not use the OSMesa library
  --without-oss           do not use the OSS sound support
  --without-pcap          do not use the Packet Capture library
  --without-png           do not use PNG
  --without-pthread       do not use the pthread library
  --without-sane          do not use SANE (scanner support)
  --without-tiff          do not use TIFF
  --without-v4l           do not use v4l1 (v4l support)
  --without-xcomposite    do not use the Xcomposite extension
  --without-xcursor       do not use the Xcursor extension
  --without-xinerama      do not use Xinerama (multi-monitor support)
  --without-xinput        do not use the Xinput extension
  --without-xinput2       do not use the Xinput 2 extension
  --without-xml           do not use XML
  --without-xrandr        do not use Xrandr (resolution changes)
  --without-xrender       do not use the Xrender extension
  --without-xshape        do not use the Xshape extension
  --without-xshm          do not use XShm (shared memory extension)
  --without-xslt          do not use XSLT
  --without-xxf86vm       do not use XFree video mode extension
  --without-zlib          do not use Zlib (data compression)
  --with-wine-tools=DIR   use Wine tools from directory DIR
  --with-wine64=DIR       use the 64-bit Wine in DIR for a Wow64 build
  --with-x                use the X Window System

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>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CPP         C preprocessor
  XMKMF       Path to xmkmf, Makefile generator for X Window System
  XML2_CFLAGS C compiler flags for libxml-2.0, overriding pkg-config
  XML2_LIBS   Linker flags for libxml-2.0, overriding pkg-config
  XSLT_CFLAGS C compiler flags for libxslt, overriding pkg-config
  XSLT_LIBS   Linker flags for libxslt, overriding pkg-config
  DBUS_CFLAGS C compiler flags for dbus-1, overriding pkg-config
  DBUS_LIBS   Linker flags for dbus-1, overriding pkg-config
  HAL_CFLAGS  C compiler flags for hal, overriding pkg-config
  HAL_LIBS    Linker flags for hal, overriding pkg-config
  GNUTLS_CFLAGS
              C compiler flags for gnutls, overriding pkg-config
  GNUTLS_LIBS Linker flags for gnutls, overriding pkg-config
  SANE_CFLAGS C compiler flags for libsane, overriding pkg-config
  SANE_LIBS   Linker flags for libsane, overriding pkg-config
  GPHOTO2_CFLAGS
              C compiler flags for libgphoto2, overriding pkg-config
  GPHOTO2_LIBS
              Linker flags for libgphoto2, overriding pkg-config
  GPHOTO2_PORT_CFLAGS
              C compiler flags for libgphoto2_port, overriding pkg-config
  GPHOTO2_PORT_LIBS
              Linker flags for libgphoto2_port, overriding pkg-config
  LCMS2_CFLAGS
              C compiler flags for lcms2, overriding pkg-config
  LCMS2_LIBS  Linker flags for lcms2, overriding pkg-config
  FREETYPE_CFLAGS
              C compiler flags for freetype2, overriding pkg-config
  FREETYPE_LIBS
              Linker flags for freetype2, overriding pkg-config
  GSTREAMER_CFLAGS
              C compiler flags for gstreamer-app-0.10, overriding pkg-config
  GSTREAMER_LIBS
              Linker flags for gstreamer-app-0.10, overriding pkg-config
  CAPI20_CFLAGS
              C compiler flags for capi20, overriding pkg-config
  CAPI20_LIBS Linker flags for capi20, overriding pkg-config
  FONTCONFIG_CFLAGS
              C compiler flags for fontconfig, overriding pkg-config
  FONTCONFIG_LIBS
              Linker flags for fontconfig, overriding pkg-config
  JPEG_CFLAGS C compiler flags for libjpeg, overriding pkg-config
  JPEG_LIBS   Linker flags for libjpeg, overriding pkg-config
  PNG_CFLAGS  C compiler flags for libpng, overriding pkg-config
  PNG_LIBS    Linker flags for libpng, overriding pkg-config
  TIFF_CFLAGS C compiler flags for libtiff, overriding pkg-config
  TIFF_LIBS   Linker flags for libtiff, overriding pkg-config
  MPG123_CFLAGS
              C compiler flags for libmpg123, overriding pkg-config
  MPG123_LIBS Linker flags for libmpg123, 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 <wine-devel@winehq.org>.
Wine home page: <http://www.winehq.org>.
_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
Wine configure 1.7.41
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_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_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_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_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 wine-devel@winehq.org ##
## ------------------------------------ ##"
     ) | 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_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_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_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_member LINENO AGGR MEMBER VAR INCLUDES
# ----------------------------------------------------
# Tries to find if the field MEMBER exists in type AGGR, after including
# INCLUDES, setting cache variable VAR accordingly.
ac_fn_c_check_member ()
{
  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2.$3" >&5
$as_echo_n "checking for $2.$3... " >&6; }
if eval \${$4+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main ()
{
static $2 ac_aggr;
if (ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$4=yes"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
$5
int
main ()
{
static $2 ac_aggr;
if (sizeof ac_aggr.$3)
return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  eval "$4=yes"
else
  eval "$4=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
eval ac_res=\$$4
	       { $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_member

# 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
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 Wine $as_me 1.7.41, 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

# 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_config_headers="$ac_config_headers include/config.h"

ac_aux_dir=
for ac_dir in tools "$srcdir"/tools; 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 tools \"$srcdir\"/tools" "$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.



libwine_version="1.0"



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

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

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

# Check whether --enable-maintainer-mode was given.
if test "${enable_maintainer_mode+set}" = set; then :
  enableval=$enable_maintainer_mode;
fi



# Check whether --with-alsa was given.
if test "${with_alsa+set}" = set; then :
  withval=$with_alsa; if test "x$withval" = "xno"; then ac_cv_header_sys_asoundlib_h=no; ac_cv_header_alsa_asoundlib_h=no; fi
fi


# Check whether --with-capi was given.
if test "${with_capi+set}" = set; then :
  withval=$with_capi;
fi


# Check whether --with-cms was given.
if test "${with_cms+set}" = set; then :
  withval=$with_cms;
fi


# Check whether --with-coreaudio was given.
if test "${with_coreaudio+set}" = set; then :
  withval=$with_coreaudio; if test "x$withval" = "xno"; then ac_cv_header_CoreAudio_CoreAudio_h=no; fi
fi


# Check whether --with-cups was given.
if test "${with_cups+set}" = set; then :
  withval=$with_cups;
fi


# Check whether --with-curses was given.
if test "${with_curses+set}" = set; then :
  withval=$with_curses; if test "x$withval" = "xno"; then ac_cv_header_ncurses_h=no; ac_cv_header_curses_h=no; fi
fi


# Check whether --with-dbus was given.
if test "${with_dbus+set}" = set; then :
  withval=$with_dbus;
fi


# Check whether --with-fontconfig was given.
if test "${with_fontconfig+set}" = set; then :
  withval=$with_fontconfig;
fi


# Check whether --with-freetype was given.
if test "${with_freetype+set}" = set; then :
  withval=$with_freetype;
fi


# Check whether --with-gettext was given.
if test "${with_gettext+set}" = set; then :
  withval=$with_gettext;
fi


# Check whether --with-gettextpo was given.
if test "${with_gettextpo+set}" = set; then :
  withval=$with_gettextpo; if test "x$withval" = "xno"; then ac_cv_header_gettext_po_h=no; fi
fi


# Check whether --with-gphoto was given.
if test "${with_gphoto+set}" = set; then :
  withval=$with_gphoto;
fi


# Check whether --with-glu was given.
if test "${with_glu+set}" = set; then :
  withval=$with_glu;
fi


# Check whether --with-gnutls was given.
if test "${with_gnutls+set}" = set; then :
  withval=$with_gnutls;
fi


# Check whether --with-gsm was given.
if test "${with_gsm+set}" = set; then :
  withval=$with_gsm; if test "x$withval" = "xno"; then ac_cv_header_gsm_h=no; ac_cv_header_gsm_gsm_h=no; fi
fi


# Check whether --with-gstreamer was given.
if test "${with_gstreamer+set}" = set; then :
  withval=$with_gstreamer;
fi


# Check whether --with-hal was given.
if test "${with_hal+set}" = set; then :
  withval=$with_hal;
fi


# Check whether --with-jpeg was given.
if test "${with_jpeg+set}" = set; then :
  withval=$with_jpeg;
fi


# Check whether --with-ldap was given.
if test "${with_ldap+set}" = set; then :
  withval=$with_ldap; if test "x$withval" = "xno"; then ac_cv_header_ldap_h=no; ac_cv_header_lber_h=no; fi
fi


# Check whether --with-mpg123 was given.
if test "${with_mpg123+set}" = set; then :
  withval=$with_mpg123;
fi


# Check whether --with-netapi was given.
if test "${with_netapi+set}" = set; then :
  withval=$with_netapi;
fi


# Check whether --with-openal was given.
if test "${with_openal+set}" = set; then :
  withval=$with_openal; if test "x$withval" = "xno"; then ac_cv_header_AL_al_h=no; ac_cv_header_OpenAL_al_h=no; fi
fi


# Check whether --with-opencl was given.
if test "${with_opencl+set}" = set; then :
  withval=$with_opencl; if test "x$withval" = "xno"; then ac_cv_header_CL_cl_h=no; ac_cv_header_OpenCL_opencl_h=no; fi
fi


# Check whether --with-opengl was given.
if test "${with_opengl+set}" = set; then :
  withval=$with_opengl;
fi


# Check whether --with-osmesa was given.
if test "${with_osmesa+set}" = set; then :
  withval=$with_osmesa;
fi


# Check whether --with-oss was given.
if test "${with_oss+set}" = set; then :
  withval=$with_oss;
fi


# Check whether --with-pcap was given.
if test "${with_pcap+set}" = set; then :
  withval=$with_pcap; if test "x$withval" = "xno"; then ac_cv_header_pcap_pcap_h=no; fi
fi


# Check whether --with-png was given.
if test "${with_png+set}" = set; then :
  withval=$with_png;
fi


# Check whether --with-pthread was given.
if test "${with_pthread+set}" = set; then :
  withval=$with_pthread; if test "x$withval" = "xno"; then ac_cv_header_pthread_h=no; fi
fi


# Check whether --with-sane was given.
if test "${with_sane+set}" = set; then :
  withval=$with_sane;
fi


# Check whether --with-tiff was given.
if test "${with_tiff+set}" = set; then :
  withval=$with_tiff;
fi


# Check whether --with-v4l was given.
if test "${with_v4l+set}" = set; then :
  withval=$with_v4l;
fi


# Check whether --with-xcomposite was given.
if test "${with_xcomposite+set}" = set; then :
  withval=$with_xcomposite; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xcomposite_h=no; fi
fi


# Check whether --with-xcursor was given.
if test "${with_xcursor+set}" = set; then :
  withval=$with_xcursor; if test "x$withval" = "xno"; then ac_cv_header_X11_Xcursor_Xcursor_h=no; fi
fi


# Check whether --with-xinerama was given.
if test "${with_xinerama+set}" = set; then :
  withval=$with_xinerama; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xinerama_h=no; fi
fi


# Check whether --with-xinput was given.
if test "${with_xinput+set}" = set; then :
  withval=$with_xinput; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_XInput_h=no; fi
fi


# Check whether --with-xinput2 was given.
if test "${with_xinput2+set}" = set; then :
  withval=$with_xinput2; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_XInput2_h=no; fi
fi


# Check whether --with-xml was given.
if test "${with_xml+set}" = set; then :
  withval=$with_xml;
fi


# Check whether --with-xrandr was given.
if test "${with_xrandr+set}" = set; then :
  withval=$with_xrandr; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xrandr_h=no; fi
fi


# Check whether --with-xrender was given.
if test "${with_xrender+set}" = set; then :
  withval=$with_xrender; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_Xrender_h=no; fi
fi


# Check whether --with-xshape was given.
if test "${with_xshape+set}" = set; then :
  withval=$with_xshape; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_shape_h=no; fi
fi


# Check whether --with-xshm was given.
if test "${with_xshm+set}" = set; then :
  withval=$with_xshm; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_XShm_h=no; fi
fi


# Check whether --with-xslt was given.
if test "${with_xslt+set}" = set; then :
  withval=$with_xslt;
fi


# Check whether --with-xxf86vm was given.
if test "${with_xxf86vm+set}" = set; then :
  withval=$with_xxf86vm; if test "x$withval" = "xno"; then ac_cv_header_X11_extensions_xf86vmode_h=no; ac_cv_header_X11_extensions_xf86vmproto_h=no; fi
fi


# Check whether --with-zlib was given.
if test "${with_zlib+set}" = set; then :
  withval=$with_zlib; if test "x$withval" = "xno"; then ac_cv_header_zlib_h=no; fi
fi



# Check whether --with-wine-tools was given.
if test "${with_wine_tools+set}" = set; then :
  withval=$with_wine_tools;
fi


# Check whether --with-wine64 was given.
if test "${with_wine64+set}" = set; then :
  withval=$with_wine64;
fi


# 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



case "$srcdir" in
 .) ;;
 *) if test -f "$srcdir/Makefile" -o -f "$srcdir/include/config.h"; then
      as_fn_error $? "you are building out of the source tree, but the source tree contains object files.
You need to run 'make distclean' in the source tree first." "$LINENO" 5
    fi ;;
esac


{ $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

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=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

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}cpp", so it can be a program name with args.
set dummy ${ac_tool_prefix}cpp; 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_CPPBIN+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CPPBIN"; then
  ac_cv_prog_CPPBIN="$CPPBIN" # 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_CPPBIN="${ac_tool_prefix}cpp"
    $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
CPPBIN=$ac_cv_prog_CPPBIN
if test -n "$CPPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPPBIN" >&5
$as_echo "$CPPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_CPPBIN"; then
  ac_ct_CPPBIN=$CPPBIN
  # Extract the first word of "cpp", so it can be a program name with args.
set dummy cpp; 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_CPPBIN+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_CPPBIN"; then
  ac_cv_prog_ac_ct_CPPBIN="$ac_ct_CPPBIN" # 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_CPPBIN="cpp"
    $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_CPPBIN=$ac_cv_prog_ac_ct_CPPBIN
if test -n "$ac_ct_CPPBIN"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CPPBIN" >&5
$as_echo "$ac_ct_CPPBIN" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_CPPBIN" = x; then
    CPPBIN="cpp"
  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
    CPPBIN=$ac_ct_CPPBIN
  fi
else
  CPPBIN="$ac_cv_prog_CPPBIN"
fi


cat >>confdefs.h <<_ACEOF
#define EXEEXT "$ac_exeext"
_ACEOF

if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; 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_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$LD"; then
  ac_cv_prog_LD="$LD" # 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_LD="${ac_tool_prefix}ld"
    $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
LD=$ac_cv_prog_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


fi
if test -z "$ac_cv_prog_LD"; then
  ac_ct_LD=$LD
  # Extract the first word of "ld", so it can be a program name with args.
set dummy ld; 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_LD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_LD"; then
  ac_cv_prog_ac_ct_LD="$ac_ct_LD" # 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_LD="ld"
    $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_LD=$ac_cv_prog_ac_ct_LD
if test -n "$ac_ct_LD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LD" >&5
$as_echo "$ac_ct_LD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_LD" = x; then
    LD=""
  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
    LD=$ac_ct_LD
  fi
else
  LD="$ac_cv_prog_LD"
fi


case $host in
  *-darwin*)
    if test "x$enable_win64" = "xyes"
    then
      CC="$CC -m64"
      CXX="$CXX -m64"
      host_cpu="x86_64"
      notice_platform="64-bit "
      TARGETFLAGS="-m64"

    else
      CC="$CC -m32"
      CXX="$CXX -m32"
      host_cpu="i386"
      notice_platform="32-bit "
      TARGETFLAGS="-m32"

      enable_win16=${enable_win16:-yes}
    fi
    with_fontconfig=${with_fontconfig:-no}
    ;;
  x86_64*|amd64*)
    if test "x$enable_win64" != "xyes" -a "$cross_compiling" != "yes"
    then
      CC="$CC -m32"
      CXX="$CXX -m32"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC works" >&5
$as_echo_n "checking whether $CC works... " >&6; }

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

int
main ()
{

  ;
  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; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                      as_fn_error $? "Cannot build a 32-bit program, you need to install 32-bit development libraries." "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
      host_cpu="i386"
      notice_platform="32-bit "
      TARGETFLAGS="-m32"

      enable_win16=${enable_win16:-yes}
    else
      if test "x${GCC}" = "xyes"
      then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports __builtin_ms_va_list" >&5
$as_echo_n "checking whether $CC supports __builtin_ms_va_list... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <stdarg.h>
int
main ()
{
void func(__builtin_ms_va_list *args);
  ;
  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
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                           as_fn_error $? "You need gcc >= 4.4 to build Wine as 64-bit." "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
      fi
      host_cpu="x86_64"
      TARGETFLAGS="-m64"

    fi
    ;;
  arm*)
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC supports Thumb" >&5
$as_echo_n "checking whether $CC supports Thumb... " >&6; }
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int ac_test(int i) { return i; }
int
main ()
{
asm(".thumb\nblx ac_test\n.arm"); if (ac_test(1)) return 1
  ;
  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; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                       as_fn_error $? "You need a target with Thumb support to build Wine for ARM." "$LINENO" 5
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    CFLAGS="$CFLAGS -marm"
    TARGETFLAGS="-marm"

    ;;
  *-mingw32*|*-cygwin*)
    enable_win16=${enable_win16:-no}
    CFLAGS="$CFLAGS -D_WIN32"
    ;;
  i[3456789]86*)
    enable_win16=${enable_win16:-yes}
    ;;
esac

enable_win16=${enable_win16:-no}
enable_win64=${enable_win64:-no}

enable_winetest=${enable_winetest:-$enable_tests}

if test -n "$with_wine64"
then
    if test "x$enable_win64" = "xyes"
    then
        as_fn_error $? "--enable-win64 and --with-wine64 are mutually exclusive.
--enable-win64 should be used in the 64-bit build tree, --with-wine64 in the 32-bit Wow64 build tree." "$LINENO" 5
    fi
    enable_fonts=${enable_fonts:-no}
    enable_server=${enable_server:-no}
elif test "x$enable_win64" = "xyes"
then
    test "x$libdir" != "x\${exec_prefix}/lib" || libdir="\${exec_prefix}/lib64"
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the directory containing the Wine tools" >&5
$as_echo_n "checking for the directory containing the Wine tools... " >&6; }
if ${wine_cv_toolsdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  wine_cv_toolsdir="$with_wine_tools"
   if test -z "$with_wine_tools"; then
     if test "$cross_compiling" = "yes"; then
       as_fn_error $? "you must use the --with-wine-tools option when cross-compiling." "$LINENO" 5
     elif test -n "$with_wine64"; then
       wine_cv_toolsdir="$with_wine64"
     fi
   fi
   if test -z "$wine_cv_toolsdir"; then
     wine_makedep=tools/makedep
     wine_cv_toolsdir="\$(top_builddir)"
   elif test -d "$wine_cv_toolsdir/tools/winebuild"; then
     wine_makedep=$wine_cv_toolsdir/tools/makedep
     case "$wine_cv_toolsdir" in
       /*) ;;
       *)  wine_cv_toolsdir="\$(top_builddir)/$wine_cv_toolsdir" ;;
     esac
     enable_tools=${enable_tools:-no}
     test -f "$wine_makedep" || as_fn_error $? "the Wine tools have not yet been built in $wine_cv_toolsdir" "$LINENO" 5
   else
     as_fn_error $? "could not find Wine tools in $wine_cv_toolsdir" "$LINENO" 5
   fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $wine_cv_toolsdir" >&5
$as_echo "$wine_cv_toolsdir" >&6; }
TOOLSDIR=$wine_cv_toolsdir

if test -n "$host_alias" -a "$host_alias" != "$build_alias"
then
    TARGETFLAGS="-b $host_alias $TARGETFLAGS"

fi

for ac_prog in flex
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_FLEX+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$FLEX"; then
  ac_cv_prog_FLEX="$FLEX" # 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_FLEX="$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
FLEX=$ac_cv_prog_FLEX
if test -n "$FLEX"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FLEX" >&5
$as_echo "$FLEX" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$FLEX" && break
done
test -n "$FLEX" || FLEX="none"

if test "$FLEX" = "none"
then
  as_fn_error $? "no suitable flex found. Please install the 'flex' package." "$LINENO" 5
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether flex is recent enough" >&5
$as_echo_n "checking whether flex is recent enough... " >&6; }
cat >conftest.l <<EOF
%top{
#include "prediluvian.h"
}
%%
EOF
if $FLEX -t conftest.l >/dev/null 2>&5
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; }
  as_fn_error $? "Your flex version is too old. Please install flex version 2.5.33 or newer." "$LINENO" 5
fi

for ac_prog in bison
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_BISON+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$BISON"; then
  ac_cv_prog_BISON="$BISON" # 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_BISON="$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
BISON=$ac_cv_prog_BISON
if test -n "$BISON"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BISON" >&5
$as_echo "$BISON" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$BISON" && break
done
test -n "$BISON" || BISON="none"

if test "$BISON" = "none"
then
  as_fn_error $? "no suitable bison found. Please install the 'bison' package." "$LINENO" 5
fi

if test -n "$ac_tool_prefix"; then
  for ac_prog in ar gar
  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 gar
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="ar"
  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

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="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

ARFLAGS=rc

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

{ $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

{ $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"


# Extract the first word of "ldconfig", so it can be a program name with args.
set dummy ldconfig; 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_LDCONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $LDCONFIG in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LDCONFIG="$LDCONFIG" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in /sbin /usr/sbin $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_LDCONFIG="$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_LDCONFIG" && ac_cv_path_LDCONFIG="true"
  ;;
esac
fi
LDCONFIG=$ac_cv_path_LDCONFIG
if test -n "$LDCONFIG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDCONFIG" >&5
$as_echo "$LDCONFIG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


for ac_prog in msgfmt
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_MSGFMT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$MSGFMT"; then
  ac_cv_prog_MSGFMT="$MSGFMT" # 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_MSGFMT="$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
MSGFMT=$ac_cv_prog_MSGFMT
if test -n "$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


  test -n "$MSGFMT" && break
done
test -n "$MSGFMT" || MSGFMT="false"

if ${ac_tool_prefix+:} false; 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_prog_PKG_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$PKG_CONFIG"; then
  ac_cv_prog_PKG_CONFIG="$PKG_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_PKG_CONFIG="${ac_tool_prefix}pkg-config"
    $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
PKG_CONFIG=$ac_cv_prog_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 ${ac_cv_prog_PKG_CONFIG:+false} :; then :
  if test "x$cross_compiling" = xyes; then :

else
  { ac_cv_prog_PKG_CONFIG=; unset ac_cv_prog_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_prog_PKG_CONFIG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$PKG_CONFIG"; then
  ac_cv_prog_PKG_CONFIG="$PKG_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_PKG_CONFIG="pkg-config"
    $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
PKG_CONFIG=$ac_cv_prog_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
else
  PKG_CONFIG=$ac_cv_prog_PKG_CONFIG
fi

if test "x$enable_maintainer_mode" != "xyes"
then
  FONTFORGE=""
  RSVG=""
  CONVERT=""
  ICOTOOL=""
else
  test "$srcdir" = . || as_fn_error $? "Maintainer mode cannot work out of tree." "$LINENO" 5
  for ac_prog in fontforge
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_FONTFORGE+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$FONTFORGE"; then
  ac_cv_prog_FONTFORGE="$FONTFORGE" # 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_FONTFORGE="$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
FONTFORGE=$ac_cv_prog_FONTFORGE
if test -n "$FONTFORGE"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FONTFORGE" >&5
$as_echo "$FONTFORGE" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$FONTFORGE" && break
done
test -n "$FONTFORGE" || FONTFORGE="false"

  for ac_prog in rsvg-convert rsvg
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_RSVG+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$RSVG"; then
  ac_cv_prog_RSVG="$RSVG" # 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_RSVG="$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
RSVG=$ac_cv_prog_RSVG
if test -n "$RSVG"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RSVG" >&5
$as_echo "$RSVG" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$RSVG" && break
done
test -n "$RSVG" || RSVG="false"

  for ac_prog in convert
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_CONVERT+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CONVERT"; then
  ac_cv_prog_CONVERT="$CONVERT" # 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_CONVERT="$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
CONVERT=$ac_cv_prog_CONVERT
if test -n "$CONVERT"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONVERT" >&5
$as_echo "$CONVERT" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$CONVERT" && break
done
test -n "$CONVERT" || CONVERT="false"

  for ac_prog in icotool
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_ICOTOOL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ICOTOOL"; then
  ac_cv_prog_ICOTOOL="$ICOTOOL" # 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_ICOTOOL="$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
ICOTOOL=$ac_cv_prog_ICOTOOL
if test -n "$ICOTOOL"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ICOTOOL" >&5
$as_echo "$ICOTOOL" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$ICOTOOL" && break
done
test -n "$ICOTOOL" || ICOTOOL="false"

  test "$FONTFORGE" != "false" || as_fn_error $? "You need fontforge to rebuild fonts in maintainer mode." "$LINENO" 5
  test "$RSVG" != "false" || as_fn_error $? "You need rsvg to rebuild icons in maintainer mode." "$LINENO" 5

    if test "$CONVERT" = false
  then
    as_fn_error $? "You need imagemagick to rebuild icons in maintainer mode." "$LINENO" 5
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for recent enough imagemagick" >&5
$as_echo_n "checking for recent enough imagemagick... " >&6; }
    convert_version=`convert --version | head -n1`
    if test "x$convert_version" != "x"
    then
      convert_version_major=`expr "$convert_version" : '.* \([0-9]*\)\.[0-9]*'`
      convert_version_minor=`expr "$convert_version" : '.* [0-9]*\.\([0-9]*\)'`
      if test "$convert_version_major" -eq 6 -a "$convert_version_minor" -lt 6
      then
        CONVERT=false
      fi
    fi
    if test "$CONVERT" = false
    then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no ($convert_version_major.$convert_version_minor)" >&5
$as_echo "no ($convert_version_major.$convert_version_minor)" >&6; }
      as_fn_error $? "You need imagemagick version 6.6 or newer to rebuild icons in maintainer mode." "$LINENO" 5
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($convert_version_major.$convert_version_minor)" >&5
$as_echo "yes ($convert_version_major.$convert_version_minor)" >&6; }
    fi
  fi

    if test "$ICOTOOL" = false
  then
    as_fn_error $? "You need icotool to rebuild icons in maintainer mode." "$LINENO" 5
  else
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for recent enough icotool" >&5
$as_echo_n "checking for recent enough icotool... " >&6; }
    icotool_version=`icotool --version | head -n1`
    if test "x$icotool_version" != "x"
    then
      icotool_version_major=`expr "$icotool_version" : '.* \([0-9]*\)\.[0-9]*'`
      icotool_version_minor=`expr "$icotool_version" : '.* [0-9]*\.\([0-9]*\)'`
      if test "$icotool_version_major" -eq 0 -a "$icotool_version_minor" -lt 29
      then
        ICOTOOL=false
        as_fn_append wine_warnings "|icotool version 0.29.0 or newer is needed to rebuild icons."
      fi
    fi
    if test "$ICOTOOL" = false
    then
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no ($icotool_version_major.$icotool_version_minor)" >&5
$as_echo "no ($icotool_version_major.$icotool_version_minor)" >&6; }
      as_fn_error $? "You need icotool version 0.29.0 or newer to rebuild icons in maintainer mode." "$LINENO" 5
    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($icotool_version_major.$icotool_version_minor)" >&5
$as_echo "yes ($icotool_version_major.$icotool_version_minor)" >&6; }
    fi
  fi

    with_gettext=yes
  with_gettextpo=yes
  { ac_cv_header_gettext_po_h=; unset ac_cv_header_gettext_po_h;}
fi

test "x$with_gettext" != xno || MSGFMT=false
if test "$MSGFMT" != "false"
then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether msgfmt supports contexts" >&5
$as_echo_n "checking whether msgfmt supports contexts... " >&6; }
  cat >conftest.po <<EOF
# comment
msgctxt "ctxt"
msgid "id"
msgstr "str"
EOF
  if $MSGFMT -o /dev/null conftest.po 2>&5
  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; }
    MSGFMT=false
  fi
fi
if test "$MSGFMT" = false; then :
  case "x$with_gettext" in
  x)   as_fn_append wine_warnings "|gettext tools not found (or too old), translations won't be built." ;;
  xno) ;;
  *)   as_fn_error $? "gettext tools not found (or too old), translations won't be built.
This is an error since --with-gettext was requested." "$LINENO" 5 ;;
esac
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for i386_set_ldt in -li386" >&5
$as_echo_n "checking for i386_set_ldt in -li386... " >&6; }
if ${ac_cv_lib_i386_i386_set_ldt+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-li386  $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 i386_set_ldt ();
int
main ()
{
return i386_set_ldt ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_i386_i386_set_ldt=yes
else
  ac_cv_lib_i386_i386_set_ldt=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_i386_i386_set_ldt" >&5
$as_echo "$ac_cv_lib_i386_i386_set_ldt" >&6; }
if test "x$ac_cv_lib_i386_i386_set_ldt" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBI386 1
_ACEOF

  LIBS="-li386 $LIBS"

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for _oss_ioctl in -lossaudio" >&5
$as_echo_n "checking for _oss_ioctl in -lossaudio... " >&6; }
if ${ac_cv_lib_ossaudio__oss_ioctl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lossaudio  $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 _oss_ioctl ();
int
main ()
{
return _oss_ioctl ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ossaudio__oss_ioctl=yes
else
  ac_cv_lib_ossaudio__oss_ioctl=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_ossaudio__oss_ioctl" >&5
$as_echo "$ac_cv_lib_ossaudio__oss_ioctl" >&6; }
if test "x$ac_cv_lib_ossaudio__oss_ioctl" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBOSSAUDIO 1
_ACEOF

  LIBS="-lossaudio $LIBS"

fi


OPENGL_LIBS=""



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

if test "$enable_largefile" != no; then

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for special C compiler options needed for large files" >&5
$as_echo_n "checking for special C compiler options needed for large files... " >&6; }
if ${ac_cv_sys_largefile_CC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_sys_largefile_CC=no
     if test "$GCC" != yes; then
       ac_save_CC=$CC
       while :; do
	 # IRIX 6.2 and later do not support large files by default,
	 # so use the C compiler's -n32 option if that helps.
	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
	 if ac_fn_c_try_compile "$LINENO"; then :
  break
fi
rm -f core conftest.err conftest.$ac_objext
	 CC="$CC -n32"
	 if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_largefile_CC=' -n32'; break
fi
rm -f core conftest.err conftest.$ac_objext
	 break
       done
       CC=$ac_save_CC
       rm -f conftest.$ac_ext
    fi
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_largefile_CC" >&5
$as_echo "$ac_cv_sys_largefile_CC" >&6; }
  if test "$ac_cv_sys_largefile_CC" != no; then
    CC=$CC$ac_cv_sys_largefile_CC
  fi

  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _FILE_OFFSET_BITS value needed for large files" >&5
$as_echo_n "checking for _FILE_OFFSET_BITS value needed for large files... " >&6; }
if ${ac_cv_sys_file_offset_bits+:} false; then :
  $as_echo_n "(cached) " >&6
else
  while :; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_file_offset_bits=no; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _FILE_OFFSET_BITS 64
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_file_offset_bits=64; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  ac_cv_sys_file_offset_bits=unknown
  break
done
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_file_offset_bits" >&5
$as_echo "$ac_cv_sys_file_offset_bits" >&6; }
case $ac_cv_sys_file_offset_bits in #(
  no | unknown) ;;
  *)
cat >>confdefs.h <<_ACEOF
#define _FILE_OFFSET_BITS $ac_cv_sys_file_offset_bits
_ACEOF
;;
esac
rm -rf conftest*
  if test $ac_cv_sys_file_offset_bits = unknown; then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for _LARGE_FILES value needed for large files" >&5
$as_echo_n "checking for _LARGE_FILES value needed for large files... " >&6; }
if ${ac_cv_sys_large_files+:} false; then :
  $as_echo_n "(cached) " >&6
else
  while :; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_large_files=no; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _LARGE_FILES 1
#include <sys/types.h>
 /* Check that off_t can represent 2**63 - 1 correctly.
    We can't simply define LARGE_OFF_T to be 9223372036854775807,
    since some C++ compilers masquerading as C compilers
    incorrectly reject 9223372036854775807.  */
#define LARGE_OFF_T ((((off_t) 1 << 31) << 31) - 1 + (((off_t) 1 << 31) << 31))
  int off_t_is_large[(LARGE_OFF_T % 2147483629 == 721
		       && LARGE_OFF_T % 2147483647 == 1)
		      ? 1 : -1];
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_sys_large_files=1; break
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  ac_cv_sys_large_files=unknown
  break
done
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sys_large_files" >&5
$as_echo "$ac_cv_sys_large_files" >&6; }
case $ac_cv_sys_large_files in #(
  no | unknown) ;;
  *)
cat >>confdefs.h <<_ACEOF
#define _LARGE_FILES $ac_cv_sys_large_files
_ACEOF
;;
esac
rm -rf conftest*
  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
{ $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 \
	AL/al.h \
	ApplicationServices/ApplicationServices.h \
	AudioToolbox/AudioConverter.h \
	AudioUnit/AudioUnit.h \
	AudioUnit/AudioComponent.h \
	CL/cl.h \
	Carbon/Carbon.h \
	CoreAudio/CoreAudio.h \
	CoreServices/CoreServices.h \
	DiskArbitration/DiskArbitration.h \
	IOKit/IOKitLib.h \
	IOKit/hid/IOHIDLib.h \
	OpenAL/al.h \
	OpenCL/opencl.h \
	QuickTime/ImageCompression.h \
	Security/Security.h \
	alias.h \
	alsa/asoundlib.h \
	arpa/inet.h \
	arpa/nameser.h \
	asm/types.h \
	asm/user.h \
	curses.h \
	direct.h \
	dirent.h \
	dlfcn.h \
	elf.h \
	float.h \
	fnmatch.h \
	getopt.h \
	gettext-po.h \
	grp.h \
	gsm.h \
	gsm/gsm.h \
	ieeefp.h \
	inet/mib2.h \
	io.h \
	kstat.h \
	lber.h \
	ldap.h \
	libproc.h \
	link.h \
	linux/cdrom.h \
	linux/compiler.h \
	linux/filter.h \
	linux/hdreg.h \
	linux/input.h \
	linux/ioctl.h \
	linux/joystick.h \
	linux/major.h \
	linux/param.h \
	linux/serial.h \
	linux/types.h \
	linux/ucdrom.h \
	lwp.h \
	mach-o/nlist.h \
	mach-o/loader.h \
	mach/mach.h \
	mach/machine.h \
	machine/cpu.h \
	machine/limits.h \
	machine/sysarch.h \
	mntent.h \
	ncurses.h \
	netdb.h \
	netinet/in.h \
	netinet/in_systm.h \
	netinet/tcp.h \
	netinet/tcp_fsm.h \
	pcap/pcap.h \
	poll.h \
	port.h \
	process.h \
	pthread.h \
	pwd.h \
	sched.h \
	scsi/scsi.h \
	scsi/scsi_ioctl.h \
	scsi/sg.h \
	stdbool.h \
	stdint.h \
	stropts.h \
	sys/asoundlib.h \
	sys/attr.h \
	sys/cdio.h \
	sys/elf32.h \
	sys/epoll.h \
	sys/event.h \
	sys/exec_elf.h \
	sys/filio.h \
	sys/inotify.h \
	sys/ioctl.h \
	sys/ipc.h \
	sys/limits.h \
	sys/link.h \
	sys/mman.h \
	sys/modem.h \
	sys/msg.h \
	sys/mtio.h \
	sys/param.h \
	sys/poll.h \
	sys/prctl.h \
	sys/protosw.h \
	sys/ptrace.h \
	sys/queue.h \
	sys/resource.h \
	sys/scsiio.h \
	sys/shm.h \
	sys/signal.h \
	sys/socket.h \
	sys/socketvar.h \
	sys/sockio.h \
	sys/statvfs.h \
	sys/strtio.h \
	sys/syscall.h \
	sys/tihdr.h \
	sys/time.h \
	sys/timeout.h \
	sys/times.h \
	sys/uio.h \
	sys/user.h \
	sys/utsname.h \
	sys/vm86.h \
	sys/wait.h \
	syscall.h \
	termios.h \
	unistd.h \
	utime.h \
	valgrind/memcheck.h \
	valgrind/valgrind.h \
	zlib.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

fi

done

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stat file-mode macros are broken" >&5
$as_echo_n "checking whether stat file-mode macros are broken... " >&6; }
if ${ac_cv_header_stat_broken+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/types.h>
#include <sys/stat.h>

#if defined S_ISBLK && defined S_IFDIR
extern char c1[S_ISBLK (S_IFDIR) ? -1 : 1];
#endif

#if defined S_ISBLK && defined S_IFCHR
extern char c2[S_ISBLK (S_IFCHR) ? -1 : 1];
#endif

#if defined S_ISLNK && defined S_IFREG
extern char c3[S_ISLNK (S_IFREG) ? -1 : 1];
#endif

#if defined S_ISSOCK && defined S_IFREG
extern char c4[S_ISSOCK (S_IFREG) ? -1 : 1];
#endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_header_stat_broken=no
else
  ac_cv_header_stat_broken=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stat_broken" >&5
$as_echo "$ac_cv_header_stat_broken" >&6; }
if test $ac_cv_header_stat_broken = yes; then

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

fi



for ac_header in sys/mount.h sys/statfs.h sys/sysctl.h sys/user.h sys/vfs.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" "#include <sys/types.h>
     #ifdef HAVE_SYS_PARAM_H
     # include <sys/param.h>
     #endif
"
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 \
	netinet/ip.h \
	net/if.h \
	net/if_arp.h \
	net/if_dl.h \
	net/if_types.h \
	net/route.h \
	netinet/if_ether.h \
	netinet/if_inarp.h \
	netinet/in_pcb.h \
	netinet/ip_icmp.h \
	netinet/ip_var.h \
	netinet/udp.h \
	netipx/ipx.h \
	sys/un.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" "#include <sys/types.h>
     #ifdef HAVE_SYS_SOCKET_H
     # include <sys/socket.h>
     #endif
     #ifdef HAVE_SYS_SOCKETVAR_H
     # include <sys/socketvar.h>
     #endif
     #ifdef HAVE_NET_ROUTE_H
     # include <net/route.h>
     #endif
     #ifdef HAVE_NETINET_IN_H
     # include <netinet/in.h>
     #endif
     #ifdef HAVE_NETINET_IN_SYSTM_H
     # include <netinet/in_systm.h>
     #endif
     #ifdef HAVE_NET_IF_H
     # include <net/if.h>
     #endif
     #ifdef HAVE_NETINET_IP_H
     # include <netinet/ip.h>
     #endif
"
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 netinet/tcp_timer.h netinet/udp_var.h netinet/icmp_var.h netinet/tcp_var.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" "#include <sys/types.h>
     #ifdef HAVE_ALIAS_H
     # include <alias.h>
     #endif
     #ifdef HAVE_SYS_SOCKET_H
     # include <sys/socket.h>
     #endif
     #ifdef HAVE_SYS_SOCKETVAR_H
     # include <sys/socketvar.h>
     #endif
     #ifdef HAVE_SYS_TIMEOUT_H
     # include <sys/timeout.h>
     #endif
     #ifdef HAVE_NETINET_IN_H
     # include <netinet/in.h>
     #endif
     #ifdef HAVE_NETINET_IN_SYSTM_H
     # include <netinet/in_systm.h>
     #endif
     #ifdef HAVE_NETINET_IP_H
     # include <netinet/ip.h>
     #endif
     #ifdef HAVE_NETINET_IP_VAR_H
     # include <netinet/ip_var.h>
     #endif
     #ifdef HAVE_NETINET_IP_ICMP_H
     # include <netinet/ip_icmp.h>
     #endif
     #ifdef HAVE_NETINET_UDP_H
     # include <netinet/udp.h>
     #endif
     #ifdef HAVE_NETINET_TCP_H
     # include <netinet/tcp.h>
     #endif
     #ifdef HAVE_NETINET_TCP_TIMER_H
     #include <netinet/tcp_timer.h>
     #endif
"
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 linux/ipx.h linux/irda.h linux/rtnetlink.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" "#include <sys/types.h>
     #ifdef HAVE_ASM_TYPES_H
     # include <asm/types.h>
     #endif
     #ifdef HAVE_SYS_SOCKET_H
     # include <sys/socket.h>
     #endif
     #ifdef HAVE_LINUX_TYPES_H
     # include <linux/types.h>
     #endif
"
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 mach-o/dyld_images.h
do :
  ac_fn_c_check_header_compile "$LINENO" "mach-o/dyld_images.h" "ac_cv_header_mach_o_dyld_images_h" "#ifdef HAVE_STDBOOL_H
     # include <stdbool.h>
     #endif
     #ifdef HAVE_STDINT_H
     # include <stdint.h>
     #endif
"
if test "x$ac_cv_header_mach_o_dyld_images_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MACH_O_DYLD_IMAGES_H 1
_ACEOF

fi

done


for ac_header in resolv.h
do :
  ac_fn_c_check_header_compile "$LINENO" "resolv.h" "ac_cv_header_resolv_h" "#include <sys/types.h>
     #ifdef HAVE_SYS_SOCKET_H
     # include <sys/socket.h>
     #endif
     #ifdef HAVE_NETINET_IN_H
     # include <netinet/in.h>
     #endif
     #ifdef HAVE_ARPA_NAMESER_H
     # include <arpa/nameser.h>
     #endif
"
if test "x$ac_cv_header_resolv_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_RESOLV_H 1
_ACEOF

fi

done


for ac_header in ifaddrs.h
do :
  ac_fn_c_check_header_compile "$LINENO" "ifaddrs.h" "ac_cv_header_ifaddrs_h" "#include <sys/types.h>
"
if test "x$ac_cv_header_ifaddrs_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_IFADDRS_H 1
_ACEOF

fi

done


for ac_header in sys/ucontext.h
do :
  ac_fn_c_check_header_compile "$LINENO" "sys/ucontext.h" "ac_cv_header_sys_ucontext_h" "#include <signal.h>
"
if test "x$ac_cv_header_sys_ucontext_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_UCONTEXT_H 1
_ACEOF

fi

done


for ac_header in sys/thr.h
do :
  ac_fn_c_check_header_compile "$LINENO" "sys/thr.h" "ac_cv_header_sys_thr_h" "#include <sys/types.h>
#ifdef HAVE_SYS_UCONTEXT_H
#include <sys/ucontext.h>
#endif
"
if test "x$ac_cv_header_sys_thr_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SYS_THR_H 1
_ACEOF

fi

done


for ac_header in pthread_np.h
do :
  ac_fn_c_check_header_compile "$LINENO" "pthread_np.h" "ac_cv_header_pthread_np_h" "#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif
"
if test "x$ac_cv_header_pthread_np_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_PTHREAD_NP_H 1
_ACEOF

fi

done


for ac_header in linux/videodev.h linux/videodev2.h libv4l1.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" "#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#include <sys/types.h>
#ifdef HAVE_ASM_TYPES_H
#include <asm/types.h>
#endif
"
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 libprocstat.h
do :
  ac_fn_c_check_header_compile "$LINENO" "libprocstat.h" "ac_cv_header_libprocstat_h" "#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif
#ifdef HAVE_SYS_QUEUE_H
#include <sys/queue.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
"
if test "x$ac_cv_header_libprocstat_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LIBPROCSTAT_H 1
_ACEOF

fi

done



dlldir="\${libdir}/wine"

DLLPREFIX=""

DLLFLAGS="-D_REENTRANT"

LDRPATH_INSTALL=""

LDRPATH_LOCAL=""

LIBEXT="so"
DLLEXT=".so"
IMPLIBEXT="def"
STATIC_IMPLIBEXT="def.a"
# Extract the first word of "ldd", so it can be a program name with args.
set dummy ldd; 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_LDD+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $LDD in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_LDD="$LDD" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
as_dummy="/sbin:/usr/sbin:$PATH"
for as_dir in $as_dummy
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_LDD="$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_LDD" && ac_cv_path_LDD="true"
  ;;
esac
fi
LDD=$ac_cv_path_LDD
if test -n "$LDD"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5
$as_echo "$LDD" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


if test -n "$ac_tool_prefix"; then
  # Extract the first word of "${ac_tool_prefix}readelf", so it can be a program name with args.
set dummy ${ac_tool_prefix}readelf; 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_READELF+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$READELF"; then
  ac_cv_prog_READELF="$READELF" # 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_READELF="${ac_tool_prefix}readelf"
    $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
READELF=$ac_cv_prog_READELF
if test -n "$READELF"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5
$as_echo "$READELF" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


fi
if test -z "$ac_cv_prog_READELF"; then
  ac_ct_READELF=$READELF
  # Extract the first word of "readelf", so it can be a program name with args.
set dummy readelf; 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_READELF+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$ac_ct_READELF"; then
  ac_cv_prog_ac_ct_READELF="$ac_ct_READELF" # 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_READELF="readelf"
    $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_READELF=$ac_cv_prog_ac_ct_READELF
if test -n "$ac_ct_READELF"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_READELF" >&5
$as_echo "$ac_ct_READELF" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi

  if test "x$ac_ct_READELF" = x; then
    READELF="true"
  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
    READELF=$ac_ct_READELF
  fi
else
  READELF="$ac_cv_prog_READELF"
fi

wine_rules_file=conf$$rules.make
rm -f $wine_rules_file
ALL_POT_FILES=""
GITIGNORE="# Automatically generated by configure; DO NOT EDIT!!"
ALL_TEST_RESOURCES=""


wine_fn_append_file ()
{
    as_fn_append $1 " \\$as_nl	$2"
}

wine_fn_ignore_file ()
{
    case "$1" in
      */*) as_fn_append GITIGNORE "$as_nl$1" ;;
      \**) as_fn_append GITIGNORE "$as_nl$1" ;;
      *)   as_fn_append GITIGNORE "$as_nl/$1" ;;
    esac
}

wine_fn_append_rule ()
{
    $as_echo "$1" >>$wine_rules_file
}

wine_fn_has_flag ()
{
    expr ",$ac_flags," : ".*,$1,.*" >/dev/null
}

wine_fn_depend_rules ()
{
    wine_fn_append_rule \
"$ac_dir/Makefile: $srcdir/$ac_dir/Makefile.in $srcdir/Make.vars.in config.status \$(MAKEDEP)
	@./config.status --file $ac_dir/Makefile:Make.vars.in:$ac_dir/Makefile.in && \$(MAKEDEP) $ac_dir
depend: $ac_dir/depend
.PHONY: $ac_dir/depend
$ac_dir/depend: \$(MAKEDEP) dummy
	@./config.status --file $ac_dir/Makefile:Make.vars.in:$ac_dir/Makefile.in && \$(MAKEDEP) $ac_dir"
}

wine_fn_pot_rules ()
{
    test "x$with_gettextpo" = xyes || return

    if wine_fn_has_flag mc
    then
        wine_fn_append_file ALL_POT_FILES $ac_dir/msg.pot
        wine_fn_append_rule \
"$ac_dir/msg.pot: $ac_dir/Makefile dummy
	@cd $ac_dir && \$(MAKE) msg.pot
$ac_dir/msg.pot: tools/wmc include"
    fi
    if wine_fn_has_flag po
    then
        wine_fn_append_file ALL_POT_FILES $ac_dir/rsrc.pot
        wine_fn_append_rule \
"$ac_dir/rsrc.pot: $ac_dir/Makefile dummy
	@cd $ac_dir && \$(MAKE) rsrc.pot
$ac_dir/rsrc.pot: tools/wrc include"
    fi
}

wine_fn_all_rules ()
{
    wine_fn_depend_rules
    wine_fn_append_rule \
"all: $ac_dir
.PHONY: $ac_dir
$ac_dir: $ac_dir/Makefile dummy
	@cd $ac_dir && \$(MAKE)"
}

wine_fn_install_rules ()
{
    wine_fn_has_flag install-lib || wine_fn_has_flag install-dev || return

    wine_fn_append_rule \
".PHONY: $ac_dir/install $ac_dir/uninstall
$ac_dir/install:: $ac_dir
	@cd $ac_dir && \$(MAKE) install
$ac_dir/uninstall:: $ac_dir/Makefile
	@cd $ac_dir && \$(MAKE) uninstall
install:: $ac_dir/install
__uninstall__: $ac_dir/uninstall"

    if wine_fn_has_flag install-lib
    then
        wine_fn_append_rule \
".PHONY: $ac_dir/install-lib
$ac_dir/install-lib:: $ac_dir
	@cd $ac_dir && \$(MAKE) install-lib
install-lib:: $ac_dir/install-lib"
    fi

    if wine_fn_has_flag install-dev
    then
        wine_fn_append_rule \
".PHONY: $ac_dir/install-dev
$ac_dir/install-dev:: $ac_dir
	@cd $ac_dir && \$(MAKE) install-dev
install-dev:: $ac_dir/install-dev"
    fi
}

wine_fn_clean_rules ()
{
    ac_clean=$@
    ac_extraclean="$ac_dir/Makefile"
    test "$srcdir" = . && ac_extraclean="$ac_extraclean $ac_dir/.gitignore"
    case $ac_dir in
        */tests) ac_extraclean="$ac_extraclean $ac_dir/testlist.c" ;;
    esac

    if wine_fn_has_flag clean
    then
        wine_fn_append_rule \
"__clean__: $ac_dir/clean
.PHONY: $ac_dir/clean
$ac_dir/clean: $ac_dir/Makefile
	@cd $ac_dir && \$(MAKE) clean
	\$(RM) $ac_extraclean"
    else
        wine_fn_append_rule \
"__clean__: $ac_dir/clean
.PHONY: $ac_dir/clean
$ac_dir/clean: dummy
	\$(RM) \$(CLEAN_FILES:%=$ac_dir/%) $ac_clean $ac_extraclean"
    fi
}

wine_fn_disabled_rules ()
{
    ac_clean=$@
    ac_extraclean="$ac_dir/Makefile"
    test "$srcdir" = . && ac_extraclean="$ac_extraclean $ac_dir/.gitignore"

    wine_fn_append_rule \
"__clean__: $ac_dir/clean
.PHONY: $ac_dir/clean
$ac_dir/clean: dummy
	\$(RM) \$(CLEAN_FILES:%=$ac_dir/%) $ac_clean $ac_extraclean"
}

wine_fn_config_makefile ()
{
    ac_dir=$1
    ac_enable=$2
    ac_flags=$3

    if eval test \"x\$"$ac_enable"\" = x"no"; then :
  wine_fn_disabled_rules; return
fi
    wine_fn_all_rules
    wine_fn_install_rules
    wine_fn_clean_rules
}

wine_fn_config_lib ()
{
    ac_name=$1
    ac_flags=$2
    ac_dir=dlls/$ac_name
    ac_deps="include"

    if test "x$enable_tools" = xno; then :

else
  ac_deps="tools/widl tools/winebuild tools/winegcc $ac_deps"
fi
    wine_fn_all_rules
    wine_fn_clean_rules

    wine_fn_append_rule \
".PHONY: $ac_dir/install $ac_dir/uninstall
$ac_dir/install:: $ac_dir
	\$(INSTALL_DATA) $ac_dir/lib$ac_name.a \$(DESTDIR)\$(dlldir)/lib$ac_name.a
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/lib$ac_name.a
install install-dev:: $ac_dir/install
__uninstall__: $ac_dir/uninstall
__builddeps__: $ac_dir
$ac_dir: $ac_deps"
}

wine_fn_config_dll ()
{
    ac_name=$1
    ac_dir=dlls/$ac_name
    ac_enable=$2
    ac_flags=$3
    ac_implib=${4:-$ac_name}
    ac_file=$ac_dir/lib$ac_implib
    ac_dll=$ac_name
    ac_deps="include"
    ac_implibflags=""

    if test "x$enable_tools" = xno; then :

else
  ac_deps="tools/widl tools/winebuild tools/winegcc $ac_deps"
fi
    case $ac_name in
      *16) ac_implibflags=" -m16" ;;
      *.*) ;;
      *)   ac_dll=$ac_dll.dll ;;
    esac

    ac_clean=
    wine_fn_has_flag implib && ac_clean="$ac_clean $ac_file.$IMPLIBEXT"
    wine_fn_has_flag mc && ac_clean="$ac_clean $ac_dir/msg.pot"
    wine_fn_has_flag po && ac_clean="$ac_clean $ac_dir/rsrc.pot"
    test -n "$DLLEXT" || ac_clean="$ac_clean $ac_dir/$ac_dll"

    if eval test \"x\$"$ac_enable"\" = x"no"; then :
                if wine_fn_has_flag implib && test "$ac_enable" != enable_win16
               then
                   wine_fn_depend_rules
                   wine_fn_clean_rules $ac_clean
               else
                   wine_fn_disabled_rules $ac_clean
                   return
               fi
else
  wine_fn_all_rules
               wine_fn_clean_rules $ac_clean
               wine_fn_append_rule \
"$ac_dir: __builddeps__
manpages htmlpages sgmlpages xmlpages:: $ac_dir/Makefile
	@cd $ac_dir && \$(MAKE) \$@
.PHONY: $ac_dir/install-lib $ac_dir/uninstall
install install-lib:: $ac_dir/install-lib
__uninstall__: $ac_dir/uninstall"
                if test -n "$DLLEXT"
                then
                    wine_fn_append_rule \
"$ac_dir/install-lib:: $ac_dir
	\$(INSTALL_PROGRAM) $ac_dir/$ac_dll$DLLEXT \$(DESTDIR)\$(dlldir)/$DLLPREFIX$ac_dll$DLLEXT
	\$(INSTALL_DATA) $ac_dir/$ac_dll.fake \$(DESTDIR)\$(fakedlldir)/$ac_dll
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/$DLLPREFIX$ac_dll$DLLEXT \$(DESTDIR)\$(fakedlldir)/$ac_dll"
                else
                    wine_fn_append_rule \
"$ac_dir/install-lib:: $ac_dir
	\$(INSTALL_PROGRAM) $ac_dir/$ac_dll \$(DESTDIR)\$(dlldir)/$ac_dll
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/$ac_dll"
                fi

                wine_fn_pot_rules
fi

    if wine_fn_has_flag staticimplib
    then
        wine_fn_append_rule \
"__builddeps__: $ac_file.$IMPLIBEXT $ac_file.$STATIC_IMPLIBEXT
$ac_file.$IMPLIBEXT $ac_file.$STATIC_IMPLIBEXT $ac_file.cross.a: $ac_deps
$ac_file.def: $srcdir/$ac_dir/$ac_name.spec $ac_dir/Makefile \$(WINEBUILD)
	\$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --def -o \$@ --export $srcdir/$ac_dir/$ac_name.spec
$ac_file.$STATIC_IMPLIBEXT: $ac_dir/Makefile dummy
	@cd $ac_dir && \$(MAKE) lib$ac_implib.$STATIC_IMPLIBEXT
.PHONY: $ac_dir/install-dev $ac_dir/uninstall
$ac_dir/install-dev:: $ac_file.$IMPLIBEXT
	\$(INSTALL_DATA) $ac_file.$IMPLIBEXT \$(DESTDIR)\$(dlldir)/lib$ac_implib.$IMPLIBEXT
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/lib$ac_implib.$IMPLIBEXT
install install-dev:: $ac_dir/install-dev
__uninstall__: $ac_dir/uninstall"

        if test "$IMPLIBEXT" != "$STATIC_IMPLIBEXT"
        then
            wine_fn_append_rule \
"$ac_dir/install-dev:: $ac_file.$STATIC_IMPLIBEXT __builddeps__
	\$(INSTALL_DATA) $ac_file.$STATIC_IMPLIBEXT \$(DESTDIR)\$(dlldir)/lib$ac_implib.$STATIC_IMPLIBEXT
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/lib$ac_implib.$STATIC_IMPLIBEXT"
        fi

        if test -n "$CROSSTARGET" -a -z "$ac_implibflags"
        then
            wine_fn_append_rule \
"__builddeps__: $ac_file.cross.a
$ac_file.cross.a: $ac_dir/Makefile dummy
	@cd $ac_dir && \$(MAKE) lib$ac_implib.cross.a"
        fi

    elif wine_fn_has_flag implib
    then
        wine_fn_append_rule \
"__builddeps__: $ac_file.$IMPLIBEXT
$ac_file.def: $srcdir/$ac_dir/$ac_name.spec $ac_dir/Makefile \$(WINEBUILD)
	\$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --def -o \$@ --export $srcdir/$ac_dir/$ac_name.spec
$ac_file.a: $srcdir/$ac_dir/$ac_name.spec $ac_dir/Makefile \$(WINEBUILD)
	\$(WINEBUILD) \$(TARGETFLAGS)$ac_implibflags -w --implib -o \$@ --export $srcdir/$ac_dir/$ac_name.spec
.PHONY: $ac_dir/install-dev $ac_dir/uninstall
$ac_dir/install-dev:: $ac_file.$IMPLIBEXT
	\$(INSTALL_DATA) $ac_file.$IMPLIBEXT \$(DESTDIR)\$(dlldir)/lib$ac_implib.$IMPLIBEXT
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/lib$ac_implib.$IMPLIBEXT
install install-dev:: $ac_dir/install-dev
__uninstall__: $ac_dir/uninstall"
        if test -n "$CROSSTARGET" -a -z "$ac_implibflags"
        then
            wine_fn_append_rule \
"__builddeps__: $ac_file.cross.a
$ac_file.cross.a: $srcdir/$ac_dir/$ac_name.spec $ac_dir/Makefile \$(WINEBUILD)
	\$(WINEBUILD) \$(CROSSTARGET:%=-b %)$ac_implibflags -w --implib -o \$@ --export $srcdir/$ac_dir/$ac_name.spec"
        fi

        if test "$ac_name" != "$ac_implib"
        then
            wine_fn_append_rule \
"__builddeps__: dlls/lib$ac_implib.$IMPLIBEXT
dlls/lib$ac_implib.$IMPLIBEXT: $ac_file.$IMPLIBEXT
	\$(RM) \$@ && \$(LN_S) $ac_name/lib$ac_implib.$IMPLIBEXT \$@
clean::
	\$(RM) dlls/lib$ac_implib.$IMPLIBEXT"
            wine_fn_ignore_file "dlls/lib$ac_implib.$IMPLIBEXT"
            if test -n "$CROSSTARGET" -a -z "$ac_implibflags"
            then
                wine_fn_append_rule \
"__builddeps__: dlls/lib$ac_implib.cross.a
dlls/lib$ac_implib.cross.a: $ac_file.cross.a
	\$(RM) \$@ && \$(LN_S) $ac_name/lib$ac_implib.cross.a \$@
clean::
	\$(RM) dlls/lib$ac_implib.cross.a"
                wine_fn_ignore_file "dlls/lib$ac_implib.cross.a"
            fi
        fi
    fi
}

wine_fn_config_program ()
{
    ac_name=$1
    ac_dir=programs/$ac_name
    ac_enable=$2
    ac_flags=$3
    ac_program=$ac_name

    case $ac_name in
      *.*) ;;
      *)   ac_program=$ac_program.exe ;;
    esac

    ac_clean=
    wine_fn_has_flag mc && ac_clean="$ac_clean $ac_dir/msg.pot"
    wine_fn_has_flag po && ac_clean="$ac_clean $ac_dir/rsrc.pot"
    wine_fn_has_flag manpage && ac_clean="$ac_clean $ac_dir/$ac_name.man"
    test -n "$DLLEXT" || ac_clean="$ac_clean $ac_dir/$ac_program"

    if eval test \"x\$"$ac_enable"\" = x"no"; then :
  wine_fn_disabled_rules $ac_clean; return
fi

    wine_fn_all_rules
    wine_fn_clean_rules $ac_clean
    wine_fn_append_rule "$ac_dir: __builddeps__"
    wine_fn_pot_rules

    wine_fn_has_flag install || return
    wine_fn_append_rule \
".PHONY: $ac_dir/install $ac_dir/uninstall
install install-lib:: $ac_dir/install
__uninstall__: $ac_dir/uninstall"

    if test -n "$DLLEXT"
    then
        wine_fn_append_rule \
"$ac_dir/install:: $ac_dir
	\$(INSTALL_PROGRAM) $ac_dir/$ac_program$DLLEXT \$(DESTDIR)\$(dlldir)/$DLLPREFIX$ac_program$DLLEXT
	\$(INSTALL_DATA) $ac_dir/$ac_program.fake \$(DESTDIR)\$(fakedlldir)/$ac_program
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(dlldir)/$DLLPREFIX$ac_program$DLLEXT \$(DESTDIR)\$(fakedlldir)/$ac_program"

        if test -z "$with_wine64" && wine_fn_has_flag installbin
        then
            wine_fn_append_rule \
"$ac_dir/install:: __tooldeps__
	\$(INSTALL_SCRIPT) \$(TOOLSDIR)/tools/wineapploader \$(DESTDIR)\$(bindir)/$ac_name
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(bindir)/$ac_name"
        fi
    else
        wine_fn_append_rule \
"$ac_dir/install:: $ac_dir
	\$(INSTALL_PROGRAM) $ac_dir/$ac_program \$(DESTDIR)\$(bindir)/$ac_program
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(bindir)/$ac_program"
    fi

    if test -z "$with_wine64" && wine_fn_has_flag manpage
    then
        wine_fn_append_rule \
"$ac_dir/install:: $ac_dir
	\$(INSTALL_DATA) $ac_dir/$ac_name.man \$(DESTDIR)\$(mandir)/man\$(prog_manext)/$ac_name.\$(prog_manext)
$ac_dir/uninstall::
	\$(RM) \$(DESTDIR)\$(mandir)/man\$(prog_manext)/$ac_name.\$(prog_manext)"
    fi
}

wine_fn_config_test ()
{
    ac_dir=$1
    ac_name=$2
    ac_flags=$3

    ac_clean=
    test -n "$CROSSTARGET" && ac_clean=`expr $ac_dir/${ac_name} : "\\(.*\\)_test"`_crosstest.exe
    test -n "$DLLEXT" || ac_clean="$ac_dir/${ac_name}.exe $ac_dir/${ac_name}-stripped.exe"

    if test "x$enable_tests" = xno; then :
  wine_fn_disabled_rules $ac_clean; return
fi

    wine_fn_append_file ALL_TEST_RESOURCES $ac_name.res
    wine_fn_all_rules
    wine_fn_clean_rules $ac_clean

    wine_fn_append_rule \
"$ac_dir: programs/winetest/Makefile __builddeps__
programs/winetest: $ac_dir
check test: $ac_dir/test
.PHONY: $ac_dir/test
$ac_dir/test: dummy
	@cd $ac_dir && \$(MAKE) test
testclean::
	\$(RM) $ac_dir/*.ok"

        if test -n "$CROSSTARGET"
        then
            wine_fn_append_rule \
"crosstest: $ac_dir/crosstest
.PHONY: $ac_dir/crosstest
$ac_dir/crosstest: $ac_dir/Makefile __builddeps__ dummy
	@cd $ac_dir && \$(MAKE) crosstest"
        fi
}

wine_fn_config_tool ()
{
    ac_dir=$1
    ac_flags=$2
    if test "x$enable_tools" = xno; then :
  return
fi

    wine_fn_all_rules
    wine_fn_install_rules
    wine_fn_clean_rules

    wine_fn_append_rule "__tooldeps__: $ac_dir"
    wine_fn_append_rule "$ac_dir: libs/port"
    case $ac_dir in
      tools/winebuild) wine_fn_append_rule "\$(WINEBUILD): $ac_dir" ;;
    esac
}

wine_fn_config_symlink ()
{
    ac_linkdir=
    if test "x$1" = "x-d"
    then
        ac_linkdir=$2
        shift; shift
    fi
    ac_links=$@
    wine_fn_append_rule \
"$ac_links:
	@./config.status \$@
distclean::
	\$(RM) $ac_links"
    for f in $ac_links; do wine_fn_ignore_file $f; done
    test -n "$ac_linkdir" || return
    wine_fn_append_rule "$ac_linkdir/Makefile $ac_linkdir/depend: $ac_links"
}

wine_binary="wine"
test "x$enable_win64" != "xyes" || wine_binary="wine64"
loader_programs="$wine_binary wine-installed"
libwine_soversion=`expr $libwine_version : '\([0-9]*\)\..*'`

LOADER_RULES="
all: wine.inf

install install-lib:: wine-installed
	\$(INSTALL_PROGRAM) wine-installed \$(DESTDIR)\$(bindir)/$wine_binary

uninstall::
	\$(RM) \$(DESTDIR)\$(bindir)/$wine_binary
"


case $host_os in
  cygwin*|mingw32*)
    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

    LIBEXT="dll"
    DLLEXT=""
    IMPLIBEXT="a"
    STATIC_IMPLIBEXT="a"
        enable_iphlpapi=${enable_iphlpapi:-no}
    enable_kernel32=${enable_kernel32:-no}
    enable_msvcrt=${enable_msvcrt:-no}
    enable_ntdll=${enable_ntdll:-no}
    enable_ws2_32=${enable_ws2_32:-no}
    enable_loader=${enable_loader:-no}
    enable_server=${enable_server:-no}
        with_x=${with_x:-no}
    with_pthread=${with_pthread:-no}

        crtlibs=""
    case $host_os in
        mingw32*)
          crtlibs="-lmsvcrt"
          SOCKET_LIBS="-L\$(top_builddir)/dlls/ws2_32 -lws2_32"
 ;;
    esac

    libwine_targets="libwine.dll libwine.a"
    LIBWINE_RULES="
OBJS = \$(C_SRCS:.c=.o) \$(EXTRA_OBJS)

all: libwine.dll libwine.a

libwine.a: \$(srcdir)/wine.def
	\$(DLLTOOL) -l \$@ -d \$(srcdir)/wine.def

libwine.dll: \$(OBJS) \$(srcdir)/wine.def
	\$(CC) -shared \$(srcdir)/wine.def -o \$@ \$(OBJS) $crtlibs \$(EXTRALIBS)

install install-lib:: libwine.dll
	\$(INSTALL_DATA) libwine.dll \$(DESTDIR)\$(libdir)/libwine.dll

install install-dev:: libwine.a
	\$(INSTALL_DATA) libwine.a \$(DESTDIR)\$(libdir)/libwine.a

uninstall::
	-cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.a libwine.dll
"

    ;;

  darwin*|macosx*)
    LIBEXT="dylib"
    DLLFLAGS="$DLLFLAGS -fPIC"
    LIBWINE_LDFLAGS="-multiply_defined suppress"
    LDRPATH_INSTALL="-Wl,-rpath,@loader_path/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`"
    LDRPATH_LOCAL="-Wl,-rpath,@loader_path/\$(top_builddir)/libs/wine"
        COREFOUNDATION_LIBS="-framework CoreFoundation"

    IOKIT_LIBS="-framework IOKit -framework CoreFoundation"

    FORCEFEEDBACK_LIBS="-framework ForceFeedback -framework CoreFoundation"

    APPLICATIONSERVICES_LIBS="-framework ApplicationServices"

    CORESERVICES_LIBS="-framework CoreServices"

    APPKIT_LIBS="-framework AppKit"

    LDEXECFLAGS="-image_base 0x7bf00000 -Wl,-segaddr,WINE_DOS,0x00001000,-segaddr,WINE_SHAREDHEAP,0x7f000000,-sectcreate,__TEXT,__info_plist,wine_info.plist"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,-no_pie" >&5
$as_echo_n "checking whether the compiler supports -Wl,-no_pie... " >&6; }
if ${ac_cv_cflags__Wl__no_pie+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,-no_pie"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wl__no_pie=yes
else
  ac_cv_cflags__Wl__no_pie=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl__no_pie" >&5
$as_echo "$ac_cv_cflags__Wl__no_pie" >&6; }
if test "x$ac_cv_cflags__Wl__no_pie" = xyes; then :
  LDEXECFLAGS="-Wl,-no_pie $LDEXECFLAGS"
fi
    if test "$ac_cv_header_DiskArbitration_DiskArbitration_h" = "yes"
    then
                DISKARBITRATION_LIBS="-framework DiskArbitration -framework CoreFoundation"

    fi
    if test "$ac_cv_header_Security_Security_h" = "yes"
    then
        SECURITY_LIBS="-framework Security -framework CoreFoundation"

                ac_save_LIBS="$LIBS"
        LIBS="$LIBS $SECURITY_LIBS"
        for ac_func in SSLCopyPeerCertificates
do :
  ac_fn_c_check_func "$LINENO" "SSLCopyPeerCertificates" "ac_cv_func_SSLCopyPeerCertificates"
if test "x$ac_cv_func_SSLCopyPeerCertificates" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_SSLCOPYPEERCERTIFICATES 1
_ACEOF

fi
done

        LIBS="$ac_save_LIBS"
        with_gnutls=${with_gnutls:-no}
    fi
    if test "$ac_cv_header_CoreAudio_CoreAudio_h" = "yes" -a "$ac_cv_header_AudioUnit_AudioUnit_h" = "yes"
    then
        if test "$ac_cv_header_AudioUnit_AudioComponent_h" = "yes"
        then
            COREAUDIO_LIBS="-framework CoreFoundation -framework CoreAudio -framework AudioUnit -framework AudioToolbox -framework CoreMIDI"

        else
                        COREAUDIO_LIBS="-framework CoreAudio -framework AudioUnit -framework CoreServices -framework AudioToolbox -framework CoreMIDI"

        fi
                ac_save_LIBS="$LIBS"
        LIBS="$LIBS $COREAUDIO_LIBS"
        for ac_func in AUGraphAddNode
do :
  ac_fn_c_check_func "$LINENO" "AUGraphAddNode" "ac_cv_func_AUGraphAddNode"
if test "x$ac_cv_func_AUGraphAddNode" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_AUGRAPHADDNODE 1
_ACEOF

fi
done

        LIBS="$ac_save_LIBS"
    fi
    if test "$ac_cv_header_OpenAL_al_h" = "yes"
    then
        OPENAL_LIBS="-framework OpenAL"


cat >>confdefs.h <<_ACEOF
#define HAVE_OPENAL 1
_ACEOF

        ac_cv_lib_openal=yes
    fi
    if test "$ac_cv_header_OpenCL_opencl_h" = "yes"
    then
        OPENCL_LIBS="-framework OpenCL"

        ac_cv_lib_OpenCL_clGetPlatformInfo=yes
    fi
    if test "$ac_cv_header_IOKit_hid_IOHIDLib_h" = "yes"
    then
        ac_save_LIBS="$LIBS"
        LIBS="$LIBS $IOKIT_LIBS"
        for ac_func in IOHIDManagerCreate
do :
  ac_fn_c_check_func "$LINENO" "IOHIDManagerCreate" "ac_cv_func_IOHIDManagerCreate"
if test "x$ac_cv_func_IOHIDManagerCreate" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_IOHIDMANAGERCREATE 1
_ACEOF

fi
done

        LIBS="$ac_save_LIBS"
    fi
    if test "$ac_cv_header_QuickTime_ImageCompression_h" = "yes"
    then
                ac_save_LIBS="$LIBS"
        LIBS="-framework QuickTime -framework ApplicationServices -framework CoreVideo $LIBS"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the QuickTime framework" >&5
$as_echo_n "checking for the QuickTime framework... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <QuickTime/ImageCompression.h>
int
main ()
{
CodecManagerVersion(NULL);
  ;
  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; }
                        QUICKTIME_LIBS="-framework QuickTime -framework ApplicationServices -framework CoreVideo"

                        enable_wineqtdecoder=${enable_wineqtdecoder:-yes}
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
                        ac_cv_header_QuickTime_ImageCompression_h=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
        LIBS="$ac_save_LIBS"
    fi
    if test "$ac_cv_header_QuickTime_ImageCompression_h" != "yes"
    then
        as_fn_append wine_notices "|QuickTime ${notice_platform}development files not found, video decoding won't be supported."
    fi
    if test "$ac_cv_header_Carbon_Carbon_h" = "yes"
    then
        CARBON_LIBS="-framework Carbon"

    fi

        if test "$ac_cv_header_ApplicationServices_ApplicationServices_h" = "yes"
    then
        ac_save_LIBS="$LIBS"
        LIBS="$LIBS $APPLICATIONSERVICES_LIBS"
        ac_fn_c_check_func "$LINENO" "CGDisplayModeGetWidth" "ac_cv_func_CGDisplayModeGetWidth"
if test "x$ac_cv_func_CGDisplayModeGetWidth" = xyes; then :
  enable_winemac_drv=${enable_winemac_drv:-yes}
fi

        LIBS="$ac_save_LIBS"
    fi

        if test "x$enable_win16" = "xyes"
    then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether 16-bit code can be built correctly" >&5
$as_echo_n "checking whether 16-bit code can be built correctly... " >&6; }
        if test "$cross_compiling" = yes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling, assuming yes" >&5
$as_echo "cross-compiling, assuming yes" >&6; }
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
asm(".text\n"
                                            "bad:\tnop;nop\n"
                                            "good:\tnop;nop\n\t"
                                            ".globl _testfunc\n"
                                            "_testfunc:\tcallw good");
                                        extern void testfunc();
int
main ()
{
unsigned short *p = (unsigned short *)testfunc;
                                        return p[0] != 0xe866 || p[1] != 0xfffa
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$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; }
                                       as_fn_error $? "Xcode 3.x cannot build 16-bit code correctly. Use --disable-win16 if you don't need 16-bit support." "$LINENO" 5
fi
rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
  conftest.$ac_objext conftest.beam conftest.$ac_ext
fi

    fi

    libwine_targets="libwine.dylib libwine.$libwine_soversion.dylib libwine.$libwine_version.dylib"
    LIBWINE_RULES="
OBJS = \$(C_SRCS:.c=.o) \$(EXTRA_OBJS)

all: libwine.dylib

libwine.$libwine_version.dylib: \$(OBJS)
	\$(CC) -dynamiclib -install_name @rpath/libwine.$libwine_soversion.dylib -Wl,-rpath,@loader_path/ -compatibility_version $libwine_soversion -current_version $libwine_version \$(OBJS) \$(EXTRALIBS) \$(LDFLAGS) \$(LIBS) -o \$@

libwine.$libwine_soversion.dylib: libwine.$libwine_version.dylib
	\$(RM) \$@ && \$(LN_S) libwine.$libwine_version.dylib \$@

libwine.dylib: libwine.$libwine_soversion.dylib
	\$(RM) \$@ && \$(LN_S) libwine.$libwine_soversion.dylib \$@

install install-lib:: libwine.$libwine_version.dylib
	\$(INSTALL_PROGRAM) libwine.$libwine_version.dylib \$(DESTDIR)\$(libdir)/libwine.$libwine_version.dylib
	cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.$libwine_soversion.dylib && \$(LN_S) libwine.$libwine_version.dylib libwine.$libwine_soversion.dylib

install install-dev::
	cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.dylib && \$(LN_S) libwine.$libwine_version.dylib libwine.dylib

uninstall::
	-cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.dylib libwine.$libwine_soversion.dylib libwine.$libwine_version.dylib
"


    as_fn_append LOADER_RULES "
$wine_binary: main.o wine_info.plist
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_LOCAL)

wine-installed: main.o wine_info.plist
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_INSTALL)
"
    ;;

  linux-android*)
    DLLFLAGS="$DLLFLAGS -fPIC"
    DLLPREFIX="lib"
    LDEXECFLAGS=""
    dlldir="\${libdir}"
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,--export-dynamic" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,--export-dynamic... " >&6; }
if ${ac_cv_cflags__fPIC__Wl___export_dynamic+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,--export-dynamic"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fPIC__Wl___export_dynamic=yes
else
  ac_cv_cflags__fPIC__Wl___export_dynamic=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__Wl___export_dynamic" >&5
$as_echo "$ac_cv_cflags__fPIC__Wl___export_dynamic" >&6; }
if test "x$ac_cv_cflags__fPIC__Wl___export_dynamic" = xyes; then :
  LDEXECFLAGS="-Wl,--export-dynamic"
fi
    as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,--rpath,\\$ORIGIN/../lib" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,--rpath,\$ORIGIN/../lib" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,--rpath,\$ORIGIN/../lib... " >&6; }
if eval \${$as_ac_var+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,--rpath,\$ORIGIN/../lib"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_ac_var=yes"
else
  eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
eval ac_res=\$$as_ac_var
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`"
                     LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"
else
  as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,-R,\\$ORIGIN/../lib" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,-R,\$ORIGIN/../lib" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,-R,\$ORIGIN/../lib... " >&6; }
if eval \${$as_ac_var+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,-R,\$ORIGIN/../lib"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_ac_var=yes"
else
  eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
eval ac_res=\$$as_ac_var
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`"
                          LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"
fi
fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--enable-new-dtags" >&5
$as_echo_n "checking whether the compiler supports -Wl,--enable-new-dtags... " >&6; }
if ${ac_cv_cflags__Wl___enable_new_dtags+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,--enable-new-dtags"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wl___enable_new_dtags=yes
else
  ac_cv_cflags__Wl___enable_new_dtags=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___enable_new_dtags" >&5
$as_echo "$ac_cv_cflags__Wl___enable_new_dtags" >&6; }
if test "x$ac_cv_cflags__Wl___enable_new_dtags" = xyes; then :
  LDRPATH_INSTALL="$LDRPATH_INSTALL -Wl,--enable-new-dtags"
fi

    case $host_cpu in
      *i[3456789]86* | x86_64)
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--section-start,.interp=0x7bf00400" >&5
$as_echo_n "checking whether the compiler supports -Wl,--section-start,.interp=0x7bf00400... " >&6; }
if ${ac_cv_cflags__Wl___section_start__interp_0x7bf00400+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,--section-start,.interp=0x7bf00400"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wl___section_start__interp_0x7bf00400=yes
else
  ac_cv_cflags__Wl___section_start__interp_0x7bf00400=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___section_start__interp_0x7bf00400" >&5
$as_echo "$ac_cv_cflags__Wl___section_start__interp_0x7bf00400" >&6; }
if test "x$ac_cv_cflags__Wl___section_start__interp_0x7bf00400" = xyes; then :
  LDEXECFLAGS="$LDEXECFLAGS -Wl,--section-start,.interp=0x7bf00400"
fi
        ;;
    esac

    libwine_targets="libwine.so"
    LIBWINE_RULES="
OBJS = \$(C_SRCS:.c=.o) \$(EXTRA_OBJS)

all: libwine.so

libwine.so: \$(OBJS)
	\$(CC) -shared \$(OBJS) \$(EXTRALIBS) \$(LDFLAGS) \$(LIBS) -o \$@

install install-lib:: libwine.so
	\$(INSTALL_PROGRAM) libwine.so \$(DESTDIR)\$(libdir)/libwine.so

uninstall::
	\$(RM) \$(DESTDIR)\$(libdir)/libwine.so
"


    as_fn_append LOADER_RULES "
$wine_binary: main.o
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_LOCAL)

wine-installed: main.o
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_INSTALL)
"
    ;;

  *)
    DLLFLAGS="$DLLFLAGS -fPIC"
    LDEXECFLAGS=""
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can build a GNU style ELF dll" >&5
$as_echo_n "checking whether we can build a GNU style ELF dll... " >&6; }
if ${ac_cv_c_dll_gnuelf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-Bsymbolic"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
void myfunc() {}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_c_dll_gnuelf="yes"
else
  ac_cv_c_dll_gnuelf="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_dll_gnuelf" >&5
$as_echo "$ac_cv_c_dll_gnuelf" >&6; }
    if test "$ac_cv_c_dll_gnuelf" = "yes"
    then
      LDSHARED="\$(CC) -shared"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-soname,confest.so.1" >&5
$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-soname,confest.so.1... " >&6; }
if ${ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,confest.so.1"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1=yes
else
  ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1" >&5
$as_echo "$ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1" >&6; }
if test "x$ac_cv_cflags__fPIC__shared__Wl__soname_confest_so_1" = xyes; then :
  LDSHARED="\$(CC) -shared -Wl,-soname,libwine.so.$libwine_soversion"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,-h,confest.so.1" >&5
$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,-h,confest.so.1... " >&6; }
if ${ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,-h,confest.so.1"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1=yes
else
  ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1" >&5
$as_echo "$ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1" >&6; }
if test "x$ac_cv_cflags__fPIC__shared__Wl__h_confest_so_1" = xyes; then :
  LDSHARED="\$(CC) -shared -Wl,-h,libwine.so.$libwine_soversion"
fi
fi

      echo '{ global: *; };' >conftest.map
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -shared -Wl,--version-script=conftest.map" >&5
$as_echo_n "checking whether the compiler supports -fPIC -shared -Wl,--version-script=conftest.map... " >&6; }
if ${ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -shared -Wl,--version-script=conftest.map"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map=yes
else
  ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map" >&5
$as_echo "$ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map" >&6; }
if test "x$ac_cv_cflags__fPIC__shared__Wl___version_script_conftest_map" = xyes; then :
  LDSHARED="$LDSHARED -Wl,--version-script=\$(srcdir)/wine.map"
fi
      rm -f conftest.map

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,--export-dynamic" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,--export-dynamic... " >&6; }
if ${ac_cv_cflags__fPIC__Wl___export_dynamic+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,--export-dynamic"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fPIC__Wl___export_dynamic=yes
else
  ac_cv_cflags__fPIC__Wl___export_dynamic=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fPIC__Wl___export_dynamic" >&5
$as_echo "$ac_cv_cflags__fPIC__Wl___export_dynamic" >&6; }
if test "x$ac_cv_cflags__fPIC__Wl___export_dynamic" = xyes; then :
  LDEXECFLAGS="-Wl,--export-dynamic"
fi

      as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,--rpath,\\$ORIGIN/../lib" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,--rpath,\$ORIGIN/../lib" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,--rpath,\$ORIGIN/../lib... " >&6; }
if eval \${$as_ac_var+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,--rpath,\$ORIGIN/../lib"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_ac_var=yes"
else
  eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
eval ac_res=\$$as_ac_var
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  LDRPATH_INSTALL="-Wl,--rpath,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`"
                       LDRPATH_LOCAL="-Wl,--rpath,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"
else
  as_ac_var=`$as_echo "ac_cv_cflags_-fPIC -Wl,-R,\\$ORIGIN/../lib" | $as_tr_sh`
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fPIC -Wl,-R,\$ORIGIN/../lib" >&5
$as_echo_n "checking whether the compiler supports -fPIC -Wl,-R,\$ORIGIN/../lib... " >&6; }
if eval \${$as_ac_var+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,-R,\$ORIGIN/../lib"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  eval "$as_ac_var=yes"
else
  eval "$as_ac_var=no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
eval ac_res=\$$as_ac_var
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
$as_echo "$ac_res" >&6; }
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  LDRPATH_INSTALL="-Wl,-R,\\\$\$ORIGIN/\`\$(MAKEDEP) -R \$(bindir) \$(libdir)\`"
                            LDRPATH_LOCAL="-Wl,-R,\\\$\$ORIGIN/\$(top_builddir)/libs/wine"
fi
fi

      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--enable-new-dtags" >&5
$as_echo_n "checking whether the compiler supports -Wl,--enable-new-dtags... " >&6; }
if ${ac_cv_cflags__Wl___enable_new_dtags+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,--enable-new-dtags"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wl___enable_new_dtags=yes
else
  ac_cv_cflags__Wl___enable_new_dtags=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___enable_new_dtags" >&5
$as_echo "$ac_cv_cflags__Wl___enable_new_dtags" >&6; }
if test "x$ac_cv_cflags__Wl___enable_new_dtags" = xyes; then :
  LDRPATH_INSTALL="$LDRPATH_INSTALL -Wl,--enable-new-dtags"
fi

      case $host_cpu in
        *i[3456789]86* | x86_64)
          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wl,--section-start,.interp=0x7bf00400" >&5
$as_echo_n "checking whether the compiler supports -Wl,--section-start,.interp=0x7bf00400... " >&6; }
if ${ac_cv_cflags__Wl___section_start__interp_0x7bf00400+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wl,--section-start,.interp=0x7bf00400"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wl___section_start__interp_0x7bf00400=yes
else
  ac_cv_cflags__Wl___section_start__interp_0x7bf00400=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wl___section_start__interp_0x7bf00400" >&5
$as_echo "$ac_cv_cflags__Wl___section_start__interp_0x7bf00400" >&6; }
if test "x$ac_cv_cflags__Wl___section_start__interp_0x7bf00400" = xyes; then :
  case $host_os in
                           freebsd* | kfreebsd*-gnu) LDEXECFLAGS="$LDEXECFLAGS -Wl,--section-start,.interp=0x60000400" ;;
                           *) LDEXECFLAGS="$LDEXECFLAGS -Wl,--section-start,.interp=0x7bf00400" ;;
                           esac

fi
          # Extract the first word of "prelink", so it can be a program name with args.
set dummy prelink; 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_PRELINK+:} false; then :
  $as_echo_n "(cached) " >&6
else
  case $PRELINK in
  [\\/]* | ?:[\\/]*)
  ac_cv_path_PRELINK="$PRELINK" # Let the user override the test with a path.
  ;;
  *)
  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
for as_dir in /sbin /usr/sbin $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_PRELINK="$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_PRELINK" && ac_cv_path_PRELINK="false"
  ;;
esac
fi
PRELINK=$ac_cv_path_PRELINK
if test -n "$PRELINK"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PRELINK" >&5
$as_echo "$PRELINK" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


          if test "x$PRELINK" = xfalse
          then
              as_fn_append wine_warnings "|prelink not found, base address of core dlls won't be set correctly."
          fi
          ;;
      esac

    else
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can build a UnixWare (Solaris) dll" >&5
$as_echo_n "checking whether we can build a UnixWare (Solaris) dll... " >&6; }
if ${ac_cv_c_dll_unixware+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fPIC -Wl,-G,-h,conftest.so.1.0,-B,symbolic"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
void myfunc() {}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_c_dll_unixware="yes"
else
  ac_cv_c_dll_unixware="no"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_dll_unixware" >&5
$as_echo "$ac_cv_c_dll_unixware" >&6; }
      if test "$ac_cv_c_dll_unixware" = "yes"
      then
        LDSHARED="\$(CC) -Wl,-G,-h,libwine.so.$libwine_soversion"
      fi
    fi
    libwine_targets="libwine.so libwine.so.$libwine_soversion libwine.so.$libwine_version"
    LIBWINE_RULES="
OBJS = \$(C_SRCS:.c=.o) \$(EXTRA_OBJS)

all: libwine.so

libwine.so.$libwine_version: \$(OBJS) \$(srcdir)/wine.map
	$LDSHARED \$(OBJS) \$(EXTRALIBS) \$(LDFLAGS) \$(LIBS) -o \$@

libwine.so.$libwine_soversion: libwine.so.$libwine_version
	\$(RM) \$@ && \$(LN_S) libwine.so.$libwine_version \$@

libwine.so: libwine.so.$libwine_soversion
	\$(RM) \$@ && \$(LN_S) libwine.so.$libwine_soversion \$@

install install-lib:: libwine.so.$libwine_version
	\$(INSTALL_PROGRAM) libwine.so.$libwine_version \$(DESTDIR)\$(libdir)/libwine.so.$libwine_version
	cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.so.$libwine_soversion && \$(LN_S) libwine.so.$libwine_version libwine.so.$libwine_soversion

install install-dev::
	cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.so && \$(LN_S) libwine.so.$libwine_version libwine.so

uninstall::
	-cd \$(DESTDIR)\$(libdir) && \$(RM) libwine.so libwine.so.$libwine_soversion libwine.so.$libwine_version
"


    as_fn_append LOADER_RULES "
$wine_binary: main.o
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_LOCAL)

wine-installed: main.o
	\$(CC) -o \$@ $LDEXECFLAGS main.o \$(LIBWINE) \$(LIBPORT) \$(EXTRALIBS) \$(LDFLAGS) \$(LDRPATH_INSTALL)
"
    ;;
esac

as_fn_append LIBWINE_RULES "
EXTRA_TARGETS = $libwine_targets
"

enable_wineqtdecoder=${enable_wineqtdecoder:-no}
enable_winemac_drv=${enable_winemac_drv:-no}

CROSSTARGET=""

if test "$cross_compiling" = "no" -a "x$enable_tests" != xno -a "$LIBEXT" != "dll"
then
    case "$host_cpu" in
  i[3456789]86*)
    ac_prefix_list="i686-w64-mingw32-gcc i586-w64-mingw32-gcc i486-w64-mingw32-gcc i386-w64-mingw32-gcc i686-pc-mingw32-gcc i586-pc-mingw32-gcc i486-pc-mingw32-gcc i386-pc-mingw32-gcc i686-mingw32msvc-gcc i586-mingw32msvc-gcc i486-mingw32msvc-gcc i386-mingw32msvc-gcc i686-mingw32-gcc i586-mingw32-gcc i486-mingw32-gcc i386-mingw32-gcc
                        mingw32-gcc" ;;
  x86_64)
    ac_prefix_list="x86_64-pc-mingw32-gcc amd64-pc-mingw32-gcc x86_64-w64-mingw32-gcc amd64-w64-mingw32-gcc x86_64-mingw32msvc-gcc amd64-mingw32msvc-gcc " ;;
  *)
    ac_prefix_list="" ;;
esac
for ac_prog in $ac_prefix_list
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_CROSSCC+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test -n "$CROSSCC"; then
  ac_cv_prog_CROSSCC="$CROSSCC" # 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_CROSSCC="$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
CROSSCC=$ac_cv_prog_CROSSCC
if test -n "$CROSSCC"; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CROSSCC" >&5
$as_echo "$CROSSCC" >&6; }
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
fi


  test -n "$CROSSCC" && break
done
test -n "$CROSSCC" || CROSSCC="false"

    if test "$CROSSCC" != "false"
    then
        ac_save_CC="$CC"
        CC="$CROSSCC"
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CROSSCC works" >&5
$as_echo_n "checking whether $CROSSCC works... " >&6; }
        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  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; }
                           set x $CROSSCC
                           shift
                           while test $# -ge 1
                           do
                               case "$1" in
                                 *-gcc) CROSSTARGET=`expr "$1" : '\(.*\)-gcc'` ;;
                               esac
                               shift
                           done
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
        CC="$ac_save_CC"
    fi
fi


if test "$ac_cv_header_pthread_h" = "yes"
then
    ac_fn_c_check_func "$LINENO" "pthread_create" "ac_cv_func_pthread_create"
if test "x$ac_cv_func_pthread_create" = xyes; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_create in -lpthread" >&5
$as_echo_n "checking for pthread_create in -lpthread... " >&6; }
if ${ac_cv_lib_pthread_pthread_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpthread  $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 pthread_create ();
int
main ()
{
return pthread_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_pthread_pthread_create=yes
else
  ac_cv_lib_pthread_pthread_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_pthread_pthread_create" >&5
$as_echo "$ac_cv_lib_pthread_pthread_create" >&6; }
if test "x$ac_cv_lib_pthread_pthread_create" = xyes; then :
  PTHREAD_LIBS="-lpthread"

fi

fi

fi
if test "x$ac_cv_func_pthread_create" != xyes -a "x$PTHREAD_LIBS" = x; then :
  case "x$with_pthread" in
  xno) ;;
  *)   as_fn_error $? "pthread ${notice_platform}development files not found.
Wine cannot support threads without libpthread.
Use the --without-pthread option if you really want this." "$LINENO" 5 ;;
esac
fi


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


# Check whether --with-x was given.
if test "${with_x+set}" = set; then :
  withval=$with_x;
fi

# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
if test "x$with_x" = xno; then
  # The user explicitly disabled X.
  have_x=disabled
else
  case $x_includes,$x_libraries in #(
    *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #(
    *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then :
  $as_echo_n "(cached) " >&6
else
  # One or both of the vars are not set, and there is no cached value.
ac_x_includes=no ac_x_libraries=no
rm -f -r conftest.dir
if mkdir conftest.dir; then
  cd conftest.dir
  cat >Imakefile <<'_ACEOF'
incroot:
	@echo incroot='${INCROOT}'
usrlibdir:
	@echo usrlibdir='${USRLIBDIR}'
libdir:
	@echo libdir='${LIBDIR}'
_ACEOF
  if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then
    # GNU make sometimes prints "make[1]: Entering ...", which would confuse us.
    for ac_var in incroot usrlibdir libdir; do
      eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`"
    done
    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
    for ac_extension in a so sl dylib la dll; do
      if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" &&
	 test -f "$ac_im_libdir/libX11.$ac_extension"; then
	ac_im_usrlibdir=$ac_im_libdir; break
      fi
    done
    # Screen out bogus values from the imake configuration.  They are
    # bogus both because they are the default anyway, and because
    # using them would break gcc on systems where it needs fixed includes.
    case $ac_im_incroot in
	/usr/include) ac_x_includes= ;;
	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
    esac
    case $ac_im_usrlibdir in
	/usr/lib | /usr/lib64 | /lib | /lib64) ;;
	*) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
    esac
  fi
  cd ..
  rm -f -r conftest.dir
fi

# Standard set of common directories for X headers.
# Check X11 before X11Rn because it is often a symlink to the current release.
ac_x_header_dirs='
/usr/X11/include
/usr/X11R7/include
/usr/X11R6/include
/usr/X11R5/include
/usr/X11R4/include

/usr/include/X11
/usr/include/X11R7
/usr/include/X11R6
/usr/include/X11R5
/usr/include/X11R4

/usr/local/X11/include
/usr/local/X11R7/include
/usr/local/X11R6/include
/usr/local/X11R5/include
/usr/local/X11R4/include

/usr/local/include/X11
/usr/local/include/X11R7
/usr/local/include/X11R6
/usr/local/include/X11R5
/usr/local/include/X11R4

/usr/X386/include
/usr/x386/include
/usr/XFree86/include/X11

/usr/include
/usr/local/include
/usr/unsupported/include
/usr/athena/include
/usr/local/x11r5/include
/usr/lpp/Xamples/include

/usr/openwin/include
/usr/openwin/share/include'

if test "$ac_x_includes" = no; then
  # Guess where to find include files, by looking for Xlib.h.
  # First, try using that file with no special directory specified.
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <X11/Xlib.h>
_ACEOF
if ac_fn_c_try_cpp "$LINENO"; then :
  # We can compile using X headers with no special include directory.
ac_x_includes=
else
  for ac_dir in $ac_x_header_dirs; do
  if test -r "$ac_dir/X11/Xlib.h"; then
    ac_x_includes=$ac_dir
    break
  fi
done
fi
rm -f conftest.err conftest.i conftest.$ac_ext
fi # $ac_x_includes = no

if test "$ac_x_libraries" = no; then
  # Check for the libraries.
  # See if we find them without any special options.
  # Don't add to $LIBS permanently.
  ac_save_LIBS=$LIBS
  LIBS="-lX11 $LIBS"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <X11/Xlib.h>
int
main ()
{
XrmInitialize ()
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  LIBS=$ac_save_LIBS
# We can link X programs with no special library path.
ac_x_libraries=
else
  LIBS=$ac_save_LIBS
for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
do
  # Don't even attempt the hair of trying to link an X program!
  for ac_extension in a so sl dylib la dll; do
    if test -r "$ac_dir/libX11.$ac_extension"; then
      ac_x_libraries=$ac_dir
      break 2
    fi
  done
done
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi # $ac_x_libraries = no

case $ac_x_includes,$ac_x_libraries in #(
  no,* | *,no | *\'*)
    # Didn't find X, or a directory has "'" in its name.
    ac_cv_have_x="have_x=no";; #(
  *)
    # Record where we found X for the cache.
    ac_cv_have_x="have_x=yes\
	ac_x_includes='$ac_x_includes'\
	ac_x_libraries='$ac_x_libraries'"
esac
fi
;; #(
    *) have_x=yes;;
  esac
  eval "$ac_cv_have_x"
fi # $with_x != no

if test "$have_x" != yes; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5
$as_echo "$have_x" >&6; }
  no_x=yes
else
  # If each of the values was on the command line, it overrides each guess.
  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
  # Update the cache value to reflect the command line values.
  ac_cv_have_x="have_x=yes\
	ac_x_includes='$x_includes'\
	ac_x_libraries='$x_libraries'"
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5
$as_echo "libraries $x_libraries, headers $x_includes" >&6; }
fi

if test "$no_x" = yes; then
  # Not all programs may use this symbol, but it does not hurt to define it.

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

  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
else
  if test -n "$x_includes"; then
    X_CFLAGS="$X_CFLAGS -I$x_includes"
  fi

  # It would also be nice to do this for all -L options, not just this one.
  if test -n "$x_libraries"; then
    X_LIBS="$X_LIBS -L$x_libraries"
    # For Solaris; some versions of Sun CC require a space after -R and
    # others require no space.  Words are not sufficient . . . .
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5
$as_echo_n "checking whether -R must be followed by a space... " >&6; }
    ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries"
    ac_xsave_c_werror_flag=$ac_c_werror_flag
    ac_c_werror_flag=yes
    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
       X_LIBS="$X_LIBS -R$x_libraries"
else
  LIBS="$ac_xsave_LIBS -R $x_libraries"
       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{

  ;
  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; }
	  X_LIBS="$X_LIBS -R $x_libraries"
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5
$as_echo "neither works" >&6; }
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    ac_c_werror_flag=$ac_xsave_c_werror_flag
    LIBS=$ac_xsave_LIBS
  fi

  # Check for system-dependent libraries X programs must link with.
  # Do this before checking for the system-independent R6 libraries
  # (-lICE), since we may need -lsocket or whatever for X linking.

  if test "$ISC" = yes; then
    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
  else
    # Martyn Johnson says this is needed for Ultrix, if the X
    # libraries were built with DECnet support.  And Karl Berry says
    # the Alpha needs dnet_stub (dnet does not exist).
    ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11"
    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 XOpenDisplay ();
int
main ()
{
return XOpenDisplay ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; }
if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet  $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 dnet_ntoa ();
int
main ()
{
return dnet_ntoa ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dnet_dnet_ntoa=yes
else
  ac_cv_lib_dnet_dnet_ntoa=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_dnet_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; }
if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
fi

    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5
$as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; }
if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-ldnet_stub  $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 dnet_ntoa ();
int
main ()
{
return dnet_ntoa ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_dnet_stub_dnet_ntoa=yes
else
  ac_cv_lib_dnet_stub_dnet_ntoa=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_dnet_stub_dnet_ntoa" >&5
$as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; }
if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
fi

    fi
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
    LIBS="$ac_xsave_LIBS"

    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
    # to get the SysV transport functions.
    # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4)
    # needs -lnsl.
    # The nsl library prevents programs from opening the X display
    # on Irix 5.2, according to T.E. Dickey.
    # The functions gethostbyname, getservbyname, and inet_addr are
    # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking.
    ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname"
if test "x$ac_cv_func_gethostbyname" = xyes; then :

fi

    if test $ac_cv_func_gethostbyname = no; then
      { $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 :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
fi

      if test $ac_cv_lib_nsl_gethostbyname = no; then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5
$as_echo_n "checking for gethostbyname in -lbsd... " >&6; }
if ${ac_cv_lib_bsd_gethostbyname+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lbsd  $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_bsd_gethostbyname=yes
else
  ac_cv_lib_bsd_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_bsd_gethostbyname" >&5
$as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; }
if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd"
fi

      fi
    fi

    # lieder@skyler.mavd.honeywell.com says without -lsocket,
    # socket/setsockopt and other routines are undefined under SCO ODT
    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
    # on later versions), says Simon Leinen: it contains gethostby*
    # variants that don't use the name server (or something).  -lsocket
    # must be given before -lnsl if both are needed.  We assume that
    # if connect needs -lnsl, so does gethostbyname.
    ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect"
if test "x$ac_cv_func_connect" = xyes; then :

fi

    if test $ac_cv_func_connect = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5
$as_echo_n "checking for connect in -lsocket... " >&6; }
if ${ac_cv_lib_socket_connect+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lsocket $X_EXTRA_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 connect ();
int
main ()
{
return connect ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_socket_connect=yes
else
  ac_cv_lib_socket_connect=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_connect" >&5
$as_echo "$ac_cv_lib_socket_connect" >&6; }
if test "x$ac_cv_lib_socket_connect" = xyes; then :
  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
fi

    fi

    # Guillermo Gomez says -lposix is necessary on A/UX.
    ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove"
if test "x$ac_cv_func_remove" = xyes; then :

fi

    if test $ac_cv_func_remove = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5
$as_echo_n "checking for remove in -lposix... " >&6; }
if ${ac_cv_lib_posix_remove+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lposix  $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 remove ();
int
main ()
{
return remove ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_posix_remove=yes
else
  ac_cv_lib_posix_remove=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_posix_remove" >&5
$as_echo "$ac_cv_lib_posix_remove" >&6; }
if test "x$ac_cv_lib_posix_remove" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
fi

    fi

    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
    ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat"
if test "x$ac_cv_func_shmat" = xyes; then :

fi

    if test $ac_cv_func_shmat = no; then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5
$as_echo_n "checking for shmat in -lipc... " >&6; }
if ${ac_cv_lib_ipc_shmat+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lipc  $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 shmat ();
int
main ()
{
return shmat ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ipc_shmat=yes
else
  ac_cv_lib_ipc_shmat=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_ipc_shmat" >&5
$as_echo "$ac_cv_lib_ipc_shmat" >&6; }
if test "x$ac_cv_lib_ipc_shmat" = xyes; then :
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
fi

    fi
  fi

  # Check for libraries that X11R6 Xt/Xaw programs need.
  ac_save_LDFLAGS=$LDFLAGS
  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
  # check for ICE first), but we must link in the order -lSM -lICE or
  # we get undefined symbols.  So assume we have SM if we have ICE.
  # These have to be linked with before -lX11, unlike the other
  # libraries we check for below, so use a different variable.
  # John Interrante, Karl Berry
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5
$as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; }
if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lICE $X_EXTRA_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 IceConnectionNumber ();
int
main ()
{
return IceConnectionNumber ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ICE_IceConnectionNumber=yes
else
  ac_cv_lib_ICE_IceConnectionNumber=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_ICE_IceConnectionNumber" >&5
$as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; }
if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then :
  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
fi

  LDFLAGS=$ac_save_LDFLAGS

fi


if test "$have_x" = "yes"
then
    ac_save_CPPFLAGS="$CPPFLAGS"
    CPPFLAGS="$CPPFLAGS $X_CFLAGS"

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lX11" >&5
$as_echo_n "checking for -lX11... " >&6; }
if ${ac_cv_lib_soname_X11+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lX11 $X_LIBS $X_EXTRA_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 XCreateWindow ();
int
main ()
{
return XCreateWindow ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_X11=`$ac_cv_path_LDD conftest.exe | grep "X11" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_X11=`otool -L conftest$ac_exeext | grep "libX11\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libX11\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_X11=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libX11\\.$LIBEXT" | sed -e "s/^.*\\[\\(libX11\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_X11:+false} :; then :
  ac_cv_lib_soname_X11=`$LDD conftest$ac_exeext | grep "libX11\\.$LIBEXT" | sed -e "s/^.*\(libX11\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_X11:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBX11 "$ac_cv_lib_soname_X11"
_ACEOF


fi
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXext" >&5
$as_echo_n "checking for -lXext... " >&6; }
if ${ac_cv_lib_soname_Xext+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXext $X_LIBS -lX11 $X_EXTRA_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 XextCreateExtension ();
int
main ()
{
return XextCreateExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xext=`$ac_cv_path_LDD conftest.exe | grep "Xext" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xext=`otool -L conftest$ac_exeext | grep "libXext\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXext\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xext=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXext\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXext\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xext:+false} :; then :
  ac_cv_lib_soname_Xext=`$LDD conftest$ac_exeext | grep "libXext\\.$LIBEXT" | sed -e "s/^.*\(libXext\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xext:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXEXT "$ac_cv_lib_soname_Xext"
_ACEOF

       X_LIBS="$X_LIBS -lXext"
fi
    X_LIBS="$X_LIBS -lX11"

        for ac_header in X11/Xlib.h \
                      X11/XKBlib.h \
                      X11/Xutil.h \
                      X11/Xcursor/Xcursor.h \
                      X11/extensions/shape.h \
                      X11/extensions/XInput.h \
                      X11/extensions/XInput2.h \
                      X11/extensions/XShm.h \
                      X11/extensions/Xcomposite.h \
                      X11/extensions/Xinerama.h \
                      X11/extensions/Xrandr.h \
                      X11/extensions/Xrender.h \
                      X11/extensions/xf86vmode.h \
                      X11/extensions/xf86vmproto.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" "#ifdef HAVE_X11_XLIB_H
# include <X11/Xlib.h>
#endif
#ifdef HAVE_X11_XUTIL_H
# include <X11/Xutil.h>
#endif
"
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


                if test "$ac_cv_header_X11_XKBlib_h" = "yes"
        then
              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XkbQueryExtension in -lX11" >&5
$as_echo_n "checking for XkbQueryExtension in -lX11... " >&6; }
if ${ac_cv_lib_X11_XkbQueryExtension+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lX11 $X_LIBS $X_EXTRA_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 XkbQueryExtension ();
int
main ()
{
return XkbQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_X11_XkbQueryExtension=yes
else
  ac_cv_lib_X11_XkbQueryExtension=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_X11_XkbQueryExtension" >&5
$as_echo "$ac_cv_lib_X11_XkbQueryExtension" >&6; }
if test "x$ac_cv_lib_X11_XkbQueryExtension" = xyes; then :

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

fi

        fi

                if test "$ac_cv_header_X11_Xcursor_Xcursor_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXcursor" >&5
$as_echo_n "checking for -lXcursor... " >&6; }
if ${ac_cv_lib_soname_Xcursor+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXcursor $X_LIBS $X_EXTRA_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 XcursorImageLoadCursor ();
int
main ()
{
return XcursorImageLoadCursor ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xcursor=`$ac_cv_path_LDD conftest.exe | grep "Xcursor" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xcursor=`otool -L conftest$ac_exeext | grep "libXcursor\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXcursor\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xcursor=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXcursor\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXcursor\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xcursor:+false} :; then :
  ac_cv_lib_soname_Xcursor=`$LDD conftest$ac_exeext | grep "libXcursor\\.$LIBEXT" | sed -e "s/^.*\(libXcursor\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xcursor:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXCURSOR "$ac_cv_lib_soname_Xcursor"
_ACEOF


fi
        fi
        if test "x$ac_cv_lib_soname_Xcursor" = "x"; then :
  case "x$with_xcursor" in
  x)   as_fn_append wine_notices "|libxcursor ${notice_platform}development files not found, the Xcursor extension won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxcursor ${notice_platform}development files not found, the Xcursor extension won't be supported.
This is an error since --with-xcursor was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_XInput_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXi" >&5
$as_echo_n "checking for -lXi... " >&6; }
if ${ac_cv_lib_soname_Xi+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXi $X_LIBS $X_EXTRA_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 XOpenDevice ();
int
main ()
{
return XOpenDevice ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xi=`$ac_cv_path_LDD conftest.exe | grep "Xi" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xi=`otool -L conftest$ac_exeext | grep "libXi\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXi\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xi=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXi\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXi\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xi:+false} :; then :
  ac_cv_lib_soname_Xi=`$LDD conftest$ac_exeext | grep "libXi\\.$LIBEXT" | sed -e "s/^.*\(libXi\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xi:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXI "$ac_cv_lib_soname_Xi"
_ACEOF


fi
        fi
        if test "x$ac_cv_lib_soname_Xi" = "x"; then :
  case "x$with_xinput" in
  x)   as_fn_append wine_notices "|libxi ${notice_platform}development files not found, the Xinput extension won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxi ${notice_platform}development files not found, the Xinput extension won't be supported.
This is an error since --with-xinput was requested." "$LINENO" 5 ;;
esac
fi

                if test "x$ac_cv_lib_soname_Xi" != x
        then
            if test "$ac_cv_header_X11_extensions_XInput2_h" != "yes"; then :
  case "x$with_xinput2" in
  x)   as_fn_append wine_notices "|XInput2 headers not found, the XInput 2 extension won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "XInput2 headers not found, the XInput 2 extension won't be supported.
This is an error since --with-xinput2 was requested." "$LINENO" 5 ;;
esac
fi
        fi

                if test "$ac_cv_header_X11_extensions_XShm_h" = "yes"
        then
              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShmQueryExtension in -lXext" >&5
$as_echo_n "checking for XShmQueryExtension in -lXext... " >&6; }
if ${ac_cv_lib_Xext_XShmQueryExtension+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext $X_LIBS $X_EXTRA_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 XShmQueryExtension ();
int
main ()
{
return XShmQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xext_XShmQueryExtension=yes
else
  ac_cv_lib_Xext_XShmQueryExtension=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_Xext_XShmQueryExtension" >&5
$as_echo "$ac_cv_lib_Xext_XShmQueryExtension" >&6; }
if test "x$ac_cv_lib_Xext_XShmQueryExtension" = xyes; then :

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

fi

        fi
        if test "$ac_cv_lib_Xext_XShmQueryExtension" != "yes"; then :
  case "x$with_xshm" in
  x)   as_fn_append wine_notices "|XShm ${notice_platform}development files not found, X Shared Memory won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "XShm ${notice_platform}development files not found, X Shared Memory won't be supported.
This is an error since --with-xshm was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_shape_h" = "yes"
        then
              { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XShapeQueryExtension in -lXext" >&5
$as_echo_n "checking for XShapeQueryExtension in -lXext... " >&6; }
if ${ac_cv_lib_Xext_XShapeQueryExtension+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXext $X_LIBS $X_EXTRA_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 XShapeQueryExtension ();
int
main ()
{
return XShapeQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xext_XShapeQueryExtension=yes
else
  ac_cv_lib_Xext_XShapeQueryExtension=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_Xext_XShapeQueryExtension" >&5
$as_echo "$ac_cv_lib_Xext_XShapeQueryExtension" >&6; }
if test "x$ac_cv_lib_Xext_XShapeQueryExtension" = xyes; then :

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

fi

        fi
        if test "$ac_cv_lib_Xext_XShapeQueryExtension" != "yes"; then :
  case "x$with_xshape" in
  x)   as_fn_append wine_notices "|XShape ${notice_platform}development files not found, XShape won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "XShape ${notice_platform}development files not found, XShape won't be supported.
This is an error since --with-xshape was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_xf86vmode_h" = "yes" -o "$ac_cv_header_X11_extensions_xf86vmproto_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXxf86vm" >&5
$as_echo_n "checking for -lXxf86vm... " >&6; }
if ${ac_cv_lib_soname_Xxf86vm+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXxf86vm $X_LIBS $X_EXTRA_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 XF86VidModeQueryExtension ();
int
main ()
{
return XF86VidModeQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xxf86vm=`$ac_cv_path_LDD conftest.exe | grep "Xxf86vm" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xxf86vm=`otool -L conftest$ac_exeext | grep "libXxf86vm\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXxf86vm\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xxf86vm=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXxf86vm\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXxf86vm\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xxf86vm:+false} :; then :
  ac_cv_lib_soname_Xxf86vm=`$LDD conftest$ac_exeext | grep "libXxf86vm\\.$LIBEXT" | sed -e "s/^.*\(libXxf86vm\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xxf86vm:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXXF86VM "$ac_cv_lib_soname_Xxf86vm"
_ACEOF


fi
        fi
        if test "x$ac_cv_lib_soname_Xxf86vm" = "x"; then :
  case "x$with_xxf86vm" in
  x)   as_fn_append wine_notices "|libXxf86vm ${notice_platform}development files not found, XFree86 Vidmode won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libXxf86vm ${notice_platform}development files not found, XFree86 Vidmode won't be supported.
This is an error since --with-xxf86vm was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_Xrender_h" = "yes" -a "x$ac_cv_lib_soname_X11" != "x"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXrender" >&5
$as_echo_n "checking for -lXrender... " >&6; }
if ${ac_cv_lib_soname_Xrender+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXrender $X_LIBS $X_EXTRA_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 XRenderQueryExtension ();
int
main ()
{
return XRenderQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xrender=`$ac_cv_path_LDD conftest.exe | grep "Xrender" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xrender=`otool -L conftest$ac_exeext | grep "libXrender\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXrender\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xrender=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXrender\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXrender\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xrender:+false} :; then :
  ac_cv_lib_soname_Xrender=`$LDD conftest$ac_exeext | grep "libXrender\\.$LIBEXT" | sed -e "s/^.*\(libXrender\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xrender:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXRENDER "$ac_cv_lib_soname_Xrender"
_ACEOF

       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderSetPictureTransform in -lXrender" >&5
$as_echo_n "checking for XRenderSetPictureTransform in -lXrender... " >&6; }
if ${ac_cv_lib_Xrender_XRenderSetPictureTransform+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXrender $X_LIBS $X_EXTRA_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 XRenderSetPictureTransform ();
int
main ()
{
return XRenderSetPictureTransform ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xrender_XRenderSetPictureTransform=yes
else
  ac_cv_lib_Xrender_XRenderSetPictureTransform=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_Xrender_XRenderSetPictureTransform" >&5
$as_echo "$ac_cv_lib_Xrender_XRenderSetPictureTransform" >&6; }
if test "x$ac_cv_lib_Xrender_XRenderSetPictureTransform" = xyes; then :

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

fi

               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for XRenderCreateLinearGradient in -lXrender" >&5
$as_echo_n "checking for XRenderCreateLinearGradient in -lXrender... " >&6; }
if ${ac_cv_lib_Xrender_XRenderCreateLinearGradient+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lXrender $X_LIBS $X_EXTRA_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 XRenderCreateLinearGradient ();
int
main ()
{
return XRenderCreateLinearGradient ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_Xrender_XRenderCreateLinearGradient=yes
else
  ac_cv_lib_Xrender_XRenderCreateLinearGradient=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_Xrender_XRenderCreateLinearGradient" >&5
$as_echo "$ac_cv_lib_Xrender_XRenderCreateLinearGradient" >&6; }
if test "x$ac_cv_lib_Xrender_XRenderCreateLinearGradient" = xyes; then :

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

fi

fi

        fi
        if test "x$ac_cv_lib_soname_Xrender" = "x"; then :
  case "x$with_xrender" in
  x)   as_fn_append wine_warnings "|libxrender ${notice_platform}development files not found, XRender won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxrender ${notice_platform}development files not found, XRender won't be supported.
This is an error since --with-xrender was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_Xrandr_h" = "yes" -a "x$ac_cv_lib_soname_Xrender" != "x"
        then
                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
int
main ()
{
static typeof(XRRSetScreenConfigAndRate) * func; if (func) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXrandr" >&5
$as_echo_n "checking for -lXrandr... " >&6; }
if ${ac_cv_lib_soname_Xrandr+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXrandr $X_LIBS $X_EXTRA_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 XRRQueryExtension ();
int
main ()
{
return XRRQueryExtension ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xrandr=`$ac_cv_path_LDD conftest.exe | grep "Xrandr" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xrandr=`otool -L conftest$ac_exeext | grep "libXrandr\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXrandr\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xrandr=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXrandr\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXrandr\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xrandr:+false} :; then :
  ac_cv_lib_soname_Xrandr=`$LDD conftest$ac_exeext | grep "libXrandr\\.$LIBEXT" | sed -e "s/^.*\(libXrandr\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xrandr:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXRANDR "$ac_cv_lib_soname_Xrandr"
_ACEOF

       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h>
int
main ()
{
static typeof(XRRGetScreenResources) *f; if (f) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

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

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        fi
        if test "x$ac_cv_lib_soname_Xrandr" = "x"; then :
  case "x$with_xrandr" in
  x)   as_fn_append wine_notices "|libxrandr ${notice_platform}development files not found, XRandr won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxrandr ${notice_platform}development files not found, XRandr won't be supported.
This is an error since --with-xrandr was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_Xinerama_h" = "yes"
        then
                cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <X11/Xlib.h>
#include <X11/extensions/Xinerama.h>
int
main ()
{
static typeof(XineramaQueryScreens) * func; if (func) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXinerama" >&5
$as_echo_n "checking for -lXinerama... " >&6; }
if ${ac_cv_lib_soname_Xinerama+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXinerama $X_LIBS $X_EXTRA_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 XineramaQueryScreens ();
int
main ()
{
return XineramaQueryScreens ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xinerama=`$ac_cv_path_LDD conftest.exe | grep "Xinerama" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xinerama=`otool -L conftest$ac_exeext | grep "libXinerama\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXinerama\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xinerama=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXinerama\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXinerama\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xinerama:+false} :; then :
  ac_cv_lib_soname_Xinerama=`$LDD conftest$ac_exeext | grep "libXinerama\\.$LIBEXT" | sed -e "s/^.*\(libXinerama\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xinerama:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXINERAMA "$ac_cv_lib_soname_Xinerama"
_ACEOF


fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
        fi
        if test "x$ac_cv_lib_soname_Xinerama" = "x"; then :
  case "x$with_xinerama" in
  x)   as_fn_append wine_notices "|libxinerama ${notice_platform}development files not found, multi-monitor setups won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxinerama ${notice_platform}development files not found, multi-monitor setups won't be supported.
This is an error since --with-xinerama was requested." "$LINENO" 5 ;;
esac
fi

                if test "$ac_cv_header_X11_extensions_Xcomposite_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lXcomposite" >&5
$as_echo_n "checking for -lXcomposite... " >&6; }
if ${ac_cv_lib_soname_Xcomposite+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lXcomposite $X_LIBS $X_EXTRA_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 XCompositeRedirectWindow ();
int
main ()
{
return XCompositeRedirectWindow ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_Xcomposite=`$ac_cv_path_LDD conftest.exe | grep "Xcomposite" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_Xcomposite=`otool -L conftest$ac_exeext | grep "libXcomposite\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libXcomposite\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_Xcomposite=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libXcomposite\\.$LIBEXT" | sed -e "s/^.*\\[\\(libXcomposite\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_Xcomposite:+false} :; then :
  ac_cv_lib_soname_Xcomposite=`$LDD conftest$ac_exeext | grep "libXcomposite\\.$LIBEXT" | sed -e "s/^.*\(libXcomposite\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_Xcomposite:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXCOMPOSITE "$ac_cv_lib_soname_Xcomposite"
_ACEOF


fi
        fi
        if test "x$ac_cv_lib_soname_Xcomposite" = "x"; then :
  case "x$with_xcomposite" in
  x)   as_fn_append wine_notices "|libxcomposite ${notice_platform}development files not found, Xcomposite won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxcomposite ${notice_platform}development files not found, Xcomposite won't be supported.
This is an error since --with-xcomposite was requested." "$LINENO" 5 ;;
esac
fi

                ac_fn_c_check_member "$LINENO" "XICCallback" "callback" "ac_cv_member_XICCallback_callback" "#ifdef HAVE_X11_XLIB_H
#include <X11/Xlib.h>
#endif
"
if test "x$ac_cv_member_XICCallback_callback" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_XICCALLBACK_CALLBACK 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "XEvent" "xcookie" "ac_cv_member_XEvent_xcookie" "#ifdef HAVE_X11_XLIB_H
#include <X11/Xlib.h>
#endif
"
if test "x$ac_cv_member_XEvent_xcookie" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_XEVENT_XCOOKIE 1
_ACEOF


fi



        opengl_msg=""
    if test "x$with_opengl" != "xno"
    then
	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lGL" >&5
$as_echo_n "checking for -lGL... " >&6; }
if ${ac_cv_lib_soname_GL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lGL $X_LIBS -lm $X_EXTRA_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 glXCreateContext ();
int
main ()
{
return glXCreateContext ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_GL=`$ac_cv_path_LDD conftest.exe | grep "GL" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_GL=`otool -L conftest$ac_exeext | grep "libGL\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libGL\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_GL=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libGL\\.$LIBEXT" | sed -e "s/^.*\\[\\(libGL\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_GL:+false} :; then :
  ac_cv_lib_soname_GL=`$LDD conftest$ac_exeext | grep "libGL\\.$LIBEXT" | sed -e "s/^.*\(libGL\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_GL:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lGL" >&5
$as_echo_n "checking for -lGL... " >&6; }
if ${ac_cv_lib_soname_GL+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lGL $X_LIBS -lm $X_EXTRA_LIBS -dylib_file /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib $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 glXCreateContext ();
int
main ()
{
return glXCreateContext ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_GL=`$ac_cv_path_LDD conftest.exe | grep "GL" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_GL=`otool -L conftest$ac_exeext | grep "libGL\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libGL\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_GL=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libGL\\.$LIBEXT" | sed -e "s/^.*\\[\\(libGL\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_GL:+false} :; then :
  ac_cv_lib_soname_GL=`$LDD conftest$ac_exeext | grep "libGL\\.$LIBEXT" | sed -e "s/^.*\(libGL\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_GL:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       if test -f /usr/X11R6/lib/libGL.a
                            then
	                        opengl_msg="/usr/X11R6/lib/libGL.a is present on your system.
This probably prevents linking to OpenGL. Try deleting the file and restarting configure."
                            else
                                opengl_msg="No OpenGL library found on this system."
                            fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_GL" >&5
$as_echo "$ac_cv_lib_soname_GL" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBGL "$ac_cv_lib_soname_GL"
_ACEOF

       OPENGL_LIBS="-Xlinker -dylib_file -Xlinker /System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib:/System/Library/Frameworks/OpenGL.framework/Versions/A/Libraries/libGL.dylib -lGL"
fi
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_GL" >&5
$as_echo "$ac_cv_lib_soname_GL" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBGL "$ac_cv_lib_soname_GL"
_ACEOF

       OPENGL_LIBS="-lGL"
fi
        if test "x$with_glu" != "xno"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gluLookAt in -lGLU" >&5
$as_echo_n "checking for gluLookAt in -lGLU... " >&6; }
if ${ac_cv_lib_GLU_gluLookAt+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lGLU $OPENGL_LIBS $X_LIBS -lm $X_EXTRA_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 gluLookAt ();
int
main ()
{
return gluLookAt ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_GLU_gluLookAt=yes
else
  ac_cv_lib_GLU_gluLookAt=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_GLU_gluLookAt" >&5
$as_echo "$ac_cv_lib_GLU_gluLookAt" >&6; }
if test "x$ac_cv_lib_GLU_gluLookAt" = xyes; then :
  :
fi

            if test "x$ac_cv_lib_GLU_gluLookAt" != xyes; then :
  case "x$with_glu" in
  x)   as_fn_append wine_notices "|libGLU ${notice_platform}development files not found, GLU won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libGLU ${notice_platform}development files not found, GLU won't be supported.
This is an error since --with-glu was requested." "$LINENO" 5 ;;
esac
fi
        fi

        if test "x$with_osmesa" != "xno"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lOSMesa" >&5
$as_echo_n "checking for -lOSMesa... " >&6; }
if ${ac_cv_lib_soname_OSMesa+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lOSMesa $X_LIBS -lm $X_EXTRA_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 glAccum ();
int
main ()
{
return glAccum ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_OSMesa=`$ac_cv_path_LDD conftest.exe | grep "OSMesa" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_OSMesa=`otool -L conftest$ac_exeext | grep "libOSMesa\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libOSMesa\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_OSMesa=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libOSMesa\\.$LIBEXT" | sed -e "s/^.*\\[\\(libOSMesa\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_OSMesa:+false} :; then :
  ac_cv_lib_soname_OSMesa=`$LDD conftest$ac_exeext | grep "libOSMesa\\.$LIBEXT" | sed -e "s/^.*\(libOSMesa\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_OSMesa:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBOSMESA "$ac_cv_lib_soname_OSMesa"
_ACEOF


fi
            if test "x$ac_cv_lib_soname_OSMesa" = "x"; then :
  case "x$with_osmesa" in
  x)   as_fn_append wine_notices "|libOSMesa ${notice_platform}development files not found (or too old), OpenGL rendering in bitmaps won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libOSMesa ${notice_platform}development files not found (or too old), OpenGL rendering in bitmaps won't be supported.
This is an error since --with-osmesa was requested." "$LINENO" 5 ;;
esac
fi
        fi
    fi
    if test -n "$opengl_msg"; then :
  case "x$with_opengl" in
  x)   as_fn_append wine_warnings "|$opengl_msg
OpenGL and Direct3D won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "$opengl_msg
OpenGL and Direct3D won't be supported.
This is an error since --with-opengl was requested." "$LINENO" 5 ;;
esac
fi

    CPPFLAGS="$ac_save_CPPFLAGS"
else
    X_CFLAGS=""
    X_LIBS=""
    enable_winex11_drv=${enable_winex11_drv:-no}
fi
if test "x$X_LIBS" = "x"; then :
  case "x$with_x" in
  xno) ;;
  *)   as_fn_error $? "X ${notice_platform}development files not found. Wine will be built
without X support, which probably isn't what you want. You will need
to install ${notice_platform}development packages of Xlib/Xfree86 at the very least.
Use the --without-x option if you really want this." "$LINENO" 5 ;;
esac
fi

test "x$ac_cv_lib_GLU_gluLookAt" != xyes && enable_glu32=${enable_glu32:-no}

if test "$ac_cv_header_CL_cl_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for clGetPlatformInfo in -lOpenCL" >&5
$as_echo_n "checking for clGetPlatformInfo in -lOpenCL... " >&6; }
if ${ac_cv_lib_OpenCL_clGetPlatformInfo+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lOpenCL  $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 clGetPlatformInfo ();
int
main ()
{
return clGetPlatformInfo ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_OpenCL_clGetPlatformInfo=yes
else
  ac_cv_lib_OpenCL_clGetPlatformInfo=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_OpenCL_clGetPlatformInfo" >&5
$as_echo "$ac_cv_lib_OpenCL_clGetPlatformInfo" >&6; }
if test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" = xyes; then :
  OPENCL_LIBS="-lOpenCL"

fi

fi
if test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" != xyes; then :
  case "x$with_opencl" in
  x)   as_fn_append wine_notices "|OpenCL ${notice_platform}development files not found, OpenCL won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "OpenCL ${notice_platform}development files not found, OpenCL won't be supported.
This is an error since --with-opencl was requested." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_OpenCL_clGetPlatformInfo" != xyes && enable_opencl=${enable_opencl:-no}

if test "$ac_cv_header_pcap_pcap_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcap_create in -lpcap" >&5
$as_echo_n "checking for pcap_create in -lpcap... " >&6; }
if ${ac_cv_lib_pcap_pcap_create+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpcap  $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 pcap_create ();
int
main ()
{
return pcap_create ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_pcap_pcap_create=yes
else
  ac_cv_lib_pcap_pcap_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_pcap_pcap_create" >&5
$as_echo "$ac_cv_lib_pcap_pcap_create" >&6; }
if test "x$ac_cv_lib_pcap_pcap_create" = xyes; then :
  LIBPCAP="-lpcap"

fi

fi
if test "x$ac_cv_lib_pcap_pcap_create" != xyes; then :
  case "x$with_pcap" in
  x)   as_fn_append wine_notices "|pcap ${notice_platform}development files not found, wpcap won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "pcap ${notice_platform}development files not found, wpcap won't be supported.
This is an error since --with-pcap was requested." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_pcap_pcap_create" != xyes && enable_wpcap=${enable_wpcap:-no}


if test "x$with_xml" != "xno"
then
    if ${XML2_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  XML2_CFLAGS=`$PKG_CONFIG --cflags libxml-2.0 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || XML2_CFLAGS=${XML2_CFLAGS:-`xml2-config --cflags 2>/dev/null`}
if ${XML2_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  XML2_LIBS=`$PKG_CONFIG --libs libxml-2.0 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || XML2_LIBS=${XML2_LIBS:-`xml2-config --libs 2>/dev/null`}
XML2_LIBS=${XML2_LIBS:-"-lxml2"}
$as_echo "$as_me:${as_lineno-$LINENO}: libxml-2.0 cflags: $XML2_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libxml-2.0 libs: $XML2_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $XML2_CFLAGS"
for ac_header in libxml/parser.h libxml/xmlsave.h libxml/SAX2.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

fi

done

        if test "$ac_cv_header_libxml_parser_h" = "yes" -a "$ac_cv_header_libxml_xmlsave_h" = "yes" -a "$ac_cv_header_libxml_SAX2_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlParseMemory in -lxml2" >&5
$as_echo_n "checking for xmlParseMemory in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlParseMemory+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlParseMemory ();
int
main ()
{
return xmlParseMemory ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlParseMemory=yes
else
  ac_cv_lib_xml2_xmlParseMemory=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_xml2_xmlParseMemory" >&5
$as_echo "$ac_cv_lib_xml2_xmlParseMemory" >&6; }
if test "x$ac_cv_lib_xml2_xmlParseMemory" = xyes; then :

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

else
  XML2_LIBS=""
fi

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlReadMemory in -lxml2" >&5
$as_echo_n "checking for xmlReadMemory in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlReadMemory+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlReadMemory ();
int
main ()
{
return xmlReadMemory ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlReadMemory=yes
else
  ac_cv_lib_xml2_xmlReadMemory=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_xml2_xmlReadMemory" >&5
$as_echo "$ac_cv_lib_xml2_xmlReadMemory" >&6; }
if test "x$ac_cv_lib_xml2_xmlReadMemory" = xyes; then :

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

fi

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlNewDocPI in -lxml2" >&5
$as_echo_n "checking for xmlNewDocPI in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlNewDocPI+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlNewDocPI ();
int
main ()
{
return xmlNewDocPI ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlNewDocPI=yes
else
  ac_cv_lib_xml2_xmlNewDocPI=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_xml2_xmlNewDocPI" >&5
$as_echo "$ac_cv_lib_xml2_xmlNewDocPI" >&6; }
if test "x$ac_cv_lib_xml2_xmlNewDocPI" = xyes; then :

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

fi

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlSchemaSetParserStructuredErrors in -lxml2" >&5
$as_echo_n "checking for xmlSchemaSetParserStructuredErrors in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlSchemaSetParserStructuredErrors+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlSchemaSetParserStructuredErrors ();
int
main ()
{
return xmlSchemaSetParserStructuredErrors ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlSchemaSetParserStructuredErrors=yes
else
  ac_cv_lib_xml2_xmlSchemaSetParserStructuredErrors=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_xml2_xmlSchemaSetParserStructuredErrors" >&5
$as_echo "$ac_cv_lib_xml2_xmlSchemaSetParserStructuredErrors" >&6; }
if test "x$ac_cv_lib_xml2_xmlSchemaSetParserStructuredErrors" = xyes; then :

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

fi

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlSchemaSetValidStructuredErrors in -lxml2" >&5
$as_echo_n "checking for xmlSchemaSetValidStructuredErrors in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlSchemaSetValidStructuredErrors+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlSchemaSetValidStructuredErrors ();
int
main ()
{
return xmlSchemaSetValidStructuredErrors ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlSchemaSetValidStructuredErrors=yes
else
  ac_cv_lib_xml2_xmlSchemaSetValidStructuredErrors=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_xml2_xmlSchemaSetValidStructuredErrors" >&5
$as_echo "$ac_cv_lib_xml2_xmlSchemaSetValidStructuredErrors" >&6; }
if test "x$ac_cv_lib_xml2_xmlSchemaSetValidStructuredErrors" = xyes; then :

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

fi

            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for xmlFirstElementChild in -lxml2" >&5
$as_echo_n "checking for xmlFirstElementChild in -lxml2... " >&6; }
if ${ac_cv_lib_xml2_xmlFirstElementChild+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lxml2 $XML2_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 xmlFirstElementChild ();
int
main ()
{
return xmlFirstElementChild ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_xml2_xmlFirstElementChild=yes
else
  ac_cv_lib_xml2_xmlFirstElementChild=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_xml2_xmlFirstElementChild" >&5
$as_echo "$ac_cv_lib_xml2_xmlFirstElementChild" >&6; }
if test "x$ac_cv_lib_xml2_xmlFirstElementChild" = xyes; then :

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

fi

            ac_fn_c_check_type "$LINENO" "xmlDocProperties" "ac_cv_type_xmlDocProperties" "#include <libxml/tree.h>
"
if test "x$ac_cv_type_xmlDocProperties" = xyes; then :

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

fi

        else
            XML2_CFLAGS=""
            XML2_LIBS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$XML2_CFLAGS" || XML2_CFLAGS=`echo " $XML2_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$XML2_LIBS" || XML2_LIBS=`echo " $XML2_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "$ac_cv_lib_xml2_xmlParseMemory" != "yes"; then :
  case "x$with_xml" in
  x)   as_fn_append wine_warnings "|libxml2 ${notice_platform}development files not found (or too old), XML won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxml2 ${notice_platform}development files not found (or too old), XML won't be supported.
This is an error since --with-xml was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_xslt" != "xno"
then
    if ${XSLT_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  XSLT_CFLAGS=`$PKG_CONFIG --cflags libxslt 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || XSLT_CFLAGS=${XSLT_CFLAGS:-`xslt-config --cflags 2>/dev/null`}
if ${XSLT_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  XSLT_LIBS=`$PKG_CONFIG --libs libxslt 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || XSLT_LIBS=${XSLT_LIBS:-`xslt-config --libs 2>/dev/null`}
XSLT_LIBS=${XSLT_LIBS:-"-lxml2"}
$as_echo "$as_me:${as_lineno-$LINENO}: libxslt cflags: $XSLT_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libxslt libs: $XSLT_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $XSLT_CFLAGS"
for ac_header in libxslt/pattern.h libxslt/transform.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" "#ifdef HAVE_LIBXSLT_PATTERN_H
# include <libxslt/pattern.h>
#endif
"
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

        if test "$ac_cv_header_libxslt_transform_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lxslt" >&5
$as_echo_n "checking for -lxslt... " >&6; }
if ${ac_cv_lib_soname_xslt+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lxslt $XSLT_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 xsltCompilePattern ();
int
main ()
{
return xsltCompilePattern ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_xslt=`$ac_cv_path_LDD conftest.exe | grep "xslt" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_xslt=`otool -L conftest$ac_exeext | grep "libxslt\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libxslt\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_xslt=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libxslt\\.$LIBEXT" | sed -e "s/^.*\\[\\(libxslt\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_xslt:+false} :; then :
  ac_cv_lib_soname_xslt=`$LDD conftest$ac_exeext | grep "libxslt\\.$LIBEXT" | sed -e "s/^.*\(libxslt\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_xslt:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBXSLT "$ac_cv_lib_soname_xslt"
_ACEOF


fi
        else
            XSLT_CFLAGS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$XSLT_CFLAGS" || XSLT_CFLAGS=`echo " $XSLT_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$XSLT_LIBS" || XSLT_LIBS=`echo " $XSLT_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_xslt" = "x"; then :
  case "x$with_xslt" in
  x)   as_fn_append wine_warnings "|libxslt ${notice_platform}development files not found, xslt won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libxslt ${notice_platform}development files not found, xslt won't be supported.
This is an error since --with-xslt was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_dbus" != "xno"
then
    if ${DBUS_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  DBUS_CFLAGS=`$PKG_CONFIG --cflags dbus-1 2>/dev/null`
fi
fi

if ${DBUS_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  DBUS_LIBS=`$PKG_CONFIG --libs dbus-1 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: dbus-1 cflags: $DBUS_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: dbus-1 libs: $DBUS_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $DBUS_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "dbus/dbus.h" "ac_cv_header_dbus_dbus_h" "$ac_includes_default"
if test "x$ac_cv_header_dbus_dbus_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -ldbus-1" >&5
$as_echo_n "checking for -ldbus-1... " >&6; }
if ${ac_cv_lib_soname_dbus_1+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-ldbus-1 $DBUS_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 dbus_connection_close ();
int
main ()
{
return dbus_connection_close ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_dbus_1=`$ac_cv_path_LDD conftest.exe | grep "dbus-1" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_dbus_1=`otool -L conftest$ac_exeext | grep "libdbus-1\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libdbus-1\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_dbus_1=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libdbus-1\\.$LIBEXT" | sed -e "s/^.*\\[\\(libdbus-1\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_dbus_1:+false} :; then :
  ac_cv_lib_soname_dbus_1=`$LDD conftest$ac_exeext | grep "libdbus-1\\.$LIBEXT" | sed -e "s/^.*\(libdbus-1\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_dbus_1:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       DBUS_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_dbus_1" >&5
$as_echo "$ac_cv_lib_soname_dbus_1" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBDBUS_1 "$ac_cv_lib_soname_dbus_1"
_ACEOF


fi
else
  DBUS_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$DBUS_CFLAGS" || DBUS_CFLAGS=`echo " $DBUS_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$DBUS_LIBS" || DBUS_LIBS=`echo " $DBUS_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_dbus_1" = "x" -a \
                            "x$ac_cv_header_DiskArbitration_DiskArbitration_h" != "xyes"; then :
  case "x$with_dbus" in
  x)   as_fn_append wine_notices "|libdbus ${notice_platform}development files not found, no dynamic device support." ;;
  xno) ;;
  *)   as_fn_error $? "libdbus ${notice_platform}development files not found, no dynamic device support.
This is an error since --with-dbus was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_hal" != "xno" -a "x$ac_cv_lib_soname_dbus_1" != x
then
    if ${HAL_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  HAL_CFLAGS=`$PKG_CONFIG --cflags hal 2>/dev/null`
fi
fi

if ${HAL_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  HAL_LIBS=`$PKG_CONFIG --libs hal 2>/dev/null`
fi
fi

HAL_LIBS=${HAL_LIBS:-"-ldbus-1"}
$as_echo "$as_me:${as_lineno-$LINENO}: hal cflags: $HAL_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: hal libs: $HAL_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $HAL_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "hal/libhal.h" "ac_cv_header_hal_libhal_h" "$ac_includes_default"
if test "x$ac_cv_header_hal_libhal_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lhal" >&5
$as_echo_n "checking for -lhal... " >&6; }
if ${ac_cv_lib_soname_hal+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lhal $HAL_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 libhal_ctx_new ();
int
main ()
{
return libhal_ctx_new ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_hal=`$ac_cv_path_LDD conftest.exe | grep "hal" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_hal=`otool -L conftest$ac_exeext | grep "libhal\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libhal\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_hal=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libhal\\.$LIBEXT" | sed -e "s/^.*\\[\\(libhal\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_hal:+false} :; then :
  ac_cv_lib_soname_hal=`$LDD conftest$ac_exeext | grep "libhal\\.$LIBEXT" | sed -e "s/^.*\(libhal\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_hal:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       HAL_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_hal" >&5
$as_echo "$ac_cv_lib_soname_hal" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBHAL "$ac_cv_lib_soname_hal"
_ACEOF


fi
else
  HAL_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$HAL_CFLAGS" || HAL_CFLAGS=`echo " $HAL_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$HAL_LIBS" || HAL_LIBS=`echo " $HAL_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

    if test "x$ac_cv_lib_soname_hal" = "x" -a \
                               "x$ac_cv_header_DiskArbitration_DiskArbitration_h" != "xyes"; then :
  case "x$with_hal" in
  x)   as_fn_append wine_notices "|libhal ${notice_platform}development files not found, no legacy dynamic device support." ;;
  xno) ;;
  *)   as_fn_error $? "libhal ${notice_platform}development files not found, no legacy dynamic device support.
This is an error since --with-hal was requested." "$LINENO" 5 ;;
esac
fi
fi

if test "x$with_gnutls" != "xno"
then
    if ${GNUTLS_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GNUTLS_CFLAGS=`$PKG_CONFIG --cflags gnutls 2>/dev/null`
fi
fi

if ${GNUTLS_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GNUTLS_LIBS=`$PKG_CONFIG --libs gnutls 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: gnutls cflags: $GNUTLS_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: gnutls libs: $GNUTLS_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $GNUTLS_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "gnutls/gnutls.h" "ac_cv_header_gnutls_gnutls_h" "$ac_includes_default"
if test "x$ac_cv_header_gnutls_gnutls_h" = xyes; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <gnutls/gnutls.h>
#include <gnutls/crypto.h>
int
main ()
{
static typeof(gnutls_mac_get_key_size) *func; if (func) return 0;
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lgnutls" >&5
$as_echo_n "checking for -lgnutls... " >&6; }
if ${ac_cv_lib_soname_gnutls+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lgnutls $GNUTLS_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 gnutls_global_init ();
int
main ()
{
return gnutls_global_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_gnutls=`$ac_cv_path_LDD conftest.exe | grep "gnutls" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_gnutls=`otool -L conftest$ac_exeext | grep "libgnutls\\(-deb0\\)\\{0,1\\}\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libgnutls\\(-deb0\\)\\{0,1\\}\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_gnutls=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libgnutls\\(-deb0\\)\\{0,1\\}\\.$LIBEXT" | sed -e "s/^.*\\[\\(libgnutls\\(-deb0\\)\\{0,1\\}\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_gnutls:+false} :; then :
  ac_cv_lib_soname_gnutls=`$LDD conftest$ac_exeext | grep "libgnutls\\(-deb0\\)\\{0,1\\}\\.$LIBEXT" | sed -e "s/^.*\(libgnutls\\(-deb0\\)\\{0,1\\}\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_gnutls:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       GNUTLS_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_gnutls" >&5
$as_echo "$ac_cv_lib_soname_gnutls" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBGNUTLS "$ac_cv_lib_soname_gnutls"
_ACEOF


fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
else
  GNUTLS_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$GNUTLS_CFLAGS" || GNUTLS_CFLAGS=`echo " $GNUTLS_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$GNUTLS_LIBS" || GNUTLS_LIBS=`echo " $GNUTLS_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_gnutls" = "x"; then :
  case "x$with_gnutls" in
  x)   as_fn_append wine_warnings "|libgnutls ${notice_platform}development files not found, no schannel support." ;;
  xno) ;;
  *)   as_fn_error $? "libgnutls ${notice_platform}development files not found, no schannel support.
This is an error since --with-gnutls was requested." "$LINENO" 5 ;;
esac
fi

CURSES_LIBS=""
if test "$ac_cv_header_ncurses_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lncurses" >&5
$as_echo_n "checking for -lncurses... " >&6; }
if ${ac_cv_lib_soname_ncurses+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lncurses  $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 waddch ();
int
main ()
{
return waddch ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_ncurses=`$ac_cv_path_LDD conftest.exe | grep "ncurses" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_ncurses=`otool -L conftest$ac_exeext | grep "libncursesw\\{0,1\\}\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libncursesw\\{0,1\\}\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_ncurses=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libncursesw\\{0,1\\}\\.$LIBEXT" | sed -e "s/^.*\\[\\(libncursesw\\{0,1\\}\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_ncurses:+false} :; then :
  ac_cv_lib_soname_ncurses=`$LDD conftest$ac_exeext | grep "libncursesw\\{0,1\\}\\.$LIBEXT" | sed -e "s/^.*\(libncursesw\\{0,1\\}\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_ncurses:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBNCURSES "$ac_cv_lib_soname_ncurses"
_ACEOF

       CURSES_LIBS="-lncurses"
fi
elif test "$ac_cv_header_curses_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lcurses" >&5
$as_echo_n "checking for -lcurses... " >&6; }
if ${ac_cv_lib_soname_curses+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lcurses  $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 waddch ();
int
main ()
{
return waddch ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_curses=`$ac_cv_path_LDD conftest.exe | grep "curses" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_curses=`otool -L conftest$ac_exeext | grep "libcurses\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libcurses\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_curses=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libcurses\\.$LIBEXT" | sed -e "s/^.*\\[\\(libcurses\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_curses:+false} :; then :
  ac_cv_lib_soname_curses=`$LDD conftest$ac_exeext | grep "libcurses\\.$LIBEXT" | sed -e "s/^.*\(libcurses\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_curses:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBCURSES "$ac_cv_lib_soname_curses"
_ACEOF

       CURSES_LIBS="-lcurses"
fi
fi
ac_save_LIBS="$LIBS"
LIBS="$LIBS $CURSES_LIBS"
for ac_func in mousemask
do :
  ac_fn_c_check_func "$LINENO" "mousemask" "ac_cv_func_mousemask"
if test "x$ac_cv_func_mousemask" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MOUSEMASK 1
_ACEOF

fi
done

LIBS="$ac_save_LIBS"
if test "x$ac_cv_lib_soname_curses$ac_cv_lib_soname_ncurses" = "x"; then :
  case "x$with_curses" in
  x)   as_fn_append wine_notices "|lib(n)curses ${notice_platform}development files not found, curses won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "lib(n)curses ${notice_platform}development files not found, curses won't be supported.
This is an error since --with-curses was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_sane" != "xno"
then
    if ${SANE_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  SANE_CFLAGS=`$PKG_CONFIG --cflags libsane 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || SANE_CFLAGS=${SANE_CFLAGS:-`sane-config --cflags 2>/dev/null`}
if ${SANE_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  SANE_LIBS=`$PKG_CONFIG --libs libsane 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || SANE_LIBS=${SANE_LIBS:-`sane-config --ldflags 2>/dev/null`}

$as_echo "$as_me:${as_lineno-$LINENO}: libsane cflags: $SANE_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libsane libs: $SANE_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $SANE_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "sane/sane.h" "ac_cv_header_sane_sane_h" "$ac_includes_default"
if test "x$ac_cv_header_sane_sane_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lsane" >&5
$as_echo_n "checking for -lsane... " >&6; }
if ${ac_cv_lib_soname_sane+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lsane $SANE_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 sane_init ();
int
main ()
{
return sane_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_sane=`$ac_cv_path_LDD conftest.exe | grep "sane" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_sane=`otool -L conftest$ac_exeext | grep "libsane\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libsane\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_sane=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libsane\\.$LIBEXT" | sed -e "s/^.*\\[\\(libsane\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_sane:+false} :; then :
  ac_cv_lib_soname_sane=`$LDD conftest$ac_exeext | grep "libsane\\.$LIBEXT" | sed -e "s/^.*\(libsane\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_sane:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       SANE_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_sane" >&5
$as_echo "$ac_cv_lib_soname_sane" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBSANE "$ac_cv_lib_soname_sane"
_ACEOF


fi
else
  SANE_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$SANE_CFLAGS" || SANE_CFLAGS=`echo " $SANE_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$SANE_LIBS" || SANE_LIBS=`echo " $SANE_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_sane" = "x"; then :
  case "x$with_sane" in
  x)   as_fn_append wine_notices "|libsane ${notice_platform}development files not found, scanners won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libsane ${notice_platform}development files not found, scanners won't be supported.
This is an error since --with-sane was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_v4l" != "xno"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lv4l1" >&5
$as_echo_n "checking for -lv4l1... " >&6; }
if ${ac_cv_lib_soname_v4l1+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lv4l1  $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 v4l1_open ();
int
main ()
{
return v4l1_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_v4l1=`$ac_cv_path_LDD conftest.exe | grep "v4l1" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_v4l1=`otool -L conftest$ac_exeext | grep "libv4l1\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libv4l1\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_v4l1=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libv4l1\\.$LIBEXT" | sed -e "s/^.*\\[\\(libv4l1\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_v4l1:+false} :; then :
  ac_cv_lib_soname_v4l1=`$LDD conftest$ac_exeext | grep "libv4l1\\.$LIBEXT" | sed -e "s/^.*\(libv4l1\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_v4l1:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBV4L1 "$ac_cv_lib_soname_v4l1"
_ACEOF


fi
fi
if test "x$ac_cv_lib_soname_v4l1" = "x"; then :
  case "x$with_v4l" in
  x)   as_fn_append wine_notices "|libv4l ${notice_platform}development files not found." ;;
  xno) ;;
  *)   as_fn_error $? "libv4l ${notice_platform}development files not found.
This is an error since --with-v4l was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_gphoto" != "xno"
then
    if ${GPHOTO2_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GPHOTO2_CFLAGS=`$PKG_CONFIG --cflags libgphoto2 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || GPHOTO2_CFLAGS=${GPHOTO2_CFLAGS:-`gphoto2-config --cflags 2>/dev/null`}
if ${GPHOTO2_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GPHOTO2_LIBS=`$PKG_CONFIG --libs libgphoto2 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || GPHOTO2_LIBS=${GPHOTO2_LIBS:-`gphoto2-config --libs 2>/dev/null`}
GPHOTO2_LIBS=${GPHOTO2_LIBS:-"-lgphoto2"}
$as_echo "$as_me:${as_lineno-$LINENO}: libgphoto2 cflags: $GPHOTO2_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libgphoto2 libs: $GPHOTO2_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $GPHOTO2_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "gphoto2-camera.h" "ac_cv_header_gphoto2_camera_h" "$ac_includes_default"
if test "x$ac_cv_header_gphoto2_camera_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gp_camera_new in -lgphoto2" >&5
$as_echo_n "checking for gp_camera_new in -lgphoto2... " >&6; }
if ${ac_cv_lib_gphoto2_gp_camera_new+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgphoto2 $GPHOTO2_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 gp_camera_new ();
int
main ()
{
return gp_camera_new ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gphoto2_gp_camera_new=yes
else
  ac_cv_lib_gphoto2_gp_camera_new=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_gphoto2_gp_camera_new" >&5
$as_echo "$ac_cv_lib_gphoto2_gp_camera_new" >&6; }
if test "x$ac_cv_lib_gphoto2_gp_camera_new" = xyes; then :

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

else
  GPHOTO2_LIBS=""; GPHOTO2_CFLAGS=""
fi

else
  GPHOTO2_LIBS=""; GPHOTO2_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$GPHOTO2_CFLAGS" || GPHOTO2_CFLAGS=`echo " $GPHOTO2_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$GPHOTO2_LIBS" || GPHOTO2_LIBS=`echo " $GPHOTO2_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

    if ${GPHOTO2_PORT_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GPHOTO2_PORT_CFLAGS=`$PKG_CONFIG --cflags libgphoto2_port 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || GPHOTO2_PORT_CFLAGS=${GPHOTO2_PORT_CFLAGS:-`gphoto2-port-config --cflags 2>/dev/null`}
if ${GPHOTO2_PORT_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GPHOTO2_PORT_LIBS=`$PKG_CONFIG --libs libgphoto2_port 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || GPHOTO2_PORT_LIBS=${GPHOTO2_PORT_LIBS:-`gphoto2-port-config --libs 2>/dev/null`}
GPHOTO2_PORT_LIBS=${GPHOTO2_PORT_LIBS:-"-lgphoto2_port"}
$as_echo "$as_me:${as_lineno-$LINENO}: libgphoto2_port cflags: $GPHOTO2_PORT_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libgphoto2_port libs: $GPHOTO2_PORT_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $GPHOTO2_PORT_CFLAGS"
ac_fn_c_check_header_mongrel "$LINENO" "gphoto2-port.h" "ac_cv_header_gphoto2_port_h" "$ac_includes_default"
if test "x$ac_cv_header_gphoto2_port_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gp_port_info_list_new in -lgphoto2_port" >&5
$as_echo_n "checking for gp_port_info_list_new in -lgphoto2_port... " >&6; }
if ${ac_cv_lib_gphoto2_port_gp_port_info_list_new+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgphoto2_port $GPHOTO2_PORT_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 gp_port_info_list_new ();
int
main ()
{
return gp_port_info_list_new ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gphoto2_port_gp_port_info_list_new=yes
else
  ac_cv_lib_gphoto2_port_gp_port_info_list_new=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_gphoto2_port_gp_port_info_list_new" >&5
$as_echo "$ac_cv_lib_gphoto2_port_gp_port_info_list_new" >&6; }
if test "x$ac_cv_lib_gphoto2_port_gp_port_info_list_new" = xyes; then :

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

else
  GPHOTO2_PORT_LIBS=""; GPHOTO2_PORT_CFLAGS=""
fi

else
  GPHOTO2_PORT_LIBS=""; GPHOTO2_PORT_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$GPHOTO2_PORT_CFLAGS" || GPHOTO2_PORT_CFLAGS=`echo " $GPHOTO2_PORT_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$GPHOTO2_PORT_LIBS" || GPHOTO2_PORT_LIBS=`echo " $GPHOTO2_PORT_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "$ac_cv_lib_gphoto2_gp_camera_new" != "yes"; then :
  case "x$with_gphoto" in
  x)   as_fn_append wine_notices "|libgphoto2 ${notice_platform}development files not found, digital cameras won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libgphoto2 ${notice_platform}development files not found, digital cameras won't be supported.
This is an error since --with-gphoto was requested." "$LINENO" 5 ;;
esac
fi
if test "$ac_cv_lib_gphoto2_port_gp_port_info_list_new" != "yes"; then :
  case "x$with_gphoto" in
  x)   as_fn_append wine_notices "|libgphoto2_port ${notice_platform}development files not found, digital cameras won't be auto-detected." ;;
  xno) ;;
  *)   as_fn_error $? "libgphoto2_port ${notice_platform}development files not found, digital cameras won't be auto-detected.
This is an error since --with-gphoto was requested." "$LINENO" 5 ;;
esac
fi


if test "$ac_cv_header_resolv_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolver library" >&5
$as_echo_n "checking for resolver library... " >&6; }
if ${ac_cv_have_resolv+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_save_LIBS="$LIBS"
       for lib in '' -lresolv
       do
         LIBS="$lib $ac_save_LIBS"
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#include <resolv.h>
int
main ()
{
if (!(_res.options & RES_INIT)) res_init(); res_query("foo",ns_c_in,0,0,0)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_resolv=${lib:-"none required"}
else
  ac_cv_have_resolv="not found"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
         test "x$ac_cv_have_resolv" = "xnot found" || break
       done
       LIBS="$ac_save_LIBS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_resolv" >&5
$as_echo "$ac_cv_have_resolv" >&6; }

    case "$ac_cv_have_resolv" in
      "not found") ;;
      "none required")

$as_echo "#define HAVE_RESOLV 1" >>confdefs.h
 ;;
      *)
        $as_echo "#define HAVE_RESOLV 1" >>confdefs.h

        RESOLV_LIBS=$ac_cv_have_resolv
 ;;
    esac
fi

if test "x$with_cms" != "xno"
then
    if ${LCMS2_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  LCMS2_CFLAGS=`$PKG_CONFIG --cflags lcms2 2>/dev/null`
fi
fi

if ${LCMS2_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  LCMS2_LIBS=`$PKG_CONFIG --libs lcms2 2>/dev/null`
fi
fi

LCMS2_LIBS=${LCMS2_LIBS:-"-llcms2"}
$as_echo "$as_me:${as_lineno-$LINENO}: lcms2 cflags: $LCMS2_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: lcms2 libs: $LCMS2_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $LCMS2_CFLAGS"
for ac_header in lcms2.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "lcms2.h" "ac_cv_header_lcms2_h" "$ac_includes_default"
if test "x$ac_cv_header_lcms2_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_LCMS2_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_lcms2_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cmsOpenProfileFromFile in -llcms2" >&5
$as_echo_n "checking for cmsOpenProfileFromFile in -llcms2... " >&6; }
if ${ac_cv_lib_lcms2_cmsOpenProfileFromFile+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-llcms2 $LCMS2_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 cmsOpenProfileFromFile ();
int
main ()
{
return cmsOpenProfileFromFile ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_lcms2_cmsOpenProfileFromFile=yes
else
  ac_cv_lib_lcms2_cmsOpenProfileFromFile=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_lcms2_cmsOpenProfileFromFile" >&5
$as_echo "$ac_cv_lib_lcms2_cmsOpenProfileFromFile" >&6; }
if test "x$ac_cv_lib_lcms2_cmsOpenProfileFromFile" = xyes; then :

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

else
  LCMS2_LIBS=""
fi

        else
            LCMS2_CFLAGS=""
            LCMS2_LIBS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$LCMS2_CFLAGS" || LCMS2_CFLAGS=`echo " $LCMS2_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$LCMS2_LIBS" || LCMS2_LIBS=`echo " $LCMS2_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "$ac_cv_lib_lcms2_cmsOpenProfileFromFile" != "yes"; then :
  case "x$with_cms" in
  x)   as_fn_append wine_notices "|liblcms2 ${notice_platform}development files not found, Color Management won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "liblcms2 ${notice_platform}development files not found, Color Management won't be supported.
This is an error since --with-cms was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_freetype" != "xno"
then
    if ${FREETYPE_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  FREETYPE_CFLAGS=`$PKG_CONFIG --cflags freetype2 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || FREETYPE_CFLAGS=${FREETYPE_CFLAGS:-`(freetype-config --cflags || freetype2-config --cflags) 2>/dev/null`}
if ${FREETYPE_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  FREETYPE_LIBS=`$PKG_CONFIG --libs freetype2 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || FREETYPE_LIBS=${FREETYPE_LIBS:-`(freetype-config --libs || freetype2-config --libs) 2>/dev/null`}
FREETYPE_LIBS=${FREETYPE_LIBS:-"-lfreetype"}
$as_echo "$as_me:${as_lineno-$LINENO}: freetype2 cflags: $FREETYPE_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: freetype2 libs: $FREETYPE_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS"
for ac_header in ft2build.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "ft2build.h" "ac_cv_header_ft2build_h" "$ac_includes_default"
if test "x$ac_cv_header_ft2build_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FT2BUILD_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_ft2build_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lfreetype" >&5
$as_echo_n "checking for -lfreetype... " >&6; }
if ${ac_cv_lib_soname_freetype+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lfreetype $FREETYPE_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 FT_Init_FreeType ();
int
main ()
{
return FT_Init_FreeType ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_freetype=`$ac_cv_path_LDD conftest.exe | grep "freetype" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_freetype=`otool -L conftest$ac_exeext | grep "libfreetype\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libfreetype\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_freetype=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libfreetype\\.$LIBEXT" | sed -e "s/^.*\\[\\(libfreetype\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_freetype:+false} :; then :
  ac_cv_lib_soname_freetype=`$LDD conftest$ac_exeext | grep "libfreetype\\.$LIBEXT" | sed -e "s/^.*\(libfreetype\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_freetype:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       FREETYPE_LIBS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_freetype" >&5
$as_echo "$ac_cv_lib_soname_freetype" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBFREETYPE "$ac_cv_lib_soname_freetype"
_ACEOF


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

                 ac_fn_c_check_type "$LINENO" "FT_TrueTypeEngineType" "ac_cv_type_FT_TrueTypeEngineType" "#include <ft2build.h>
#include FT_MODULE_H
"
if test "x$ac_cv_type_FT_TrueTypeEngineType" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_FT_TRUETYPEENGINETYPE 1
_ACEOF


fi

fi
        else
            FREETYPE_CFLAGS=""
            FREETYPE_LIBS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$FREETYPE_CFLAGS" || FREETYPE_CFLAGS=`echo " $FREETYPE_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$FREETYPE_LIBS" || FREETYPE_LIBS=`echo " $FREETYPE_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_freetype" = x; then :
  case "x$with_freetype" in
  xno) ;;
  *)   as_fn_error $? "FreeType ${notice_platform}development files not found. Fonts will not be built.
Use the --without-freetype option if you really want this." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_soname_freetype" = x && enable_fonts=${enable_fonts:-no}

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for parport header/ppdev.h" >&5
$as_echo_n "checking for parport header/ppdev.h... " >&6; }
if ${ac_cv_c_ppdev+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef HAVE_SYS_IOCTL_H
# include <sys/ioctl.h>
#endif
#include <linux/ppdev.h>
int
main ()
{
ioctl (1,PPCLAIM,0)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_ppdev="yes"
else
  ac_cv_c_ppdev="no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_ppdev" >&5
$as_echo "$ac_cv_c_ppdev" >&6; }
if test "$ac_cv_c_ppdev" = "yes"
then

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

fi

ac_wine_check_funcs_save_LIBS="$LIBS"
LIBS="$LIBS $PTHREAD_LIBS"
for ac_func in \
        pthread_attr_get_np \
        pthread_getattr_np \
        pthread_getthreadid_np \
        pthread_get_stackaddr_np \
        pthread_get_stacksize_np
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

LIBS="$ac_wine_check_funcs_save_LIBS"

if test "$ac_cv_header_zlib_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inflate in -lz" >&5
$as_echo_n "checking for inflate in -lz... " >&6; }
if ${ac_cv_lib_z_inflate+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lz  $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 inflate ();
int
main ()
{
return inflate ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_z_inflate=yes
else
  ac_cv_lib_z_inflate=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_z_inflate" >&5
$as_echo "$ac_cv_lib_z_inflate" >&6; }
if test "x$ac_cv_lib_z_inflate" = xyes; then :

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

                            Z_LIBS="-lz"

fi

fi
if test "x$Z_LIBS" = "x"; then :
  case "x$with_zlib" in
  x)   as_fn_append wine_notices "|libz ${notice_platform}development files not found, data compression won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libz ${notice_platform}development files not found, data compression won't be supported.
This is an error since --with-zlib was requested." "$LINENO" 5 ;;
esac
fi

if test "x$enable_tools" != xno
then
    if test "$ac_cv_header_gettext_po_h" = "yes"
    then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for po_message_msgctxt in -lgettextpo" >&5
$as_echo_n "checking for po_message_msgctxt in -lgettextpo... " >&6; }
if ${ac_cv_lib_gettextpo_po_message_msgctxt+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgettextpo  $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 po_message_msgctxt ();
int
main ()
{
return po_message_msgctxt ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gettextpo_po_message_msgctxt=yes
else
  ac_cv_lib_gettextpo_po_message_msgctxt=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_gettextpo_po_message_msgctxt" >&5
$as_echo "$ac_cv_lib_gettextpo_po_message_msgctxt" >&6; }
if test "x$ac_cv_lib_gettextpo_po_message_msgctxt" = xyes; then :

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

                      GETTEXTPO_LIBS="-lgettextpo"

fi

    fi
    test "x$with_gettextpo" != xyes || if test "x$GETTEXTPO_LIBS" = "x"; then :
  case "x$with_gettextpo" in
  x)   as_fn_append wine_notices "|GetText ${notice_platform}development files not found (or too old), po files can't be rebuilt." ;;
  xno) ;;
  *)   as_fn_error $? "GetText ${notice_platform}development files not found (or too old), po files can't be rebuilt.
This is an error since --with-gettextpo was requested." "$LINENO" 5 ;;
esac
fi
fi

if test "x$with_gstreamer" != "xno"
then
    if ${GSTREAMER_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GSTREAMER_CFLAGS=`$PKG_CONFIG --cflags gstreamer-app-0.10 2>/dev/null`
fi
fi

if ${GSTREAMER_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  GSTREAMER_LIBS=`$PKG_CONFIG --libs gstreamer-app-0.10 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: gstreamer-app-0.10 cflags: $GSTREAMER_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: gstreamer-app-0.10 libs: $GSTREAMER_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $GSTREAMER_CFLAGS"
ac_gst_incl=""
        for i in $GSTREAMER_CFLAGS
        do
            case "$i" in
                -I*) ac_gst_incl="$ac_gst_incl $i";;
            esac
        done
        GSTREAMER_CFLAGS=$ac_gst_incl
        CPPFLAGS="$ac_save_CPPFLAGS $GSTREAMER_CFLAGS"
        ac_fn_c_check_header_mongrel "$LINENO" "gst/gstpad.h" "ac_cv_header_gst_gstpad_h" "$ac_includes_default"
if test "x$ac_cv_header_gst_gstpad_h" = xyes; then :
  ac_fn_c_check_header_mongrel "$LINENO" "gst/app/gstappsink.h" "ac_cv_header_gst_app_gstappsink_h" "$ac_includes_default"
if test "x$ac_cv_header_gst_app_gstappsink_h" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether gint64 defined by gst/app/gstappsink.h is indeed 64-bit" >&5
$as_echo_n "checking whether gint64 defined by gst/app/gstappsink.h is indeed 64-bit... " >&6; }
                  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <gst/app/gstappsink.h>
int
main ()
{
static int a[sizeof(gint64) > 4 ? 1 : -1]; if (a[0]) return 0;
  ;
  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; }
                     { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gst_pad_get_caps_reffed in -lgstreamer-0.10" >&5
$as_echo_n "checking for gst_pad_get_caps_reffed in -lgstreamer-0.10... " >&6; }
if ${ac_cv_lib_gstreamer_0_10_gst_pad_get_caps_reffed+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgstreamer-0.10  $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 gst_pad_get_caps_reffed ();
int
main ()
{
return gst_pad_get_caps_reffed ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gstreamer_0_10_gst_pad_get_caps_reffed=yes
else
  ac_cv_lib_gstreamer_0_10_gst_pad_get_caps_reffed=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_gstreamer_0_10_gst_pad_get_caps_reffed" >&5
$as_echo "$ac_cv_lib_gstreamer_0_10_gst_pad_get_caps_reffed" >&6; }
if test "x$ac_cv_lib_gstreamer_0_10_gst_pad_get_caps_reffed" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gst_app_buffer_new in -lgstapp-0.10" >&5
$as_echo_n "checking for gst_app_buffer_new in -lgstapp-0.10... " >&6; }
if ${ac_cv_lib_gstapp_0_10_gst_app_buffer_new+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lgstapp-0.10 $GSTREAMER_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 gst_app_buffer_new ();
int
main ()
{
return gst_app_buffer_new ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_gstapp_0_10_gst_app_buffer_new=yes
else
  ac_cv_lib_gstapp_0_10_gst_app_buffer_new=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_gstapp_0_10_gst_app_buffer_new" >&5
$as_echo "$ac_cv_lib_gstapp_0_10_gst_app_buffer_new" >&6; }
if test "x$ac_cv_lib_gstapp_0_10_gst_app_buffer_new" = xyes; then :
  :
fi

fi

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


else
  GSTREAMER_CFLAGS=""
fi


CPPFLAGS=$ac_save_CPPFLAGS
test -z "$GSTREAMER_CFLAGS" || GSTREAMER_CFLAGS=`echo " $GSTREAMER_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$GSTREAMER_LIBS" || GSTREAMER_LIBS=`echo " $GSTREAMER_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_gstapp_0_10_gst_app_buffer_new" != xyes -a "x$ac_cv_header_QuickTime_ImageCompression_h" != xyes; then :
  case "x$with_gstreamer" in
  x)   as_fn_append wine_notices "|gstreamer-0.10 base plugins ${notice_platform}development files not found, gstreamer support disabled" ;;
  xno) ;;
  *)   as_fn_error $? "gstreamer-0.10 base plugins ${notice_platform}development files not found, gstreamer support disabled
This is an error since --with-gstreamer was requested." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_gstapp_0_10_gst_app_buffer_new" = xyes || enable_winegstreamer=${enable_winegstreamer:-no}

ALSA_LIBS=""

if test "$ac_cv_header_sys_asoundlib_h" = "yes" -o "$ac_cv_header_alsa_asoundlib_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for snd_pcm_hw_params_get_access_mask in -lasound" >&5
$as_echo_n "checking for snd_pcm_hw_params_get_access_mask in -lasound... " >&6; }
if ${ac_cv_lib_asound_snd_pcm_hw_params_get_access_mask+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lasound  $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 snd_pcm_hw_params_get_access_mask ();
int
main ()
{
return snd_pcm_hw_params_get_access_mask ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_asound_snd_pcm_hw_params_get_access_mask=yes
else
  ac_cv_lib_asound_snd_pcm_hw_params_get_access_mask=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_asound_snd_pcm_hw_params_get_access_mask" >&5
$as_echo "$ac_cv_lib_asound_snd_pcm_hw_params_get_access_mask" >&6; }
if test "x$ac_cv_lib_asound_snd_pcm_hw_params_get_access_mask" = xyes; then :
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifdef HAVE_ALSA_ASOUNDLIB_H
#include <alsa/asoundlib.h>
#elif defined(HAVE_SYS_ASOUNDLIB_H)
#include <sys/asoundlib.h>
#endif
int
main ()
{
snd_pcm_hw_params_get_access_mask(NULL, NULL)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ALSA_LIBS="-lasound"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi

fi

if test "x$with_oss" != xno
then
    ac_save_CPPFLAGS="$CPPFLAGS"
    if test -f /etc/oss.conf
    then
        . /etc/oss.conf
    fi
    ac_oss_incl="-I${OSSLIBDIR:-/usr/lib/oss}/include"
    CPPFLAGS="$CPPFLAGS $ac_oss_incl"
    ac_fn_c_check_header_mongrel "$LINENO" "sys/soundcard.h" "ac_cv_header_sys_soundcard_h" "$ac_includes_default"
if test "x$ac_cv_header_sys_soundcard_h" = xyes; then :
  ac_fn_c_check_member "$LINENO" "oss_sysinfo" "numaudioengines" "ac_cv_member_oss_sysinfo_numaudioengines" "#include <sys/soundcard.h>
"
if test "x$ac_cv_member_oss_sysinfo_numaudioengines" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_OSS_SYSINFO_NUMAUDIOENGINES 1
_ACEOF

OSS4_CFLAGS="$ac_oss_incl"

fi

fi


    CPPFLAGS="$ac_save_CPPFLAGS"
    if test "x$ac_cv_member_oss_sysinfo_numaudioengines" != xyes
    then
        as_fn_append wine_notices "|OSS sound system found but too old (OSSv4 needed), OSS won't be supported."
    fi
fi

if test "x$with_capi" != "xno"
then
    if ${CAPI20_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  CAPI20_CFLAGS=`$PKG_CONFIG --cflags capi20 2>/dev/null`
fi
fi

if ${CAPI20_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  CAPI20_LIBS=`$PKG_CONFIG --libs capi20 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: capi20 cflags: $CAPI20_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: capi20 libs: $CAPI20_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $CAPI20_CFLAGS"
    for ac_header in capi20.h linux/capi.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" "#define __user
"
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

    if test "$ac_cv_header_capi20_h" = "yes" -a "$ac_cv_header_linux_capi_h" = "yes"
    then
        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lcapi20" >&5
$as_echo_n "checking for -lcapi20... " >&6; }
if ${ac_cv_lib_soname_capi20+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lcapi20 $CAPI20_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 capi20_register ();
int
main ()
{
return capi20_register ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_capi20=`$ac_cv_path_LDD conftest.exe | grep "capi20" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_capi20=`otool -L conftest$ac_exeext | grep "libcapi20\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libcapi20\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_capi20=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libcapi20\\.$LIBEXT" | sed -e "s/^.*\\[\\(libcapi20\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_capi20:+false} :; then :
  ac_cv_lib_soname_capi20=`$LDD conftest$ac_exeext | grep "libcapi20\\.$LIBEXT" | sed -e "s/^.*\(libcapi20\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_capi20:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBCAPI20 "$ac_cv_lib_soname_capi20"
_ACEOF


fi
    fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$CAPI20_CFLAGS" || CAPI20_CFLAGS=`echo " $CAPI20_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$CAPI20_LIBS" || CAPI20_LIBS=`echo " $CAPI20_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_capi20" = "x"; then :
  case "x$with_capi" in
  x)   as_fn_append wine_notices "|libcapi20 ${notice_platform}development files not found, ISDN won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libcapi20 ${notice_platform}development files not found, ISDN won't be supported.
This is an error since --with-capi was requested." "$LINENO" 5 ;;
esac
fi

CUPS_CFLAGS=""

if test "x$with_cups" != "xno"
then
    ac_save_CPPFLAGS="$CPPFLAGS"
    ac_cups_cflags=`cups-config --cflags 2>/dev/null`
    ac_cups_libs=`cups-config --ldflags 2>/dev/null`
    CPPFLAGS="$CPPFLAGS $ac_cups_cflags"
    for ac_header in cups/cups.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "cups/cups.h" "ac_cv_header_cups_cups_h" "$ac_includes_default"
if test "x$ac_cv_header_cups_cups_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_CUPS_CUPS_H 1
_ACEOF
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lcups" >&5
$as_echo_n "checking for -lcups... " >&6; }
if ${ac_cv_lib_soname_cups+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lcups $ac_cups_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 cupsGetDefault ();
int
main ()
{
return cupsGetDefault ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_cups=`$ac_cv_path_LDD conftest.exe | grep "cups" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_cups=`otool -L conftest$ac_exeext | grep "libcups\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libcups\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_cups=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libcups\\.$LIBEXT" | sed -e "s/^.*\\[\\(libcups\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_cups:+false} :; then :
  ac_cv_lib_soname_cups=`$LDD conftest$ac_exeext | grep "libcups\\.$LIBEXT" | sed -e "s/^.*\(libcups\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_cups:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBCUPS "$ac_cv_lib_soname_cups"
_ACEOF

       CUPS_CFLAGS="$ac_cups_cflags"
fi
fi

done

    CPPFLAGS="$ac_save_CPPFLAGS"
fi
if test "x$ac_cv_lib_soname_cups" = "x"; then :
  case "x$with_cups" in
  x)   as_fn_append wine_notices "|libcups ${notice_platform}development files not found, CUPS won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libcups ${notice_platform}development files not found, CUPS won't be supported.
This is an error since --with-cups was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_fontconfig" != "xno"
then
    if ${FONTCONFIG_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  FONTCONFIG_CFLAGS=`$PKG_CONFIG --cflags fontconfig 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || FONTCONFIG_CFLAGS=${FONTCONFIG_CFLAGS:-$X_CFLAGS}
if ${FONTCONFIG_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  FONTCONFIG_LIBS=`$PKG_CONFIG --libs fontconfig 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || FONTCONFIG_LIBS=${FONTCONFIG_LIBS:-$X_LIBS}

$as_echo "$as_me:${as_lineno-$LINENO}: fontconfig cflags: $FONTCONFIG_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: fontconfig libs: $FONTCONFIG_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $FONTCONFIG_CFLAGS"
for ac_header in fontconfig/fontconfig.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "fontconfig/fontconfig.h" "ac_cv_header_fontconfig_fontconfig_h" "$ac_includes_default"
if test "x$ac_cv_header_fontconfig_fontconfig_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_FONTCONFIG_FONTCONFIG_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_fontconfig_fontconfig_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lfontconfig" >&5
$as_echo_n "checking for -lfontconfig... " >&6; }
if ${ac_cv_lib_soname_fontconfig+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lfontconfig $FONTCONFIG_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 FcInit ();
int
main ()
{
return FcInit ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_fontconfig=`$ac_cv_path_LDD conftest.exe | grep "fontconfig" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_fontconfig=`otool -L conftest$ac_exeext | grep "libfontconfig\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libfontconfig\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_fontconfig=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libfontconfig\\.$LIBEXT" | sed -e "s/^.*\\[\\(libfontconfig\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_fontconfig:+false} :; then :
  ac_cv_lib_soname_fontconfig=`$LDD conftest$ac_exeext | grep "libfontconfig\\.$LIBEXT" | sed -e "s/^.*\(libfontconfig\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_fontconfig:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       FONTCONFIG_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_fontconfig" >&5
$as_echo "$ac_cv_lib_soname_fontconfig" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBFONTCONFIG "$ac_cv_lib_soname_fontconfig"
_ACEOF


fi
        else
            FONTCONFIG_CFLAGS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$FONTCONFIG_CFLAGS" || FONTCONFIG_CFLAGS=`echo " $FONTCONFIG_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$FONTCONFIG_LIBS" || FONTCONFIG_LIBS=`echo " $FONTCONFIG_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_fontconfig" = "x"; then :
  case "x$with_fontconfig" in
  x)   as_fn_append wine_notices "|fontconfig ${notice_platform}development files not found, fontconfig won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "fontconfig ${notice_platform}development files not found, fontconfig won't be supported.
This is an error since --with-fontconfig was requested." "$LINENO" 5 ;;
esac
fi

if test "$ac_cv_header_gsm_h" = "yes" -o "$ac_cv_header_gsm_gsm_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lgsm" >&5
$as_echo_n "checking for -lgsm... " >&6; }
if ${ac_cv_lib_soname_gsm+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_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 :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_gsm=`$ac_cv_path_LDD conftest.exe | grep "gsm" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_gsm=`otool -L conftest$ac_exeext | grep "libgsm\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libgsm\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_gsm=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libgsm\\.$LIBEXT" | sed -e "s/^.*\\[\\(libgsm\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_gsm:+false} :; then :
  ac_cv_lib_soname_gsm=`$LDD conftest$ac_exeext | grep "libgsm\\.$LIBEXT" | sed -e "s/^.*\(libgsm\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_gsm:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBGSM "$ac_cv_lib_soname_gsm"
_ACEOF


fi
fi
if test "x$ac_cv_lib_soname_gsm" = "x"; then :
  case "x$with_gsm" in
  x)   as_fn_append wine_notices "|libgsm ${notice_platform}development files not found, gsm 06.10 codec won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libgsm ${notice_platform}development files not found, gsm 06.10 codec won't be supported.
This is an error since --with-gsm was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_jpeg" != "xno"
then
    if ${JPEG_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  JPEG_CFLAGS=`$PKG_CONFIG --cflags libjpeg 2>/dev/null`
fi
fi

if ${JPEG_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  JPEG_LIBS=`$PKG_CONFIG --libs libjpeg 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: libjpeg cflags: $JPEG_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libjpeg libs: $JPEG_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $JPEG_CFLAGS"
for ac_header in jpeglib.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "jpeglib.h" "ac_cv_header_jpeglib_h" "$ac_includes_default"
if test "x$ac_cv_header_jpeglib_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_JPEGLIB_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_jpeglib_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -ljpeg" >&5
$as_echo_n "checking for -ljpeg... " >&6; }
if ${ac_cv_lib_soname_jpeg+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-ljpeg $JPEG_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 jpeg_start_decompress ();
int
main ()
{
return jpeg_start_decompress ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_jpeg=`$ac_cv_path_LDD conftest.exe | grep "jpeg" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_jpeg=`otool -L conftest$ac_exeext | grep "libjpeg\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libjpeg\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_jpeg=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libjpeg\\.$LIBEXT" | sed -e "s/^.*\\[\\(libjpeg\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_jpeg:+false} :; then :
  ac_cv_lib_soname_jpeg=`$LDD conftest$ac_exeext | grep "libjpeg\\.$LIBEXT" | sed -e "s/^.*\(libjpeg\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_jpeg:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       JPEG_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_jpeg" >&5
$as_echo "$ac_cv_lib_soname_jpeg" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBJPEG "$ac_cv_lib_soname_jpeg"
_ACEOF


fi
        else
            JPEG_CFLAGS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$JPEG_CFLAGS" || JPEG_CFLAGS=`echo " $JPEG_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$JPEG_LIBS" || JPEG_LIBS=`echo " $JPEG_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_jpeg" = "x"; then :
  case "x$with_jpeg" in
  x)   as_fn_append wine_warnings "|libjpeg ${notice_platform}development files not found, JPEG won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libjpeg ${notice_platform}development files not found, JPEG won't be supported.
This is an error since --with-jpeg was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_png" != "xno"
then
    if ${PNG_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  PNG_CFLAGS=`$PKG_CONFIG --cflags libpng 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || PNG_CFLAGS=${PNG_CFLAGS:-$X_CFLAGS}
if ${PNG_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  PNG_LIBS=`$PKG_CONFIG --libs libpng 2>/dev/null`
fi
fi
test "$cross_compiling" = yes || PNG_LIBS=${PNG_LIBS:-$X_LIBS}

$as_echo "$as_me:${as_lineno-$LINENO}: libpng cflags: $PNG_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libpng libs: $PNG_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $PNG_CFLAGS"
for ac_header in png.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default"
if test "x$ac_cv_header_png_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_PNG_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_png_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lpng" >&5
$as_echo_n "checking for -lpng... " >&6; }
if ${ac_cv_lib_soname_png+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lpng $PNG_LIBS -lm -lz $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 png_create_read_struct ();
int
main ()
{
return png_create_read_struct ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_png=`$ac_cv_path_LDD conftest.exe | grep "png" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_png=`otool -L conftest$ac_exeext | grep "libpng[0-9]*\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libpng[0-9]*\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_png=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libpng[0-9]*\\.$LIBEXT" | sed -e "s/^.*\\[\\(libpng[0-9]*\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_png:+false} :; then :
  ac_cv_lib_soname_png=`$LDD conftest$ac_exeext | grep "libpng[0-9]*\\.$LIBEXT" | sed -e "s/^.*\(libpng[0-9]*\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_png:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       PNG_CFLAGS=""
else
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_soname_png" >&5
$as_echo "$ac_cv_lib_soname_png" >&6; }

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBPNG "$ac_cv_lib_soname_png"
_ACEOF

       cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <png.h>
int
main ()
{
typeof(png_set_expand_gray_1_2_4_to_8) *p
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :

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

fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
        else
            PNG_CFLAGS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$PNG_CFLAGS" || PNG_CFLAGS=`echo " $PNG_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$PNG_LIBS" || PNG_LIBS=`echo " $PNG_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_png" = "x"; then :
  case "x$with_png" in
  x)   as_fn_append wine_warnings "|libpng ${notice_platform}development files not found, PNG won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libpng ${notice_platform}development files not found, PNG won't be supported.
This is an error since --with-png was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_tiff" != "xno"
then
    if ${TIFF_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  TIFF_CFLAGS=`$PKG_CONFIG --cflags libtiff 2>/dev/null`
fi
fi

if ${TIFF_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  TIFF_LIBS=`$PKG_CONFIG --libs libtiff 2>/dev/null`
fi
fi


$as_echo "$as_me:${as_lineno-$LINENO}: libtiff cflags: $TIFF_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libtiff libs: $TIFF_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $TIFF_CFLAGS"
for ac_header in tiffio.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "tiffio.h" "ac_cv_header_tiffio_h" "$ac_includes_default"
if test "x$ac_cv_header_tiffio_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_TIFFIO_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_tiffio_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -ltiff" >&5
$as_echo_n "checking for -ltiff... " >&6; }
if ${ac_cv_lib_soname_tiff+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-ltiff $TIFF_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 TIFFClientOpen ();
int
main ()
{
return TIFFClientOpen ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_tiff=`$ac_cv_path_LDD conftest.exe | grep "tiff" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_tiff=`otool -L conftest$ac_exeext | grep "libtiff\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libtiff\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_tiff=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libtiff\\.$LIBEXT" | sed -e "s/^.*\\[\\(libtiff\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_tiff:+false} :; then :
  ac_cv_lib_soname_tiff=`$LDD conftest$ac_exeext | grep "libtiff\\.$LIBEXT" | sed -e "s/^.*\(libtiff\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_tiff:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBTIFF "$ac_cv_lib_soname_tiff"
_ACEOF


fi
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$TIFF_CFLAGS" || TIFF_CFLAGS=`echo " $TIFF_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$TIFF_LIBS" || TIFF_LIBS=`echo " $TIFF_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_soname_tiff" = "x"; then :
  case "x$with_tiff" in
  x)   as_fn_append wine_notices "|libtiff ${notice_platform}development files not found, TIFF won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libtiff ${notice_platform}development files not found, TIFF won't be supported.
This is an error since --with-tiff was requested." "$LINENO" 5 ;;
esac
fi

if test "x$with_mpg123" != "xno"
then
    if ${MPG123_CFLAGS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  MPG123_CFLAGS=`$PKG_CONFIG --cflags libmpg123 2>/dev/null`
fi
fi

if ${MPG123_LIBS:+false} :; then :
  if ${PKG_CONFIG+:} false; then :
  MPG123_LIBS=`$PKG_CONFIG --libs libmpg123 2>/dev/null`
fi
fi

MPG123_LIBS=${MPG123_LIBS:-"-lmpg123"}
$as_echo "$as_me:${as_lineno-$LINENO}: libmpg123 cflags: $MPG123_CFLAGS" >&5
$as_echo "$as_me:${as_lineno-$LINENO}: libmpg123 libs: $MPG123_LIBS" >&5
ac_save_CPPFLAGS=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $MPG123_CFLAGS"
for ac_header in mpg123.h
do :
  ac_fn_c_check_header_mongrel "$LINENO" "mpg123.h" "ac_cv_header_mpg123_h" "$ac_includes_default"
if test "x$ac_cv_header_mpg123_h" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_MPG123_H 1
_ACEOF

fi

done

        if test "$ac_cv_header_mpg123_h" = "yes"
        then
            { $as_echo "$as_me:${as_lineno-$LINENO}: checking for mpg123_feed in -lmpg123" >&5
$as_echo_n "checking for mpg123_feed in -lmpg123... " >&6; }
if ${ac_cv_lib_mpg123_mpg123_feed+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lmpg123 $MPG123_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 mpg123_feed ();
int
main ()
{
return mpg123_feed ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_mpg123_mpg123_feed=yes
else
  ac_cv_lib_mpg123_mpg123_feed=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_mpg123_mpg123_feed" >&5
$as_echo "$ac_cv_lib_mpg123_mpg123_feed" >&6; }
if test "x$ac_cv_lib_mpg123_mpg123_feed" = xyes; then :
  :
else
  MPG123_LIBS=""
fi

        else
            MPG123_CFLAGS=""
            MPG123_LIBS=""
        fi
CPPFLAGS=$ac_save_CPPFLAGS
test -z "$MPG123_CFLAGS" || MPG123_CFLAGS=`echo " $MPG123_CFLAGS" | sed 's/ -I\([^/]\)/ -I\$(top_builddir)\/\1/g'`
test -z "$MPG123_LIBS" || MPG123_LIBS=`echo " $MPG123_LIBS" | sed 's/ -L\([^/]\)/ -L\$(top_builddir)\/\1/g'`

fi
if test "x$ac_cv_lib_mpg123_mpg123_feed" != xyes -a x"$ac_cv_header_CoreAudio_CoreAudio_h" != xyes; then :
  case "x$with_mpg123" in
  x)   as_fn_append wine_notices "|libmpg123 ${notice_platform}development files not found (or too old), mp3 codec won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libmpg123 ${notice_platform}development files not found (or too old), mp3 codec won't be supported.
This is an error since --with-mpg123 was requested." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_mpg123_mpg123_feed" = xyes -o "x$ac_cv_header_AudioToolbox_AudioConverter_h" = xyes || enable_winemp3_acm=${enable_winemp3_acm:-no}

if test "$ac_cv_header_AL_al_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lopenal" >&5
$as_echo_n "checking for -lopenal... " >&6; }
if ${ac_cv_lib_soname_openal+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lopenal  $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 alGetSource3i ();
int
main ()
{
return alGetSource3i ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_openal=`$ac_cv_path_LDD conftest.exe | grep "openal" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_openal=`otool -L conftest$ac_exeext | grep "libopenal\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libopenal\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_openal=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libopenal\\.$LIBEXT" | sed -e "s/^.*\\[\\(libopenal\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_openal:+false} :; then :
  ac_cv_lib_soname_openal=`$LDD conftest$ac_exeext | grep "libopenal\\.$LIBEXT" | sed -e "s/^.*\(libopenal\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_openal:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBOPENAL "$ac_cv_lib_soname_openal"
_ACEOF

       OPENAL_LIBS="-lopenal"

                      ac_cv_lib_openal=yes

cat >>confdefs.h <<_ACEOF
#define HAVE_OPENAL 1
_ACEOF

fi
fi
if test "x$ac_cv_lib_openal" != xyes; then :
  case "x$with_openal" in
  x)   as_fn_append wine_notices "|libopenal ${notice_platform}development files not found (or too old), OpenAL won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libopenal ${notice_platform}development files not found (or too old), OpenAL won't be supported.
This is an error since --with-openal was requested." "$LINENO" 5 ;;
esac
fi
test "x$ac_cv_lib_openal" = xyes || enable_openal32=${enable_openal32:-no}

if test "$ac_cv_header_kstat_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for kstat_open in -lkstat" >&5
$as_echo_n "checking for kstat_open in -lkstat... " >&6; }
if ${ac_cv_lib_kstat_kstat_open+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lkstat  $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 kstat_open ();
int
main ()
{
return kstat_open ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_kstat_kstat_open=yes
else
  ac_cv_lib_kstat_kstat_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_kstat_kstat_open" >&5
$as_echo "$ac_cv_lib_kstat_kstat_open" >&6; }
if test "x$ac_cv_lib_kstat_kstat_open" = xyes; then :

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

                  KSTAT_LIBS="-lkstat"

fi

fi

if test "$ac_cv_header_libprocstat_h" = "yes"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for procstat_open_sysctl in -lprocstat" >&5
$as_echo_n "checking for procstat_open_sysctl in -lprocstat... " >&6; }
if ${ac_cv_lib_procstat_procstat_open_sysctl+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lprocstat  $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 procstat_open_sysctl ();
int
main ()
{
return procstat_open_sysctl ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_procstat_procstat_open_sysctl=yes
else
  ac_cv_lib_procstat_procstat_open_sysctl=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_procstat_procstat_open_sysctl" >&5
$as_echo "$ac_cv_lib_procstat_procstat_open_sysctl" >&6; }
if test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes; then :

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

                  PROCSTAT_LIBS="-lprocstat"

fi

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lodbc" >&5
$as_echo_n "checking for -lodbc... " >&6; }
if ${ac_cv_lib_soname_odbc+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lodbc  $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 SQLConnect ();
int
main ()
{
return SQLConnect ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_odbc=`$ac_cv_path_LDD conftest.exe | grep "odbc" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_odbc=`otool -L conftest$ac_exeext | grep "libodbc\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libodbc\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_odbc=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libodbc\\.$LIBEXT" | sed -e "s/^.*\\[\\(libodbc\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_odbc:+false} :; then :
  ac_cv_lib_soname_odbc=`$LDD conftest$ac_exeext | grep "libodbc\\.$LIBEXT" | sed -e "s/^.*\(libodbc\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_odbc:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       cat >>confdefs.h <<_ACEOF
#define SONAME_LIBODBC "libodbc.$LIBEXT"
_ACEOF

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBODBC "$ac_cv_lib_soname_odbc"
_ACEOF


fi

if test "x$with_netapi" != "xno"
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -lnetapi" >&5
$as_echo_n "checking for -lnetapi... " >&6; }
if ${ac_cv_lib_soname_netapi+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_soname_save_LIBS=$LIBS
LIBS="-lnetapi  $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 libnetapi_init ();
int
main ()
{
return libnetapi_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  case "$LIBEXT" in
    dll) ac_cv_lib_soname_netapi=`$ac_cv_path_LDD conftest.exe | grep "netapi" | sed -e "s/dll.*/dll/"';2,$d'` ;;
    dylib) ac_cv_lib_soname_netapi=`otool -L conftest$ac_exeext | grep "libnetapi\\.[0-9A-Za-z.]*dylib" | sed -e "s/^.*\/\(libnetapi\.[0-9A-Za-z.]*dylib\).*$/\1/"';2,$d'` ;;
    *) ac_cv_lib_soname_netapi=`$READELF -d conftest$ac_exeext | grep "NEEDED.*libnetapi\\.$LIBEXT" | sed -e "s/^.*\\[\\(libnetapi\\.$LIBEXT[^	 ]*\\)\\].*$/\1/"';2,$d'`
       if ${ac_cv_lib_soname_netapi:+false} :; then :
  ac_cv_lib_soname_netapi=`$LDD conftest$ac_exeext | grep "libnetapi\\.$LIBEXT" | sed -e "s/^.*\(libnetapi\.$LIBEXT[^	 ]*\).*$/\1/"';2,$d'`
fi ;;
  esac
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
  LIBS=$ac_check_soname_save_LIBS
fi
if ${ac_cv_lib_soname_netapi:+false} :; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5
$as_echo "not found" >&6; }
       cat >>confdefs.h <<_ACEOF
#define SONAME_LIBNETAPI "libnetapi.$LIBEXT"
_ACEOF

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

cat >>confdefs.h <<_ACEOF
#define SONAME_LIBNETAPI "$ac_cv_lib_soname_netapi"
_ACEOF


fi
fi

test -n "$ALSA_LIBS" || enable_winealsa_drv=${enable_winealsa_drv:-no}
test -n "$COREAUDIO_LIBS" || enable_winecoreaudio_drv=${enable_winecoreaudio_drv:-no}
test "x$ac_cv_member_oss_sysinfo_numaudioengines" = xyes || enable_wineoss_drv=${enable_wineoss_drv:-no}
test "$ac_cv_header_linux_joystick_h" = "yes" -o "$ac_cv_header_IOKit_hid_IOHIDLib_h" = "yes" || enable_winejoystick_drv=${enable_winejoystick_drv:-no}

if test "x$ALSA_LIBS$COREAUDIO_LIBS" = "x" -a \
        "x$ac_cv_member_oss_sysinfo_numaudioengines" != xyes -a \
        "x$with_alsa$with_coreaudio$with_oss" != xnonono
then
    as_fn_append wine_warnings "|No sound system was found. Windows applications will be silent."
fi


EXTRACFLAGS=""

if test "x${GCC}" = "xyes"
then
  EXTRACFLAGS="-Wall -pipe"

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gcc strength-reduce bug" >&5
$as_echo_n "checking for gcc strength-reduce bug... " >&6; }
if ${ac_cv_c_gcc_strength_bug+:} false; then :
  $as_echo_n "(cached) " >&6
else
  if test "$cross_compiling" = yes; then :
  ac_cv_c_gcc_strength_bug="yes"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int L[4] = {0,1,2,3};
int
main ()
{
static int Array[3];
  unsigned int B = 3;
  int i;
  for(i=0; i<B; i++) Array[i] = i - 3;
  for(i=0; i<4 - 1; i++) L[i] = L[i + 1];
  L[i] = 4;
  return (Array[1] != -2 || L[2] != 3)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_run "$LINENO"; then :
  ac_cv_c_gcc_strength_bug="no"
else
  ac_cv_c_gcc_strength_bug="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
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_gcc_strength_bug" >&5
$as_echo "$ac_cv_c_gcc_strength_bug" >&6; }
  if test "$ac_cv_c_gcc_strength_bug" = "yes"
  then
    EXTRACFLAGS="$EXTRACFLAGS -fno-strength-reduce"
  fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fno-builtin" >&5
$as_echo_n "checking whether the compiler supports -fno-builtin... " >&6; }
if ${ac_cv_cflags__fno_builtin+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fno-builtin"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fno_builtin=yes
else
  ac_cv_cflags__fno_builtin=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fno_builtin" >&5
$as_echo "$ac_cv_cflags__fno_builtin" >&6; }
if test "x$ac_cv_cflags__fno_builtin" = xyes; then :
  BUILTINFLAG="-fno-builtin"

fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fno-strict-aliasing" >&5
$as_echo_n "checking whether the compiler supports -fno-strict-aliasing... " >&6; }
if ${ac_cv_cflags__fno_strict_aliasing+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fno-strict-aliasing"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fno_strict_aliasing=yes
else
  ac_cv_cflags__fno_strict_aliasing=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fno_strict_aliasing" >&5
$as_echo "$ac_cv_cflags__fno_strict_aliasing" >&6; }
if test "x$ac_cv_cflags__fno_strict_aliasing" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -fno-strict-aliasing"
fi
    saved_CFLAGS=$CFLAGS
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Werror=unknown-warning-option" >&5
$as_echo_n "checking whether the compiler supports -Werror=unknown-warning-option... " >&6; }
if ${ac_cv_cflags__Werror_unknown_warning_option+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Werror=unknown-warning-option"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Werror_unknown_warning_option=yes
else
  ac_cv_cflags__Werror_unknown_warning_option=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Werror_unknown_warning_option" >&5
$as_echo "$ac_cv_cflags__Werror_unknown_warning_option" >&6; }
if test "x$ac_cv_cflags__Werror_unknown_warning_option" = xyes; then :
  CFLAGS="$CFLAGS -Werror=unknown-warning-option"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wdeclaration-after-statement" >&5
$as_echo_n "checking whether the compiler supports -Wdeclaration-after-statement... " >&6; }
if ${ac_cv_cflags__Wdeclaration_after_statement+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wdeclaration-after-statement"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wdeclaration_after_statement=yes
else
  ac_cv_cflags__Wdeclaration_after_statement=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wdeclaration_after_statement" >&5
$as_echo "$ac_cv_cflags__Wdeclaration_after_statement" >&6; }
if test "x$ac_cv_cflags__Wdeclaration_after_statement" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wdeclaration-after-statement"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wempty-body" >&5
$as_echo_n "checking whether the compiler supports -Wempty-body... " >&6; }
if ${ac_cv_cflags__Wempty_body+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wempty-body"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wempty_body=yes
else
  ac_cv_cflags__Wempty_body=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wempty_body" >&5
$as_echo "$ac_cv_cflags__Wempty_body" >&6; }
if test "x$ac_cv_cflags__Wempty_body" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wempty-body"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wignored-qualifiers" >&5
$as_echo_n "checking whether the compiler supports -Wignored-qualifiers... " >&6; }
if ${ac_cv_cflags__Wignored_qualifiers+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wignored-qualifiers"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wignored_qualifiers=yes
else
  ac_cv_cflags__Wignored_qualifiers=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wignored_qualifiers" >&5
$as_echo "$ac_cv_cflags__Wignored_qualifiers" >&6; }
if test "x$ac_cv_cflags__Wignored_qualifiers" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wignored-qualifiers"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wstrict-prototypes" >&5
$as_echo_n "checking whether the compiler supports -Wstrict-prototypes... " >&6; }
if ${ac_cv_cflags__Wstrict_prototypes+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wstrict-prototypes"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wstrict_prototypes=yes
else
  ac_cv_cflags__Wstrict_prototypes=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wstrict_prototypes" >&5
$as_echo "$ac_cv_cflags__Wstrict_prototypes" >&6; }
if test "x$ac_cv_cflags__Wstrict_prototypes" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wstrict-prototypes"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wtype-limits" >&5
$as_echo_n "checking whether the compiler supports -Wtype-limits... " >&6; }
if ${ac_cv_cflags__Wtype_limits+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wtype-limits"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wtype_limits=yes
else
  ac_cv_cflags__Wtype_limits=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wtype_limits" >&5
$as_echo "$ac_cv_cflags__Wtype_limits" >&6; }
if test "x$ac_cv_cflags__Wtype_limits" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wtype-limits"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wunused-but-set-parameter" >&5
$as_echo_n "checking whether the compiler supports -Wunused-but-set-parameter... " >&6; }
if ${ac_cv_cflags__Wunused_but_set_parameter+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wunused-but-set-parameter"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wunused_but_set_parameter=yes
else
  ac_cv_cflags__Wunused_but_set_parameter=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wunused_but_set_parameter" >&5
$as_echo "$ac_cv_cflags__Wunused_but_set_parameter" >&6; }
if test "x$ac_cv_cflags__Wunused_but_set_parameter" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wunused-but-set-parameter"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wvla" >&5
$as_echo_n "checking whether the compiler supports -Wvla... " >&6; }
if ${ac_cv_cflags__Wvla+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wvla"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wvla=yes
else
  ac_cv_cflags__Wvla=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wvla" >&5
$as_echo "$ac_cv_cflags__Wvla" >&6; }
if test "x$ac_cv_cflags__Wvla" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wvla"
fi
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wwrite-strings" >&5
$as_echo_n "checking whether the compiler supports -Wwrite-strings... " >&6; }
if ${ac_cv_cflags__Wwrite_strings+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wwrite-strings"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wwrite_strings=yes
else
  ac_cv_cflags__Wwrite_strings=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wwrite_strings" >&5
$as_echo "$ac_cv_cflags__Wwrite_strings" >&6; }
if test "x$ac_cv_cflags__Wwrite_strings" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wwrite-strings"
fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wpointer-arith" >&5
$as_echo_n "checking whether the compiler supports -Wpointer-arith... " >&6; }
if ${ac_cv_cflags__Wpointer_arith+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wpointer-arith"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wpointer_arith=yes
else
  ac_cv_cflags__Wpointer_arith=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wpointer_arith" >&5
$as_echo "$ac_cv_cflags__Wpointer_arith" >&6; }
if test "x$ac_cv_cflags__Wpointer_arith" = xyes; then :
  saved_string_h_CFLAGS=$CFLAGS
      CFLAGS="$CFLAGS -Wpointer-arith -Werror"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken string.h that generates warnings with -Wpointer-arith" >&5
$as_echo_n "checking for broken string.h that generates warnings with -Wpointer-arith... " >&6; }
if ${ac_cv_c_string_h_warnings+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_string_h_warnings=no
else
  ac_cv_c_string_h_warnings=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_string_h_warnings" >&5
$as_echo "$ac_cv_c_string_h_warnings" >&6; }
      test "$ac_cv_c_string_h_warnings" = yes || EXTRACFLAGS="$EXTRACFLAGS -Wpointer-arith"
      CFLAGS=$saved_string_h_CFLAGS
fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wlogical-op" >&5
$as_echo_n "checking whether the compiler supports -Wlogical-op... " >&6; }
if ${ac_cv_cflags__Wlogical_op+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wlogical-op"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wlogical_op=yes
else
  ac_cv_cflags__Wlogical_op=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wlogical_op" >&5
$as_echo "$ac_cv_cflags__Wlogical_op" >&6; }
if test "x$ac_cv_cflags__Wlogical_op" = xyes; then :
  saved_string_h_CFLAGS=$CFLAGS
      CFLAGS="$CFLAGS -Wlogical-op -Werror"
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking for broken string.h that generates warnings with -Wlogical-op" >&5
$as_echo_n "checking for broken string.h that generates warnings with -Wlogical-op... " >&6; }
if ${ac_cv_c_logicalop_noisy+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
char*f(const char *h,char n) {return strchr(h,n);}
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_logicalop_noisy=no
else
  ac_cv_c_logicalop_noisy=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_logicalop_noisy" >&5
$as_echo "$ac_cv_c_logicalop_noisy" >&6; }
      CFLAGS=$saved_string_h_CFLAGS
      test "$ac_cv_c_logicalop_noisy" = yes || EXTRACFLAGS="$EXTRACFLAGS -Wlogical-op"
fi

  CFLAGS=$saved_CFLAGS

    for ac_flag in $CFLAGS; do
    case $ac_flag in
      -g) case $host_os in
            darwin*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -gstabs+" >&5
$as_echo_n "checking whether the compiler supports -gstabs+... " >&6; }
if ${ac_cv_cflags__gstabsp+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -gstabs+"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__gstabsp=yes
else
  ac_cv_cflags__gstabsp=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__gstabsp" >&5
$as_echo "$ac_cv_cflags__gstabsp" >&6; }
if test "x$ac_cv_cflags__gstabsp" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -gstabs+"
fi ;;
            *) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -gdwarf-2" >&5
$as_echo_n "checking whether the compiler supports -gdwarf-2... " >&6; }
if ${ac_cv_cflags__gdwarf_2+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -gdwarf-2"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__gdwarf_2=yes
else
  ac_cv_cflags__gdwarf_2=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__gdwarf_2" >&5
$as_echo "$ac_cv_cflags__gdwarf_2" >&6; }
if test "x$ac_cv_cflags__gdwarf_2" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -gdwarf-2"
fi
               { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -gstrict-dwarf" >&5
$as_echo_n "checking whether the compiler supports -gstrict-dwarf... " >&6; }
if ${ac_cv_cflags__gstrict_dwarf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -gstrict-dwarf"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__gstrict_dwarf=yes
else
  ac_cv_cflags__gstrict_dwarf=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__gstrict_dwarf" >&5
$as_echo "$ac_cv_cflags__gstrict_dwarf" >&6; }
if test "x$ac_cv_cflags__gstrict_dwarf" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -gstrict-dwarf"
fi ;;
          esac ;;
    esac
  done

    case $host_cpu in
    *i[3456789]86*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -fno-omit-frame-pointer" >&5
$as_echo_n "checking whether the compiler supports -fno-omit-frame-pointer... " >&6; }
if ${ac_cv_cflags__fno_omit_frame_pointer+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -fno-omit-frame-pointer"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__fno_omit_frame_pointer=yes
else
  ac_cv_cflags__fno_omit_frame_pointer=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__fno_omit_frame_pointer" >&5
$as_echo "$ac_cv_cflags__fno_omit_frame_pointer" >&6; }
if test "x$ac_cv_cflags__fno_omit_frame_pointer" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -fno-omit-frame-pointer"
fi ;;
  esac

    case $host in
    x86_64-*mingw32*|x86_64-*cygwin*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Wno-format" >&5
$as_echo_n "checking whether the compiler supports -Wno-format... " >&6; }
if ${ac_cv_cflags__Wno_format+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Wno-format"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Wno_format=yes
else
  ac_cv_cflags__Wno_format=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Wno_format" >&5
$as_echo "$ac_cv_cflags__Wno_format" >&6; }
if test "x$ac_cv_cflags__Wno_format" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Wno-format"
fi ;;
  esac

    if test "x$enable_maintainer_mode" = "xyes"
  then
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the compiler supports -Werror" >&5
$as_echo_n "checking whether the compiler supports -Werror... " >&6; }
if ${ac_cv_cflags__Werror+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_wine_try_cflags_saved=$CFLAGS
CFLAGS="$CFLAGS -Werror"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int main(int argc, char **argv) { return 0; }
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_cflags__Werror=yes
else
  ac_cv_cflags__Werror=no
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
CFLAGS=$ac_wine_try_cflags_saved
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cflags__Werror" >&5
$as_echo "$ac_cv_cflags__Werror" >&6; }
if test "x$ac_cv_cflags__Werror" = xyes; then :
  EXTRACFLAGS="$EXTRACFLAGS -Werror"
fi
  fi

    saved_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Werror"
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ms_hook_prologue attribute" >&5
$as_echo_n "checking for ms_hook_prologue attribute... " >&6; }
if ${ac_cv_have_ms_hook_prologue+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
int __attribute__((__ms_hook_prologue__)) test(void) { return 0; }
int
main ()
{

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_have_ms_hook_prologue="yes"
else
  ac_cv_have_ms_hook_prologue="no"
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_have_ms_hook_prologue" >&5
$as_echo "$ac_cv_have_ms_hook_prologue" >&6; }
  CFLAGS="$saved_CFLAGS"
  if test "$ac_cv_have_ms_hook_prologue" = "yes"
  then

$as_echo "#define DECLSPEC_HOTPATCH __attribute__((__ms_hook_prologue__))" >>confdefs.h

  else
      $as_echo "#define DECLSPEC_HOTPATCH /* */" >>confdefs.h

  fi
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for the need to disable Fortify" >&5
$as_echo_n "checking for the need to disable Fortify... " >&6; }
if ${ac_cv_c_fortify_enabled+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <string.h>
int
main ()
{
#if defined(__USE_FORTIFY_LEVEL) && __USE_FORTIFY_LEVEL > 0
#error Fortify enabled
#endif
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_fortify_enabled=no
else
  ac_cv_c_fortify_enabled=yes
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_fortify_enabled" >&5
$as_echo "$ac_cv_c_fortify_enabled" >&6; }
if test "$ac_cv_c_fortify_enabled" = yes
then
    CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0"
fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether external symbols need an underscore prefix" >&5
$as_echo_n "checking whether external symbols need an underscore prefix... " >&6; }
if ${ac_cv_c_extern_prefix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
extern int ac_test;
int
main ()
{
asm(".globl _ac_test\n_ac_test:\t.long 0"); if (ac_test) return 1
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_c_extern_prefix="yes"
else
  ac_cv_c_extern_prefix="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: $ac_cv_c_extern_prefix" >&5
$as_echo "$ac_cv_c_extern_prefix" >&6; }

case $host_cpu in
  *i[3456789]86*)
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether external symbols need stdcall decoration" >&5
$as_echo_n "checking whether external symbols need stdcall decoration... " >&6; }
if ${ac_cv_c_stdcall_suffix+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef _MSC_VER
#define __stdcall __attribute__((__stdcall__))
#endif
int __stdcall ac_test(int i) { return i; }
int
main ()
{
asm("jmp _ac_test@4"); if (ac_test(1)) return 1
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_c_stdcall_suffix="yes"
else
  ac_cv_c_stdcall_suffix="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: $ac_cv_c_stdcall_suffix" >&5
$as_echo "$ac_cv_c_stdcall_suffix" >&6; } ;;
  *) ac_cv_c_stdcall_suffix="no" ;;
esac


if test "$ac_cv_c_extern_prefix" = "yes"
then
    $as_echo "#define __ASM_NAME(name) \"_\" name" >>confdefs.h

    asm_name_prefix="_"
else
    $as_echo "#define __ASM_NAME(name) name" >>confdefs.h

    asm_name_prefix=""
fi


if test "$ac_cv_c_stdcall_suffix" = "yes"
then
    $as_echo "#define __ASM_STDCALL(args) \"@\" #args" >>confdefs.h

else
    $as_echo "#define __ASM_STDCALL(args) \"\"" >>confdefs.h

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to define a function in assembly code" >&5
$as_echo_n "checking how to define a function in assembly code... " >&6; }
if ${ac_cv_asm_func_def+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm("\t.globl _ac_test\n\t.def _ac_test; .scl 2; .type 32; .endef\n_ac_test:\t.long 0");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_asm_func_def=".def"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm("\t.globl _ac_test\n\t.type _ac_test,@function\n_ac_test:\t.long 0");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_asm_func_def=".type @function"
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm("\t.globl _ac_test\n\t.type _ac_test,2\n_ac_test:\t.long 0");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_asm_func_def=".type 2"
else
  ac_cv_asm_func_def="unknown"
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_asm_func_def" >&5
$as_echo "$ac_cv_asm_func_def" >&6; }


case "$ac_cv_asm_func_def" in
  ".def")
     $as_echo "#define __ASM_FUNC(name) \".def \" __ASM_NAME(name) \"; .scl 2; .type 32; .endef\"" >>confdefs.h

     asm_func_header=".def $asm_name_prefix\" #name suffix \"; .scl 2; .type 32; .endef" ;;
  ".type @function")
     $as_echo "#define __ASM_FUNC(name) \".type \" __ASM_NAME(name) \",@function\"" >>confdefs.h

     asm_func_header=".type $asm_name_prefix\" #name suffix \",@function" ;;
  ".type 2")
     $as_echo "#define __ASM_FUNC(name) \".type \" __ASM_NAME(name) \",2\"" >>confdefs.h

     asm_func_header=".type $asm_name_prefix\" #name suffix \",2" ;;
  *)
     $as_echo "#define __ASM_FUNC(name) \"\"" >>confdefs.h

     asm_func_header="" ;;
esac

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether asm() works outside of functions" >&5
$as_echo_n "checking whether asm() works outside of functions... " >&6; }
if ${ac_cv_c_asm_outside_funcs+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
asm(".text\n\t.long 0");
int
main ()
{

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

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether .previous is supported in assembly code" >&5
$as_echo_n "checking whether .previous is supported in assembly code... " >&6; }
if ${ac_cv_c_dot_previous+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

int
main ()
{
asm(".text\nac_test:\t.long 0\n\t.previous");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_c_dot_previous="yes"
else
  ac_cv_c_dot_previous="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: $ac_cv_c_dot_previous" >&5
$as_echo "$ac_cv_c_dot_previous" >&6; }

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether CFI directives are supported in assembly code" >&5
$as_echo_n "checking whether CFI directives are supported in assembly code... " >&6; }
if ${ac_cv_c_cfi_support+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
asm(".text\nac_test:\t.cfi_startproc\n\t.long 0\n\t.cfi_endproc");
int
main ()
{

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

asm_func_header=".globl $asm_name_prefix\" #name suffix \"\\n\\t$asm_func_header\\n$asm_name_prefix\" #name suffix \":\\n\\t"
asm_func_trailer=""
if test "$ac_cv_c_dot_previous" = "yes"
then
   asm_func_trailer="\\n\\t.previous"
fi
if test "$ac_cv_c_cfi_support" = "yes"
then
   asm_func_header="$asm_func_header.cfi_startproc\\n\\t"
   asm_func_trailer="\\n\\t.cfi_endproc$asm_func_trailer"

$as_echo "#define __ASM_CFI(str) str" >>confdefs.h

   UNWINDFLAGS=-fasynchronous-unwind-tables

else
   $as_echo "#define __ASM_CFI(str) \"\"" >>confdefs.h

fi

asm_func_code="$asm_func_header\" code \"$asm_func_trailer"


if test "$ac_cv_c_asm_outside_funcs" = "yes"
then
    cat >>confdefs.h <<_ACEOF
#define __ASM_DEFINE_FUNC(name,suffix,code) asm(".text\n\t.align 4\n\t$asm_func_code");
_ACEOF

else
    cat >>confdefs.h <<_ACEOF
#define __ASM_DEFINE_FUNC(name,suffix,code) void __asm_dummy_##name(void) { asm(".text\n\t.align 4\n\t$asm_func_code"); }
_ACEOF

fi

$as_echo "#define __ASM_GLOBAL_FUNC(name,code) __ASM_DEFINE_FUNC(name,\"\",code)" >>confdefs.h


$as_echo "#define __ASM_STDCALL_FUNC(name,args,code) __ASM_DEFINE_FUNC(name,__ASM_STDCALL(args),code)" >>confdefs.h



case $build_os in
  cygwin*|mingw32*) TOOLSEXT=".exe"
 ;;
esac

case $host_os in
  linux*)
    case $host_cpu in
      *i[3456789]86*|x86_64*)
        test "$wine_binary" = wine || wine_fn_ignore_file "loader/wine-preloader"
        loader_programs="$loader_programs $wine_binary-preloader"
        as_fn_append LOADER_RULES "
$wine_binary-preloader: preloader.o
	\$(CC) -o \$@ -static -nostartfiles -nodefaultlibs -Wl,-Ttext=0x7c400000 preloader.o \$(LIBPORT) \$(LDFLAGS)

install install-lib:: $wine_binary-preloader
	\$(INSTALL_PROGRAM) $wine_binary-preloader \$(DESTDIR)\$(bindir)/$wine_binary-preloader

uninstall::
	\$(RM) \$(DESTDIR)\$(bindir)/$wine_binary-preloader

preloader_EXTRADEFS = $BUILTINFLAG
" ;;
    esac
    ;;
esac
as_fn_append LOADER_RULES "
PROGRAMS = $loader_programs
"


ac_save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $BUILTINFLAG"
for ac_func in \
        __res_get_state \
        __res_getservers \
	_finite \
	_isnan \
	_pclose \
	_popen \
	_snprintf \
	_spawnvp \
	_strdup \
	_stricmp \
	_strnicmp \
	_strtoi64 \
	_strtoui64 \
	_vsnprintf \
	asctime_r \
	chsize \
	dlopen \
	epoll_create \
	ffs \
	finitef \
	fnmatch \
	fork \
	fpclass \
	fstatfs \
	fstatvfs \
	ftruncate \
	futimens \
	futimes \
	futimesat \
	getattrlist \
	getdirentries \
	getopt_long_only \
	getpwuid \
	gettimeofday \
	getuid \
	if_nameindex \
	isnanf \
	kqueue \
	lstat \
	memmove \
	mmap \
	pclose \
	pipe2 \
	poll \
	popen \
	port_create \
	prctl \
	pread \
	proc_pidinfo \
	pwrite \
	readdir \
	readlink \
	sched_yield \
	select \
	setproctitle \
	setrlimit \
	settimeofday \
	sigaltstack \
	sigprocmask \
	snprintf \
	statfs \
	statvfs \
	strcasecmp \
	strdup \
	strerror \
	strncasecmp \
	strtold \
	strtoll \
	strtoull \
	symlink \
	tcdrain \
	thr_kill2 \
	timegm \
	usleep \
	vsnprintf

do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

CFLAGS="$ac_save_CFLAGS"

if test "$ac_cv_func_dlopen" = no
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 :
  $as_echo "#define HAVE_DLOPEN 1" >>confdefs.h
 DL_LIBS="-ldl"

fi

fi
ac_wine_check_funcs_save_LIBS="$LIBS"
LIBS="$LIBS $DL_LIBS"
for ac_func in dladdr
do :
  ac_fn_c_check_func "$LINENO" "dladdr" "ac_cv_func_dladdr"
if test "x$ac_cv_func_dladdr" = xyes; then :
  cat >>confdefs.h <<_ACEOF
#define HAVE_DLADDR 1
_ACEOF

fi
done

LIBS="$ac_wine_check_funcs_save_LIBS"

if test "$ac_cv_func_poll" = no
then
    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for poll in -lpoll" >&5
$as_echo_n "checking for poll in -lpoll... " >&6; }
if ${ac_cv_lib_poll_poll+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lpoll  $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 poll ();
int
main ()
{
return poll ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_poll_poll=yes
else
  ac_cv_lib_poll_poll=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_poll_poll" >&5
$as_echo "$ac_cv_lib_poll_poll" >&6; }
if test "x$ac_cv_lib_poll_poll" = xyes; then :
  $as_echo "#define HAVE_POLL 1" >>confdefs.h
 POLL_LIBS="-lpoll"

fi

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"

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing connect" >&5
$as_echo_n "checking for library containing connect... " >&6; }
if ${ac_cv_search_connect+:} 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 connect ();
int
main ()
{
return connect ();
  ;
  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_connect=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_connect+:} false; then :
  break
fi
done
if ${ac_cv_search_connect+:} false; then :

else
  ac_cv_search_connect=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_connect" >&5
$as_echo "$ac_cv_search_connect" >&6; }
ac_res=$ac_cv_search_connect
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_aton" >&5
$as_echo_n "checking for library containing inet_aton... " >&6; }
if ${ac_cv_search_inet_aton+:} 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 inet_aton ();
int
main ()
{
return inet_aton ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' resolv; 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_inet_aton=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_inet_aton+:} false; then :
  break
fi
done
if ${ac_cv_search_inet_aton+:} false; then :

else
  ac_cv_search_inet_aton=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_aton" >&5
$as_echo "$ac_cv_search_inet_aton" >&6; }
ac_res=$ac_cv_search_inet_aton
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

fi


for ac_func in \
	getaddrinfo \
	getnameinfo \
	getnetbyname \
	getprotobyname \
	getprotobynumber \
	getservbyport \
	inet_addr \
	inet_network \
	inet_ntop \
	inet_pton \
	sendmsg \
	socketpair \

do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done


ac_save_LIBS=$LIBS
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing clock_gettime" >&5
$as_echo_n "checking for library containing clock_gettime... " >&6; }
if ${ac_cv_search_clock_gettime+:} 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 clock_gettime ();
int
main ()
{
return clock_gettime ();
  ;
  return 0;
}
_ACEOF
for ac_lib in '' rt; 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_clock_gettime=$ac_res
fi
rm -f core conftest.err conftest.$ac_objext \
    conftest$ac_exeext
  if ${ac_cv_search_clock_gettime+:} false; then :
  break
fi
done
if ${ac_cv_search_clock_gettime+:} false; then :

else
  ac_cv_search_clock_gettime=no
fi
rm conftest.$ac_ext
LIBS=$ac_func_search_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_clock_gettime" >&5
$as_echo "$ac_cv_search_clock_gettime" >&6; }
ac_res=$ac_cv_search_clock_gettime
if test "$ac_res" != no; then :
  test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"

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

                test "$ac_res" = "none required" || RT_LIBS="$ac_res"

fi

LIBS=$ac_save_LIBS

LDAP_LIBS=""

if test "$ac_cv_header_ldap_h" = "yes" -a "$ac_cv_header_lber_h" = "yes"
then
    ac_fn_c_check_type "$LINENO" "LDAPSortKey" "ac_cv_type_LDAPSortKey" "#include <ldap.h>
"
if test "x$ac_cv_type_LDAPSortKey" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ldap_initialize in -lldap_r" >&5
$as_echo_n "checking for ldap_initialize in -lldap_r... " >&6; }
if ${ac_cv_lib_ldap_r_ldap_initialize+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-lldap_r $PTHREAD_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 ldap_initialize ();
int
main ()
{
return ldap_initialize ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_ldap_r_ldap_initialize=yes
else
  ac_cv_lib_ldap_r_ldap_initialize=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_ldap_r_ldap_initialize" >&5
$as_echo "$ac_cv_lib_ldap_r_ldap_initialize" >&6; }
if test "x$ac_cv_lib_ldap_r_ldap_initialize" = xyes; then :
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ber_init in -llber" >&5
$as_echo_n "checking for ber_init in -llber... " >&6; }
if ${ac_cv_lib_lber_ber_init+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_check_lib_save_LIBS=$LIBS
LIBS="-llber $PTHREAD_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 ber_init ();
int
main ()
{
return ber_init ();
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_lib_lber_ber_init=yes
else
  ac_cv_lib_lber_ber_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_lber_ber_init" >&5
$as_echo "$ac_cv_lib_lber_ber_init" >&6; }
if test "x$ac_cv_lib_lber_ber_init" = xyes; then :

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

                 LDAP_LIBS="-lldap_r -llber"
fi

fi

fi

    ac_wine_check_funcs_save_LIBS="$LIBS"
LIBS="$LIBS $LDAP_LIBS $PTHREAD_LIBS"
for ac_func in \
	ldap_count_references \
	ldap_first_reference \
	ldap_next_reference \
	ldap_parse_reference \
	ldap_parse_sort_control \
	ldap_parse_sortresponse_control \
	ldap_parse_vlv_control \
	ldap_parse_vlvresponse_control
do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

LIBS="$ac_wine_check_funcs_save_LIBS"
fi
if test "x$LDAP_LIBS" = "x"; then :
  case "x$with_ldap" in
  x)   as_fn_append wine_notices "|libldap (OpenLDAP) ${notice_platform}development files not found, LDAP won't be supported." ;;
  xno) ;;
  *)   as_fn_error $? "libldap (OpenLDAP) ${notice_platform}development files not found, LDAP won't be supported.
This is an error since --with-ldap was requested." "$LINENO" 5 ;;
esac
fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether mkdir takes only one argument" >&5
$as_echo_n "checking whether mkdir takes only one argument... " >&6; }
if ${wine_cv_one_arg_mkdir+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <sys/stat.h>
int
main ()
{
mkdir("foo");
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  wine_cv_one_arg_mkdir=yes
else
  wine_cv_one_arg_mkdir=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $wine_cv_one_arg_mkdir" >&5
$as_echo "$wine_cv_one_arg_mkdir" >&6; }
if test "$wine_cv_one_arg_mkdir" = "yes"
then

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

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sched_setaffinity" >&5
$as_echo_n "checking for sched_setaffinity... " >&6; }
if ${wine_cv_have_sched_setaffinity+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE
#include <sched.h>
int
main ()
{
sched_setaffinity(0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  wine_cv_have_sched_setaffinity=yes
else
  wine_cv_have_sched_setaffinity=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: $wine_cv_have_sched_setaffinity" >&5
$as_echo "$wine_cv_have_sched_setaffinity" >&6; }
if test "$wine_cv_have_sched_setaffinity" = "yes"
then

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

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fallocate" >&5
$as_echo_n "checking for fallocate... " >&6; }
if ${wine_cv_have_fallocate+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE
#include <fcntl.h>
int
main ()
{
fallocate(-1, 0, 0, 0);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  wine_cv_have_fallocate=yes
else
  wine_cv_have_fallocate=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: $wine_cv_have_fallocate" >&5
$as_echo "$wine_cv_have_fallocate" >&6; }
if test "$wine_cv_have_fallocate" = "yes"
then

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

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for inline" >&5
$as_echo_n "checking for inline... " >&6; }
if ${ac_cv_c_inline+:} false; then :
  $as_echo_n "(cached) " >&6
else
  ac_cv_c_inline=no
for ac_kw in inline __inline__ __inline; do
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __cplusplus
typedef int foo_t;
static $ac_kw foo_t static_foo () {return 0; }
$ac_kw foo_t foo () {return 0; }
#endif

_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  ac_cv_c_inline=$ac_kw
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  test "$ac_cv_c_inline" != no && break
done

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

case $ac_cv_c_inline in
  inline | yes) ;;
  *)
    case $ac_cv_c_inline in
      no) ac_val=;;
      *) ac_val=$ac_cv_c_inline;;
    esac
    cat >>confdefs.h <<_ACEOF
#ifndef __cplusplus
#define inline $ac_val
#endif
_ACEOF
    ;;
esac

ac_fn_c_check_type "$LINENO" "mode_t" "ac_cv_type_mode_t" "$ac_includes_default"
if test "x$ac_cv_type_mode_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_MODE_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "off_t" "ac_cv_type_off_t" "$ac_includes_default"
if test "x$ac_cv_type_off_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_OFF_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default"
if test "x$ac_cv_type_pid_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_PID_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default"
if test "x$ac_cv_type_size_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIZE_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default"
if test "x$ac_cv_type_ssize_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SSIZE_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "long long" "ac_cv_type_long_long" "$ac_includes_default"
if test "x$ac_cv_type_long_long" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_LONG_LONG 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "fsblkcnt_t" "ac_cv_type_fsblkcnt_t" "$ac_includes_default"
if test "x$ac_cv_type_fsblkcnt_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_FSBLKCNT_T 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "fsfilcnt_t" "ac_cv_type_fsfilcnt_t" "$ac_includes_default"
if test "x$ac_cv_type_fsfilcnt_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_FSFILCNT_T 1
_ACEOF


fi

ac_fn_c_check_type "$LINENO" "sigset_t" "ac_cv_type_sigset_t" "#include <sys/types.h>
#include <signal.h>
"
if test "x$ac_cv_type_sigset_t" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIGSET_T 1
_ACEOF


fi

ac_fn_c_check_type "$LINENO" "request_sense" "ac_cv_type_request_sense" "#include <linux/cdrom.h>
"
if test "x$ac_cv_type_request_sense" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_REQUEST_SENSE 1
_ACEOF


fi


ac_fn_c_check_type "$LINENO" "struct xinpgen" "ac_cv_type_struct_xinpgen" "#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_SYS_SOCKETVAR_H
#include <sys/socketvar.h>
#endif
#ifdef HAVE_NET_ROUTE_H
#include <net/route.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IN_SYSTM_H
#include <netinet/in_systm.h>
#endif
#ifdef HAVE_NETINET_IP_H
#include <netinet/ip.h>
#endif
#ifdef HAVE_NETINET_IN_PCB_H
#include <netinet/in_pcb.h>
#endif
"
if test "x$ac_cv_type_struct_xinpgen" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_XINPGEN 1
_ACEOF


fi


ac_fn_c_check_type "$LINENO" "struct r_debug" "ac_cv_type_struct_r_debug" "#ifdef HAVE_LINK_H
#include <link.h>
#endif
#ifdef HAVE_SYS_LINK_H
#include <sys/link.h>
#endif
"
if test "x$ac_cv_type_struct_r_debug" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_R_DEBUG 1
_ACEOF


fi
ac_fn_c_check_type "$LINENO" "struct link_map" "ac_cv_type_struct_link_map" "#ifdef HAVE_LINK_H
#include <link.h>
#endif
#ifdef HAVE_SYS_LINK_H
#include <sys/link.h>
#endif
"
if test "x$ac_cv_type_struct_link_map" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_LINK_MAP 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct ff_effect" "direction" "ac_cv_member_struct_ff_effect_direction" "#ifdef HAVE_LINUX_INPUT_H
#include <linux/input.h>
#endif
"
if test "x$ac_cv_member_struct_ff_effect_direction" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_FF_EFFECT_DIRECTION 1
_ACEOF


fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigaddset" >&5
$as_echo_n "checking for sigaddset... " >&6; }
if ${wine_cv_have_sigaddset+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <signal.h>
int
main ()
{
sigset_t set; sigaddset(&set,SIGTERM);
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  wine_cv_have_sigaddset=yes
else
  wine_cv_have_sigaddset=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: $wine_cv_have_sigaddset" >&5
$as_echo "$wine_cv_have_sigaddset" >&6; }
if test "$wine_cv_have_sigaddset" = "yes"
then

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

fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we can use re-entrant gethostbyname_r Linux style" >&5
$as_echo_n "checking whether we can use re-entrant gethostbyname_r Linux style... " >&6; }
if ${wine_cv_linux_gethostbyname_r_6+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <netdb.h>
int
main ()
{

    char *name=0;
    struct hostent he;
    struct hostent *result;
    char *buf=0;
    int bufsize=0;
    int errnr;
    char *addr=0;
    int addrlen=0;
    int addrtype=0;
    gethostbyname_r(name,&he,buf,bufsize,&result,&errnr);
    gethostbyaddr_r(addr, addrlen, addrtype,&he,buf,bufsize,&result,&errnr);

  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  wine_cv_linux_gethostbyname_r_6=yes
else
  wine_cv_linux_gethostbyname_r_6=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: $wine_cv_linux_gethostbyname_r_6" >&5
$as_echo "$wine_cv_linux_gethostbyname_r_6" >&6; }
   if test "$wine_cv_linux_gethostbyname_r_6" = "yes"
   then

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

   fi

if test "$ac_cv_header_linux_joystick_h" = "yes"
then
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether linux/joystick.h uses the Linux 2.2+ API" >&5
$as_echo_n "checking whether linux/joystick.h uses the Linux 2.2+ API... " >&6; }
if ${wine_cv_linux_joystick_22_api+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */

	#include <sys/ioctl.h>
	#include <sys/types.h>
	#include <linux/joystick.h>

	struct js_event blub;
	#if !defined(JS_EVENT_AXIS) || !defined(JS_EVENT_BUTTON)
	#error "no 2.2 header"
	#endif

int
main ()
{
/*empty*/
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  wine_cv_linux_joystick_22_api=yes
else
  wine_cv_linux_joystick_22_api=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext

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

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

   fi
fi


ac_fn_c_check_member "$LINENO" "struct statfs" "f_bfree" "ac_cv_member_struct_statfs_f_bfree" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_bfree" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_BFREE 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct statfs" "f_bavail" "ac_cv_member_struct_statfs_f_bavail" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_bavail" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_BAVAIL 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct statfs" "f_frsize" "ac_cv_member_struct_statfs_f_frsize" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_frsize" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_FRSIZE 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct statfs" "f_ffree" "ac_cv_member_struct_statfs_f_ffree" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_ffree" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_FFREE 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct statfs" "f_favail" "ac_cv_member_struct_statfs_f_favail" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_favail" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_FAVAIL 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct statfs" "f_namelen" "ac_cv_member_struct_statfs_f_namelen" "#include <sys/types.h>
#ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
#endif
#ifdef HAVE_SYS_MOUNT_H
# include <sys/mount.h>
#endif
#ifdef HAVE_SYS_VFS_H
# include <sys/vfs.h>
#endif
#ifdef HAVE_SYS_STATFS_H
# include <sys/statfs.h>
#endif
"
if test "x$ac_cv_member_struct_statfs_f_namelen" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATFS_F_NAMELEN 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct statvfs" "f_blocks" "ac_cv_member_struct_statvfs_f_blocks" "#ifdef HAVE_SYS_STATVFS_H
#include <sys/statvfs.h>
#endif
"
if test "x$ac_cv_member_struct_statvfs_f_blocks" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STATVFS_F_BLOCKS 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct dirent" "d_reclen" "ac_cv_member_struct_dirent_d_reclen" "#ifdef HAVE_DIRENT_H
#include <dirent.h>
#endif
"
if test "x$ac_cv_member_struct_dirent_d_reclen" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_DIRENT_D_RECLEN 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct msghdr" "msg_accrights" "ac_cv_member_struct_msghdr_msg_accrights" "#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_SYS_UN_H
# include <sys/un.h>
#endif
"
if test "x$ac_cv_member_struct_msghdr_msg_accrights" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_MSGHDR_MSG_ACCRIGHTS 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct sockaddr" "sa_len" "ac_cv_member_struct_sockaddr_sa_len" "#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_SYS_UN_H
# include <sys/un.h>
#endif
"
if test "x$ac_cv_member_struct_sockaddr_sa_len" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_SA_LEN 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct sockaddr_un" "sun_len" "ac_cv_member_struct_sockaddr_un_sun_len" "#include <sys/types.h>
#ifdef HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#ifdef HAVE_SYS_UN_H
# include <sys/un.h>
#endif
"
if test "x$ac_cv_member_struct_sockaddr_un_sun_len" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_UN_SUN_LEN 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "scsireq_t" "cmd" "ac_cv_member_scsireq_t_cmd" "#include <sys/types.h>
#ifdef HAVE_SCSI_SG_H
#include <scsi/sg.h>
#endif
"
if test "x$ac_cv_member_scsireq_t_cmd" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SCSIREQ_T_CMD 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "sg_io_hdr_t" "interface_id" "ac_cv_member_sg_io_hdr_t_interface_id" "#include <sys/types.h>
#ifdef HAVE_SCSI_SG_H
#include <scsi/sg.h>
#endif
"
if test "x$ac_cv_member_sg_io_hdr_t_interface_id" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SG_IO_HDR_T_INTERFACE_ID 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "siginfo_t" "si_fd" "ac_cv_member_siginfo_t_si_fd" "#include <signal.h>
"
if test "x$ac_cv_member_siginfo_t_si_fd" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_SIGINFO_T_SI_FD 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct mtget" "mt_blksiz" "ac_cv_member_struct_mtget_mt_blksiz" "#include <sys/types.h>
#ifdef HAVE_SYS_MTIO_H
#include <sys/mtio.h>
#endif
"
if test "x$ac_cv_member_struct_mtget_mt_blksiz" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_MTGET_MT_BLKSIZ 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct mtget" "mt_gstat" "ac_cv_member_struct_mtget_mt_gstat" "#include <sys/types.h>
#ifdef HAVE_SYS_MTIO_H
#include <sys/mtio.h>
#endif
"
if test "x$ac_cv_member_struct_mtget_mt_gstat" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_MTGET_MT_GSTAT 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct mtget" "mt_blkno" "ac_cv_member_struct_mtget_mt_blkno" "#include <sys/types.h>
#ifdef HAVE_SYS_MTIO_H
#include <sys/mtio.h>
#endif
"
if test "x$ac_cv_member_struct_mtget_mt_blkno" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_MTGET_MT_BLKNO 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct option" "name" "ac_cv_member_struct_option_name" "#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif
"
if test "x$ac_cv_member_struct_option_name" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_OPTION_NAME 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct stat" "st_blocks" "ac_cv_member_struct_stat_st_blocks" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_blocks" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BLOCKS 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_mtim" "ac_cv_member_struct_stat_st_mtim" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_mtim" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_MTIM 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_mtimespec" "ac_cv_member_struct_stat_st_mtimespec" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_mtimespec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_MTIMESPEC 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_ctim" "ac_cv_member_struct_stat_st_ctim" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_ctim" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_CTIM 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_ctimespec" "ac_cv_member_struct_stat_st_ctimespec" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_ctimespec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_CTIMESPEC 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_atim" "ac_cv_member_struct_stat_st_atim" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_atim" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIM 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_atimespec" "ac_cv_member_struct_stat_st_atimespec" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_atimespec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_ATIMESPEC 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtime" "ac_cv_member_struct_stat_st_birthtime" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_birthtime" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIME 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtim" "ac_cv_member_struct_stat_st_birthtim" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_birthtim" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIM 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "st_birthtimespec" "ac_cv_member_struct_stat_st_birthtimespec" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat_st_birthtimespec" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "__st_birthtime" "ac_cv_member_struct_stat___st_birthtime" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat___st_birthtime" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT___ST_BIRTHTIME 1
_ACEOF


fi
ac_fn_c_check_member "$LINENO" "struct stat" "__st_birthtim" "ac_cv_member_struct_stat___st_birthtim" "$ac_includes_default"
if test "x$ac_cv_member_struct_stat___st_birthtim" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_STAT___ST_BIRTHTIM 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct sockaddr_in6" "sin6_scope_id" "ac_cv_member_struct_sockaddr_in6_sin6_scope_id" "#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_member_struct_sockaddr_in6_sin6_scope_id" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID 1
_ACEOF


fi


ac_fn_c_check_type "$LINENO" "struct __res_state" "ac_cv_type_struct___res_state" "#ifdef HAVE_RESOLV_H
#include <resolv.h>
#endif
"
if test "x$ac_cv_type_struct___res_state" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT___RES_STATE 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct __res_state" "_u._ext.nscount6" "ac_cv_member_struct___res_state__u__ext_nscount6" "#ifdef HAVE_RESOLV_H
#include <resolv.h>
#endif
"
if test "x$ac_cv_member_struct___res_state__u__ext_nscount6" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT___RES_STATE__U__EXT_NSCOUNT6 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "ns_msg" "_msg_ptr" "ac_cv_member_ns_msg__msg_ptr" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
#ifdef HAVE_ARPA_NAMESER_H
# include <arpa/nameser.h>
#endif
"
if test "x$ac_cv_member_ns_msg__msg_ptr" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_NS_MSG__MSG_PTR 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct icmpstat" "icps_inhist" "ac_cv_member_struct_icmpstat_icps_inhist" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IP_H
#include <netinet/ip.h>
#endif
#ifdef HAVE_NETINET_IP_ICMP_H
#include <netinet/ip_icmp.h>
#endif
#ifdef HAVE_NETINET_ICMP_VAR_H
#include <netinet/icmp_var.h>
#endif
"
if test "x$ac_cv_member_struct_icmpstat_icps_inhist" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_ICMPSTAT_ICPS_INHIST 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct icmpstat" "icps_outhist" "ac_cv_member_struct_icmpstat_icps_outhist" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_ALIAS_H
#include <alias.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef HAVE_SYS_SOCKETVAR_H
#include <sys/socketvar.h>
#endif
#ifdef HAVE_SYS_TIMEOUT_H
#include <sys/timeout.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IN_SYSTM_H
#include <netinet/in_systm.h>
#endif
#ifdef HAVE_NETINET_IP_H
#include <netinet/ip.h>
#endif
#ifdef HAVE_NETINET_IP_VAR_H
#include <netinet/ip_var.h>
#endif
#ifdef HAVE_NETINET_IP_ICMP_H
#include <netinet/ip_icmp.h>
#endif
#ifdef HAVE_NETINET_ICMP_VAR_H
#include <netinet/icmp_var.h>
#endif
"
if test "x$ac_cv_member_struct_icmpstat_icps_outhist" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_ICMPSTAT_ICPS_OUTHIST 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct ipstat" "ips_total" "ac_cv_member_struct_ipstat_ips_total" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKETVAR_H
#include <sys/socketvar.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IP_VAR_H
#include <netinet/ip_var.h>
#endif
"
if test "x$ac_cv_member_struct_ipstat_ips_total" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_IPSTAT_IPS_TOTAL 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct ip_stats" "ips_total" "ac_cv_member_struct_ip_stats_ips_total" "#ifdef HAVE_NETINET_IP_VAR_H
#include <netinet/ip_var.h>
#endif
"
if test "x$ac_cv_member_struct_ip_stats_ips_total" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_IP_STATS_IPS_TOTAL 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct tcpstat" "tcps_connattempt" "ac_cv_member_struct_tcpstat_tcps_connattempt" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKETVAR_H
#include <sys/socketvar.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_TCP_H
#include <netinet/tcp.h>
#endif
#ifdef HAVE_NETINET_TCP_VAR_H
#include <netinet/tcp_var.h>
#endif
"
if test "x$ac_cv_member_struct_tcpstat_tcps_connattempt" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_TCPSTAT_TCPS_CONNATTEMPT 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct tcp_stats" "tcps_connattempt" "ac_cv_member_struct_tcp_stats_tcps_connattempt" "#ifdef HAVE_NETINET_TCP_VAR_H
#include <netinet/tcp_var.h>
#endif
"
if test "x$ac_cv_member_struct_tcp_stats_tcps_connattempt" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_TCP_STATS_TCPS_CONNATTEMPT 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct udpstat" "udps_ipackets" "ac_cv_member_struct_udpstat_udps_ipackets" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IP_VAR_H
#include <netinet/ip_var.h>
#endif
#ifdef HAVE_NETINET_UDP_H
#include <netinet/udp.h>
#endif
#ifdef HAVE_NETINET_UDP_VAR_H
#include <netinet/udp_var.h>
#endif
"
if test "x$ac_cv_member_struct_udpstat_udps_ipackets" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_UDPSTAT_UDPS_IPACKETS 1
_ACEOF


fi


ac_fn_c_check_member "$LINENO" "struct ifreq" "ifr_hwaddr" "ac_cv_member_struct_ifreq_ifr_hwaddr" "#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NET_IF_H
# include <net/if.h>
#endif
"
if test "x$ac_cv_member_struct_ifreq_ifr_hwaddr" = xyes; then :

cat >>confdefs.h <<_ACEOF
#define HAVE_STRUCT_IFREQ_IFR_HWADDR 1
_ACEOF


fi


{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for timezone variable" >&5
$as_echo_n "checking for timezone variable... " >&6; }
if ${ac_cv_have_timezone+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
int
main ()
{
timezone = 1
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_timezone="yes"
else
  ac_cv_have_timezone="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: $ac_cv_have_timezone" >&5
$as_echo "$ac_cv_have_timezone" >&6; }
if test "$ac_cv_have_timezone" = "yes"
then

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

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for daylight variable" >&5
$as_echo_n "checking for daylight variable... " >&6; }
if ${ac_cv_have_daylight+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <time.h>
int
main ()
{
daylight = 1
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_daylight="yes"
else
  ac_cv_have_daylight="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: $ac_cv_have_daylight" >&5
$as_echo "$ac_cv_have_daylight" >&6; }
if test "$ac_cv_have_daylight" = "yes"
then

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

fi

ac_save_LIBS="$LIBS"
LIBS="$LIBS -lm"
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isfinite" >&5
$as_echo_n "checking for isfinite... " >&6; }
if ${ac_cv_have_isfinite+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#define _GNU_SOURCE
#include <math.h>
int
main ()
{
float f = 0.0; return isfinite(f)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_isfinite="yes"
else
  ac_cv_have_isfinite="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: $ac_cv_have_isfinite" >&5
$as_echo "$ac_cv_have_isfinite" >&6; }
if test "$ac_cv_have_isfinite" = "yes"
then

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

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isinf" >&5
$as_echo_n "checking for isinf... " >&6; }
if ${ac_cv_have_isinf+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
float f = 0.0; return isinf(f)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_isinf="yes"
else
  ac_cv_have_isinf="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: $ac_cv_have_isinf" >&5
$as_echo "$ac_cv_have_isinf" >&6; }
if test "$ac_cv_have_isinf" = "yes"
then

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

fi

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for isnan" >&5
$as_echo_n "checking for isnan... " >&6; }
if ${ac_cv_have_isnan+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <math.h>
int
main ()
{
float f = 0.0; return isnan(f)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have_isnan="yes"
else
  ac_cv_have_isnan="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: $ac_cv_have_isnan" >&5
$as_echo "$ac_cv_have_isnan" >&6; }
if test "$ac_cv_have_isnan" = "yes"
then

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

fi

for ac_func in \
	cbrt \
	cbrtf \
	exp2 \
	exp2f \
	llrint \
	llrintf \
	llround \
	llroundf \
	log2 \
	log2f \
	lrint \
	lrintf \
	lround \
	lroundf \
	rint \
	rintf \
	round \
	roundf \
	trunc \
	truncf

do :
  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
  cat >>confdefs.h <<_ACEOF
#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
_ACEOF

fi
done

LIBS="$ac_save_LIBS"

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

int
main ()
{
return __builtin_clz(1)
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
  ac_cv_have___builtin_clz="yes"
else
  ac_cv_have___builtin_clz="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: $ac_cv_have___builtin_clz" >&5
$as_echo "$ac_cv_have___builtin_clz" >&6; }
if test "$ac_cv_have___builtin_clz" = "yes"
then

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

fi


case $host_cpu in
  *i[3456789]86*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __i386__" >&5
$as_echo_n "checking whether we need to define __i386__... " >&6; }
if ${ac_cv_cpp_def___i386__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __i386__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___i386__=yes
else
  ac_cv_cpp_def___i386__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___i386__" >&5
$as_echo "$ac_cv_cpp_def___i386__" >&6; }
if test "x$ac_cv_cpp_def___i386__" = xyes; then :
  CFLAGS="$CFLAGS -D__i386__"
  LINTFLAGS="$LINTFLAGS -D__i386__"
fi ;;
  *x86_64*)         { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __x86_64__" >&5
$as_echo_n "checking whether we need to define __x86_64__... " >&6; }
if ${ac_cv_cpp_def___x86_64__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __x86_64__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___x86_64__=yes
else
  ac_cv_cpp_def___x86_64__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___x86_64__" >&5
$as_echo "$ac_cv_cpp_def___x86_64__" >&6; }
if test "x$ac_cv_cpp_def___x86_64__" = xyes; then :
  CFLAGS="$CFLAGS -D__x86_64__"
  LINTFLAGS="$LINTFLAGS -D__x86_64__"
fi ;;
  *sparc64*)        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __sparc64__" >&5
$as_echo_n "checking whether we need to define __sparc64__... " >&6; }
if ${ac_cv_cpp_def___sparc64__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __sparc64__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___sparc64__=yes
else
  ac_cv_cpp_def___sparc64__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___sparc64__" >&5
$as_echo "$ac_cv_cpp_def___sparc64__" >&6; }
if test "x$ac_cv_cpp_def___sparc64__" = xyes; then :
  CFLAGS="$CFLAGS -D__sparc64__"
  LINTFLAGS="$LINTFLAGS -D__sparc64__"
fi ;;
  *sparc*)          { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __sparc__" >&5
$as_echo_n "checking whether we need to define __sparc__... " >&6; }
if ${ac_cv_cpp_def___sparc__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __sparc__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___sparc__=yes
else
  ac_cv_cpp_def___sparc__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___sparc__" >&5
$as_echo "$ac_cv_cpp_def___sparc__" >&6; }
if test "x$ac_cv_cpp_def___sparc__" = xyes; then :
  CFLAGS="$CFLAGS -D__sparc__"
  LINTFLAGS="$LINTFLAGS -D__sparc__"
fi ;;
  *powerpc64*)      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __powerpc64__" >&5
$as_echo_n "checking whether we need to define __powerpc64__... " >&6; }
if ${ac_cv_cpp_def___powerpc64__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __powerpc64__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___powerpc64__=yes
else
  ac_cv_cpp_def___powerpc64__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___powerpc64__" >&5
$as_echo "$ac_cv_cpp_def___powerpc64__" >&6; }
if test "x$ac_cv_cpp_def___powerpc64__" = xyes; then :
  CFLAGS="$CFLAGS -D__powerpc64__"
  LINTFLAGS="$LINTFLAGS -D__powerpc64__"
fi ;;
  *powerpc*)        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __powerpc__" >&5
$as_echo_n "checking whether we need to define __powerpc__... " >&6; }
if ${ac_cv_cpp_def___powerpc__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __powerpc__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___powerpc__=yes
else
  ac_cv_cpp_def___powerpc__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___powerpc__" >&5
$as_echo "$ac_cv_cpp_def___powerpc__" >&6; }
if test "x$ac_cv_cpp_def___powerpc__" = xyes; then :
  CFLAGS="$CFLAGS -D__powerpc__"
  LINTFLAGS="$LINTFLAGS -D__powerpc__"
fi ;;
  *aarch64*)        { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __aarch64__" >&5
$as_echo_n "checking whether we need to define __aarch64__... " >&6; }
if ${ac_cv_cpp_def___aarch64__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __aarch64__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___aarch64__=yes
else
  ac_cv_cpp_def___aarch64__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___aarch64__" >&5
$as_echo "$ac_cv_cpp_def___aarch64__" >&6; }
if test "x$ac_cv_cpp_def___aarch64__" = xyes; then :
  CFLAGS="$CFLAGS -D__aarch64__"
  LINTFLAGS="$LINTFLAGS -D__aarch64__"
fi ;;
  *arm*)            { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __arm__" >&5
$as_echo_n "checking whether we need to define __arm__... " >&6; }
if ${ac_cv_cpp_def___arm__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __arm__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___arm__=yes
else
  ac_cv_cpp_def___arm__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___arm__" >&5
$as_echo "$ac_cv_cpp_def___arm__" >&6; }
if test "x$ac_cv_cpp_def___arm__" = xyes; then :
  CFLAGS="$CFLAGS -D__arm__"
  LINTFLAGS="$LINTFLAGS -D__arm__"
fi ;;
esac

case $host_vendor in
  *sun*) { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we need to define __sun__" >&5
$as_echo_n "checking whether we need to define __sun__... " >&6; }
if ${ac_cv_cpp_def___sun__+:} false; then :
  $as_echo_n "(cached) " >&6
else
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#ifndef __sun__
yes
#endif
_ACEOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  $EGREP "yes" >/dev/null 2>&1; then :
  ac_cv_cpp_def___sun__=yes
else
  ac_cv_cpp_def___sun__=no
fi
rm -f conftest*

fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cpp_def___sun__" >&5
$as_echo "$ac_cv_cpp_def___sun__" >&6; }
if test "x$ac_cv_cpp_def___sun__" = xyes; then :
  CFLAGS="$CFLAGS -D__sun__"
  LINTFLAGS="$LINTFLAGS -D__sun__"
fi ;;
esac





ac_config_commands="$ac_config_commands include/stamp-h"

$as_echo_n "creating Makefile rules..." >&6

ALL_VARS_RULES="OPENGL_LIBS = $OPENGL_LIBS
SOCKET_LIBS = $SOCKET_LIBS
COREFOUNDATION_LIBS = $COREFOUNDATION_LIBS
IOKIT_LIBS = $IOKIT_LIBS
FORCEFEEDBACK_LIBS = $FORCEFEEDBACK_LIBS
APPLICATIONSERVICES_LIBS = $APPLICATIONSERVICES_LIBS
CORESERVICES_LIBS = $CORESERVICES_LIBS
APPKIT_LIBS = $APPKIT_LIBS
DISKARBITRATION_LIBS = $DISKARBITRATION_LIBS
SECURITY_LIBS = $SECURITY_LIBS
COREAUDIO_LIBS = $COREAUDIO_LIBS
OPENAL_LIBS = $OPENAL_LIBS
OPENCL_LIBS = $OPENCL_LIBS
QUICKTIME_LIBS = $QUICKTIME_LIBS
CARBON_LIBS = $CARBON_LIBS
PTHREAD_LIBS = $PTHREAD_LIBS
X_CFLAGS = $X_CFLAGS
X_PRE_LIBS = $X_PRE_LIBS
X_LIBS = $X_LIBS
X_EXTRA_LIBS = $X_EXTRA_LIBS
XML2_CFLAGS = $XML2_CFLAGS
XML2_LIBS = $XML2_LIBS
XSLT_CFLAGS = $XSLT_CFLAGS
XSLT_LIBS = $XSLT_LIBS
DBUS_CFLAGS = $DBUS_CFLAGS
DBUS_LIBS = $DBUS_LIBS
HAL_CFLAGS = $HAL_CFLAGS
HAL_LIBS = $HAL_LIBS
GNUTLS_CFLAGS = $GNUTLS_CFLAGS
GNUTLS_LIBS = $GNUTLS_LIBS
SANE_CFLAGS = $SANE_CFLAGS
SANE_LIBS = $SANE_LIBS
GPHOTO2_CFLAGS = $GPHOTO2_CFLAGS
GPHOTO2_LIBS = $GPHOTO2_LIBS
GPHOTO2_PORT_CFLAGS = $GPHOTO2_PORT_CFLAGS
GPHOTO2_PORT_LIBS = $GPHOTO2_PORT_LIBS
RESOLV_LIBS = $RESOLV_LIBS
LCMS2_CFLAGS = $LCMS2_CFLAGS
LCMS2_LIBS = $LCMS2_LIBS
FREETYPE_CFLAGS = $FREETYPE_CFLAGS
FREETYPE_LIBS = $FREETYPE_LIBS
Z_LIBS = $Z_LIBS
GETTEXTPO_LIBS = $GETTEXTPO_LIBS
GSTREAMER_CFLAGS = $GSTREAMER_CFLAGS
GSTREAMER_LIBS = $GSTREAMER_LIBS
ALSA_LIBS = $ALSA_LIBS
OSS4_CFLAGS = $OSS4_CFLAGS
CAPI20_CFLAGS = $CAPI20_CFLAGS
CAPI20_LIBS = $CAPI20_LIBS
CUPS_CFLAGS = $CUPS_CFLAGS
FONTCONFIG_CFLAGS = $FONTCONFIG_CFLAGS
FONTCONFIG_LIBS = $FONTCONFIG_LIBS
JPEG_CFLAGS = $JPEG_CFLAGS
JPEG_LIBS = $JPEG_LIBS
PNG_CFLAGS = $PNG_CFLAGS
PNG_LIBS = $PNG_LIBS
TIFF_CFLAGS = $TIFF_CFLAGS
TIFF_LIBS = $TIFF_LIBS
MPG123_CFLAGS = $MPG123_CFLAGS
MPG123_LIBS = $MPG123_LIBS
KSTAT_LIBS = $KSTAT_LIBS
PROCSTAT_LIBS = $PROCSTAT_LIBS
DL_LIBS = $DL_LIBS
POLL_LIBS = $POLL_LIBS
RT_LIBS = $RT_LIBS
LDAP_LIBS = $LDAP_LIBS
"



wine_fn_append_rule "
# Rules automatically generated by configure

CLEAN_FILES = *.o *.a *.so *.res *.fake *.ok *.tab.[ch] *.yy.c

.INIT: Makefile
.MAKEFILEDEPS:
all: Makefile
Makefile: $srcdir/Makefile.in $srcdir/Make.vars.in config.status \$(MAKEDEP)
	@./config.status Make.tmp Makefile"

test "$srcdir" = . && wine_fn_append_rule "all: .gitignore
.gitignore: config.status
	@./config.status .gitignore"

test -n "$CROSSTARGET" || wine_fn_append_rule "crosstest:
	@echo \"crosstest is not supported (mingw not installed?)\" && false"

if test "x$enable_fonts" != xno; then
ac_config_links="$ac_config_links fonts/marlett.ttf:fonts/marlett.ttf"
ac_config_links="$ac_config_links fonts/symbol.ttf:fonts/symbol.ttf"
ac_config_links="$ac_config_links fonts/tahoma.ttf:fonts/tahoma.ttf"
ac_config_links="$ac_config_links fonts/tahomabd.ttf:fonts/tahomabd.ttf"
test "$srcdir" = "." || wine_fn_config_symlink fonts/marlett.ttf fonts/symbol.ttf fonts/tahoma.ttf fonts/tahomabd.ttf
fi
ac_config_links="$ac_config_links loader/l_intl.nls:loader/l_intl.nls"
test "$srcdir" = "." || wine_fn_config_symlink loader/l_intl.nls
ac_config_links="$ac_config_links po/LINGUAS:po/LINGUAS"
test "$srcdir" = "." || wine_fn_config_symlink po/LINGUAS
ac_config_links="$ac_config_links wine:tools/winewrapper"
wine_fn_config_symlink wine
if test "x$enable_win64" != xno; then
ac_config_links="$ac_config_links wine64:tools/winewrapper"
wine_fn_config_symlink wine64
fi

wine_fn_config_dll acledit enable_acledit
wine_fn_config_dll aclui enable_aclui implib
wine_fn_config_dll activeds enable_activeds implib
wine_fn_config_dll actxprxy enable_actxprxy clean
wine_fn_config_lib adsiid
wine_fn_config_dll advapi32 enable_advapi32 clean,implib
wine_fn_config_test dlls/advapi32/tests advapi32_test
wine_fn_config_dll advpack enable_advpack implib
wine_fn_config_test dlls/advpack/tests advpack_test
wine_fn_config_dll amstream enable_amstream clean
wine_fn_config_test dlls/amstream/tests amstream_test
wine_fn_config_dll api-ms-win-core-com-l1-1-0 enable_api_ms_win_core_com_l1_1_0
wine_fn_config_dll api-ms-win-core-console-l1-1-0 enable_api_ms_win_core_console_l1_1_0
wine_fn_config_dll api-ms-win-core-datetime-l1-1-0 enable_api_ms_win_core_datetime_l1_1_0
wine_fn_config_dll api-ms-win-core-datetime-l1-1-1 enable_api_ms_win_core_datetime_l1_1_1
wine_fn_config_dll api-ms-win-core-debug-l1-1-1 enable_api_ms_win_core_debug_l1_1_1
wine_fn_config_dll api-ms-win-core-errorhandling-l1-1-1 enable_api_ms_win_core_errorhandling_l1_1_1
wine_fn_config_dll api-ms-win-core-errorhandling-l1-1-2 enable_api_ms_win_core_errorhandling_l1_1_2
wine_fn_config_dll api-ms-win-core-fibers-l1-1-0 enable_api_ms_win_core_fibers_l1_1_0
wine_fn_config_dll api-ms-win-core-fibers-l1-1-1 enable_api_ms_win_core_fibers_l1_1_1
wine_fn_config_dll api-ms-win-core-file-l1-2-0 enable_api_ms_win_core_file_l1_2_0
wine_fn_config_dll api-ms-win-core-file-l2-1-0 enable_api_ms_win_core_file_l2_1_0
wine_fn_config_dll api-ms-win-core-file-l2-1-1 enable_api_ms_win_core_file_l2_1_1
wine_fn_config_dll api-ms-win-core-handle-l1-1-0 enable_api_ms_win_core_handle_l1_1_0
wine_fn_config_dll api-ms-win-core-heap-l1-2-0 enable_api_ms_win_core_heap_l1_2_0
wine_fn_config_dll api-ms-win-core-heap-obsolete-l1-1-0 enable_api_ms_win_core_heap_obsolete_l1_1_0
wine_fn_config_dll api-ms-win-core-interlocked-l1-2-0 enable_api_ms_win_core_interlocked_l1_2_0
wine_fn_config_dll api-ms-win-core-io-l1-1-1 enable_api_ms_win_core_io_l1_1_1
wine_fn_config_dll api-ms-win-core-kernel32-legacy-l1-1-0 enable_api_ms_win_core_kernel32_legacy_l1_1_0
wine_fn_config_dll api-ms-win-core-libraryloader-l1-1-1 enable_api_ms_win_core_libraryloader_l1_1_1
wine_fn_config_dll api-ms-win-core-localization-l1-2-0 enable_api_ms_win_core_localization_l1_2_0
wine_fn_config_dll api-ms-win-core-localization-l1-2-1 enable_api_ms_win_core_localization_l1_2_1
wine_fn_config_dll api-ms-win-core-localization-obsolete-l1-1-0 enable_api_ms_win_core_localization_obsolete_l1_1_0
wine_fn_config_dll api-ms-win-core-localregistry-l1-1-0 enable_api_ms_win_core_localregistry_l1_1_0
wine_fn_config_dll api-ms-win-core-memory-l1-1-1 enable_api_ms_win_core_memory_l1_1_1
wine_fn_config_dll api-ms-win-core-namedpipe-l1-2-0 enable_api_ms_win_core_namedpipe_l1_2_0
wine_fn_config_dll api-ms-win-core-processenvironment-l1-2-0 enable_api_ms_win_core_processenvironment_l1_2_0
wine_fn_config_dll api-ms-win-core-processthreads-l1-1-0 enable_api_ms_win_core_processthreads_l1_1_0
wine_fn_config_dll api-ms-win-core-processthreads-l1-1-1 enable_api_ms_win_core_processthreads_l1_1_1
wine_fn_config_dll api-ms-win-core-processthreads-l1-1-2 enable_api_ms_win_core_processthreads_l1_1_2
wine_fn_config_dll api-ms-win-core-profile-l1-1-0 enable_api_ms_win_core_profile_l1_1_0
wine_fn_config_dll api-ms-win-core-psapi-l1-1-0 enable_api_ms_win_core_psapi_l1_1_0
wine_fn_config_dll api-ms-win-core-registry-l1-1-0 enable_api_ms_win_core_registry_l1_1_0
wine_fn_config_dll api-ms-win-core-rtlsupport-l1-2-0 enable_api_ms_win_core_rtlsupport_l1_2_0
wine_fn_config_dll api-ms-win-core-shlwapi-legacy-l1-1-0 enable_api_ms_win_core_shlwapi_legacy_l1_1_0
wine_fn_config_dll api-ms-win-core-string-l1-1-0 enable_api_ms_win_core_string_l1_1_0
wine_fn_config_dll api-ms-win-core-synch-l1-2-0 enable_api_ms_win_core_synch_l1_2_0
wine_fn_config_dll api-ms-win-core-sysinfo-l1-2-0 enable_api_ms_win_core_sysinfo_l1_2_0
wine_fn_config_dll api-ms-win-core-sysinfo-l1-2-1 enable_api_ms_win_core_sysinfo_l1_2_1
wine_fn_config_dll api-ms-win-core-threadpool-legacy-l1-1-0 enable_api_ms_win_core_threadpool_legacy_l1_1_0
wine_fn_config_dll api-ms-win-core-timezone-l1-1-0 enable_api_ms_win_core_timezone_l1_1_0
wine_fn_config_dll api-ms-win-core-url-l1-1-0 enable_api_ms_win_core_url_l1_1_0
wine_fn_config_dll api-ms-win-core-util-l1-1-0 enable_api_ms_win_core_util_l1_1_0
wine_fn_config_dll api-ms-win-core-winrt-error-l1-1-0 enable_api_ms_win_core_winrt_error_l1_1_0
wine_fn_config_dll api-ms-win-core-winrt-error-l1-1-1 enable_api_ms_win_core_winrt_error_l1_1_1
wine_fn_config_dll api-ms-win-core-winrt-l1-1-0 enable_api_ms_win_core_winrt_l1_1_0
wine_fn_config_dll api-ms-win-core-winrt-string-l1-1-0 enable_api_ms_win_core_winrt_string_l1_1_0
wine_fn_config_dll api-ms-win-core-xstate-l2-1-0 enable_api_ms_win_core_xstate_l2_1_0
wine_fn_config_dll api-ms-win-downlevel-advapi32-l1-1-0 enable_api_ms_win_downlevel_advapi32_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-advapi32-l2-1-0 enable_api_ms_win_downlevel_advapi32_l2_1_0
wine_fn_config_dll api-ms-win-downlevel-normaliz-l1-1-0 enable_api_ms_win_downlevel_normaliz_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-ole32-l1-1-0 enable_api_ms_win_downlevel_ole32_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-shell32-l1-1-0 enable_api_ms_win_downlevel_shell32_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-shlwapi-l1-1-0 enable_api_ms_win_downlevel_shlwapi_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-shlwapi-l2-1-0 enable_api_ms_win_downlevel_shlwapi_l2_1_0
wine_fn_config_dll api-ms-win-downlevel-user32-l1-1-0 enable_api_ms_win_downlevel_user32_l1_1_0
wine_fn_config_dll api-ms-win-downlevel-version-l1-1-0 enable_api_ms_win_downlevel_version_l1_1_0
wine_fn_config_dll api-ms-win-eventing-provider-l1-1-0 enable_api_ms_win_eventing_provider_l1_1_0
wine_fn_config_dll api-ms-win-ntuser-dc-access-l1-1-0 enable_api_ms_win_ntuser_dc_access_l1_1_0
wine_fn_config_dll api-ms-win-security-base-l1-1-0 enable_api_ms_win_security_base_l1_1_0
wine_fn_config_dll api-ms-win-security-base-l1-2-0 enable_api_ms_win_security_base_l1_2_0
wine_fn_config_dll api-ms-win-security-sddl-l1-1-0 enable_api_ms_win_security_sddl_l1_1_0
wine_fn_config_dll api-ms-win-service-core-l1-1-1 enable_api_ms_win_service_core_l1_1_1
wine_fn_config_dll api-ms-win-service-management-l1-1-0 enable_api_ms_win_service_management_l1_1_0
wine_fn_config_dll api-ms-win-service-winsvc-l1-2-0 enable_api_ms_win_service_winsvc_l1_2_0
wine_fn_config_dll apphelp enable_apphelp
wine_fn_config_test dlls/apphelp/tests apphelp_test
wine_fn_config_dll appwiz.cpl enable_appwiz_cpl po
wine_fn_config_dll atl enable_atl clean,implib
wine_fn_config_test dlls/atl/tests atl_test
wine_fn_config_dll atl100 enable_atl100 clean,implib
wine_fn_config_test dlls/atl100/tests atl100_test
wine_fn_config_dll atl110 enable_atl110 clean
wine_fn_config_dll atl80 enable_atl80 clean,implib
wine_fn_config_test dlls/atl80/tests atl80_test
wine_fn_config_dll atl90 enable_atl90 clean
wine_fn_config_dll authz enable_authz
wine_fn_config_dll avicap32 enable_avicap32 implib
wine_fn_config_dll avifil32 enable_avifil32 clean,implib,po
wine_fn_config_test dlls/avifil32/tests avifil32_test
wine_fn_config_dll avifile.dll16 enable_win16
wine_fn_config_dll avrt enable_avrt implib
wine_fn_config_dll bcrypt enable_bcrypt
wine_fn_config_test dlls/bcrypt/tests bcrypt_test
wine_fn_config_dll browseui enable_browseui clean,po
wine_fn_config_test dlls/browseui/tests browseui_test
wine_fn_config_dll cabinet enable_cabinet implib
wine_fn_config_test dlls/cabinet/tests cabinet_test
wine_fn_config_dll capi2032 enable_capi2032 implib
wine_fn_config_dll cards enable_cards implib
wine_fn_config_dll cfgmgr32 enable_cfgmgr32 implib
wine_fn_config_dll clusapi enable_clusapi implib
wine_fn_config_dll combase enable_combase
wine_fn_config_test dlls/combase/tests combase_test
wine_fn_config_dll comcat enable_comcat
wine_fn_config_test dlls/comcat/tests comcat_test
wine_fn_config_dll comctl32 enable_comctl32 implib,po
wine_fn_config_test dlls/comctl32/tests comctl32_test
wine_fn_config_dll comdlg32 enable_comdlg32 clean,implib,po
wine_fn_config_test dlls/comdlg32/tests comdlg32_test
wine_fn_config_dll comm.drv16 enable_win16
wine_fn_config_dll commdlg.dll16 enable_win16
wine_fn_config_dll compobj.dll16 enable_win16
wine_fn_config_dll compstui enable_compstui implib
wine_fn_config_dll comsvcs enable_comsvcs implib
wine_fn_config_dll connect enable_connect
wine_fn_config_dll credui enable_credui implib,po
wine_fn_config_test dlls/credui/tests credui_test
wine_fn_config_dll crtdll enable_crtdll implib
wine_fn_config_dll crypt32 enable_crypt32 implib,po
wine_fn_config_test dlls/crypt32/tests crypt32_test
wine_fn_config_dll cryptdlg enable_cryptdlg po
wine_fn_config_dll cryptdll enable_cryptdll implib
wine_fn_config_dll cryptext enable_cryptext
wine_fn_config_dll cryptnet enable_cryptnet implib
wine_fn_config_test dlls/cryptnet/tests cryptnet_test
wine_fn_config_dll cryptui enable_cryptui implib,po
wine_fn_config_test dlls/cryptui/tests cryptui_test
wine_fn_config_dll ctapi32 enable_ctapi32
wine_fn_config_dll ctl3d.dll16 enable_win16
wine_fn_config_dll ctl3d32 enable_ctl3d32 implib
wine_fn_config_dll ctl3dv2.dll16 enable_win16
wine_fn_config_dll d2d1 enable_d2d1 implib
wine_fn_config_test dlls/d2d1/tests d2d1_test
wine_fn_config_dll d3d10 enable_d3d10 implib
wine_fn_config_test dlls/d3d10/tests d3d10_test
wine_fn_config_dll d3d10_1 enable_d3d10_1 implib
wine_fn_config_dll d3d10core enable_d3d10core implib
wine_fn_config_test dlls/d3d10core/tests d3d10core_test
wine_fn_config_dll d3d11 enable_d3d11
wine_fn_config_dll d3d8 enable_d3d8 implib
wine_fn_config_test dlls/d3d8/tests d3d8_test
wine_fn_config_dll d3d9 enable_d3d9 implib
wine_fn_config_test dlls/d3d9/tests d3d9_test
wine_fn_config_dll d3dcompiler_33 enable_d3dcompiler_33
wine_fn_config_dll d3dcompiler_34 enable_d3dcompiler_34
wine_fn_config_dll d3dcompiler_35 enable_d3dcompiler_35
wine_fn_config_dll d3dcompiler_36 enable_d3dcompiler_36
wine_fn_config_dll d3dcompiler_37 enable_d3dcompiler_37
wine_fn_config_dll d3dcompiler_38 enable_d3dcompiler_38
wine_fn_config_dll d3dcompiler_39 enable_d3dcompiler_39
wine_fn_config_dll d3dcompiler_40 enable_d3dcompiler_40
wine_fn_config_dll d3dcompiler_41 enable_d3dcompiler_41
wine_fn_config_dll d3dcompiler_42 enable_d3dcompiler_42
wine_fn_config_dll d3dcompiler_43 enable_d3dcompiler_43 implib d3dcompiler
wine_fn_config_test dlls/d3dcompiler_43/tests d3dcompiler_43_test
wine_fn_config_dll d3dim enable_d3dim implib
wine_fn_config_dll d3drm enable_d3drm implib
wine_fn_config_test dlls/d3drm/tests d3drm_test
wine_fn_config_dll d3dx10_33 enable_d3dx10_33
wine_fn_config_dll d3dx10_34 enable_d3dx10_34
wine_fn_config_dll d3dx10_35 enable_d3dx10_35
wine_fn_config_dll d3dx10_36 enable_d3dx10_36
wine_fn_config_dll d3dx10_37 enable_d3dx10_37
wine_fn_config_dll d3dx10_38 enable_d3dx10_38
wine_fn_config_dll d3dx10_39 enable_d3dx10_39
wine_fn_config_dll d3dx10_40 enable_d3dx10_40
wine_fn_config_dll d3dx10_41 enable_d3dx10_41
wine_fn_config_dll d3dx10_42 enable_d3dx10_42
wine_fn_config_dll d3dx10_43 enable_d3dx10_43
wine_fn_config_dll d3dx11_42 enable_d3dx11_42
wine_fn_config_dll d3dx11_43 enable_d3dx11_43
wine_fn_config_dll d3dx9_24 enable_d3dx9_24
wine_fn_config_dll d3dx9_25 enable_d3dx9_25
wine_fn_config_dll d3dx9_26 enable_d3dx9_26
wine_fn_config_dll d3dx9_27 enable_d3dx9_27
wine_fn_config_dll d3dx9_28 enable_d3dx9_28
wine_fn_config_dll d3dx9_29 enable_d3dx9_29
wine_fn_config_dll d3dx9_30 enable_d3dx9_30
wine_fn_config_dll d3dx9_31 enable_d3dx9_31
wine_fn_config_dll d3dx9_32 enable_d3dx9_32
wine_fn_config_dll d3dx9_33 enable_d3dx9_33
wine_fn_config_dll d3dx9_34 enable_d3dx9_34
wine_fn_config_dll d3dx9_35 enable_d3dx9_35
wine_fn_config_dll d3dx9_36 enable_d3dx9_36 implib d3dx9
wine_fn_config_test dlls/d3dx9_36/tests d3dx9_36_test
wine_fn_config_dll d3dx9_37 enable_d3dx9_37
wine_fn_config_dll d3dx9_38 enable_d3dx9_38
wine_fn_config_dll d3dx9_39 enable_d3dx9_39
wine_fn_config_dll d3dx9_40 enable_d3dx9_40
wine_fn_config_dll d3dx9_41 enable_d3dx9_41
wine_fn_config_dll d3dx9_42 enable_d3dx9_42
wine_fn_config_dll d3dx9_43 enable_d3dx9_43
wine_fn_config_dll d3dxof enable_d3dxof clean,implib
wine_fn_config_test dlls/d3dxof/tests d3dxof_test
wine_fn_config_dll dbgeng enable_dbgeng implib
wine_fn_config_dll dbghelp enable_dbghelp implib
wine_fn_config_dll dciman32 enable_dciman32 implib
wine_fn_config_dll ddeml.dll16 enable_win16
wine_fn_config_dll ddraw enable_ddraw clean,implib
wine_fn_config_test dlls/ddraw/tests ddraw_test
wine_fn_config_dll ddrawex enable_ddrawex clean
wine_fn_config_test dlls/ddrawex/tests ddrawex_test
wine_fn_config_dll devenum enable_devenum clean,po
wine_fn_config_test dlls/devenum/tests devenum_test
wine_fn_config_dll dhcpcsvc enable_dhcpcsvc
wine_fn_config_dll difxapi enable_difxapi
wine_fn_config_dll dinput enable_dinput clean,implib,po,staticimplib
wine_fn_config_test dlls/dinput/tests dinput_test
wine_fn_config_dll dinput8 enable_dinput8 clean,implib
wine_fn_config_test dlls/dinput8/tests dinput8_test
wine_fn_config_dll dispdib.dll16 enable_win16
wine_fn_config_dll dispex enable_dispex clean
wine_fn_config_test dlls/dispex/tests dispex_test
wine_fn_config_dll display.drv16 enable_win16
wine_fn_config_dll dmband enable_dmband clean
wine_fn_config_test dlls/dmband/tests dmband_test
wine_fn_config_dll dmcompos enable_dmcompos clean
wine_fn_config_test dlls/dmcompos/tests dmcompos_test
wine_fn_config_dll dmime enable_dmime clean
wine_fn_config_test dlls/dmime/tests dmime_test
wine_fn_config_dll dmloader enable_dmloader clean
wine_fn_config_test dlls/dmloader/tests dmloader_test
wine_fn_config_dll dmscript enable_dmscript clean
wine_fn_config_test dlls/dmscript/tests dmscript_test
wine_fn_config_dll dmstyle enable_dmstyle clean
wine_fn_config_test dlls/dmstyle/tests dmstyle_test
wine_fn_config_dll dmsynth enable_dmsynth clean
wine_fn_config_test dlls/dmsynth/tests dmsynth_test
wine_fn_config_dll dmusic enable_dmusic clean
wine_fn_config_test dlls/dmusic/tests dmusic_test
wine_fn_config_dll dmusic32 enable_dmusic32 implib
wine_fn_config_dll dnsapi enable_dnsapi implib
wine_fn_config_test dlls/dnsapi/tests dnsapi_test
wine_fn_config_dll dplay enable_dplay implib
wine_fn_config_dll dplayx enable_dplayx clean,implib
wine_fn_config_test dlls/dplayx/tests dplayx_test
wine_fn_config_dll dpnaddr enable_dpnaddr
wine_fn_config_dll dpnet enable_dpnet clean,implib
wine_fn_config_test dlls/dpnet/tests dpnet_test
wine_fn_config_dll dpnhpast enable_dpnhpast
wine_fn_config_dll dpnlobby enable_dpnlobby
wine_fn_config_dll dpvoice enable_dpvoice clean
wine_fn_config_test dlls/dpvoice/tests dpvoice_test
wine_fn_config_dll dpwsockx enable_dpwsockx
wine_fn_config_dll drmclien enable_drmclien
wine_fn_config_dll dsound enable_dsound clean,implib
wine_fn_config_test dlls/dsound/tests dsound_test
wine_fn_config_dll dssenh enable_dssenh
wine_fn_config_test dlls/dssenh/tests dssenh_test
wine_fn_config_dll dswave enable_dswave clean
wine_fn_config_test dlls/dswave/tests dswave_test
wine_fn_config_dll dwmapi enable_dwmapi implib
wine_fn_config_dll dwrite enable_dwrite implib
wine_fn_config_test dlls/dwrite/tests dwrite_test
wine_fn_config_dll dxdiagn enable_dxdiagn clean,po
wine_fn_config_test dlls/dxdiagn/tests dxdiagn_test
wine_fn_config_lib dxerr8
wine_fn_config_lib dxerr9
wine_fn_config_dll dxgi enable_dxgi implib
wine_fn_config_test dlls/dxgi/tests dxgi_test
wine_fn_config_lib dxguid
wine_fn_config_dll dxva2 enable_dxva2
wine_fn_config_dll evr enable_evr
wine_fn_config_dll explorerframe enable_explorerframe clean
wine_fn_config_test dlls/explorerframe/tests explorerframe_test
wine_fn_config_dll ext-ms-win-gdi-devcaps-l1-1-0 enable_ext_ms_win_gdi_devcaps_l1_1_0
wine_fn_config_dll faultrep enable_faultrep implib
wine_fn_config_test dlls/faultrep/tests faultrep_test
wine_fn_config_dll fltlib enable_fltlib
wine_fn_config_dll fntcache enable_fntcache
wine_fn_config_dll fontsub enable_fontsub
wine_fn_config_dll fusion enable_fusion
wine_fn_config_test dlls/fusion/tests fusion_test
wine_fn_config_dll fwpuclnt enable_fwpuclnt
wine_fn_config_dll gameux enable_gameux clean
wine_fn_config_test dlls/gameux/tests gameux_test
wine_fn_config_dll gdi.exe16 enable_win16
wine_fn_config_dll gdi32 enable_gdi32 clean,implib,po
wine_fn_config_test dlls/gdi32/tests gdi32_test
wine_fn_config_dll gdiplus enable_gdiplus implib
wine_fn_config_test dlls/gdiplus/tests gdiplus_test
wine_fn_config_dll glu32 enable_glu32 implib
wine_fn_config_dll gphoto2.ds enable_gphoto2_ds po
wine_fn_config_dll gpkcsp enable_gpkcsp
wine_fn_config_dll hal enable_hal
wine_fn_config_dll hhctrl.ocx enable_hhctrl_ocx clean,implib,po htmlhelp
wine_fn_config_dll hid enable_hid implib
wine_fn_config_dll hlink enable_hlink clean,implib
wine_fn_config_test dlls/hlink/tests hlink_test
wine_fn_config_dll hnetcfg enable_hnetcfg clean
wine_fn_config_dll httpapi enable_httpapi
wine_fn_config_dll iccvid enable_iccvid po
wine_fn_config_dll icmp enable_icmp
wine_fn_config_dll ieframe enable_ieframe clean,implib,po
wine_fn_config_test dlls/ieframe/tests ieframe_test
wine_fn_config_dll ifsmgr.vxd enable_win16
wine_fn_config_dll imaadp32.acm enable_imaadp32_acm
wine_fn_config_dll imagehlp enable_imagehlp implib
wine_fn_config_test dlls/imagehlp/tests imagehlp_test
wine_fn_config_dll imm.dll16 enable_win16
wine_fn_config_dll imm32 enable_imm32 implib
wine_fn_config_test dlls/imm32/tests imm32_test
wine_fn_config_dll inetcomm enable_inetcomm clean,implib
wine_fn_config_test dlls/inetcomm/tests inetcomm_test
wine_fn_config_dll inetcpl.cpl enable_inetcpl_cpl po
wine_fn_config_dll inetmib1 enable_inetmib1
wine_fn_config_test dlls/inetmib1/tests inetmib1_test
wine_fn_config_dll infosoft enable_infosoft clean
wine_fn_config_test dlls/infosoft/tests infosoft_test
wine_fn_config_dll initpki enable_initpki
wine_fn_config_dll inkobj enable_inkobj
wine_fn_config_dll inseng enable_inseng clean
wine_fn_config_dll iphlpapi enable_iphlpapi implib
wine_fn_config_test dlls/iphlpapi/tests iphlpapi_test
wine_fn_config_dll itircl enable_itircl
wine_fn_config_dll itss enable_itss clean
wine_fn_config_test dlls/itss/tests itss_test
wine_fn_config_dll joy.cpl enable_joy_cpl po
wine_fn_config_dll jscript enable_jscript clean,po
wine_fn_config_test dlls/jscript/tests jscript_test
wine_fn_config_dll jsproxy enable_jsproxy implib
wine_fn_config_dll kernel32 enable_kernel32 clean,implib,mc
wine_fn_config_test dlls/kernel32/tests kernel32_test
wine_fn_config_dll keyboard.drv16 enable_win16
wine_fn_config_dll krnl386.exe16 enable_win16 implib kernel
wine_fn_config_dll ksuser enable_ksuser
wine_fn_config_dll ktmw32 enable_ktmw32
wine_fn_config_dll loadperf enable_loadperf implib
wine_fn_config_dll localspl enable_localspl po
wine_fn_config_test dlls/localspl/tests localspl_test
wine_fn_config_dll localui enable_localui po
wine_fn_config_test dlls/localui/tests localui_test
wine_fn_config_dll lz32 enable_lz32 implib
wine_fn_config_test dlls/lz32/tests lz32_test
wine_fn_config_dll lzexpand.dll16 enable_win16
wine_fn_config_dll mapi32 enable_mapi32 implib,po
wine_fn_config_test dlls/mapi32/tests mapi32_test
wine_fn_config_dll mapistub enable_mapistub
wine_fn_config_dll mciavi32 enable_mciavi32
wine_fn_config_dll mcicda enable_mcicda
wine_fn_config_dll mciqtz32 enable_mciqtz32
wine_fn_config_dll mciseq enable_mciseq
wine_fn_config_dll mciwave enable_mciwave
wine_fn_config_dll mf enable_mf
wine_fn_config_dll mfplat enable_mfplat
wine_fn_config_dll mfreadwrite enable_mfreadwrite
wine_fn_config_dll mgmtapi enable_mgmtapi
wine_fn_config_dll midimap enable_midimap
wine_fn_config_dll mlang enable_mlang clean,implib
wine_fn_config_test dlls/mlang/tests mlang_test
wine_fn_config_dll mmcndmgr enable_mmcndmgr clean
wine_fn_config_test dlls/mmcndmgr/tests mmcndmgr_test
wine_fn_config_dll mmdevapi enable_mmdevapi clean
wine_fn_config_test dlls/mmdevapi/tests mmdevapi_test
wine_fn_config_dll mmdevldr.vxd enable_win16
wine_fn_config_dll mmsystem.dll16 enable_win16
wine_fn_config_dll monodebg.vxd enable_win16
wine_fn_config_dll mountmgr.sys enable_mountmgr_sys
wine_fn_config_dll mouse.drv16 enable_win16
wine_fn_config_dll mpr enable_mpr implib,po
wine_fn_config_test dlls/mpr/tests mpr_test
wine_fn_config_dll mprapi enable_mprapi implib
wine_fn_config_dll msacm.dll16 enable_win16
wine_fn_config_dll msacm32.drv enable_msacm32_drv
wine_fn_config_dll msacm32 enable_msacm32 implib,po
wine_fn_config_test dlls/msacm32/tests msacm32_test
wine_fn_config_dll msadp32.acm enable_msadp32_acm
wine_fn_config_dll msasn1 enable_msasn1 implib
wine_fn_config_dll mscat32 enable_mscat32
wine_fn_config_dll mscms enable_mscms implib
wine_fn_config_test dlls/mscms/tests mscms_test
wine_fn_config_dll mscoree enable_mscoree clean
wine_fn_config_test dlls/mscoree/tests mscoree_test
wine_fn_config_dll msctf enable_msctf clean
wine_fn_config_test dlls/msctf/tests msctf_test
wine_fn_config_dll msdaps enable_msdaps clean
wine_fn_config_dll msdmo enable_msdmo implib
wine_fn_config_test dlls/msdmo/tests msdmo_test
wine_fn_config_dll msftedit enable_msftedit
wine_fn_config_dll msg711.acm enable_msg711_acm
wine_fn_config_dll msgsm32.acm enable_msgsm32_acm
wine_fn_config_dll mshtml.tlb enable_mshtml_tlb clean
wine_fn_config_dll mshtml enable_mshtml clean,implib,po
wine_fn_config_test dlls/mshtml/tests mshtml_test clean
wine_fn_config_dll msi enable_msi clean,implib,po
wine_fn_config_test dlls/msi/tests msi_test
wine_fn_config_dll msident enable_msident clean
wine_fn_config_dll msimg32 enable_msimg32 implib
wine_fn_config_dll msimsg enable_msimsg
wine_fn_config_dll msimtf enable_msimtf clean
wine_fn_config_dll msisip enable_msisip
wine_fn_config_dll msisys.ocx enable_msisys_ocx
wine_fn_config_dll msls31 enable_msls31
wine_fn_config_dll msnet32 enable_msnet32
wine_fn_config_dll mspatcha enable_mspatcha implib
wine_fn_config_dll msrle32 enable_msrle32 po
wine_fn_config_test dlls/msrle32/tests msrle32_test
wine_fn_config_dll mssign32 enable_mssign32
wine_fn_config_dll mssip32 enable_mssip32
wine_fn_config_dll mstask enable_mstask clean
wine_fn_config_test dlls/mstask/tests mstask_test
wine_fn_config_dll msvcirt enable_msvcirt
wine_fn_config_dll msvcm80 enable_msvcm80
wine_fn_config_dll msvcm90 enable_msvcm90
wine_fn_config_dll msvcp100 enable_msvcp100
wine_fn_config_test dlls/msvcp100/tests msvcp100_test
wine_fn_config_dll msvcp110 enable_msvcp110
wine_fn_config_dll msvcp120 enable_msvcp120
wine_fn_config_test dlls/msvcp120/tests msvcp120_test
wine_fn_config_dll msvcp120_app enable_msvcp120_app
wine_fn_config_dll msvcp60 enable_msvcp60
wine_fn_config_test dlls/msvcp60/tests msvcp60_test
wine_fn_config_dll msvcp70 enable_msvcp70
wine_fn_config_dll msvcp71 enable_msvcp71
wine_fn_config_dll msvcp80 enable_msvcp80
wine_fn_config_dll msvcp90 enable_msvcp90
wine_fn_config_test dlls/msvcp90/tests msvcp90_test
wine_fn_config_dll msvcr100 enable_msvcr100 implib
wine_fn_config_test dlls/msvcr100/tests msvcr100_test
wine_fn_config_dll msvcr110 enable_msvcr110 implib
wine_fn_config_dll msvcr120 enable_msvcr120 implib
wine_fn_config_test dlls/msvcr120/tests msvcr120_test
wine_fn_config_dll msvcr120_app enable_msvcr120_app
wine_fn_config_dll msvcr70 enable_msvcr70 implib
wine_fn_config_dll msvcr71 enable_msvcr71 implib
wine_fn_config_dll msvcr80 enable_msvcr80 implib
wine_fn_config_dll msvcr90 enable_msvcr90 implib
wine_fn_config_test dlls/msvcr90/tests msvcr90_test
wine_fn_config_dll msvcrt enable_msvcrt implib
wine_fn_config_test dlls/msvcrt/tests msvcrt_test
wine_fn_config_dll msvcrt20 enable_msvcrt20 implib
wine_fn_config_dll msvcrt40 enable_msvcrt40 implib
wine_fn_config_dll msvcrtd enable_msvcrtd implib
wine_fn_config_test dlls/msvcrtd/tests msvcrtd_test
wine_fn_config_dll msvfw32 enable_msvfw32 implib,po
wine_fn_config_test dlls/msvfw32/tests msvfw32_test
wine_fn_config_dll msvidc32 enable_msvidc32 po
wine_fn_config_dll msvideo.dll16 enable_win16
wine_fn_config_dll mswsock enable_mswsock implib
wine_fn_config_dll msxml enable_msxml clean
wine_fn_config_dll msxml2 enable_msxml2 clean
wine_fn_config_dll msxml3 enable_msxml3 clean
wine_fn_config_test dlls/msxml3/tests msxml3_test clean
wine_fn_config_dll msxml4 enable_msxml4 clean
wine_fn_config_dll msxml6 enable_msxml6 clean
wine_fn_config_dll nddeapi enable_nddeapi implib
wine_fn_config_dll ndis.sys enable_ndis_sys
wine_fn_config_dll netapi32 enable_netapi32 implib
wine_fn_config_test dlls/netapi32/tests netapi32_test
wine_fn_config_dll netcfgx enable_netcfgx clean
wine_fn_config_test dlls/netcfgx/tests netcfgx_test
wine_fn_config_dll netprofm enable_netprofm clean
wine_fn_config_test dlls/netprofm/tests netprofm_test
wine_fn_config_dll newdev enable_newdev implib
wine_fn_config_dll normaliz enable_normaliz implib
wine_fn_config_dll npmshtml enable_npmshtml
wine_fn_config_dll npptools enable_npptools
wine_fn_config_dll ntdll enable_ntdll implib
wine_fn_config_test dlls/ntdll/tests ntdll_test
wine_fn_config_dll ntdsapi enable_ntdsapi implib
wine_fn_config_test dlls/ntdsapi/tests ntdsapi_test
wine_fn_config_dll ntoskrnl.exe enable_ntoskrnl_exe implib
wine_fn_config_dll ntprint enable_ntprint
wine_fn_config_test dlls/ntprint/tests ntprint_test
wine_fn_config_dll objsel enable_objsel clean
wine_fn_config_dll odbc32 enable_odbc32 implib
wine_fn_config_dll odbccp32 enable_odbccp32 implib
wine_fn_config_test dlls/odbccp32/tests odbccp32_test
wine_fn_config_dll odbccu32 enable_odbccu32
wine_fn_config_dll ole2.dll16 enable_win16
wine_fn_config_dll ole2conv.dll16 enable_win16
wine_fn_config_dll ole2disp.dll16 enable_win16
wine_fn_config_dll ole2nls.dll16 enable_win16
wine_fn_config_dll ole2prox.dll16 enable_win16
wine_fn_config_dll ole2thk.dll16 enable_win16
wine_fn_config_dll ole32 enable_ole32 clean,implib
wine_fn_config_test dlls/ole32/tests ole32_test
wine_fn_config_dll oleacc enable_oleacc clean,implib,po
wine_fn_config_test dlls/oleacc/tests oleacc_test
wine_fn_config_dll oleaut32 enable_oleaut32 clean,implib,po
wine_fn_config_test dlls/oleaut32/tests oleaut32_test clean
wine_fn_config_dll olecli.dll16 enable_win16
wine_fn_config_dll olecli32 enable_olecli32 implib
wine_fn_config_dll oledb32 enable_oledb32 clean
wine_fn_config_test dlls/oledb32/tests oledb32_test clean
wine_fn_config_dll oledlg enable_oledlg implib,po
wine_fn_config_dll olepro32 enable_olepro32 implib
wine_fn_config_dll olesvr.dll16 enable_win16
wine_fn_config_dll olesvr32 enable_olesvr32 implib
wine_fn_config_dll olethk32 enable_olethk32
wine_fn_config_dll openal32 enable_openal32
wine_fn_config_dll opencl enable_opencl
wine_fn_config_dll opengl32 enable_opengl32 implib
wine_fn_config_test dlls/opengl32/tests opengl32_test
wine_fn_config_dll packager enable_packager clean
wine_fn_config_test dlls/packager/tests packager_test
wine_fn_config_dll pdh enable_pdh implib
wine_fn_config_test dlls/pdh/tests pdh_test
wine_fn_config_dll photometadatahandler enable_photometadatahandler
wine_fn_config_dll pidgen enable_pidgen
wine_fn_config_dll powrprof enable_powrprof implib
wine_fn_config_dll printui enable_printui
wine_fn_config_dll prntvpt enable_prntvpt
wine_fn_config_dll propsys enable_propsys clean,implib
wine_fn_config_test dlls/propsys/tests propsys_test
wine_fn_config_dll psapi enable_psapi implib
wine_fn_config_test dlls/psapi/tests psapi_test
wine_fn_config_dll pstorec enable_pstorec clean
wine_fn_config_dll qcap enable_qcap
wine_fn_config_test dlls/qcap/tests qcap_test
wine_fn_config_dll qedit enable_qedit clean
wine_fn_config_test dlls/qedit/tests qedit_test
wine_fn_config_dll qmgr enable_qmgr clean
wine_fn_config_test dlls/qmgr/tests qmgr_test
wine_fn_config_dll qmgrprxy enable_qmgrprxy clean
wine_fn_config_dll quartz enable_quartz clean,implib
wine_fn_config_test dlls/quartz/tests quartz_test clean
wine_fn_config_dll query enable_query
wine_fn_config_dll rasapi16.dll16 enable_win16
wine_fn_config_dll rasapi32 enable_rasapi32 implib
wine_fn_config_test dlls/rasapi32/tests rasapi32_test
wine_fn_config_dll rasdlg enable_rasdlg implib
wine_fn_config_dll regapi enable_regapi
wine_fn_config_dll resutils enable_resutils implib
wine_fn_config_dll riched20 enable_riched20 implib
wine_fn_config_test dlls/riched20/tests riched20_test
wine_fn_config_dll riched32 enable_riched32
wine_fn_config_test dlls/riched32/tests riched32_test
wine_fn_config_dll rpcrt4 enable_rpcrt4 clean,implib
wine_fn_config_test dlls/rpcrt4/tests rpcrt4_test clean
wine_fn_config_dll rsabase enable_rsabase
wine_fn_config_dll rsaenh enable_rsaenh implib
wine_fn_config_test dlls/rsaenh/tests rsaenh_test
wine_fn_config_dll rstrtmgr enable_rstrtmgr
wine_fn_config_dll rtutils enable_rtutils implib
wine_fn_config_dll samlib enable_samlib
wine_fn_config_dll sane.ds enable_sane_ds po
wine_fn_config_dll scarddlg enable_scarddlg
wine_fn_config_dll sccbase enable_sccbase
wine_fn_config_dll schannel enable_schannel
wine_fn_config_test dlls/schannel/tests schannel_test
wine_fn_config_dll schedsvc enable_schedsvc clean
wine_fn_config_test dlls/schedsvc/tests schedsvc_test clean
wine_fn_config_dll scrrun enable_scrrun clean
wine_fn_config_test dlls/scrrun/tests scrrun_test clean
wine_fn_config_dll scsiport.sys enable_scsiport_sys
wine_fn_config_dll secur32 enable_secur32 implib
wine_fn_config_test dlls/secur32/tests secur32_test
wine_fn_config_dll security enable_security
wine_fn_config_dll sensapi enable_sensapi implib
wine_fn_config_dll serialui enable_serialui implib,po
wine_fn_config_test dlls/serialui/tests serialui_test
wine_fn_config_dll setupapi enable_setupapi implib,po
wine_fn_config_test dlls/setupapi/tests setupapi_test
wine_fn_config_dll setupx.dll16 enable_win16
wine_fn_config_dll sfc enable_sfc implib
wine_fn_config_dll sfc_os enable_sfc_os implib
wine_fn_config_dll shdoclc enable_shdoclc po
wine_fn_config_dll shdocvw enable_shdocvw clean,implib
wine_fn_config_test dlls/shdocvw/tests shdocvw_test
wine_fn_config_dll shell.dll16 enable_win16
wine_fn_config_dll shell32 enable_shell32 clean,implib,po
wine_fn_config_test dlls/shell32/tests shell32_test
wine_fn_config_dll shfolder enable_shfolder implib
wine_fn_config_dll shlwapi enable_shlwapi implib,po
wine_fn_config_test dlls/shlwapi/tests shlwapi_test
wine_fn_config_dll slbcsp enable_slbcsp
wine_fn_config_dll slc enable_slc implib
wine_fn_config_test dlls/slc/tests slc_test
wine_fn_config_dll snmpapi enable_snmpapi implib
wine_fn_config_test dlls/snmpapi/tests snmpapi_test
wine_fn_config_dll softpub enable_softpub
wine_fn_config_dll sound.drv16 enable_win16
wine_fn_config_dll spoolss enable_spoolss implib
wine_fn_config_test dlls/spoolss/tests spoolss_test
wine_fn_config_dll stdole2.tlb enable_stdole2_tlb clean
wine_fn_config_dll stdole32.tlb enable_stdole32_tlb clean
wine_fn_config_dll sti enable_sti clean,implib
wine_fn_config_test dlls/sti/tests sti_test
wine_fn_config_dll storage.dll16 enable_win16
wine_fn_config_dll stress.dll16 enable_win16
wine_fn_config_lib strmbase
wine_fn_config_lib strmiids
wine_fn_config_dll svrapi enable_svrapi
wine_fn_config_dll sxs enable_sxs implib
wine_fn_config_test dlls/sxs/tests sxs_test
wine_fn_config_dll system.drv16 enable_win16
wine_fn_config_dll t2embed enable_t2embed
wine_fn_config_dll tapi32 enable_tapi32 implib
wine_fn_config_dll taskschd enable_taskschd clean
wine_fn_config_test dlls/taskschd/tests taskschd_test
wine_fn_config_dll toolhelp.dll16 enable_win16
wine_fn_config_dll traffic enable_traffic
wine_fn_config_dll twain.dll16 enable_win16
wine_fn_config_dll twain_32 enable_twain_32
wine_fn_config_test dlls/twain_32/tests twain_32_test
wine_fn_config_dll typelib.dll16 enable_win16
wine_fn_config_dll unicows enable_unicows implib
wine_fn_config_dll updspapi enable_updspapi
wine_fn_config_dll url enable_url implib
wine_fn_config_dll urlmon enable_urlmon clean,implib,po
wine_fn_config_test dlls/urlmon/tests urlmon_test
wine_fn_config_dll usbd.sys enable_usbd_sys implib
wine_fn_config_dll user.exe16 enable_win16
wine_fn_config_dll user32 enable_user32 clean,implib,po
wine_fn_config_test dlls/user32/tests user32_test
wine_fn_config_dll userenv enable_userenv implib
wine_fn_config_test dlls/userenv/tests userenv_test
wine_fn_config_dll usp10 enable_usp10 implib
wine_fn_config_test dlls/usp10/tests usp10_test
wine_fn_config_lib uuid
wine_fn_config_dll uxtheme enable_uxtheme implib
wine_fn_config_test dlls/uxtheme/tests uxtheme_test
wine_fn_config_dll vbscript enable_vbscript clean
wine_fn_config_test dlls/vbscript/tests vbscript_test clean
wine_fn_config_dll vcomp enable_vcomp
wine_fn_config_dll vcomp100 enable_vcomp100
wine_fn_config_dll vcomp90 enable_vcomp90
wine_fn_config_dll vdhcp.vxd enable_win16
wine_fn_config_dll vdmdbg enable_vdmdbg implib
wine_fn_config_dll ver.dll16 enable_win16
wine_fn_config_dll version enable_version implib
wine_fn_config_test dlls/version/tests version_test
wine_fn_config_dll vmm.vxd enable_win16
wine_fn_config_dll vnbt.vxd enable_win16
wine_fn_config_dll vnetbios.vxd enable_win16
wine_fn_config_dll vssapi enable_vssapi
wine_fn_config_dll vtdapi.vxd enable_win16
wine_fn_config_dll vwin32.vxd enable_win16
wine_fn_config_dll w32skrnl enable_win16
wine_fn_config_dll w32sys.dll16 enable_win16
wine_fn_config_dll wbemdisp enable_wbemdisp clean
wine_fn_config_test dlls/wbemdisp/tests wbemdisp_test
wine_fn_config_dll wbemprox enable_wbemprox clean
wine_fn_config_test dlls/wbemprox/tests wbemprox_test
wine_fn_config_dll webservices enable_webservices implib
wine_fn_config_dll wer enable_wer implib
wine_fn_config_test dlls/wer/tests wer_test
wine_fn_config_dll wevtapi enable_wevtapi
wine_fn_config_dll wiaservc enable_wiaservc clean
wine_fn_config_dll win32s16.dll16 enable_win16
wine_fn_config_dll win87em.dll16 enable_win16
wine_fn_config_dll winaspi.dll16 enable_win16
wine_fn_config_dll windebug.dll16 enable_win16
wine_fn_config_dll windowscodecs enable_windowscodecs clean,implib
wine_fn_config_test dlls/windowscodecs/tests windowscodecs_test
wine_fn_config_dll windowscodecsext enable_windowscodecsext implib
wine_fn_config_test dlls/windowscodecsext/tests windowscodecsext_test
wine_fn_config_dll winealsa.drv enable_winealsa_drv
wine_fn_config_dll winecoreaudio.drv enable_winecoreaudio_drv
wine_fn_config_lib winecrt0
wine_fn_config_dll wined3d enable_wined3d implib
wine_fn_config_dll winegstreamer enable_winegstreamer
wine_fn_config_dll winejoystick.drv enable_winejoystick_drv
wine_fn_config_dll winemac.drv enable_winemac_drv
wine_fn_config_dll winemapi enable_winemapi
wine_fn_config_dll winemp3.acm enable_winemp3_acm
wine_fn_config_dll wineoss.drv enable_wineoss_drv
wine_fn_config_dll wineps.drv enable_wineps_drv clean,po
wine_fn_config_dll wineps16.drv16 enable_win16
wine_fn_config_dll wineqtdecoder enable_wineqtdecoder
wine_fn_config_dll winex11.drv enable_winex11_drv
wine_fn_config_dll wing.dll16 enable_win16
wine_fn_config_dll wing32 enable_wing32
wine_fn_config_dll winhttp enable_winhttp clean,implib
wine_fn_config_test dlls/winhttp/tests winhttp_test
wine_fn_config_dll wininet enable_wininet implib,po
wine_fn_config_test dlls/wininet/tests wininet_test
wine_fn_config_dll winmm enable_winmm implib,po
wine_fn_config_test dlls/winmm/tests winmm_test
wine_fn_config_dll winnls.dll16 enable_win16
wine_fn_config_dll winnls32 enable_winnls32 implib
wine_fn_config_dll winscard enable_winscard implib
wine_fn_config_dll winsock.dll16 enable_win16
wine_fn_config_dll winspool.drv enable_winspool_drv implib,po winspool
wine_fn_config_test dlls/winspool.drv/tests winspool.drv_test
wine_fn_config_dll winsta enable_winsta
wine_fn_config_dll wintab.dll16 enable_win16
wine_fn_config_dll wintab32 enable_wintab32 implib
wine_fn_config_test dlls/wintab32/tests wintab32_test
wine_fn_config_dll wintrust enable_wintrust implib
wine_fn_config_test dlls/wintrust/tests wintrust_test
wine_fn_config_dll wlanapi enable_wlanapi
wine_fn_config_dll wldap32 enable_wldap32 implib,po
wine_fn_config_test dlls/wldap32/tests wldap32_test
wine_fn_config_dll wmi enable_wmi
wine_fn_config_dll wmiutils enable_wmiutils clean
wine_fn_config_test dlls/wmiutils/tests wmiutils_test
wine_fn_config_dll wmp enable_wmp clean
wine_fn_config_test dlls/wmp/tests wmp_test
wine_fn_config_dll wmvcore enable_wmvcore
wine_fn_config_dll wnaspi32 enable_wnaspi32 implib
wine_fn_config_dll wow32 enable_win16 implib
wine_fn_config_dll wpcap enable_wpcap
wine_fn_config_dll ws2_32 enable_ws2_32 implib
wine_fn_config_test dlls/ws2_32/tests ws2_32_test
wine_fn_config_dll wshom.ocx enable_wshom_ocx clean
wine_fn_config_test dlls/wshom.ocx/tests wshom.ocx_test clean
wine_fn_config_dll wsnmp32 enable_wsnmp32 implib
wine_fn_config_test dlls/wsnmp32/tests wsnmp32_test
wine_fn_config_dll wsock32 enable_wsock32 implib
wine_fn_config_dll wtsapi32 enable_wtsapi32 implib
wine_fn_config_test dlls/wtsapi32/tests wtsapi32_test
wine_fn_config_dll wuapi enable_wuapi clean
wine_fn_config_dll wuaueng enable_wuaueng
wine_fn_config_dll x3daudio1_1 enable_x3daudio1_1
wine_fn_config_dll x3daudio1_2 enable_x3daudio1_2
wine_fn_config_dll x3daudio1_3 enable_x3daudio1_3
wine_fn_config_dll x3daudio1_4 enable_x3daudio1_4
wine_fn_config_dll x3daudio1_5 enable_x3daudio1_5
wine_fn_config_dll x3daudio1_6 enable_x3daudio1_6
wine_fn_config_dll x3daudio1_7 enable_x3daudio1_7
wine_fn_config_dll xapofx1_1 enable_xapofx1_1
wine_fn_config_dll xapofx1_3 enable_xapofx1_3
wine_fn_config_dll xapofx1_4 enable_xapofx1_4
wine_fn_config_dll xapofx1_5 enable_xapofx1_5
wine_fn_config_dll xaudio2_7 enable_xaudio2_7
wine_fn_config_dll xinput1_1 enable_xinput1_1
wine_fn_config_dll xinput1_2 enable_xinput1_2
wine_fn_config_dll xinput1_3 enable_xinput1_3 implib xinput
wine_fn_config_test dlls/xinput1_3/tests xinput1_3_test
wine_fn_config_dll xinput1_4 enable_xinput1_4
wine_fn_config_dll xinput9_1_0 enable_xinput9_1_0
wine_fn_config_dll xmllite enable_xmllite implib
wine_fn_config_test dlls/xmllite/tests xmllite_test
wine_fn_config_dll xolehlp enable_xolehlp
wine_fn_config_dll xpsprint enable_xpsprint
wine_fn_config_dll xpssvcs enable_xpssvcs
wine_fn_config_makefile documentation enable_documentation clean
wine_fn_config_makefile fonts enable_fonts clean,install-lib
wine_fn_config_makefile include enable_include clean,install-dev
wine_fn_config_makefile libs/port enable_libs_port
wine_fn_config_makefile libs/wine enable_libs_wine clean,install-dev,install-lib
wine_fn_config_makefile libs/wpp enable_libs_wpp
wine_fn_config_makefile loader enable_loader clean,install-lib,manpage
wine_fn_config_program arp enable_arp install
wine_fn_config_program aspnet_regiis enable_aspnet_regiis install
wine_fn_config_program attrib enable_attrib install,po
wine_fn_config_program cabarc enable_cabarc install
wine_fn_config_program cacls enable_cacls install
wine_fn_config_program clock enable_clock install,po
wine_fn_config_program cmd enable_cmd install,po
wine_fn_config_test programs/cmd/tests cmd.exe_test
wine_fn_config_program conhost enable_conhost install
wine_fn_config_program control enable_control install
wine_fn_config_program cscript enable_cscript clean,install
wine_fn_config_program dpnsvr enable_dpnsvr install
wine_fn_config_program dxdiag enable_dxdiag install,po
wine_fn_config_program eject enable_eject install
wine_fn_config_program expand enable_expand install
wine_fn_config_program explorer enable_explorer install,po
wine_fn_config_program extrac32 enable_extrac32 install
wine_fn_config_program findstr enable_findstr install
wine_fn_config_program hh enable_hh install
wine_fn_config_program hostname enable_hostname install,po
wine_fn_config_program icinfo enable_icinfo install
wine_fn_config_program iexplore enable_iexplore install
wine_fn_config_program ipconfig enable_ipconfig install,po
wine_fn_config_program lodctr enable_lodctr install
wine_fn_config_program mofcomp enable_mofcomp install
wine_fn_config_program mshta enable_mshta install
wine_fn_config_program msiexec enable_msiexec install,installbin,manpage
wine_fn_config_program net enable_net install,po
wine_fn_config_program netsh enable_netsh install
wine_fn_config_program netstat enable_netstat install,po
wine_fn_config_program ngen enable_ngen install
wine_fn_config_program notepad enable_notepad install,installbin,manpage,po
wine_fn_config_program oleview enable_oleview install,po
wine_fn_config_program ping enable_ping install
wine_fn_config_program plugplay enable_plugplay install
wine_fn_config_program presentationfontcache enable_presentationfontcache install
wine_fn_config_program progman enable_progman install,po
wine_fn_config_program reg enable_reg install,po
wine_fn_config_test programs/reg/tests reg.exe_test
wine_fn_config_program regasm enable_regasm install
wine_fn_config_program regedit enable_regedit install,installbin,manpage,po
wine_fn_config_test programs/regedit/tests regedit.exe_test
wine_fn_config_program regsvcs enable_regsvcs install
wine_fn_config_program regsvr32 enable_regsvr32 install,installbin,manpage,po
wine_fn_config_program rpcss enable_rpcss clean,install
wine_fn_config_program rundll.exe16 enable_win16 install
wine_fn_config_program rundll32 enable_rundll32 install
wine_fn_config_program sc enable_sc install
wine_fn_config_program schtasks enable_schtasks install
wine_fn_config_program sdbinst enable_sdbinst install
wine_fn_config_program secedit enable_secedit install
wine_fn_config_program servicemodelreg enable_servicemodelreg install
wine_fn_config_program services enable_services clean,install
wine_fn_config_test programs/services/tests services.exe_test
wine_fn_config_program spoolsv enable_spoolsv install
wine_fn_config_program start enable_start install,po
wine_fn_config_program svchost enable_svchost install
wine_fn_config_program systeminfo enable_systeminfo install
wine_fn_config_program taskkill enable_taskkill install,po
wine_fn_config_program tasklist enable_tasklist install
wine_fn_config_program taskmgr enable_taskmgr install,po
wine_fn_config_program termsv enable_termsv install
wine_fn_config_program uninstaller enable_uninstaller install,po
wine_fn_config_program unlodctr enable_unlodctr install
wine_fn_config_program view enable_view install,po
wine_fn_config_program wevtutil enable_wevtutil install
wine_fn_config_program wineboot enable_wineboot install,installbin,manpage,po
wine_fn_config_program winebrowser enable_winebrowser install
wine_fn_config_program winecfg enable_winecfg install,installbin,manpage,po
wine_fn_config_program wineconsole enable_wineconsole install,installbin,manpage,po
wine_fn_config_program winedbg enable_winedbg install,installbin,manpage,po
wine_fn_config_program winedevice enable_winedevice install
wine_fn_config_program winefile enable_winefile install,installbin,manpage,po
wine_fn_config_program winemenubuilder enable_winemenubuilder install
wine_fn_config_program winemine enable_winemine install,installbin,manpage,po
wine_fn_config_program winemsibuilder enable_winemsibuilder install
wine_fn_config_program winepath enable_winepath install,installbin,manpage
wine_fn_config_program winetest enable_winetest clean
wine_fn_config_program winevdm enable_win16 install
wine_fn_config_program winhelp.exe16 enable_win16 install
wine_fn_config_program winhlp32 enable_winhlp32 install,po
wine_fn_config_program winoldap.mod16 enable_win16 install
wine_fn_config_program winver enable_winver install
wine_fn_config_program wmic enable_wmic install,po
wine_fn_config_program wordpad enable_wordpad install,po
wine_fn_config_program write enable_write install,po
wine_fn_config_program wscript enable_wscript clean,install
wine_fn_config_test programs/wscript/tests wscript.exe_test
wine_fn_config_program wusa enable_wusa install
wine_fn_config_program xcopy enable_xcopy install,po
wine_fn_config_test programs/xcopy/tests xcopy.exe_test
wine_fn_config_makefile server enable_server clean,install-lib,manpage
wine_fn_config_tool tools clean,install-dev,install-lib,manpage
wine_fn_config_tool tools/sfnt2fon clean
wine_fn_config_tool tools/widl clean,install-dev,manpage
wine_fn_config_tool tools/winebuild clean,install-dev,manpage
wine_fn_config_tool tools/winedump clean,install-dev,manpage
wine_fn_config_tool tools/winegcc clean,install-dev,manpage
wine_fn_config_tool tools/wmc clean,install-dev,manpage
wine_fn_config_tool tools/wrc clean,install-dev,manpage

LINGUAS="\
ar \
bg \
ca \
cs \
da \
de \
el \
en \
en_US \
eo \
es \
fa \
fi \
fr \
he \
hi \
hr \
hu \
it \
ja \
ko \
lt \
ml \
nb_NO \
nl \
or \
pa \
pl \
pt_BR \
pt_PT \
rm \
ro \
ru \
sk \
sl \
sr_RS@cyrillic \
sr_RS@latin \
sv \
te \
th \
tr \
uk \
wa \
zh_CN \
zh_TW"




wine_fn_ignore_file ".gitignore"
wine_fn_ignore_file "Makefile"
wine_fn_ignore_file "TAGS"
wine_fn_ignore_file "tags"
wine_fn_ignore_file "autom4te.cache"
wine_fn_ignore_file "config.cache"
wine_fn_ignore_file "config.log"
wine_fn_ignore_file "config.status"
wine_fn_ignore_file "configure.lineno"
wine_fn_ignore_file "include/config.h"
wine_fn_ignore_file "include/stamp-h"
test "$wine_binary" = wine || wine_fn_ignore_file "loader/wine"

if test "x$enable_tools" != xno
then
    wine_fn_ignore_file "tools/makedep$ac_exeext"
    ac_config_commands="$ac_config_commands tools/makedep"

fi

ac_config_commands="$ac_config_commands Makefile"


ac_config_files="$ac_config_files Make.tmp:Make.vars.in:Makefile.in"



if test "x$enable_maintainer_mode" = xyes
then
    wine_fn_append_rule "configure: configure.ac aclocal.m4
	autoconf --warnings=all
include/config.h.in: include/stamp-h.in
include/stamp-h.in: configure.ac aclocal.m4
	autoheader --warnings=all
	@echo timestamp > \$@"
fi

if test "x$with_gettextpo" = xyes
then
    test "$srcdir" = . || as_fn_error $? "Rebuilding po files is not supported for out of tree builds." "$LINENO" 5
    wine_fn_append_rule "ALL_POT_FILES =$ALL_POT_FILES
\$(LINGUAS:%=po/%.po): po/wine.pot
	msgmerge --previous -q \$@ po/wine.pot | msgattrib --no-obsolete -o \$@.new && mv \$@.new \$@
po/wine.pot: \$(ALL_POT_FILES)
	msgcat -o \$@ \$(ALL_POT_FILES)"
fi

if test "$MSGFMT" != false
then
    wine_fn_append_rule "__builddeps__: \$(LINGUAS:%=po/%.mo)
clean::
	\$(RM) \$(LINGUAS:%=po/%.mo)"

    posrc="po"
    test "$srcdir" = . || posrc="$srcdir/po"
    for i in $LINGUAS
    do
        wine_fn_ignore_file "po/$i.mo"
        wine_fn_append_rule "po/$i.mo: $posrc/$i.po
	\$(MSGFMT) -o \$@ $posrc/$i.po"
    done
else
    LINGUAS=
fi

if test "x$enable_tools" != xno
then
    wine_fn_append_rule "tools/makedep$ac_exeext: $srcdir/tools/makedep.c include/config.h config.status
	@./config.status tools/makedep
Makefile: tools/makedep$ac_exeext
distclean:: clean
	\$(RM) tools/makedep$ac_exeext"
else
    wine_fn_append_rule "\$(MAKEDEP):
	@echo \"You need to run make in $TOOLSDIR first\" && false"
fi

if test -n "$with_wine64"
then
    wine_fn_append_rule "all: fonts server tools $with_wine64/loader/wine $with_wine64/loader/wine-preloader
fonts server tools:
	\$(RM) \$@ && \$(LN_S) $with_wine64/\$@ \$@
$with_wine64/loader/wine:
	\$(RM) \$@ && \$(LN_S) $ac_pwd/loader/wine \$@
$with_wine64/loader/wine-preloader:
	\$(RM) \$@ && \$(LN_S) $ac_pwd/loader/wine-preloader \$@
clean::
	\$(RM) fonts server tools $with_wine64/loader/wine $with_wine64/loader/wine-preloader"
else
    as_fn_append LOADER_RULES "
install install-lib:: wine.inf install-man-pages
	\$(INSTALL_DATA) wine.inf \$(DESTDIR)\$(datadir)/wine/wine.inf
	\$(INSTALL_DATA) \$(srcdir)/l_intl.nls \$(DESTDIR)\$(datadir)/wine/l_intl.nls

uninstall::
	\$(RM) \$(DESTDIR)\$(datadir)/wine/wine.inf \$(DESTDIR)\$(datadir)/wine/l_intl.nls
"
fi

if test "$srcdir" = .
then
    ac_config_commands="$ac_config_commands .gitignore"

fi

$as_echo " done" >&6
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



: "${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 Wine $as_me 1.7.41, 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_links="$ac_config_links"
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 links:
$config_links

Configuration commands:
$config_commands

Report bugs to <wine-devel@winehq.org>.
Wine home page: <http://www.winehq.org>."

_ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
Wine config.status 1.7.41
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'
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
#
wine_fn_output_makedep ()
{
    as_dir=tools; as_fn_mkdir_p
    $CC -Iinclude -I$srcdir/include -D__WINESRC__ $EXTRACFLAGS $CPPFLAGS $CFLAGS -o tools/makedep$ac_exeext $srcdir/tools/makedep.c $LDFLAGS
}
wine_fn_output_makefile ()
{
    cat Make.tmp - <<\_WINE_EOF >\$tmp/makefile && mv -f \$tmp/makefile \$1 && rm -f Make.tmp && "$wine_makedep" . && return
`cat $wine_rules_file`
_WINE_EOF
    as_fn_error $? "could not create Makefile" "$LINENO" 5
}
wine_fn_output_gitignore ()
{
    sort <<\_WINE_EOF >\$tmp/gitignore && mv -f \$tmp/gitignore \$1 && return
$GITIGNORE
_WINE_EOF
    as_fn_error $? "could not create .gitignore" "$LINENO" 5
}

_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
    "include/config.h") CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
    "include/stamp-h") CONFIG_COMMANDS="$CONFIG_COMMANDS include/stamp-h" ;;
    "fonts/marlett.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/marlett.ttf:fonts/marlett.ttf" ;;
    "fonts/symbol.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/symbol.ttf:fonts/symbol.ttf" ;;
    "fonts/tahoma.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/tahoma.ttf:fonts/tahoma.ttf" ;;
    "fonts/tahomabd.ttf") CONFIG_LINKS="$CONFIG_LINKS fonts/tahomabd.ttf:fonts/tahomabd.ttf" ;;
    "loader/l_intl.nls") CONFIG_LINKS="$CONFIG_LINKS loader/l_intl.nls:loader/l_intl.nls" ;;
    "po/LINGUAS") CONFIG_LINKS="$CONFIG_LINKS po/LINGUAS:po/LINGUAS" ;;
    "wine") CONFIG_LINKS="$CONFIG_LINKS wine:tools/winewrapper" ;;
    "wine64") CONFIG_LINKS="$CONFIG_LINKS wine64:tools/winewrapper" ;;
    "tools/makedep") CONFIG_COMMANDS="$CONFIG_COMMANDS tools/makedep" ;;
    "Makefile") CONFIG_COMMANDS="$CONFIG_COMMANDS Makefile" ;;
    "Make.tmp") CONFIG_FILES="$CONFIG_FILES Make.tmp:Make.vars.in:Makefile.in" ;;
    ".gitignore") CONFIG_COMMANDS="$CONFIG_COMMANDS .gitignore" ;;

  *) 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_LINKS+set}" = set || CONFIG_LINKS=$config_links
  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  :L $CONFIG_LINKS  :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
  #

_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
$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
 ;;
  :L)
  #
  # CONFIG_LINK
  #

  if test "$ac_source" = "$ac_file" && test "$srcdir" = '.'; then
    :
  else
    # Prefer the file from the source tree if names are identical.
    if test "$ac_source" = "$ac_file" || test ! -r "$ac_source"; then
      ac_source=$srcdir/$ac_source
    fi

    { $as_echo "$as_me:${as_lineno-$LINENO}: linking $ac_source to $ac_file" >&5
$as_echo "$as_me: linking $ac_source to $ac_file" >&6;}

    if test ! -r "$ac_source"; then
      as_fn_error $? "$ac_source: file not found" "$LINENO" 5
    fi
    rm -f "$ac_file"

    # Try a relative symlink, then a hard link, then a copy.
    case $ac_source in
    [\\/$]* | ?:[\\/]* ) ac_rel_source=$ac_source ;;
	*) ac_rel_source=$ac_top_build_prefix$ac_source ;;
    esac
    ln -s "$ac_rel_source" "$ac_file" 2>/dev/null ||
      ln "$ac_source" "$ac_file" 2>/dev/null ||
      cp -p "$ac_source" "$ac_file" ||
      as_fn_error $? "cannot link or copy $ac_source to $ac_file" "$LINENO" 5
  fi
 ;;
  :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
    "include/stamp-h":C) echo timestamp > include/stamp-h ;;
    "tools/makedep":C) wine_fn_output_makedep || as_fn_exit $? ;;
    "Makefile":C) wine_fn_output_makefile Makefile ;;
    ".gitignore":C) wine_fn_output_gitignore .gitignore ;;

  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


if test "$no_create" = "yes"
then
  exit 0
fi

ac_save_IFS="$IFS"
if test "x$wine_notices != "x; then
    echo >&6
    IFS="|"
    for msg in $wine_notices; do
        IFS="$ac_save_IFS"
        if ${msg:+false} :; then :

else
  { $as_echo "$as_me:${as_lineno-$LINENO}: $msg" >&5
$as_echo "$as_me: $msg" >&6;}
fi
    done
fi
IFS="|"
for msg in $wine_warnings; do
    IFS="$ac_save_IFS"
    if ${msg:+false} :; then :

else
  echo >&2
        { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $msg" >&5
$as_echo "$as_me: WARNING: $msg" >&2;}
fi
done
IFS="$ac_save_IFS"

$as_echo "
$as_me: Finished.  Do '${ac_make}' to compile Wine.
" >&6

