#! /bin/sh


















































































if test `uname -s | grep -c MINGW 2>/dev/null` != "0"; then
  msyshost=1
fi

# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf version 2.13 
# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
#
# This configure script is free software; the Free Software Foundation
# gives unlimited permission to copy, distribute and modify it.

# Defaults:
ac_help=
ac_default_prefix=/usr/local
# Any additions from configure.in:
ac_help="$ac_help
  --enable-build-backend={AndroidEclipse,CppEclipse,VisualStudio,FasterMake,CompileDB}
                         Enable additional build backends"
ac_help="$ac_help
  --enable-release        Build with more conservative, release engineering-oriented options.
                          This may slow down builds."
ac_help="$ac_help
  --disable-compile-environment
                          Disable compiler/library checks."
ac_help="$ac_help
  --disable-shared-js
                          Do not create a shared library."
ac_help="$ac_help
  --disable-export-js
                          Do not mark JS symbols as DLL exported/visible."
ac_help="$ac_help
  --with-gonk=DIR
               location of gonk dir"
ac_help="$ac_help
  --with-gonk-toolchain-prefix=DIR
                          prefix to gonk toolchain commands"
ac_help="$ac_help
  --with-android-ndk=DIR
                          location where the Android NDK can be found"
ac_help="$ac_help
  --with-android-toolchain=DIR
                          location of the Android toolchain"
ac_help="$ac_help
  --with-android-gnu-compiler-version=VER
                          gnu compiler version to use"
ac_help="$ac_help
  --with-android-cxx-stl=VALUE
                          use the specified C++ STL (stlport, libstdc++, libc++)"
ac_help="$ac_help
  --with-android-version=VER
                          android platform version, default 9"
ac_help="$ac_help
  --with-ios-sdk=TYPE
                          Type of iOS SDK to use (iphonesimulator, iphoneos)
                          and optionally version (like iphoneos8.2)"
ac_help="$ac_help
  --enable-ios-target=VER (default=8.0)
                          Set the minimum iOS version needed at runtime"
ac_help="$ac_help
  --with-compiler-wrapper[=path/to/wrapper]
    Enable compiling with wrappers such as distcc and ccache"
ac_help="$ac_help
  --with-ccache[=path/to/ccache]
                          Enable compiling with ccache"
ac_help="$ac_help
  --enable-rust           Include Rust language sources"
ac_help="$ac_help
  --with-windows-version=WINSDK_TARGETVER
                          Windows SDK version to target. Win8.1 (603) is
                          currently the minimum supported version."
ac_help="$ac_help
  --enable-macos-target=VER (default=10.6)
                          Set the minimum MacOS version needed at runtime"
ac_help="$ac_help
  --with-macos-sdk=dir    Location of platform SDK to use (Mac OS X only)"
ac_help="$ac_help
  --with-x                use the X Window System"
ac_help="$ac_help
  --with-arch=[[type|toolchain-default]]
                           Use specific CPU features (-march=type). Resets
                           thumb, fpu, float-abi, etc. defaults when set"
ac_help="$ac_help
  --with-thumb[[=yes|no|toolchain-default]]
                          Use Thumb instruction set (-mthumb)"
ac_help="$ac_help
  --with-thumb-interwork[[=yes|no|toolchain-default]]
                           Use Thumb/ARM instuctions interwork (-mthumb-interwork)"
ac_help="$ac_help
  --with-fpu=[[type|toolchain-default]]
                           Use specific FPU type (-mfpu=type)"
ac_help="$ac_help
  --with-float-abi=[[type|toolchain-default]]
                           Use specific arm float ABI (-mfloat-abi=type)"
ac_help="$ac_help
  --with-soft-float[[=yes|no|toolchain-default]]
                           Use soft float library (-msoft-float)"
ac_help="$ac_help
  --enable-address-sanitizer       Enable Address Sanitizer (default=no)"
ac_help="$ac_help
  --enable-memory-sanitizer       Enable Memory Sanitizer (default=no)"
ac_help="$ac_help
  --enable-thread-sanitizer       Enable Thread Sanitizer (default=no)"
ac_help="$ac_help
  --enable-llvm-hacks       Enable workarounds required for several LLVM instrumentations (default=no)"
ac_help="$ac_help
  --enable-warnings-as-errors
                          Enable treating warnings as errors"
ac_help="$ac_help
  --enable-profiling      Set compile flags necessary for using sampling profilers (e.g. shark, perf)"
ac_help="$ac_help
  --disable-ion      Disable use of the IonMonkey JIT"
ac_help="$ac_help
  --enable-debug[=DBG]    Enable building with developer debug info
                           (using compiler flags DBG)"
ac_help="$ac_help
  --with-debug-label=LABELS
                          Define DEBUG_<value> for each comma-separated
                          value given."
ac_help="$ac_help
  --enable-debug-symbols[=DBG]
                          Enable debugging symbols (using compiler flags DBG)"
ac_help="$ac_help
  --enable-cpp-rtti       Enable C++ RTTI "
ac_help="$ac_help
  --enable-gold           Enable GNU Gold Linker when it is not already the default"
ac_help="$ac_help
  --disable-icf          Disable Identical Code Folding"
ac_help="$ac_help
  --enable-pie           Enable Position Independent Executables"
ac_help="$ac_help
  --enable-dtrace         build with dtrace support if available (default=no)"
ac_help="$ac_help
  --with-linux-headers=DIR
                          location where the Linux kernel headers can be found"
ac_help="$ac_help
  --with-pthreads         Force use of system pthread library with NSPR "
ac_help="$ac_help
  --enable-update-channel=CHANNEL
                          Select application update channel (default=default)"
ac_help="$ac_help
  --with-nspr-cflags=FLAGS
                          Pass FLAGS to CC when building code that uses NSPR.
                          Use this when there's no accurate nspr-config
                          script available.  This is the case when building
                          SpiderMonkey as part of the Mozilla tree: the
                          top-level configure script computes NSPR flags
                          that accomodate the quirks of that environment."
ac_help="$ac_help
  --with-nspr-libs=LIBS   Pass LIBS to LD when linking code that uses NSPR.
                          See --with-nspr-cflags for more details."
ac_help="$ac_help
  --enable-nspr-build     Configure and build NSPR from source tree"
ac_help="$ac_help
  --with-system-nspr      Use an NSPR that is already built and installed.
                          Use the 'nspr-config' script in the current path,
                          or look for the script in the directories given with
                          --with-nspr-exec-prefix or --with-nspr-prefix.
                          (Those flags are only checked if you specify
                          --with-system-nspr.)"
ac_help="$ac_help
  --enable-posix-nspr-emulation
                          Enable emulation of NSPR for POSIX systems"
ac_help="$ac_help
  --with-nspr-prefix=PFX  Prefix where NSPR is installed"
ac_help="$ac_help
  --with-nspr-exec-prefix=PFX
                          Exec prefix where NSPR is installed"
ac_help="$ac_help
  --with-system-zlib[=PFX]
                          Use system libz [installed at prefix PFX]"
ac_help="$ac_help
  --enable-system-ffi       Use system libffi (located with pkgconfig)"
ac_help="$ac_help
  --with-arm-kuser         Use kuser helpers (Linux/ARM only -- requires kernel 2.6.13 or later)"
ac_help="$ac_help
  --enable-ui-locale=ab-CD
                          Select the user interface locale (default: en-US)"
ac_help="$ac_help
  --disable-tests         Do not build test libraries & programs"
ac_help="$ac_help
  --disable-optimize      Disable compiler optimization
  --enable-optimize=[OPT] Specify compiler optimization flags [OPT=-O]"
ac_help="$ac_help
  --disable-trace-logging   Disable trace logging"
ac_help="$ac_help
  --enable-dmd            Enable DMD; also enables jemalloc and replace-malloc"
ac_help="$ac_help
  --disable-jemalloc       Don't replace memory allocator with jemalloc"
ac_help="$ac_help
  --enable-wrap-malloc    Wrap malloc calls (gnu linker only)"
ac_help="$ac_help
  --with-wrap-malloc=DIR  Location of malloc wrapper library"
ac_help="$ac_help
  --enable-small-chunk-size  Allocate memory for JS GC things in smaller chunks"
ac_help="$ac_help
  --enable-gc-trace  Enable tracing of allocation and finalization"
ac_help="$ac_help
  --enable-valgrind       Enable Valgrind integration hooks (default=no)"
ac_help="$ac_help
  --enable-simulator=ARCH
                          Enable a JIT code simulator for the specified arch.
                          (arm, arm64, mips32, mips64)."
ac_help="$ac_help
  --enable-jprof          Enable jprof profiling tool (needs mozilla/tools/jprof). Implies --enable-profiling."
ac_help="$ac_help
  --enable-instruments    Enable instruments remote profiling. Implies --enable-profiling."
ac_help="$ac_help
  --enable-callgrind      Enable callgrind profiling. Implies --enable-profiling."
ac_help="$ac_help
  --enable-vtune          Enable vtune profiling. Implies --enable-profiling."
ac_help="$ac_help
  --enable-jitspew        Enable the Jit spew and IONFLAGS."
ac_help="$ac_help
  --enable-gczeal         Enable zealous GCing"
ac_help="$ac_help
  --enable-perf           Enable Linux perf integration"
ac_help="$ac_help
  --enable-more-deterministic
                          Enable changes that make the shell more deterministic"
ac_help="$ac_help
  --enable-oom-breakpoint
                          Enable a breakpoint function for artificial OOMs"
ac_help="$ac_help
  --enable-clang-plugin   Enable building with the mozilla clang plugin "
ac_help="$ac_help
  --with-sixgill=path/to/sixgill
                          Enable static checking of code using sixgill"
ac_help="$ac_help
  --enable-strip          Enable stripping of libs & executables "
ac_help="$ac_help
  --enable-install-strip  Enable stripping of libs & executables when packaging "
ac_help="$ac_help
  --jitreport-granularity=N
                           Default granularity at which to report JIT code
                           to external tools
                             0 - no info
                             1 - code ranges for whole functions only
                             2 - per-line information
                             3 - per-op information"
ac_help="$ac_help
  --enable-xterm-updates  Update XTERM titles with current command."
ac_help="$ac_help
  --enable-readline       Link js shell to system readline library"
ac_help="$ac_help
  --enable-ctypes         Enable js-ctypes (default=no)"
ac_help="$ac_help
  --with-qemu-exe=path   Use path as an arm emulator on host platforms"
ac_help="$ac_help
  --with-cross-lib=dir   Use dir as the location for arm libraries"
ac_help="$ac_help
  --with-system-icu
                          Use system ICU (located with pkgconfig)"
ac_help="$ac_help
  --with-intl-api, --with-intl-api=build, --without-intl-api
    Determine the status of the ECMAScript Internationalization API.  The first
    (or lack of any of these) builds and exposes the API.  The second builds it
    but doesn't use ICU or expose the API to script.  The third doesn't build
    ICU at all."

# Initialize some variables set by options.
# The variables have the same names as the options, with
# dashes changed to underlines.
build=NONE
cache_file=./config.cache
exec_prefix=NONE
host=NONE
no_create=
nonopt=NONE
no_recursion=
prefix=NONE
program_prefix=NONE
program_suffix=NONE
program_transform_name=s,x,x,
silent=
site=
srcdir=
target=NONE
verbose=
x_includes=NONE
x_libraries=NONE
bindir='${exec_prefix}/bin'
sbindir='${exec_prefix}/sbin'
libexecdir='${exec_prefix}/libexec'
datadir='${prefix}/share'
sysconfdir='${prefix}/etc'
sharedstatedir='${prefix}/com'
localstatedir='${prefix}/var'
libdir='${exec_prefix}/lib'
includedir='${prefix}/include'
oldincludedir='/usr/include'
infodir='${prefix}/info'
mandir='${prefix}/man'

# Initialize some other variables.
subdirs=
MFLAGS= MAKEFLAGS=
SHELL=${CONFIG_SHELL-/bin/sh}
# Maximum number of lines to put in a shell here document.
ac_max_here_lines=12

ac_prev=
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=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
  *) ac_optarg= ;;
  esac

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

  case "$ac_option" in

  -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 ;;
  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
    build="$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" ;;

  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
    ac_prev=datadir ;;
  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
  | --da=*)
    datadir="$ac_optarg" ;;

  -disable-* | --disable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; echo "configure: error: $ac_feature: invalid feature name" 1>&5; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    eval "enable_${ac_feature}=no" ;;

  -enable-* | --enable-*)
    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; echo "configure: error: $ac_feature: invalid feature name" 1>&5; exit 1; }
    fi
    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "enable_${ac_feature}='$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)
    # 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 << EOF
Usage: configure [options] [host]
Options: [defaults in brackets after descriptions]
Configuration:
  --cache-file=FILE       cache test results in FILE
  --help                  print this message
  --no-create             do not create output files
  --quiet, --silent       do not print \`checking...' messages
  --version               print the version of autoconf that created configure
Directory and file names:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [$ac_default_prefix]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [same as prefix]
  --bindir=DIR            user executables in DIR [EPREFIX/bin]
  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
  --datadir=DIR           read-only architecture-independent data in DIR
                          [PREFIX/share]
  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
                          [PREFIX/com]
  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
  --includedir=DIR        C header files in DIR [PREFIX/include]
  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
  --infodir=DIR           info documentation in DIR [PREFIX/info]
  --mandir=DIR            man documentation in DIR [PREFIX/man]
  --srcdir=DIR            find the sources in DIR [configure dir or ..]
  --program-prefix=PREFIX prepend PREFIX to installed program names
  --program-suffix=SUFFIX append SUFFIX to installed program names
  --program-transform-name=PROGRAM
                          run sed PROGRAM on installed program names
EOF
    cat << EOF
Host type:
  --build=BUILD           configure for building on BUILD [BUILD=HOST]
  --host=HOST             configure for HOST [guessed]
  --target=TARGET         configure for TARGET [TARGET=HOST]
Features and packages:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --x-includes=DIR        X include files are in DIR
  --x-libraries=DIR       X library files are in DIR
EOF
    if test -n "$ac_help"; then
      echo "--enable and --with options recognized:$ac_help"
    fi
    exit 0 ;;

  -host | --host | --hos | --ho)
    ac_prev=host ;;
  -host=* | --host=* | --hos=* | --ho=*)
    host="$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" ;;

  -localstatedir | --localstatedir | --localstatedi | --localstated \
  | --localstate | --localstat | --localsta | --localst \
  | --locals | --local | --loca | --loc | --lo)
    ac_prev=localstatedir ;;
  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
    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)
    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" ;;

  -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 ;;
  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
    target="$ac_optarg" ;;

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

  -version | --version | --versio | --versi | --vers)
    echo "configure generated by autoconf version 2.13"
    exit 0 ;;

  -with-* | --with-*)
    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; echo "configure: error: $ac_package: invalid package name" 1>&5; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    case "$ac_option" in
      *=*) ;;
      *) ac_optarg=yes ;;
    esac
    eval "with_${ac_package}='$ac_optarg'" ;;

  -without-* | --without-*)
    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
    # Reject names that are not valid shell variable names.
    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
      { echo "configure: error: $ac_package: invalid package name" 1>&2; echo "configure: error: $ac_package: invalid package name" 1>&5; exit 1; }
    fi
    ac_package=`echo $ac_package| sed 's/-/_/g'`
    eval "with_${ac_package}=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" ;;

  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&5; exit 1; }
    ;;

  *)
    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
      echo "configure: warning: $ac_option: invalid host type" 1>&2
    fi
    if test "x$nonopt" != xNONE; then
      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; echo "configure: error: can only configure for one host and one target at a time" 1>&5; exit 1; }
    fi
    nonopt="$ac_option"
    ;;

  esac
done

if test -n "$ac_prev"; then
  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&5; exit 1; }
fi

if test -z "$srcdir"; then
  srcdir=`dirname "$0"`
fi
srcdir="$srcdir/../.."
trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15

# File descriptor usage:
# 0 standard input
# 1 file creation
# 2 errors and warnings
# 3 some systems may open it to /dev/tty
# 4 used on the Kubota Titan
# 6 checking for... messages and results
# 5 compiler messages saved in config.log
if test "$silent" = yes; then
  exec 6>/dev/null
else
  exec 6>&1
fi
exec 5>./config.log

echo "\
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
" 1>&5

# Strip out --no-create and --no-recursion so they do not pile up.
# Also quote any args containing shell metacharacters.
ac_configure_args=
for ac_arg
do
  case "$ac_arg" in
  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
  | --no-cr | --no-c) ;;
  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
  esac
done

# NLS nuisances.
# Only set these to C if already set.  These must not be set unconditionally
# because not all systems understand e.g. LANG=C (notably SCO).
# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
# Non-C LC_CTYPE values break the ctype check.
if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi

# confdefs.h avoids OS command line length limits that DEFS can exceed.
rm -rf conftest* confdefs.h
# AIX cpp loses on an empty file, so make sure it contains at least a newline.
echo > confdefs.h

# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
ac_unique_file=js/src/jsapi.h

# 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 its parent.
  ac_prog=$0
  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
  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
  if test "$ac_srcdir_defaulted" = yes; then
    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; echo "configure: error: can not find sources in $ac_confdir or .." 1>&5; exit 1; }
  else
    { echo "configure: error: can not find sources in $srcdir" 1>&2; echo "configure: error: can not find sources in $srcdir" 1>&5; exit 1; }
  fi
fi
srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`

# Prefer explicitly selected file to automatically selected ones.
if test -z "$CONFIG_SITE"; then
  if test "x$prefix" != xNONE; then
    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
  else
    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
  fi
fi
for ac_site_file in $CONFIG_SITE; do
  if test -r "$ac_site_file"; then
    echo "loading site script $ac_site_file"
    . "$ac_site_file"
  fi
done

if test -r "$cache_file"; then
  echo "loading cache $cache_file"
  . $cache_file
else
  echo "creating cache $cache_file"
  > $cache_file
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

ac_exeext=
ac_objext=o
if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
    ac_n= ac_c='
' ac_t='	'
  else
    ac_n=-n ac_c= ac_t=
  fi
else
  ac_n= ac_c='\c' ac_t=
fi


trap '[ "$?" != 0 ] && echo "------ config.log ------" && tail -n 25 config.log' EXIT

> subconfigures
> skip_subconfigures


ac_aux_dir=
for ac_dir in ${srcdir}/build/autoconf $srcdir/${srcdir}/build/autoconf; 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
  fi
done
if test -z "$ac_aux_dir"; then
  { echo "configure: error: can not find install-sh or install.sh in ${srcdir}/build/autoconf $srcdir/${srcdir}/build/autoconf" 1>&2; echo "configure: error: can not find install-sh or install.sh in ${srcdir}/build/autoconf $srcdir/${srcdir}/build/autoconf" 1>&5; exit 1; }
fi
ac_config_guess=$ac_aux_dir/config.guess
ac_config_sub=$ac_aux_dir/config.sub
ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.


# Do some error checking and defaulting for the host and target type.
# The inputs are:
#    configure --host=HOST --target=TARGET --build=BUILD NONOPT
#
# The rules are:
# 1. You are not allowed to specify --host, --target, and nonopt at the
#    same time.
# 2. Host defaults to nonopt.
# 3. If nonopt is not specified, then host defaults to the current host,
#    as determined by config.guess.
# 4. Target and build default to nonopt.
# 5. If nonopt is not specified, then target and build default to host.

# The aliases save the names the user supplied, while $host etc.
# will get canonicalized.
case $host---$target---$nonopt in
NONE---*---* | *---NONE---* | *---*---NONE) ;;
*) { echo "configure: error: can only configure for one host and one target at a time" 1>&2; echo "configure: error: can only configure for one host and one target at a time" 1>&5; exit 1; } ;;
esac


# Make sure we can run config.sub.
if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
else { echo "configure: error: can not run $ac_config_sub" 1>&2; echo "configure: error: can not run $ac_config_sub" 1>&5; exit 1; }
fi

echo $ac_n "checking host system type""... $ac_c" 1>&6
echo "configure:910: checking host system type" >&5

host_alias=$host
case "$host_alias" in
NONE)
  case $nonopt in
  NONE)
    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; echo "configure: error: can not guess host type; you must specify one" 1>&5; exit 1; }
    fi ;;
  *) host_alias=$nonopt ;;
  esac ;;
esac

host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$host" 1>&6

echo $ac_n "checking target system type""... $ac_c" 1>&6
echo "configure:931: checking target system type" >&5

target_alias=$target
case "$target_alias" in
NONE)
  case $nonopt in
  NONE) target_alias=$host_alias ;;
  *) target_alias=$nonopt ;;
  esac ;;
esac

target=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $target_alias`
target_cpu=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
target_vendor=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
target_os=`echo $target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$target" 1>&6

echo $ac_n "checking build system type""... $ac_c" 1>&6
echo "configure:949: checking build system type" >&5

build_alias=$build
case "$build_alias" in
NONE)
  case $nonopt in
  NONE) build_alias=$host_alias ;;
  *) build_alias=$nonopt ;;
  esac ;;
esac

build=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $build_alias`
build_cpu=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
build_vendor=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
build_os=`echo $build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
echo "$ac_t""$build" 1>&6

test "$host_alias" != "$target_alias" &&
  test "$program_prefix$program_suffix$program_transform_name" = \
    NONENONEs,x,x, &&
  program_prefix=${target_alias}-

TARGET_CPU="${target_cpu}"
TARGET_VENDOR="${target_vendor}"
TARGET_OS="${target_os}"

CFLAGS="${CFLAGS=}"
CPPFLAGS="${CPPFLAGS=}"
CXXFLAGS="${CXXFLAGS=}"
LDFLAGS="${LDFLAGS=}"
HOST_CFLAGS="${HOST_CFLAGS=}"
HOST_CXXFLAGS="${HOST_CXXFLAGS=}"
HOST_LDFLAGS="${HOST_LDFLAGS=}"

_SUBDIR_CC="$CC"
_SUBDIR_CXX="$CXX"
_SUBDIR_CFLAGS="$CFLAGS"
_SUBDIR_CPPFLAGS="$CPPFLAGS"
_SUBDIR_CXXFLAGS="$CXXFLAGS"
_SUBDIR_LDFLAGS="$LDFLAGS"
_SUBDIR_HOST_CC="$HOST_CC"
_SUBDIR_HOST_CFLAGS="$HOST_CFLAGS"
_SUBDIR_HOST_CXXFLAGS="$HOST_CXXFLAGS"
_SUBDIR_HOST_LDFLAGS="$HOST_LDFLAGS"
_SUBDIR_CONFIG_ARGS="$ac_configure_args"

NSPR_VERSION=4
NSPR_MINVER=4.9.2

PERL_VERSION=5.006
WINDRES_VERSION=2.14.90
W32API_VERSION=3.14

MSMANIFEST_TOOL=

MISSING_X=
for ac_prog in gawk mawk nawk awk
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1010: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AWK'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AWK"; then
  ac_cv_prog_AWK="$AWK" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AWK="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AWK="$ac_cv_prog_AWK"
if test -n "$AWK"; then
  echo "$ac_t""$AWK" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$AWK" && break
done


USE_PTHREADS=
_PTHREAD_LDFLAGS=""

_topsrcdir=`cd $srcdir; pwd -W 2>/dev/null || pwd`
_objdir=`pwd`

if test "$_topsrcdir" = "$_objdir"
then
  echo "  ***"
  echo "  * Building directly in the main source directory is not allowed."
  echo "  *"
  echo "  * To build, you must run configure from a separate directory"
  echo "  * (referred to as an object directory)."
  echo "  ***"
  exit 1
fi

# Check for a couple representative files in the source tree
_conflict_files=
for file in $_topsrcdir/Makefile $_topsrcdir/config/autoconf.mk; do
  if test -f $file; then
    _conflict_files="$_conflict_files $file"
  fi
done
if test "$_conflict_files"; then
  echo "***"
  echo "*   Your source tree contains these files:"
  for file in $_conflict_files; do
    echo "*         $file"
  done
  cat 1>&2 <<-EOF
	*   This indicates that you previously built in the source tree.
	*   A source tree build can confuse the separate objdir build.
	*
	*   To clean up the source tree:
	*     1. cd $_topsrcdir
	*     2. gmake distclean
	***
	EOF
  exit 1
  break
fi
MOZ_BUILD_ROOT=`pwd -W 2>/dev/null || pwd`


BUILD_BACKENDS="RecursiveMake"

# Check whether --enable-build-backend or --disable-build-backend was given.
if test "${enable_build_backend+set}" = set; then
  enableval="$enable_build_backend"
   BUILD_BACKENDS="RecursiveMake `echo $enableval | sed 's/,/ /g'`"
fi






  if test -z "$MOZILLA_OFFICIAL"; then
    DEVELOPER_OPTIONS=1
  fi
  # Check whether --enable-release or --disable-release was given.
if test "${enable_release+set}" = set; then
  enableval="$enable_release"
  if test "$enableval" = "yes"; then
    DEVELOPER_OPTIONS=
  elif test "$enableval" = "no"; then
    DEVELOPER_OPTIONS=1
  else
    { echo "configure: error: Option, release, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, release, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


  

if test -z "$CROSS_COMPILE"; then
case "$target" in
*-mingw*)
    if test -z "$CC"; then CC=cl; fi
    if test -z "$CXX"; then CXX=cl; fi
    if test -z "$CPP"; then CPP="$CC -E -nologo"; fi
    if test -z "$CXXCPP"; then CXXCPP="$CXX -TP -E -nologo"; ac_cv_prog_CXXCPP="$CXXCPP"; fi
    if test -z "$LD"; then LD=link; fi
    if test -z "$AS"; then
        case "${target_cpu}" in
        i*86)
            AS=ml;
            ;;
        x86_64)
            AS=ml64;
            ;;
        esac
    fi
    if test -z "$MIDL"; then MIDL=midl; fi

    # need override this flag since we don't use $(LDFLAGS) for this.
    if test -z "$HOST_LDFLAGS" ; then
        HOST_LDFLAGS=" "
    fi
    ;;
*-darwin*)
    # GCC on darwin is based on gcc 4.2 and we don't support it anymore.
    if test -z "$CC"; then
          for ac_prog in clang
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1149: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$CC" in
  /*)
  ac_cv_path_CC="$CC" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_CC="$CC" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_CC="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
CC="$ac_cv_path_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CC" && break
done

  if test "$msyshost"; then
    case "$CC" in
    /*)
      tmp_DIRNAME=`dirname "$CC"`
      tmp_BASENAME=`basename "$CC"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      CC="$tmp_PWD/$tmp_BASENAME"
      if test -e "$CC.exe"; then
        CC="$CC.exe"
      fi
    esac
  fi

    fi
    if test -z "$CXX"; then
          for ac_prog in clang++
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1204: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$CXX" in
  /*)
  ac_cv_path_CXX="$CXX" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_CXX="$CXX" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_CXX="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
CXX="$ac_cv_path_CXX"
if test -n "$CXX"; then
  echo "$ac_t""$CXX" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CXX" && break
done

  if test "$msyshost"; then
    case "$CXX" in
    /*)
      tmp_DIRNAME=`dirname "$CXX"`
      tmp_BASENAME=`basename "$CXX"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      CXX="$tmp_PWD/$tmp_BASENAME"
      if test -e "$CXX.exe"; then
        CXX="$CXX.exe"
      fi
    esac
  fi

    fi
    IS_GCC=$($CC -v 2>&1 | grep gcc)
    if test -n "$IS_GCC"
    then
      echo gcc is known to be broken on OS X, please use clang.
      echo see http://developer.mozilla.org/en-US/docs/Developer_Guide/Build_Instructions/Mac_OS_X_Prerequisites
      echo for more information.
      exit 1
    fi
    ;;
esac
fi


COMPILE_ENVIRONMENT=1
# Check whether --enable-compile-environment or --disable-compile-environment was given.
if test "${enable_compile_environment+set}" = set; then
  enableval="$enable_compile_environment"
  if test "$enableval" = "no"; then
    COMPILE_ENVIRONMENT= 
  elif test "$enableval" = "yes"; then
    :
  else
    { echo "configure: error: Option, compile-environment, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, compile-environment, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi



  for ac_prog in $PERL perl5 perl 
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1286: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$PERL" in
  /*)
  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_PERL="$PERL" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_PERL="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
PERL="$ac_cv_path_PERL"
if test -n "$PERL"; then
  echo "$ac_t""$PERL" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$PERL" && break
done

  if test "$msyshost"; then
    case "$PERL" in
    /*)
      tmp_DIRNAME=`dirname "$PERL"`
      tmp_BASENAME=`basename "$PERL"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      PERL="$tmp_PWD/$tmp_BASENAME"
      if test -e "$PERL.exe"; then
        PERL="$PERL.exe"
      fi
    esac
  fi

if test -z "$PERL" -o "$PERL" = ":"; then
    { echo "configure: error: perl not found in \$PATH" 1>&2; echo "configure: error: perl not found in \$PATH" 1>&5; exit 1; }
fi

# Check whether --enable-shared-js or --disable-shared-js was given.
if test "${enable_shared_js+set}" = set; then
  enableval="$enable_shared_js"
  if test "$enableval" = "yes"; then
    DISABLE_SHARED_JS=0
  elif test "$enableval" = "no"; then
    DISABLE_SHARED_JS=1
  else
    { echo "configure: error: Option, shared-js, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, shared-js, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


# Check whether --enable-export-js or --disable-export-js was given.
if test "${enable_export_js+set}" = set; then
  enableval="$enable_export_js"
  if test "$enableval" = "no"; then
    DISABLE_EXPORT_JS=1
  elif test "$enableval" = "yes"; then
    DISABLE_EXPORT_JS=
  else
    { echo "configure: error: Option, export-js, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, export-js, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$DISABLE_SHARED_JS" = "1" ; then
  if test "$DISABLE_EXPORT_JS" = "1"; then
    cat >> confdefs.pytmp <<\EOF
    (''' STATIC_JS_API ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define STATIC_JS_API 1
EOF

  else
    cat >> confdefs.pytmp <<\EOF
    (''' STATIC_EXPORTABLE_JS_API ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define STATIC_EXPORTABLE_JS_API 1
EOF

  fi
else
  if test "$DISABLE_EXPORT_JS" = "1"; then
    { echo "configure: error: Must export JS symbols when building a shared library." 1>&2; echo "configure: error: Must export JS symbols when building a shared library." 1>&5; exit 1; }
  fi
  JS_SHARED_LIBRARY=1
fi


if test "$JS_STANDALONE" = no; then
  autoconfmk=autoconf-js.mk
  JS_STANDALONE=
  #DIST is exported from top-level configure
else
  JS_STANDALONE=1
  cat >> confdefs.pytmp <<\EOF
    (''' JS_STANDALONE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_STANDALONE 1
EOF

  DIST="$MOZ_BUILD_ROOT/dist"
fi

BUILDING_JS=1


# Check whether --with-gonk or --without-gonk was given.
if test "${with_gonk+set}" = set; then
  withval="$with_gonk"
  gonkdir=$withval
fi


# Check whether --with-gonk-toolchain-prefix or --without-gonk-toolchain-prefix was given.
if test "${with_gonk_toolchain_prefix+set}" = set; then
  withval="$with_gonk_toolchain_prefix"
  gonk_toolchain_prefix=$withval
fi


if test -n "$gonkdir" ; then
    kernel_name=`uname -s | tr "[:upper:]" "[:lower:]"`
        ANDROID_VERSION=15
    if test -n "${PLATFORM_SDK_VERSION}"; then
        ANDROID_VERSION="${PLATFORM_SDK_VERSION}"
    fi

        AS="$gonk_toolchain_prefix"as
    CC="$gonk_toolchain_prefix"gcc
    CXX="$gonk_toolchain_prefix"g++
    CPP="$gonk_toolchain_prefix"cpp
    LD="$gonk_toolchain_prefix"ld
    AR="$gonk_toolchain_prefix"ar
    RANLIB="$gonk_toolchain_prefix"ranlib
    STRIP="$gonk_toolchain_prefix"strip
    OBJCOPY="$gonk_toolchain_prefix"objcopy

    STLPORT_CPPFLAGS="-I$_topsrcdir/build/stlport/stlport -I$gonkdir/ndk/sources/cxx-stl/system/include"
    STLPORT_LIBS="-lstlport"

    CPPFLAGS="-DANDROID $TARGET_C_INCLUDES -I$gonkdir/frameworks/base/native/include -I$gonkdir/system/core/include -isystem $gonkdir/bionic $CPPFLAGS -I$gonkdir/external/valgrind/fxos-include"
    CFLAGS="-mandroid -fno-short-enums -fno-exceptions $CFLAGS"
    CXXFLAGS="-mandroid -fno-short-enums -fno-exceptions -Wno-psabi $CXXFLAGS $STLPORT_CPPFLAGS"
    LIBS="$LIBS $STLPORT_LIBS"

        LDFLAGS="-mandroid -L$gonkdir/out/target/product/$GONK_PRODUCT/obj/lib -Wl,-rpath-link=$gonkdir/out/target/product/$GONK_PRODUCT/obj/lib --sysroot=$gonkdir/out/target/product/$GONK_PRODUCT/obj/ -llog $LDFLAGS"

        if test -z "$HOST_CPPFLAGS" ; then
        HOST_CPPFLAGS=" "
    fi
    if test -z "$HOST_CFLAGS" ; then
        HOST_CFLAGS=" "
    fi
    if test -z "$HOST_CXXFLAGS" ; then
        HOST_CXXFLAGS=" "
    fi
    if test -z "$HOST_LDFLAGS" ; then
        HOST_LDFLAGS=" "
    fi

    cat >> confdefs.pytmp <<\EOF
    (''' ANDROID ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define ANDROID 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' GONK ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define GONK 1
EOF

else
    

# Check whether --with-android-ndk or --without-android-ndk was given.
if test "${with_android_ndk+set}" = set; then
  withval="$with_android_ndk"
  android_ndk=$withval
fi


# Check whether --with-android-toolchain or --without-android-toolchain was given.
if test "${with_android_toolchain+set}" = set; then
  withval="$with_android_toolchain"
  android_toolchain=$withval
fi


# Check whether --with-android-gnu-compiler-version or --without-android-gnu-compiler-version was given.
if test "${with_android_gnu_compiler_version+set}" = set; then
  withval="$with_android_gnu_compiler_version"
  android_gnu_compiler_version=$withval
fi


# Check whether --with-android-cxx-stl or --without-android-cxx-stl was given.
if test "${with_android_cxx_stl+set}" = set; then
  withval="$with_android_cxx_stl"
  android_cxx_stl=$withval
else
  android_cxx_stl=mozstlport
fi



android_version=9

# Check whether --with-android-version or --without-android-version was given.
if test "${with_android_version+set}" = set; then
  withval="$with_android_version"
  android_version=$withval
fi


if test $android_version -lt 9 ; then
    { echo "configure: error: --with-android-version must be at least 9." 1>&2; echo "configure: error: --with-android-version must be at least 9." 1>&5; exit 1; }
fi

case "$target" in
arm-*linux*-android*|*-linuxandroid*)
    android_tool_prefix="arm-linux-androideabi"
    ;;
i?86-*android*)
    android_tool_prefix="i686-linux-android"
    ;;
mipsel-*android*)
    android_tool_prefix="mipsel-linux-android"
    ;;
*)
    android_tool_prefix="$target_os"
    ;;
esac

case "$target" in
*-android*|*-linuxandroid*)
    if test -z "$android_ndk" ; then
        { echo "configure: error: You must specify --with-android-ndk=/path/to/ndk when targeting Android." 1>&2; echo "configure: error: You must specify --with-android-ndk=/path/to/ndk when targeting Android." 1>&5; exit 1; }
    fi

    if test -z "$android_toolchain" ; then
        echo $ac_n "checking for android toolchain directory""... $ac_c" 1>&6
echo "configure:1547: checking for android toolchain directory" >&5

        kernel_name=`uname -s | tr "[:upper:]" "[:lower:]"`

        for version in $android_gnu_compiler_version 4.9 4.8 4.7; do
            case "$target_cpu" in
            arm)
                target_name=arm-linux-androideabi-$version
                ;;
            i?86)
                target_name=x86-$version
                ;;
            mipsel)
                target_name=mipsel-linux-android-$version
                ;;
            *)
                { echo "configure: error: target cpu is not supported" 1>&2; echo "configure: error: target cpu is not supported" 1>&5; exit 1; }
                ;;
            esac
            case "$host_cpu" in
            i*86)
                android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86
                ;;
            x86_64)
                android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86_64
                if ! test -d "$android_toolchain" ; then
                    android_toolchain="$android_ndk"/toolchains/$target_name/prebuilt/$kernel_name-x86
                fi
                ;;
            *)
                { echo "configure: error: No known toolchain for your host cpu" 1>&2; echo "configure: error: No known toolchain for your host cpu" 1>&5; exit 1; }
                ;;
            esac
            if test -d "$android_toolchain" ; then
                android_gnu_compiler_version=$version
                break
            elif test -n "$android_gnu_compiler_version" ; then
                { echo "configure: error: not found. Your --with-android-gnu-compiler-version may be wrong." 1>&2; echo "configure: error: not found. Your --with-android-gnu-compiler-version may be wrong." 1>&5; exit 1; }
            fi
        done

        if test -z "$android_gnu_compiler_version" ; then
            { echo "configure: error: not found. You have to specify --with-android-toolchain=/path/to/ndk/toolchain." 1>&2; echo "configure: error: not found. You have to specify --with-android-toolchain=/path/to/ndk/toolchain." 1>&5; exit 1; }
        else
            echo "$ac_t""$android_toolchain" 1>&6
        fi
        NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-android-toolchain=$android_toolchain"
    fi

    NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-android-version=$android_version"

    echo $ac_n "checking for android platform directory""... $ac_c" 1>&6
echo "configure:1599: checking for android platform directory" >&5

    case "$target_cpu" in
    arm)
        target_name=arm
        ;;
    i?86)
        target_name=x86
        ;;
    mipsel)
        target_name=mips
        ;;
    esac

    android_platform="$android_ndk"/platforms/android-"$android_version"/arch-"$target_name"

    if test -d "$android_platform" ; then
        echo "$ac_t""$android_platform" 1>&6
    else
        { echo "configure: error: not found. Please check your NDK. With the current configuration, it should be in $android_platform" 1>&2; echo "configure: error: not found. Please check your NDK. With the current configuration, it should be in $android_platform" 1>&5; exit 1; }
    fi

        TOOLCHAIN_PREFIX="$android_toolchain/bin/$android_tool_prefix-"
    AS="$android_toolchain"/bin/"$android_tool_prefix"-as
    if test -z "$CC"; then
        CC="$android_toolchain"/bin/"$android_tool_prefix"-gcc
    fi
    if test -z "$CXX"; then
        CXX="$android_toolchain"/bin/"$android_tool_prefix"-g++
    fi
    if test -z "$CPP"; then
        CPP="$android_toolchain"/bin/"$android_tool_prefix"-cpp
    fi
    LD="$android_toolchain"/bin/"$android_tool_prefix"-ld
    AR="$android_toolchain"/bin/"$android_tool_prefix"-ar
    RANLIB="$android_toolchain"/bin/"$android_tool_prefix"-ranlib
    STRIP="$android_toolchain"/bin/"$android_tool_prefix"-strip
    OBJCOPY="$android_toolchain"/bin/"$android_tool_prefix"-objcopy

    CPPFLAGS="-idirafter $android_platform/usr/include $CPPFLAGS"
    CFLAGS="-mandroid -fno-short-enums -fno-exceptions $CFLAGS"
    CXXFLAGS="-mandroid -fno-short-enums -fno-exceptions -Wno-psabi $CXXFLAGS"
    ASFLAGS="-idirafter $android_platform/usr/include -DANDROID $ASFLAGS"

                    LDFLAGS="-mandroid -L$android_platform/usr/lib -Wl,-rpath-link=$android_platform/usr/lib --sysroot=$android_platform -llog -Wl,--allow-shlib-undefined $LDFLAGS"
        if test -z "$HOST_CPPFLAGS" ; then
        HOST_CPPFLAGS=" "
    fi
    if test -z "$HOST_CFLAGS" ; then
        HOST_CFLAGS=" "
    fi
    if test -z "$HOST_CXXFLAGS" ; then
        HOST_CXXFLAGS=" "
    fi
    if test -z "$HOST_LDFLAGS" ; then
        HOST_LDFLAGS=" "
    fi

    ANDROID_NDK="${android_ndk}"
    ANDROID_TOOLCHAIN="${android_toolchain}"
    ANDROID_PLATFORM="${android_platform}"

    cat >> confdefs.pytmp <<\EOF
    (''' ANDROID ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define ANDROID 1
EOF

    
    
    

    ;;
esac


fi

case "$target" in
*-apple-darwin*)
    

# Check whether --with-ios-sdk or --without-ios-sdk was given.
if test "${with_ios_sdk+set}" = set; then
  withval="$with_ios_sdk"
  ios_sdk=$withval
fi


# Check whether --enable-ios-target or --disable-ios-target was given.
if test "${enable_ios_target+set}" = set; then
  enableval="$enable_ios_target"
  _IOS_TARGET=$enableval
fi

_IOS_TARGET_DEFAULT=8.0

case "$target" in
arm*-apple-darwin*)
    if test -z "$ios_sdk" -o "$ios_sdk" = "yes"; then
       ios_sdk=iphoneos
    fi
    case "$ios_sdk" in
         iphoneos*)
                ios_target_arg="-miphoneos-version-min"
                ;;
         *)
                { echo "configure: error: Only 'iphoneos' SDKs are valid when targeting iOS device, don't know what to do with '$ios_sdk'." 1>&2; echo "configure: error: Only 'iphoneos' SDKs are valid when targeting iOS device, don't know what to do with '$ios_sdk'." 1>&5; exit 1; }
                ;;
    esac
    ;;
*-apple-darwin*)
    ios_target_arg="-mios-simulator-version-min"
    case "$ios_sdk" in
         # Empty SDK is okay, this might be an OS X desktop build.
         ""|iphonesimulator*)
                ;;
         # Default to iphonesimulator
         yes)
                ios_sdk=iphonesimulator
                ;;
         *)
                { echo "configure: error: Only 'iphonesimulator' SDKs are valid when targeting iOS simulator." 1>&2; echo "configure: error: Only 'iphonesimulator' SDKs are valid when targeting iOS simulator." 1>&5; exit 1; }
                ;;
    esac
    ;;
esac


if test -n "$ios_sdk"; then
   if test -z "$_IOS_TARGET"; then
      _IOS_TARGET=$_IOS_TARGET_DEFAULT
      ios_target_arg="${ios_target_arg}=${_IOS_TARGET}"
   fi
   # Ensure that xcrun knows where this SDK is.
   ios_sdk_path=`xcrun --sdk $ios_sdk --show-sdk-path 2>/dev/null`
   _ret=$?
   if test $_ret -ne 0; then
      { echo "configure: error: iOS SDK '$ios_sdk' could not be found." 1>&2; echo "configure: error: iOS SDK '$ios_sdk' could not be found." 1>&5; exit 1; }
   fi
   MOZ_IOS=1
   export HOST_CC=clang
   export HOST_CXX=clang++
   # Add isysroot, arch, and ios target arguments
   case "$target_cpu" in
        arm*)
                ARGS="-arch armv7"
                ;;
        *)
                # Unfortunately simulator builds need this.
                export CROSS_COMPILE=1
                ;;
   esac
   ARGS=" $ARGS -isysroot $ios_sdk_path $ios_target_arg"
   # Now find our tools
   

_prog_name=clang

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1760: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_CC=$_path

fi

echo "$ac_t""$ac_cv_ios_path_CC" 1>&6
CC="${ac_cv_ios_path_CC}$ARGS"

   

_prog_name=clang++

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1782: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_CXX=$_path

fi

echo "$ac_t""$ac_cv_ios_path_CXX" 1>&6
CXX="${ac_cv_ios_path_CXX}$ARGS"

   export CPP="$CC -E"
   export LD="$CXX"
   

_prog_name=`echo AR | tr "[:upper:]" "[:lower:]"`

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1806: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_AR=$_path

fi

echo "$ac_t""$ac_cv_ios_path_AR" 1>&6
AR="${ac_cv_ios_path_AR}"

   

_prog_name=as

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1828: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_AS'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_AS=$_path

fi

echo "$ac_t""$ac_cv_ios_path_AS" 1>&6
AS="${ac_cv_ios_path_AS}$ARGS"

   

_prog_name=`echo OTOOL | tr "[:upper:]" "[:lower:]"`

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1850: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_OTOOL'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_OTOOL=$_path

fi

echo "$ac_t""$ac_cv_ios_path_OTOOL" 1>&6
OTOOL="${ac_cv_ios_path_OTOOL}"

   

_prog_name=`echo STRIP | tr "[:upper:]" "[:lower:]"`

echo $ac_n "checking for $_prog_name in iOS SDK""... $ac_c" 1>&6
echo "configure:1872: checking for $_prog_name in iOS SDK" >&5
if eval "test \"`echo '$''{'ac_cv_ios_path_STRIP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
_path=`xcrun --sdk $ios_sdk --find $_prog_name 2>/dev/null`
_res=$?
if test $_res -ne 0; then
   { echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&2; echo "configure: error: Could not find '$_prog_name' in the iOS SDK" 1>&5; exit 1; }
fi
ac_cv_ios_path_STRIP=$_path

fi

echo "$ac_t""$ac_cv_ios_path_STRIP" 1>&6
STRIP="${ac_cv_ios_path_STRIP}"

   export PKG_CONFIG_PATH=${ios_sdk_path}/usr/lib/pkgconfig/
fi



    ;;
esac


AR_FLAGS='crs $@'

if test "$COMPILE_ENVIRONMENT"; then

# Note:
#   In Mozilla, we use the names $target, $host and $build incorrectly, but are
#   too far gone to back out now. See Bug 475488:
#     - When we say $target, we mean $host, that is, the system on which
#       Mozilla will be run.
#     - When we say $host, we mean $build, that is, the system on which Mozilla
#       is built.
#     - $target (in its correct usage) is for compilers who generate code for a
#       different platform than $host, so it would not be used by Mozilla.
if test "$target" != "$host"; then
    
echo "cross compiling from $host to $target"

_SAVE_CC="$CC"
_SAVE_CFLAGS="$CFLAGS"
_SAVE_LDFLAGS="$LDFLAGS"

echo $ac_n "checking for host c compiler""... $ac_c" 1>&6
echo "configure:1920: checking for host c compiler" >&5
for ac_prog in cc gcc clang cl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1926: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_HOST_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$HOST_CC"; then
  ac_cv_prog_HOST_CC="$HOST_CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_HOST_CC="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
HOST_CC="$ac_cv_prog_HOST_CC"
if test -n "$HOST_CC"; then
  echo "$ac_t""$HOST_CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$HOST_CC" && break
done
test -n "$HOST_CC" || HOST_CC=""""

if test -z "$HOST_CC"; then
    { echo "configure: error: no acceptable c compiler found in \$PATH" 1>&2; echo "configure: error: no acceptable c compiler found in \$PATH" 1>&5; exit 1; }
fi
echo "$ac_t""$HOST_CC" 1>&6
echo $ac_n "checking for host c++ compiler""... $ac_c" 1>&6
echo "configure:1961: checking for host c++ compiler" >&5
for ac_prog in c++ g++ clang++ cl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:1967: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_HOST_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$HOST_CXX"; then
  ac_cv_prog_HOST_CXX="$HOST_CXX" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_HOST_CXX="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
HOST_CXX="$ac_cv_prog_HOST_CXX"
if test -n "$HOST_CXX"; then
  echo "$ac_t""$HOST_CXX" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$HOST_CXX" && break
done
test -n "$HOST_CXX" || HOST_CXX=""""

if test -z "$HOST_CXX"; then
    { echo "configure: error: no acceptable c++ compiler found in \$PATH" 1>&2; echo "configure: error: no acceptable c++ compiler found in \$PATH" 1>&5; exit 1; }
fi
echo "$ac_t""$HOST_CXX" 1>&6

if test -z "$HOST_CFLAGS"; then
    HOST_CFLAGS="$CFLAGS"
fi
if test -z "$HOST_CXXFLAGS"; then
    HOST_CXXFLAGS="$CXXFLAGS"
fi
if test -z "$HOST_LDFLAGS"; then
    HOST_LDFLAGS="$LDFLAGS"
fi
if test -z "$HOST_AR_FLAGS"; then
    HOST_AR_FLAGS="$AR_FLAGS"
fi
for ac_prog in $HOST_RANLIB ranlib
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2019: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_HOST_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$HOST_RANLIB"; then
  ac_cv_prog_HOST_RANLIB="$HOST_RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy=":"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_HOST_RANLIB="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
HOST_RANLIB="$ac_cv_prog_HOST_RANLIB"
if test -n "$HOST_RANLIB"; then
  echo "$ac_t""$HOST_RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$HOST_RANLIB" && break
done
test -n "$HOST_RANLIB" || HOST_RANLIB="ranlib"

for ac_prog in $HOST_AR ar
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2054: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_HOST_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$HOST_AR"; then
  ac_cv_prog_HOST_AR="$HOST_AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy=":"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_HOST_AR="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
HOST_AR="$ac_cv_prog_HOST_AR"
if test -n "$HOST_AR"; then
  echo "$ac_t""$HOST_AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$HOST_AR" && break
done
test -n "$HOST_AR" || HOST_AR="ar"

CC="$HOST_CC"
CFLAGS="$HOST_CFLAGS"
LDFLAGS="$HOST_LDFLAGS"

echo $ac_n "checking whether the host c compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works""... $ac_c" 1>&6
echo "configure:2089: checking whether the host c compiler ($HOST_CC $HOST_CFLAGS $HOST_LDFLAGS) works" >&5
cat > conftest.$ac_ext <<EOF
#line 2091 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:2098: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_prog_hostcc_works=1 echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: installation or configuration problem: host compiler $HOST_CC cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: host compiler $HOST_CC cannot create executables." 1>&5; exit 1; } 
fi
rm -f conftest*

CC="$HOST_CXX"
CFLAGS="$HOST_CXXFLAGS"
echo $ac_n "checking whether the host c++ compiler ($HOST_CXX $HOST_CXXFLAGS $HOST_LDFLAGS) works""... $ac_c" 1>&6
echo "configure:2112: checking whether the host c++ compiler ($HOST_CXX $HOST_CXXFLAGS $HOST_LDFLAGS) works" >&5
cat > conftest.$ac_ext <<EOF
#line 2114 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:2121: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_prog_hostcxx_works=1 echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: installation or configuration problem: host compiler $HOST_CXX cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: host compiler $HOST_CXX cannot create executables." 1>&5; exit 1; } 
fi
rm -f conftest*

CC=$_SAVE_CC
CFLAGS=$_SAVE_CFLAGS
LDFLAGS=$_SAVE_LDFLAGS

for ac_prog in "${target_alias}-gcc" "${target}-gcc"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2141: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CC" && break
done
test -n "$CC" || CC=":"

unset ac_cv_prog_CC
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2175: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
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
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2205: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_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 $# -gt 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
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2256: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; echo "configure: error: no acceptable cc found in \$PATH" 1>&5; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:2288: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 2299 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:2304: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&5; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:2330: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:2335: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:2344: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:2363: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&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

for ac_prog in "${target_alias}-g++" "${target}-g++"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2399: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CXX="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CXX="$ac_cv_prog_CXX"
if test -n "$CXX"; then
  echo "$ac_t""$CXX" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CXX" && break
done
test -n "$CXX" || CXX=":"

unset ac_cv_prog_CXX
for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2435: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CXX="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CXX="$ac_cv_prog_CXX"
if test -n "$CXX"; then
  echo "$ac_t""$CXX" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CXX" && break
done
test -n "$CXX" || CXX="gcc"


echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:2467: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

cat > conftest.$ac_ext << EOF

#line 2478 "configure"
#include "confdefs.h"

int main(){return(0);}
EOF
if { (eval echo configure:2483: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cxx_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cxx_cross=no
  else
    ac_cv_prog_cxx_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cxx_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
if test $ac_cv_prog_cxx_works = no; then
  { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&5; exit 1; }
fi
echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:2509: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
cross_compiling=$ac_cv_prog_cxx_cross

echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
echo "configure:2514: checking whether we are using GNU C++" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.C <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:2523: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gxx=yes
else
  ac_cv_prog_gxx=no
fi
fi

echo "$ac_t""$ac_cv_prog_gxx" 1>&6

if test $ac_cv_prog_gxx = yes; then
  GXX=yes
else
  GXX=
fi

ac_test_CXXFLAGS="${CXXFLAGS+set}"
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=
echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
echo "configure:2542: checking whether ${CXX-g++} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.cc
if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
  ac_cv_prog_cxx_g=yes
else
  ac_cv_prog_cxx_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cxx_g" 1>&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

for ac_declaration in \
   ''\
   '#include <stdlib.h>' \
   'extern "C" void std::exit (int) throw (); using std::exit;' \
   'extern "C" void std::exit (int); using std::exit;' \
   'extern "C" void exit (int) throw ();' \
   'extern "C" void exit (int);' \
   'void exit (int);'
do
  cat > conftest.$ac_ext <<EOF
#line 2583 "configure"
#include "confdefs.h"
#include <stdlib.h>
$ac_declaration
int main() {
exit (42);
; return 0; }
EOF
if { (eval echo configure:2591: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  continue
fi
rm -f conftest*
  cat > conftest.$ac_ext <<EOF
#line 2601 "configure"
#include "confdefs.h"
$ac_declaration
int main() {
exit (42);
; return 0; }
EOF
if { (eval echo configure:2608: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  break
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
done
if test -n "$ac_declaration"; then
  echo '#ifdef __cplusplus' >>confdefs.h
  echo $ac_declaration      >>confdefs.h
  echo '#endif'             >>confdefs.h
fi



for ac_prog in "${target_alias}-ranlib" "${target}-ranlib"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2630: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$RANLIB" && break
done
test -n "$RANLIB" || RANLIB=":"

for ac_prog in "${target_alias}-ar" "${target}-ar"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2665: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$AR" && break
done
test -n "$AR" || AR=":"

for ac_prog in "${target_alias}-as" "${target}-as"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2700: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AS'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AS"; then
  ac_cv_prog_AS="$AS" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AS="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AS="$ac_cv_prog_AS"
if test -n "$AS"; then
  echo "$ac_t""$AS" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$AS" && break
done
test -n "$AS" || AS=":"

for ac_prog in "${target_alias}-ld" "${target}-ld"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2735: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$LD"; then
  ac_cv_prog_LD="$LD" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_LD="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
LD="$ac_cv_prog_LD"
if test -n "$LD"; then
  echo "$ac_t""$LD" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$LD" && break
done
test -n "$LD" || LD=":"

for ac_prog in "${target_alias}-strip" "${target}-strip"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2770: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_STRIP="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
STRIP="$ac_cv_prog_STRIP"
if test -n "$STRIP"; then
  echo "$ac_t""$STRIP" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$STRIP" && break
done
test -n "$STRIP" || STRIP=":"

for ac_prog in "${target_alias}-windres" "${target}-windres"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2805: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$WINDRES"; then
  ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_WINDRES="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
WINDRES="$ac_cv_prog_WINDRES"
if test -n "$WINDRES"; then
  echo "$ac_t""$WINDRES" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$WINDRES" && break
done
test -n "$WINDRES" || WINDRES=":"

for ac_prog in "${target_alias}-otool" "${target}-otool"
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2840: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_OTOOL'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$OTOOL"; then
  ac_cv_prog_OTOOL="$OTOOL" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_OTOOL="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
OTOOL="$ac_cv_prog_OTOOL"
if test -n "$OTOOL"; then
  echo "$ac_t""$OTOOL" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$OTOOL" && break
done
test -n "$OTOOL" || OTOOL=":"

cat >> confdefs.pytmp <<\EOF
    (''' CROSS_COMPILE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define CROSS_COMPILE 1
EOF

CROSS_COMPILE=1

cross_compiling=yes

else
    # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2885: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="gcc"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
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
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2915: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_prog_rejected=no
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
        ac_prog_rejected=yes
	continue
      fi
      ac_cv_prog_CC="cc"
      break
    fi
  done
  IFS="$ac_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 $# -gt 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
    set dummy "$ac_dir/$ac_word" "$@"
    shift
    ac_cv_prog_CC="$@"
  fi
fi
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test -z "$CC"; then
    case "`uname -s`" in
    *win32* | *WIN32*)
      # Extract the first word of "cl", so it can be a program name with args.
set dummy cl; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:2966: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CC"; then
  ac_cv_prog_CC="$CC" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CC="cl"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CC="$ac_cv_prog_CC"
if test -n "$CC"; then
  echo "$ac_t""$CC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi
 ;;
    esac
  fi
  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; echo "configure: error: no acceptable cc found in \$PATH" 1>&5; exit 1; }
fi

echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:2998: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

cat > conftest.$ac_ext << EOF

#line 3009 "configure"
#include "confdefs.h"

main(){return(0);}
EOF
if { (eval echo configure:3014: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cc_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cc_cross=no
  else
    ac_cv_prog_cc_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cc_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
if test $ac_cv_prog_cc_works = no; then
  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&5; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:3040: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:3045: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.c <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:3054: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gcc=yes
else
  ac_cv_prog_gcc=no
fi
fi

echo "$ac_t""$ac_cv_prog_gcc" 1>&6

if test $ac_cv_prog_gcc = yes; then
  GCC=yes
else
  GCC=
fi

ac_test_CFLAGS="${CFLAGS+set}"
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:3073: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.c
if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
  ac_cv_prog_cc_g=yes
else
  ac_cv_prog_cc_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cc_g" 1>&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

    for ac_prog in $CCC c++ g++ gcc CC cxx cc++ cl
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3109: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$CXX"; then
  ac_cv_prog_CXX="$CXX" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_CXX="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
CXX="$ac_cv_prog_CXX"
if test -n "$CXX"; then
  echo "$ac_t""$CXX" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CXX" && break
done
test -n "$CXX" || CXX="gcc"


echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:3141: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

cat > conftest.$ac_ext << EOF

#line 3152 "configure"
#include "confdefs.h"

int main(){return(0);}
EOF
if { (eval echo configure:3157: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  ac_cv_prog_cxx_works=yes
  # If we can't run a trivial program, we are probably using a cross compiler.
  if (./conftest; exit) 2>/dev/null; then
    ac_cv_prog_cxx_cross=no
  else
    ac_cv_prog_cxx_cross=yes
  fi
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  ac_cv_prog_cxx_works=no
fi
rm -fr conftest*
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
if test $ac_cv_prog_cxx_works = no; then
  { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&5; exit 1; }
fi
echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:3183: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
cross_compiling=$ac_cv_prog_cxx_cross

echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
echo "configure:3188: checking whether we are using GNU C++" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.C <<EOF
#ifdef __GNUC__
  yes;
#endif
EOF
if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:3197: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
  ac_cv_prog_gxx=yes
else
  ac_cv_prog_gxx=no
fi
fi

echo "$ac_t""$ac_cv_prog_gxx" 1>&6

if test $ac_cv_prog_gxx = yes; then
  GXX=yes
else
  GXX=
fi

ac_test_CXXFLAGS="${CXXFLAGS+set}"
ac_save_CXXFLAGS="$CXXFLAGS"
CXXFLAGS=
echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
echo "configure:3216: checking whether ${CXX-g++} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'void f(){}' > conftest.cc
if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
  ac_cv_prog_cxx_g=yes
else
  ac_cv_prog_cxx_g=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_prog_cxx_g" 1>&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

for ac_declaration in \
   ''\
   '#include <stdlib.h>' \
   'extern "C" void std::exit (int) throw (); using std::exit;' \
   'extern "C" void std::exit (int); using std::exit;' \
   'extern "C" void exit (int) throw ();' \
   'extern "C" void exit (int);' \
   'void exit (int);'
do
  cat > conftest.$ac_ext <<EOF
#line 3257 "configure"
#include "confdefs.h"
#include <stdlib.h>
$ac_declaration
int main() {
exit (42);
; return 0; }
EOF
if { (eval echo configure:3265: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  continue
fi
rm -f conftest*
  cat > conftest.$ac_ext <<EOF
#line 3275 "configure"
#include "confdefs.h"
$ac_declaration
int main() {
exit (42);
; return 0; }
EOF
if { (eval echo configure:3282: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  break
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
done
if test -n "$ac_declaration"; then
  echo '#ifdef __cplusplus' >>confdefs.h
  echo $ac_declaration      >>confdefs.h
  echo '#endif'             >>confdefs.h
fi


    # Extract the first word of "ranlib", so it can be a program name with args.
set dummy ranlib; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3301: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$RANLIB"; then
  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_RANLIB="ranlib"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":"
fi
fi
RANLIB="$ac_cv_prog_RANLIB"
if test -n "$RANLIB"; then
  echo "$ac_t""$RANLIB" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

      for ac_prog in $AS as
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3333: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_AS'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$AS" in
  /*)
  ac_cv_path_AS="$AS" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_AS="$AS" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_AS="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
AS="$ac_cv_path_AS"
if test -n "$AS"; then
  echo "$ac_t""$AS" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$AS" && break
done
test -n "$AS" || AS="$CC"

  if test "$msyshost"; then
    case "$AS" in
    /*)
      tmp_DIRNAME=`dirname "$AS"`
      tmp_BASENAME=`basename "$AS"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      AS="$tmp_PWD/$tmp_BASENAME"
      if test -e "$AS.exe"; then
        AS="$AS.exe"
      fi
    esac
  fi

    for ac_prog in ar
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3387: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_AR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$AR"; then
  ac_cv_prog_AR="$AR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_AR="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
AR="$ac_cv_prog_AR"
if test -n "$AR"; then
  echo "$ac_t""$AR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$AR" && break
done
test -n "$AR" || AR=":"

    for ac_prog in ld
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3422: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$LD"; then
  ac_cv_prog_LD="$LD" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_LD="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
LD="$ac_cv_prog_LD"
if test -n "$LD"; then
  echo "$ac_t""$LD" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$LD" && break
done
test -n "$LD" || LD=":"

    for ac_prog in strip
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3457: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_STRIP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$STRIP"; then
  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_STRIP="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
STRIP="$ac_cv_prog_STRIP"
if test -n "$STRIP"; then
  echo "$ac_t""$STRIP" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$STRIP" && break
done
test -n "$STRIP" || STRIP=":"

    for ac_prog in windres
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3492: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_WINDRES'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$WINDRES"; then
  ac_cv_prog_WINDRES="$WINDRES" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_WINDRES="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
WINDRES="$ac_cv_prog_WINDRES"
if test -n "$WINDRES"; then
  echo "$ac_t""$WINDRES" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$WINDRES" && break
done
test -n "$WINDRES" || WINDRES=":"

    if test -z "$HOST_CC"; then
        HOST_CC='$(CC)'
    fi
    if test -z "$HOST_CFLAGS"; then
        HOST_CFLAGS='$(CFLAGS)'
    fi
    if test -z "$HOST_CXX"; then
        HOST_CXX='$(CXX)'
    fi
    if test -z "$HOST_CXXFLAGS"; then
        HOST_CXXFLAGS='$(CXXFLAGS)'
    fi
    if test -z "$HOST_LDFLAGS"; then
        HOST_LDFLAGS='$(LDFLAGS)'
    fi
    if test -z "$HOST_RANLIB"; then
        HOST_RANLIB='$(RANLIB)'
    fi
    if test -z "$HOST_AR"; then
        HOST_AR='$(AR)'
    fi
    if test -z "$HOST_AR_FLAGS"; then
        HOST_AR_FLAGS='$(AR_FLAGS)'
    fi
fi


GNU_AS=
GNU_LD=
GNU_CC=
GNU_CXX=
CC_VERSION='N/A'
CXX_VERSION='N/A'
cat <<EOF > conftest.c
#if defined(_MSC_VER)
#if defined(__clang__)
COMPILER clang-cl _MSC_VER
#else
COMPILER msvc _MSC_FULL_VER
#endif
#elif defined(__clang__)
COMPILER clang __clang_major__.__clang_minor__.__clang_patchlevel__
#elif defined(__GNUC__)
COMPILER gcc __GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__
#elif defined(__INTEL_COMPILER)
COMPILER icc __INTEL_COMPILER
#endif
EOF
read dummy compiler CC_VERSION <<EOF
$($CC -E $CPPFLAGS $CFLAGS conftest.c 2>/dev/null | grep COMPILER)
EOF
read dummy cxxcompiler CXX_VERSION <<EOF
$($CXX -E $CPPFLAGS $CXXFLAGS conftest.c 2>/dev/null | grep COMPILER)
EOF
if test "$compiler" != "$cxxcompiler"; then
    { echo "configure: error: Your C and C++ compilers are different.  You need to use the same compiler." 1>&2; echo "configure: error: Your C and C++ compilers are different.  You need to use the same compiler." 1>&5; exit 1; }
fi
if test "$CC_VERSION" != "$CXX_VERSION"; then
    # This may not be strictly necessary, but if we want to drop it, we
    # should make sure any version checks below apply to both the C and
    # C++ compiler versions.
    { echo "configure: error: Your C and C++ compiler versions are different.  You need to use the same compiler version." 1>&2; echo "configure: error: Your C and C++ compiler versions are different.  You need to use the same compiler version." 1>&5; exit 1; }
fi
CC_VERSION=`echo "$CC_VERSION" | sed 's/ //g'`
CXX_VERSION=`echo "$CXX_VERSION" | sed 's/ //g'`
if test "$compiler" = "gcc"; then
    GNU_CC=1
    GNU_CXX=1
    
    GCC_VERSION_FULL="$CXX_VERSION"
    GCC_VERSION=`echo "$GCC_VERSION_FULL" | $PERL -pe '(split(/\./))[0]>=4&&s/(^\d*\.\d*).*/$1/;'`

    GCC_MAJOR_VERSION=`echo ${GCC_VERSION} | $AWK -F\. '{ print $1 }'`
    GCC_MINOR_VERSION=`echo ${GCC_VERSION} | $AWK -F\. '{ print $2 }'`
    
fi

if test "`echo | $AS -o conftest.out -v 2>&1 | grep -c GNU`" != "0"; then
    GNU_AS=1
fi
rm -f conftest.out
if test "`echo | $LD -v 2>&1 | grep -c GNU`" != "0"; then
    GNU_LD=1
fi

if test "$compiler" = "msvc"; then
     MSVC_VERSION_FULL="$CXX_VERSION"
     CC_VERSION=`echo ${CC_VERSION} | cut -c 1-4`
     CXX_VERSION=`echo ${CXX_VERSION} | cut -c 1-4`
fi

INTEL_CC=
INTEL_CXX=
if test "$compiler" = "icc"; then
   INTEL_CC=1
   INTEL_CXX=1
fi

CLANG_CC=
CLANG_CXX=
CLANG_CL=
if test "$compiler" = "clang"; then
    GNU_CC=1
    GNU_CXX=1
    CLANG_CC=1
    CLANG_CXX=1
fi
if test "$compiler" = "clang-cl"; then
    CLANG_CL=1
    # We force clang-cl to emulate Visual C++ 2013 in configure.in, but that
    # is based on the CLANG_CL variable defined here, so make sure that we're
    # getting the right version here manually.
    CC_VERSION=1800
    CXX_VERSION=1800
    MSVC_VERSION_FULL=180030723
    # Build on clang-cl with MSVC 2013 Update 3 with fallback emulation.
    CFLAGS="$CFLAGS -fms-compatibility-version=18.00.30723 -fallback"
    CXXFLAGS="$CXXFLAGS -fms-compatibility-version=18.00.30723 -fallback"
fi

if test "$GNU_CC"; then
    if `$CC -print-prog-name=ld` -v 2>&1 | grep -c GNU >/dev/null; then
        GCC_USE_GNU_LD=1
    fi
fi




if test -n "$GNU_CC" -a -z "$CLANG_CC" ; then
    if test "$GCC_MAJOR_VERSION" -eq 4 -a "$GCC_MINOR_VERSION" -lt 7 ||
       test "$GCC_MAJOR_VERSION" -lt 4; then
        { echo "configure: error: Only GCC 4.7 or newer supported" 1>&2; echo "configure: error: Only GCC 4.7 or newer supported" 1>&5; exit 1; }
    fi
fi



# Check whether --with-compiler_wrapper or --without-compiler_wrapper was given.
if test "${with_compiler_wrapper+set}" = set; then
  withval="$with_compiler_wrapper"
  COMPILER_WRAPPER=$withval
else
  COMPILER_WRAPPER="no"
fi


# Check whether --with-ccache or --without-ccache was given.
if test "${with_ccache+set}" = set; then
  withval="$with_ccache"
  CCACHE=$withval
else
  CCACHE="no"
fi


if test "$CCACHE" != "no"; then
    if test -z "$CCACHE" -o "$CCACHE" = "yes"; then
        CCACHE=
    else
        if test ! -e "$CCACHE"; then
            { echo "configure: error: $CCACHE not found" 1>&2; echo "configure: error: $CCACHE not found" 1>&5; exit 1; }
        fi
    fi
      for ac_prog in $CCACHE ccache
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3691: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_CCACHE'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$CCACHE" in
  /*)
  ac_cv_path_CCACHE="$CCACHE" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_CCACHE="$CCACHE" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_CCACHE="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
CCACHE="$ac_cv_path_CCACHE"
if test -n "$CCACHE"; then
  echo "$ac_t""$CCACHE" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$CCACHE" && break
done

  if test "$msyshost"; then
    case "$CCACHE" in
    /*)
      tmp_DIRNAME=`dirname "$CCACHE"`
      tmp_BASENAME=`basename "$CCACHE"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      CCACHE="$tmp_PWD/$tmp_BASENAME"
      if test -e "$CCACHE.exe"; then
        CCACHE="$CCACHE.exe"
      fi
    esac
  fi

    if test -z "$CCACHE" -o "$CCACHE" = ":"; then
        { echo "configure: error: ccache not found" 1>&2; echo "configure: error: ccache not found" 1>&5; exit 1; }
    elif test -x "$CCACHE"; then
        if test "$COMPILER_WRAPPER" != "no"; then
            COMPILER_WRAPPER="$CCACHE $COMPILER_WRAPPER"
        else
            COMPILER_WRAPPER="$CCACHE"
        fi
        MOZ_USING_CCACHE=1
    else
        { echo "configure: error: $CCACHE is not executable" 1>&2; echo "configure: error: $CCACHE is not executable" 1>&5; exit 1; }
    fi
fi



if test "$COMPILER_WRAPPER" != "no"; then
    case "$target" in
    *-mingw*)
                                                        COMPILER_WRAPPER=`echo "$COMPILER_WRAPPER" | tr '\\' '/'`
        ;;
    esac

    case "$CC" in
    $COMPILER_WRAPPER\ *)
        :
        ;;
    *)
        CC="$COMPILER_WRAPPER $CC"
        CXX="$COMPILER_WRAPPER $CXX"
        _SUBDIR_CC="$CC"
        _SUBDIR_CXX="$CXX"
        ac_cv_prog_CC="$CC"
        ac_cv_prog_CXX="$CXX"
        ;;
    esac
    MOZ_USING_COMPILER_WRAPPER=1
fi




echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
echo "configure:3782: checking how to run the C preprocessor" >&5
# On Suns, sometimes $CPP names a directory.
if test -n "$CPP" && test -d "$CPP"; then
  CPP=
fi
if test -z "$CPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    # This must be in double quotes, not single quotes, because CPP may get
  # substituted into the Makefile and "${CC-cc}" will confuse make.
  CPP="${CC-cc} -E"
  # On the NeXT, cc -E runs the code through the compiler's parser,
  # not just through cpp.
  cat > conftest.$ac_ext <<EOF
#line 3797 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -E -traditional-cpp"
  cat > conftest.$ac_ext <<EOF
#line 3814 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP="${CC-cc} -nologo -E"
  cat > conftest.$ac_ext <<EOF
#line 3831 "configure"
#include "confdefs.h"
#include <assert.h>
Syntax Error
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3837: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CPP=/lib/cpp
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
  ac_cv_prog_CPP="$CPP"
fi
  CPP="$ac_cv_prog_CPP"
else
  ac_cv_prog_CPP="$CPP"
fi
echo "$ac_t""$CPP" 1>&6

echo $ac_n "checking how to run the C++ preprocessor""... $ac_c" 1>&6
echo "configure:3862: checking how to run the C++ preprocessor" >&5
if test -z "$CXXCPP"; then
if eval "test \"`echo '$''{'ac_cv_prog_CXXCPP'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross
  CXXCPP="${CXX-g++} -E"
  cat > conftest.$ac_ext <<EOF
#line 3875 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:3880: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  :
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  CXXCPP=/lib/cpp
fi
rm -f conftest*
  ac_cv_prog_CXXCPP="$CXXCPP"
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross
fi
fi
CXXCPP="$ac_cv_prog_CXXCPP"
echo "$ac_t""$CXXCPP" 1>&6


   # Extract the first word of "rustc", so it can be a program name with args.
set dummy rustc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:3908: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_RUSTC'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$RUSTC" in
  /*)
  ac_cv_path_RUSTC="$RUSTC" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_RUSTC="$RUSTC" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_RUSTC="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
RUSTC="$ac_cv_path_RUSTC"
if test -n "$RUSTC"; then
  echo "$ac_t""$RUSTC" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$RUSTC" in
    /*)
      tmp_DIRNAME=`dirname "$RUSTC"`
      tmp_BASENAME=`basename "$RUSTC"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      RUSTC="$tmp_PWD/$tmp_BASENAME"
      if test -e "$RUSTC.exe"; then
        RUSTC="$RUSTC.exe"
      fi
    esac
  fi

  if test -n "$RUSTC"; then
    echo $ac_n "checking rustc version""... $ac_c" 1>&6
echo "configure:3955: checking rustc version" >&5
    RUSTC_VERSION=`$RUSTC --version | cut -d ' ' -f 2`
    # Parse out semversion elements.
    _RUSTC_MAJOR_VERSION=`echo ${RUSTC_VERSION} | cut -d . -f 1`
    _RUSTC_MINOR_VERSION=`echo ${RUSTC_VERSION} | cut -d . -f 2`
    _RUSTC_EXTRA_VERSION=`echo ${RUSTC_VERSION} | cut -d . -f 3 | cut -d + -f 1`
    _RUSTC_PATCH_VERSION=`echo ${_RUSTC_EXTRA_VERSION} | cut -d '-' -f 1`
    echo "$ac_t""$RUSTC_VERSION (v${_RUSTC_MAJOR_VERSION}.${_RUSTC_MINOR_VERSION}.${_RUSTC_PATCH_VERSION})" 1>&6
  fi
  # Check whether --enable-rust or --disable-rust was given.
if test "${enable_rust+set}" = set; then
  enableval="$enable_rust"
  if test "$enableval" = "yes"; then
    MOZ_RUST=1
  elif test "$enableval" = "no"; then
    MOZ_RUST= 
  else
    { echo "configure: error: Option, rust, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, rust, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

  if test -z "$RUSTC" -a -n "$MOZ_RUST"; then
    { echo "configure: error: Rust compiler not found.
      To compile rust language sources, you must have 'rustc' in your path.
      See http://www.rust-lang.org/ for more information." 1>&2; echo "configure: error: Rust compiler not found.
      To compile rust language sources, you must have 'rustc' in your path.
      See http://www.rust-lang.org/ for more information." 1>&5; exit 1; }
  fi
  if test -n "$MOZ_RUST" && test -z "$_RUSTC_MAJOR_VERSION" -o \
    "$_RUSTC_MAJOR_VERSION" -lt 1 -o \
    \( "$_RUSTC_MAJOR_VERSION" -eq 1 -a "$_RUSTC_MINOR_VERSION" -lt 4 \); then
    { echo "configure: error: Rust compiler ${RUSTC_VERSION} is too old.
      To compile Rust language sources please install at least
      version 1.4 of the 'rustc' toolchain and make sure it is
      first in your path.
      You can verify this by typing 'rustc --version'." 1>&2; echo "configure: error: Rust compiler ${RUSTC_VERSION} is too old.
      To compile Rust language sources please install at least
      version 1.4 of the 'rustc' toolchain and make sure it is
      first in your path.
      You can verify this by typing 'rustc --version'." 1>&5; exit 1; }
  fi
  



# Target the Windows 8.1 SDK by default
WINSDK_TARGETVER=603
WINVER=502

# Check whether --with-windows-version or --without-windows-version was given.
if test "${with_windows_version+set}" = set; then
  withval="$with_windows_version"
  WINSDK_TARGETVER=$withval
fi


# Currently only version 603 is allowed
case "$WINSDK_TARGETVER" in
603)
    MOZ_WINSDK_TARGETVER=0${WINSDK_TARGETVER}0000
    ;;

*)
    { echo "configure: error: Invalid value for --with-windows-version ($WINSDK_TARGETVER)" 1>&2; echo "configure: error: Invalid value for --with-windows-version ($WINSDK_TARGETVER)" 1>&5; exit 1; };
    ;;
esac

case "$target" in
*-mingw*)
    if test "$GCC" != "yes"; then
        # Check to see if we are really running in a msvc environemnt
        _WIN32_MSVC=1

        # Make sure compilers are valid
        CFLAGS="$CFLAGS -TC -nologo"
        CXXFLAGS="$CXXFLAGS -TP -nologo"
        # MSVC warning C4345 warns of newly conformant behavior as of VS2003.
        # MSVC warning C4351 warns of newly conformant behavior as of VS2005.
        # MSVC warning C4800 warns when a value is implicitly cast to bool,
        # because this also forces narrowing to a single byte, which can be a
        # perf hit.  But this matters so little in practice (and often we want
        # that behavior) that it's better to turn it off.
        # _CRT_SECURE_NO_WARNINGS disables warnings about using MSVC-specific
        # secure CRT functions.
        # MSVC warning C4819 warns some UTF-8 characters (e.g. copyright sign)
        # on non-Western system locales even if it is in a comment.
        CFLAGS="$CFLAGS -wd4819"
        CXXFLAGS="$CXXFLAGS -wd4345 -wd4351 -wd4800 -wd4819 -D_CRT_SECURE_NO_WARNINGS"
        
        ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        cat > conftest.$ac_ext <<EOF
#line 4052 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
 printf("Hello World\n"); 
; return 0; }
EOF
if { (eval echo configure:4059: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: \$(CC) test failed.  You must have MS VC++ in your path to build." 1>&2; echo "configure: error: \$(CC) test failed.  You must have MS VC++ in your path to build." 1>&5; exit 1; } 
fi
rm -f conftest*

        ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

        cat > conftest.$ac_ext <<EOF
#line 4077 "configure"
#include "confdefs.h"
#include <new.h>
int main() {
 unsigned *test = new unsigned(42); 
; return 0; }
EOF
if { (eval echo configure:4084: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: \$(CXX) test failed.  You must have MS VC++ in your path to build." 1>&2; echo "configure: error: \$(CXX) test failed.  You must have MS VC++ in your path to build." 1>&5; exit 1; } 
fi
rm -f conftest*
        ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross


        
        _MSVC_VER_FILTER='s|.*[^!-~]([0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?).*|\1|p'
        

        # Determine compiler version
        _CC_MAJOR_VERSION=`echo ${CC_VERSION} | cut -c 1-2`
        _CC_MINOR_VERSION=`echo ${CC_VERSION} | cut -c 3-4`
        _MSC_VER=${CC_VERSION}

        _CXX_MAJOR_VERSION=`echo ${CXX_VERSION} | cut -c 1-2`

        if test "$_CC_MAJOR_VERSION" != "$_CXX_MAJOR_VERSION"; then
            { echo "configure: error: The major versions of \$CC and \$CXX do not match." 1>&2; echo "configure: error: The major versions of \$CC and \$CXX do not match." 1>&5; exit 1; }
        fi

        cat >> confdefs.pytmp <<\EOF
    (''' _CRT_SECURE_NO_WARNINGS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _CRT_SECURE_NO_WARNINGS 1
EOF

        cat >> confdefs.pytmp <<\EOF
    (''' _CRT_NONSTDC_NO_WARNINGS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _CRT_NONSTDC_NO_WARNINGS 1
EOF

        cat >> confdefs.pytmp <<\EOF
    (''' _USE_MATH_DEFINES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _USE_MATH_DEFINES 1
EOF
 # Otherwise MSVC's math.h doesn't #define M_PI.

        if test "$_CC_MAJOR_VERSION" = "18"; then
            _CC_SUITE=12
            MSVC_C_RUNTIME_DLL=msvcr120.dll
            MSVC_CXX_RUNTIME_DLL=msvcp120.dll
        elif test "$_CC_MAJOR_VERSION" = "19"; then
            _CC_SUITE=14
            MSVC_C_RUNTIME_DLL=vcruntime140.dll
            MSVC_CXX_RUNTIME_DLL=msvcp140.dll
            MSVC_APPCRT_DLL=appcrt140.dll
            MSVC_DESKTOPCRT_DLL=desktopcrt140.dll

            # -Wv:18 disables all warnings introduced after VS2013
            # See http://blogs.msdn.com/b/vcblog/archive/2014/11/12/improvements-to-warnings-in-the-c-compiler.aspx
            CFLAGS="$CFLAGS -Wv:18"
            CXXFLAGS="$CXXFLAGS -Wv:18"

            # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
            CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"
        else
            { echo "configure: error: This version ($CC_VERSION) of the MSVC compiler is unsupported. See https://developer.mozilla.org/en/Windows_Build_Prerequisites." 1>&2; echo "configure: error: This version ($CC_VERSION) of the MSVC compiler is unsupported. See https://developer.mozilla.org/en/Windows_Build_Prerequisites." 1>&5; exit 1; }
        fi
        
        
        
        

                        MSMT_TOOL=`${MT-mt} 2>&1|grep 'Microsoft (R) Manifest Tool'`
        if test -z "$MSMT_TOOL"; then
          { echo "configure: error: Microsoft (R) Manifest Tool must be in your \$PATH." 1>&2; echo "configure: error: Microsoft (R) Manifest Tool must be in your \$PATH." 1>&5; exit 1; }
        fi

        
        _MSMT_VER_FILTER='s|.*[^!-~]\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*|\1|p'
        
        MSMANIFEST_TOOL_VERSION=`echo ${MSMT_TOOL}|sed -ne "$_MSMT_VER_FILTER"`
        if test -z "$MSMANIFEST_TOOL_VERSION"; then
          echo "configure: warning: Unknown version of the Microsoft (R) Manifest Tool." 1>&2
        fi

        MSMANIFEST_TOOL=1
        unset MSMT_TOOL

        # Check linker version
        _LD_FULL_VERSION=`"${LD}" -v 2>&1 | sed -nre "$_MSVC_VER_FILTER"`
        _LD_MAJOR_VERSION=`echo ${_LD_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
        if test "$_LD_MAJOR_VERSION" != "$_CC_SUITE"; then
            { echo "configure: error: The linker major version, $_LD_FULL_VERSION,  does not match the compiler suite version, $_CC_SUITE." 1>&2; echo "configure: error: The linker major version, $_LD_FULL_VERSION,  does not match the compiler suite version, $_CC_SUITE." 1>&5; exit 1; }
        fi

        INCREMENTAL_LINKER=1

        unset _MSVC_VER_FILTER

        CFLAGS="$CFLAGS -D_HAS_EXCEPTIONS=0"
        CXXFLAGS="$CXXFLAGS -D_HAS_EXCEPTIONS=0"
    else
        # Check w32api version
        _W32API_MAJOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $1 }'`
        _W32API_MINOR_VERSION=`echo $W32API_VERSION | $AWK -F\. '{ print $2 }'`
        echo $ac_n "checking for w32api version >= $W32API_VERSION""... $ac_c" 1>&6
echo "configure:4198: checking for w32api version >= $W32API_VERSION" >&5
        cat > conftest.$ac_ext <<EOF
#line 4200 "configure"
#include "confdefs.h"
#include <w32api.h>
int main() {
#if (__W32API_MAJOR_VERSION < $_W32API_MAJOR_VERSION) || \
                (__W32API_MAJOR_VERSION == $_W32API_MAJOR_VERSION && \
                 __W32API_MINOR_VERSION < $_W32API_MINOR_VERSION)
                #error "test failed."
            #endif
            
; return 0; }
EOF
if { (eval echo configure:4212: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
   res=yes 
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
   res=no 
fi
rm -f conftest*
        echo "$ac_t""$res" 1>&6
        if test "$res" != "yes"; then
            { echo "configure: error: w32api version $W32API_VERSION or higher required." 1>&2; echo "configure: error: w32api version $W32API_VERSION or higher required." 1>&5; exit 1; }
        fi
        # Check windres version
        echo $ac_n "checking for windres version >= $WINDRES_VERSION""... $ac_c" 1>&6
echo "configure:4228: checking for windres version >= $WINDRES_VERSION" >&5
        _WINDRES_VERSION=`${WINDRES} --version 2>&1 | grep -i windres 2>/dev/null | $AWK '{ print $3 }'`
        echo "$ac_t""$_WINDRES_VERSION" 1>&6
        _WINDRES_MAJOR_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $1 }'`
        _WINDRES_MINOR_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $2 }'`
        _WINDRES_RELEASE_VERSION=`echo $_WINDRES_VERSION | $AWK -F\. '{ print $3 }'`
        WINDRES_MAJOR_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $1 }'`
        WINDRES_MINOR_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $2 }'`
        WINDRES_RELEASE_VERSION=`echo $WINDRES_VERSION | $AWK -F\. '{ print $3 }'`
        if test "$_WINDRES_MAJOR_VERSION" -lt "$WINDRES_MAJOR_VERSION" -o \
                "$_WINDRES_MAJOR_VERSION" -eq "$WINDRES_MAJOR_VERSION" -a \
                "$_WINDRES_MINOR_VERSION" -lt "$WINDRES_MINOR_VERSION" -o \
                "$_WINDRES_MAJOR_VERSION" -eq "$WINDRES_MAJOR_VERSION" -a \
                "$_WINDRES_MINOR_VERSION" -eq "$WINDRES_MINOR_VERSION" -a \
                "$_WINDRES_RELEASE_VERSION" -lt "$WINDRES_RELEASE_VERSION"
        then
            { echo "configure: error: windres version $WINDRES_VERSION or higher is required to build." 1>&2; echo "configure: error: windres version $WINDRES_VERSION or higher is required to build." 1>&5; exit 1; }
        fi
    fi # !GNU_CC

    
  echo $ac_n "checking for highest Windows version supported by this SDK""... $ac_c" 1>&6
echo "configure:4250: checking for highest Windows version supported by this SDK" >&5
if eval "test \"`echo '$''{'ac_cv_winsdk_maxver'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.h <<EOF
#include <winsdkver.h>

WINVER_MAXVER
EOF
                      ac_cv_winsdk_maxver=`$CPP conftest.h 2>/dev/null | tail -n1`
                      rm -f conftest.h
                     
fi

echo "$ac_t""$ac_cv_winsdk_maxver" 1>&6
                  MOZ_WINSDK_MAXVER=${ac_cv_winsdk_maxver}0000

    cat >> confdefs.pytmp <<EOF
    (''' WINVER ''', r''' 0x$WINVER ''')
EOF
cat >> confdefs.h <<EOF
#define WINVER 0x$WINVER
EOF

    cat >> confdefs.pytmp <<EOF
    (''' _WIN32_WINNT ''', r''' 0x$WINVER ''')
EOF
cat >> confdefs.h <<EOF
#define _WIN32_WINNT 0x$WINVER
EOF

    # Require OS features provided by IE 6.0 SP2 (XP SP2)
    cat >> confdefs.pytmp <<EOF
    (''' _WIN32_IE ''', r''' 0x0603 ''')
EOF
cat >> confdefs.h <<EOF
#define _WIN32_IE 0x0603
EOF


    # If the maximum version supported by this SDK is lower than the target
    # version, error out
    echo $ac_n "checking for Windows SDK being recent enough""... $ac_c" 1>&6
echo "configure:4293: checking for Windows SDK being recent enough" >&5
    if $PERL -e "exit(0x$MOZ_WINSDK_TARGETVER > $MOZ_WINSDK_MAXVER)"; then
        echo "$ac_t"""yes"" 1>&6
    else
        echo "$ac_t"""no"" 1>&6
        { echo "configure: error: You are targeting Windows version 0x$MOZ_WINSDK_TARGETVER, but your SDK only supports up to version $MOZ_WINSDK_MAXVER. Install and use an updated SDK, or target a lower version using --with-windows-version. Alternatively, try running the Windows SDK Configuration Tool and selecting a newer SDK. See https://developer.mozilla.org/En/Windows_SDK_versions for more details on fixing this." 1>&2; echo "configure: error: You are targeting Windows version 0x$MOZ_WINSDK_TARGETVER, but your SDK only supports up to version $MOZ_WINSDK_MAXVER. Install and use an updated SDK, or target a lower version using --with-windows-version. Alternatively, try running the Windows SDK Configuration Tool and selecting a newer SDK. See https://developer.mozilla.org/En/Windows_SDK_versions for more details on fixing this." 1>&5; exit 1; }
    fi

    cat >> confdefs.pytmp <<EOF
    (''' MOZ_WINSDK_TARGETVER ''', r''' 0x$MOZ_WINSDK_TARGETVER ''')
EOF
cat >> confdefs.h <<EOF
#define MOZ_WINSDK_TARGETVER 0x$MOZ_WINSDK_TARGETVER
EOF

    ;;
esac

if test -n "$_WIN32_MSVC"; then
    SKIP_PATH_CHECKS=1
    SKIP_COMPILER_CHECKS=1
    SKIP_LIBRARY_CHECKS=1

    # Since we're skipping compiler and library checks, hard-code
    # some facts here.

    # Common to all MSVC environments:

    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_LOCALECONV ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_LOCALECONV 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_HYPOT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_HYPOT 1
EOF

    for ac_func in _getc_nolock
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:4338: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 4343 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:4370: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

fi

fi # COMPILE_ENVIRONMENT

# Check to see if we are running in a broken QEMU scratchbox.
# We know that anything below 1.0.16 is broken.
for ac_prog in sb-conf ve
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4408: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_SBCONF'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$SBCONF"; then
  ac_cv_prog_SBCONF="$SBCONF" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_SBCONF="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
SBCONF="$ac_cv_prog_SBCONF"
if test -n "$SBCONF"; then
  echo "$ac_t""$SBCONF" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$SBCONF" && break
done
test -n "$SBCONF" || SBCONF=""""

if test -n "$SBCONF"; then
    _sb_version=`$SBCONF ve`
    _sb_version_major=`echo $_sb_version | cut -f1 -d.`
    _sb_version_minor=`echo $_sb_version | cut -f2 -d.`
    _sb_version_point=`echo $_sb_version | cut -f3 -d.`
    if test $_sb_version_major -eq 1 -a $_sb_version_minor -eq 0 -a $_sb_version_point -le 16; then
        QEMU_CANT_RUN_JS_SHELL=1
    fi
fi











# Find a good install program.  We prefer a C program (faster),
# so one script is as good as another.  But avoid the broken or
# incompatible versions:
# SysV /etc/install, /usr/sbin/install
# SunOS /usr/etc/install
# IRIX /sbin/install
# AIX /bin/install
# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
# AFS /usr/afsws/bin/install, which mishandles nonexistent args
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
# ./install, which can be erroneously created by make from ./install.sh.
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
echo "configure:4470: checking for a BSD compatible install" >&5
if test -z "$INSTALL"; then
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    IFS="${IFS= 	}"; ac_save_IFS="$IFS"; IFS=":"
  for ac_dir in $PATH; do
    # Account for people who put trailing slashes in PATH elements.
    case "$ac_dir/" in
    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
    *)
      # OSF1 and SCO ODT 3.0 have their own names for install.
      # Don't use installbsd from OSF since it installs stuff as root
      # by default.
      for ac_prog in ginstall scoinst install; do
        if test -f $ac_dir/$ac_prog; then
	  if test $ac_prog = install &&
            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
	    # AIX install.  It has an incompatible calling convention.
	    :
	  else
	    ac_cv_path_install="$ac_dir/$ac_prog -c"
	    break 2
	  fi
	fi
      done
      ;;
    esac
  done
  IFS="$ac_save_IFS"

fi
  if test "${ac_cv_path_install+set}" = set; then
    INSTALL="$ac_cv_path_install"
  else
    # As a last resort, use the slow shell script.  We don't cache a
    # path for INSTALL within a source directory, because that will
    # break other packages using the cache if that directory is
    # removed, or if the path is relative.
    INSTALL="$ac_install_sh"
  fi
fi
echo "$ac_t""$INSTALL" 1>&6

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

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

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

echo $ac_n "checking whether ln -s works""... $ac_c" 1>&6
echo "configure:4523: checking whether ln -s works" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LN_S'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  rm -f conftestdata
if ln -s X conftestdata 2>/dev/null
then
  rm -f conftestdata
  ac_cv_prog_LN_S="ln -s"
else
  ac_cv_prog_LN_S=ln
fi
fi
LN_S="$ac_cv_prog_LN_S"
if test "$ac_cv_prog_LN_S" = "ln -s"; then
  echo "$ac_t""yes" 1>&6
else
  echo "$ac_t""no" 1>&6
fi


echo $ac_n "checking for tar archiver""... $ac_c" 1>&6
echo "configure:4545: checking for tar archiver" >&5
for ac_prog in gnutar gtar tar
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4551: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_TAR'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test -n "$TAR"; then
  ac_cv_prog_TAR="$TAR" # Let the user override the test.
else
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_prog_TAR="$ac_prog"
      break
    fi
  done
  IFS="$ac_save_ifs"
fi
fi
TAR="$ac_cv_prog_TAR"
if test -n "$TAR"; then
  echo "$ac_t""$TAR" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$TAR" && break
done
test -n "$TAR" || TAR=""""

if test -z "$TAR"; then
    echo "configure: warning: no tar archiver found in \$PATH" 1>&2
fi
echo "$ac_t""$TAR" 1>&6


echo $ac_n "checking for minimum required perl version >= $PERL_VERSION""... $ac_c" 1>&6
echo "configure:4588: checking for minimum required perl version >= $PERL_VERSION" >&5
_perl_version=`PERL_VERSION=$PERL_VERSION $PERL -e 'print "$]"; if ($] >= $ENV{PERL_VERSION}) { exit(0); } else { exit(1); }' 2>&5`
_perl_res=$?
echo "$ac_t""$_perl_version" 1>&6

if test "$_perl_res" != 0; then
    { echo "configure: error: Perl $PERL_VERSION or higher is required." 1>&2; echo "configure: error: Perl $PERL_VERSION or higher is required." 1>&5; exit 1; }
fi

echo $ac_n "checking for full perl installation""... $ac_c" 1>&6
echo "configure:4598: checking for full perl installation" >&5
_perl_archlib=`$PERL -e 'use Config; if ( -d $Config{archlib} ) { exit(0); } else { exit(1); }' 2>&5`
_perl_res=$?
if test "$_perl_res" != 0; then
    echo "$ac_t""no" 1>&6
    { echo "configure: error: Cannot find Config.pm or \$Config{archlib}.  A full perl installation is required." 1>&2; echo "configure: error: Cannot find Config.pm or \$Config{archlib}.  A full perl installation is required." 1>&5; exit 1; }
else
    echo "$ac_t""yes" 1>&6
fi



if test -z "$PYTHON"; then
    for ac_prog in $PYTHON python2.7 python
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4616: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PYTHON'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$PYTHON" in
  /*)
  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_PYTHON="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
PYTHON="$ac_cv_path_PYTHON"
if test -n "$PYTHON"; then
  echo "$ac_t""$PYTHON" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$PYTHON" && break
done

  if test "$msyshost"; then
    case "$PYTHON" in
    /*)
      tmp_DIRNAME=`dirname "$PYTHON"`
      tmp_BASENAME=`basename "$PYTHON"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      PYTHON="$tmp_PWD/$tmp_BASENAME"
      if test -e "$PYTHON.exe"; then
        PYTHON="$PYTHON.exe"
      fi
    esac
  fi

  if test -z "$PYTHON"; then
      { echo "configure: error: python was not found in \$PATH" 1>&2; echo "configure: error: python was not found in \$PATH" 1>&5; exit 1; }
  fi
else
  echo "$ac_t""Using Python from environment variable \$PYTHON" 1>&6
fi

_virtualenv_topsrcdir=
_virtualenv_populate_path=

for base in $MOZILLA_CENTRAL_PATH $_topsrcdir $_topsrcdir/../..; do
  possible=$base/python/mozbuild/mozbuild/virtualenv.py

  if test -e $possible; then
    _virtualenv_topsrcdir=$base
    _virtualenv_populate_path=$possible
    break
  fi
done

if test -z $_virtualenv_populate_path; then
    { echo "configure: error: Unable to find Virtualenv population script. In order
to build, you will need mozilla-central's virtualenv.

If you are building from a mozilla-central checkout, you should never see this
message. If you are building from a source archive, the source archive was
likely not created properly (it is missing the virtualenv files).

If you have a copy of mozilla-central available, define the
MOZILLA_CENTRAL_PATH environment variable to the top source directory of
mozilla-central and relaunch configure." 1>&2; echo "configure: error: Unable to find Virtualenv population script. In order
to build, you will need mozilla-central's virtualenv.

If you are building from a mozilla-central checkout, you should never see this
message. If you are building from a source archive, the source archive was
likely not created properly (it is missing the virtualenv files).

If you have a copy of mozilla-central available, define the
MOZILLA_CENTRAL_PATH environment variable to the top source directory of
mozilla-central and relaunch configure." 1>&5; exit 1; }

fi

if test -z $DONT_POPULATE_VIRTUALENV; then
  echo "$ac_t""Creating Python environment" 1>&6
        $PYTHON $_virtualenv_populate_path \
    $_virtualenv_topsrcdir $MOZ_BUILD_ROOT $MOZ_BUILD_ROOT/_virtualenv \
    $_virtualenv_topsrcdir/build/virtualenv_packages.txt || exit 1

  case "$host_os" in
  mingw*)
    PYTHON=`cd $MOZ_BUILD_ROOT && pwd -W`/_virtualenv/Scripts/python.exe
    ;;
  *)
    PYTHON=$MOZ_BUILD_ROOT/_virtualenv/bin/python
    ;;
  esac
fi



echo $ac_n "checking Python environment is Mozilla virtualenv""... $ac_c" 1>&6
echo "configure:4726: checking Python environment is Mozilla virtualenv" >&5
$PYTHON -c "import mozbuild.base"
if test "$?" != 0; then
    { echo "configure: error: Python environment does not appear to be sane." 1>&2; echo "configure: error: Python environment does not appear to be sane." 1>&5; exit 1; }
fi
echo "$ac_t""yes" 1>&6

PYTHON_SITE_PACKAGES=`$PYTHON -c "import distutils.sysconfig; print distutils.sysconfig.get_python_lib()"`
if test -z "$PYTHON_SITE_PACKAGES"; then
    { echo "configure: error: Could not determine python site packages directory." 1>&2; echo "configure: error: Could not determine python site packages directory." 1>&5; exit 1; }
fi




if test -z "$COMPILE_ENVIRONMENT"; then
    NSINSTALL_BIN='$(PYTHON) $(topsrcdir)/config/nsinstall.py'
fi


 # Extract the first word of "doxygen", so it can be a program name with args.
set dummy doxygen; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4749: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_DOXYGEN'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$DOXYGEN" in
  /*)
  ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_DOXYGEN="$DOXYGEN" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_DOXYGEN="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_DOXYGEN" && ac_cv_path_DOXYGEN=":"
  ;;
esac
fi
DOXYGEN="$ac_cv_path_DOXYGEN"
if test -n "$DOXYGEN"; then
  echo "$ac_t""$DOXYGEN" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$DOXYGEN" in
    /*)
      tmp_DIRNAME=`dirname "$DOXYGEN"`
      tmp_BASENAME=`basename "$DOXYGEN"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      DOXYGEN="$tmp_PWD/$tmp_BASENAME"
      if test -e "$DOXYGEN.exe"; then
        DOXYGEN="$DOXYGEN.exe"
      fi
    esac
  fi

 # Extract the first word of "autoconf", so it can be a program name with args.
set dummy autoconf; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4798: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_AUTOCONF'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$AUTOCONF" in
  /*)
  ac_cv_path_AUTOCONF="$AUTOCONF" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_AUTOCONF="$AUTOCONF" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_AUTOCONF="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_AUTOCONF" && ac_cv_path_AUTOCONF=":"
  ;;
esac
fi
AUTOCONF="$ac_cv_path_AUTOCONF"
if test -n "$AUTOCONF"; then
  echo "$ac_t""$AUTOCONF" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$AUTOCONF" in
    /*)
      tmp_DIRNAME=`dirname "$AUTOCONF"`
      tmp_BASENAME=`basename "$AUTOCONF"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      AUTOCONF="$tmp_PWD/$tmp_BASENAME"
      if test -e "$AUTOCONF.exe"; then
        AUTOCONF="$AUTOCONF.exe"
      fi
    esac
  fi

 # Extract the first word of "xargs", so it can be a program name with args.
set dummy xargs; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:4847: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_XARGS'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$XARGS" in
  /*)
  ac_cv_path_XARGS="$XARGS" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_XARGS="$XARGS" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_XARGS="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
XARGS="$ac_cv_path_XARGS"
if test -n "$XARGS"; then
  echo "$ac_t""$XARGS" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$XARGS" in
    /*)
      tmp_DIRNAME=`dirname "$XARGS"`
      tmp_BASENAME=`basename "$XARGS"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      XARGS="$tmp_PWD/$tmp_BASENAME"
      if test -e "$XARGS.exe"; then
        XARGS="$XARGS.exe"
      fi
    esac
  fi

if test -z "$XARGS" -o "$XARGS" = ":"; then
    { echo "configure: error: xargs not found in \$PATH ." 1>&2; echo "configure: error: xargs not found in \$PATH ." 1>&5; exit 1; }
fi

if test "$COMPILE_ENVIRONMENT"; then






# Check whether --enable-macos-target or --disable-macos-target was given.
if test "${enable_macos_target+set}" = set; then
  enableval="$enable_macos_target"
  _MACOSX_DEPLOYMENT_TARGET=$enableval
fi


if test "$target_cpu" != "arm"; then
case "$target" in
*-darwin*)
    if test -n "$_MACOSX_DEPLOYMENT_TARGET" ; then
                export MACOSX_DEPLOYMENT_TARGET=$_MACOSX_DEPLOYMENT_TARGET
    else
                        export MACOSX_DEPLOYMENT_TARGET=10.6
    fi
    ;;
esac
fi



MACOS_SDK_DIR=
# Check whether --with-macos-sdk or --without-macos-sdk was given.
if test "${with_macos_sdk+set}" = set; then
  withval="$with_macos_sdk"
  MACOS_SDK_DIR=$withval
fi




if test "$MACOS_SDK_DIR"; then
      
  if test ! -d "$MACOS_SDK_DIR"; then
    { echo "configure: error: SDK not found.  When using --with-macos-sdk, you must
specify a valid SDK.  SDKs are installed when the optional cross-development
tools are selected during the Xcode/Developer Tools installation." 1>&2; echo "configure: error: SDK not found.  When using --with-macos-sdk, you must
specify a valid SDK.  SDKs are installed when the optional cross-development
tools are selected during the Xcode/Developer Tools installation." 1>&5; exit 1; }
  fi

  CFLAGS="$CFLAGS -isysroot ${MACOS_SDK_DIR}"
  CXXFLAGS="$CXXFLAGS -isysroot ${MACOS_SDK_DIR}"

    CPP="$CPP -isysroot ${MACOS_SDK_DIR}"
  CXXCPP="$CXXCPP -isysroot ${MACOS_SDK_DIR}"

  
  echo $ac_n "checking for valid compiler/Mac OS X SDK combination""... $ac_c" 1>&6
echo "configure:4952: checking for valid compiler/Mac OS X SDK combination" >&5
  ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

  cat > conftest.$ac_ext <<EOF
#line 4961 "configure"
#include "confdefs.h"
#include <new>
                 int main() { return 0; }
int main() {
result=yes
; return 0; }
EOF
if { (eval echo configure:4969: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  result=no
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
  ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

  echo "$ac_t""$result" 1>&6

  if test "$result" = "no" ; then
    { echo "configure: error: The selected compiler and Mac OS X SDK are incompatible." 1>&2; echo "configure: error: The selected compiler and Mac OS X SDK are incompatible." 1>&5; exit 1; }
  fi
fi

fi # COMPILE_ENVIRONMENT

if test -n "$MAKE"; then
  if test `echo $MAKE | grep -c make.py` != 1; then
     NOT_PYMAKE=$MAKE
  fi
fi

case "$host_os" in
mingw*)
      for ac_prog in $GMAKE $NOT_PYMAKE make gmake
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:5006: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_GMAKE'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$GMAKE" in
  /*)
  ac_cv_path_GMAKE="$GMAKE" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_GMAKE="$GMAKE" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_GMAKE="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
GMAKE="$ac_cv_path_GMAKE"
if test -n "$GMAKE"; then
  echo "$ac_t""$GMAKE" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$GMAKE" && break
done
test -n "$GMAKE" || GMAKE=":"

  if test "$msyshost"; then
    case "$GMAKE" in
    /*)
      tmp_DIRNAME=`dirname "$GMAKE"`
      tmp_BASENAME=`basename "$GMAKE"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      GMAKE="$tmp_PWD/$tmp_BASENAME"
      if test -e "$GMAKE.exe"; then
        GMAKE="$GMAKE.exe"
      fi
    esac
  fi

    ;;
*)
      for ac_prog in $GMAKE $NOT_PYMAKE gmake make
do
# Extract the first word of "$ac_prog", so it can be a program name with args.
set dummy $ac_prog; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:5062: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_GMAKE'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$GMAKE" in
  /*)
  ac_cv_path_GMAKE="$GMAKE" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_GMAKE="$GMAKE" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_GMAKE="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
GMAKE="$ac_cv_path_GMAKE"
if test -n "$GMAKE"; then
  echo "$ac_t""$GMAKE" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

test -n "$GMAKE" && break
done
test -n "$GMAKE" || GMAKE=":"

  if test "$msyshost"; then
    case "$GMAKE" in
    /*)
      tmp_DIRNAME=`dirname "$GMAKE"`
      tmp_BASENAME=`basename "$GMAKE"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      GMAKE="$tmp_PWD/$tmp_BASENAME"
      if test -e "$GMAKE.exe"; then
        GMAKE="$GMAKE.exe"
      fi
    esac
  fi

    ;;
esac
if test "$GMAKE" = ":"; then
   { echo "configure: error: GNU make not found" 1>&2; echo "configure: error: GNU make not found" 1>&5; exit 1; }
fi

# MAKE will be set by client.mk, but still need this for standalone js builds
if test -z "$MAKE"; then
  MAKE=$GMAKE
fi

if test "$COMPILE_ENVIRONMENT"; then

# If we find X, set shell vars x_includes and x_libraries to the
# paths, otherwise set no_x=yes.
# Uses ac_ vars as temps to allow command line to override cache and checks.
# --without-x overrides everything else, but does not touch the cache.
echo $ac_n "checking for X""... $ac_c" 1>&6
echo "configure:5129: checking for X" >&5

# Check whether --with-x or --without-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
  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
    # Both variables are already set.
    have_x=yes
  else
if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&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 -fr conftestdir
if mkdir conftestdir; then
  cd conftestdir
  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
  cat > Imakefile <<'EOF'
acfindx:
	@echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
EOF
  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
    for ac_extension in a so sl; 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) ;;
	*) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;;
    esac
    case "$ac_im_usrlibdir" in
	/usr/lib | /lib) ;;
	*) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;;
    esac
  fi
  cd ..
  rm -fr conftestdir
fi

if test "$ac_x_includes" = NO; then
  # Guess where to find include files, by looking for this one X11 .h file.
  test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h

  # First, try using that file with no special directory specified.
cat > conftest.$ac_ext <<EOF
#line 5191 "configure"
#include "confdefs.h"
#include <$x_direct_test_include>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:5196: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  # We can compile using X headers with no special include directory.
ac_x_includes=
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  # Look for the header file in a standard set of common directories.
# Check X11 before X11Rn because it is often a symlink to the current release.
  for ac_dir in               \
    /usr/X11/include          \
    /usr/X11R6/include        \
    /usr/X11R5/include        \
    /usr/X11R4/include        \
                              \
    /usr/include/X11          \
    /usr/include/X11R6        \
    /usr/include/X11R5        \
    /usr/include/X11R4        \
                              \
    /usr/local/X11/include    \
    /usr/local/X11R6/include  \
    /usr/local/X11R5/include  \
    /usr/local/X11R4/include  \
                              \
    /usr/local/include/X11    \
    /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 \
    ; \
  do
    if test -r "$ac_dir/$x_direct_test_include"; then
      ac_x_includes=$ac_dir
      break
    fi
  done
fi
rm -f conftest*
fi # $ac_x_includes = NO

if test "$ac_x_libraries" = NO; then
  # Check for the libraries.

  test -z "$x_direct_test_library" && x_direct_test_library=Xt
  test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc

  # See if we find them without any special options.
  # Don't add to $LIBS permanently.
  ac_save_LIBS="$LIBS"
  LIBS="-l$x_direct_test_library $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5265 "configure"
#include "confdefs.h"

int main() {
${x_direct_test_function}()
; return 0; }
EOF
if { (eval echo configure:5272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  LIBS="$ac_save_LIBS"
# We can link X programs with no special library path.
ac_x_libraries=
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  LIBS="$ac_save_LIBS"
# First see if replacing the include by lib works.
# Check X11 before X11Rn because it is often a symlink to the current release.
for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
    /usr/X11/lib          \
    /usr/X11R6/lib        \
    /usr/X11R5/lib        \
    /usr/X11R4/lib        \
                          \
    /usr/lib/X11          \
    /usr/lib/X11R6        \
    /usr/lib/X11R5        \
    /usr/lib/X11R4        \
                          \
    /usr/local/X11/lib    \
    /usr/local/X11R6/lib  \
    /usr/local/X11R5/lib  \
    /usr/local/X11R4/lib  \
                          \
    /usr/local/lib/X11    \
    /usr/local/lib/X11R6  \
    /usr/local/lib/X11R5  \
    /usr/local/lib/X11R4  \
                          \
    /usr/X386/lib         \
    /usr/x386/lib         \
    /usr/XFree86/lib/X11  \
                          \
    /usr/lib              \
    /usr/local/lib        \
    /usr/unsupported/lib  \
    /usr/athena/lib       \
    /usr/local/x11r5/lib  \
    /usr/lpp/Xamples/lib  \
    /lib/usr/lib/X11	  \
                          \
    /usr/openwin/lib      \
    /usr/openwin/share/lib \
    ; \
do
  for ac_extension in a so sl; do
    if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
      ac_x_libraries=$ac_dir
      break 2
    fi
  done
done
fi
rm -f conftest*
fi # $ac_x_libraries = NO

if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
  # Didn't find X anywhere.  Cache the known absence of X.
  ac_cv_have_x="have_x=no"
else
  # 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"
fi
fi
  fi
  eval "$ac_cv_have_x"
fi # $with_x != no

if test "$have_x" != yes; then
  echo "$ac_t""$have_x" 1>&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"
  echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
fi

if test "$no_x" = yes; then
  # Not all programs may use this symbol, but it does not hurt to define it.
  cat >> confdefs.pytmp <<\EOF
    (''' X_DISPLAY_MISSING ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define X_DISPLAY_MISSING 1
EOF

  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 . . . .
    case "`(uname -sr) 2>/dev/null`" in
    "SunOS 5"*)
      echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
echo "configure:5381: checking whether -R must be followed by a space" >&5
      ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
      cat > conftest.$ac_ext <<EOF
#line 5384 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:5391: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_R_nospace=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_R_nospace=no
fi
rm -f conftest*
      if test $ac_R_nospace = yes; then
	echo "$ac_t""no" 1>&6
	X_LIBS="$X_LIBS -R$x_libraries"
      else
	LIBS="$ac_xsave_LIBS -R $x_libraries"
	cat > conftest.$ac_ext <<EOF
#line 5407 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:5414: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_R_space=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_R_space=no
fi
rm -f conftest*
	if test $ac_R_space = yes; then
	  echo "$ac_t""yes" 1>&6
	  X_LIBS="$X_LIBS -R $x_libraries"
	else
	  echo "$ac_t""neither works" 1>&6
	fi
      fi
      LIBS="$ac_xsave_LIBS"
    esac
  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@cl.cam.ac.uk says this is needed for Ultrix, if the X
    # libraries were built with DECnet support.  And karl@cs.umb.edu says
    # the Alpha needs dnet_stub (dnet does not exist).
    echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
echo "configure:5446: checking for dnet_ntoa in -ldnet" >&5
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldnet  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5454 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dnet_ntoa();

int main() {
dnet_ntoa()
; return 0; }
EOF
if { (eval echo configure:5465: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
else
  echo "$ac_t""no" 1>&6
fi

    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
      echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
echo "configure:5487: checking for dnet_ntoa in -ldnet_stub" >&5
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldnet_stub  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5495 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dnet_ntoa();

int main() {
dnet_ntoa()
; return 0; }
EOF
if { (eval echo configure:5506: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
else
  echo "$ac_t""no" 1>&6
fi

    fi

    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
    # to get the SysV transport functions.
    # chad@anasazi.com 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 dickey@clark.net.
    echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
echo "configure:5535: checking for gethostbyname" >&5
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5540 "configure"
#define gethostbyname innocuous_gethostbyname
#include "confdefs.h"
#undef gethostbyname
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char gethostbyname(); below.  */
#define gethostbyname innocuous_gethostbyname
#include <assert.h>
#undef gethostbyname
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {

/* 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_gethostbyname) || defined (__stub___gethostbyname)
choke me
#else
gethostbyname();
#endif

; return 0; }
EOF
if { (eval echo configure:5567: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_gethostbyname=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'gethostbyname`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
fi

    if test $ac_cv_func_gethostbyname = no; then
      echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
echo "configure:5588: checking for gethostbyname in -lnsl" >&5
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lnsl  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5596 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname();

int main() {
gethostbyname()
; return 0; }
EOF
if { (eval echo configure:5607: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
else
  echo "$ac_t""no" 1>&6
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@lia.di.epfl.ch: it contains
    # gethostby* variants that don't use the nameserver (or something).
    # -lsocket must be given before -lnsl if both are needed.
    # We assume that if connect needs -lnsl, so does gethostbyname.
    echo $ac_n "checking for connect""... $ac_c" 1>&6
echo "configure:5637: checking for connect" >&5
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5642 "configure"
#define connect innocuous_connect
#include "confdefs.h"
#undef connect
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char connect(); below.  */
#define connect innocuous_connect
#include <assert.h>
#undef connect
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char connect();

int main() {

/* 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_connect) || defined (__stub___connect)
choke me
#else
connect();
#endif

; return 0; }
EOF
if { (eval echo configure:5669: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_connect=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_connect=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'connect`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
fi

    if test $ac_cv_func_connect = no; then
      echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
echo "configure:5690: checking for connect in -lsocket" >&5
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5698 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char connect();

int main() {
connect()
; return 0; }
EOF
if { (eval echo configure:5709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
else
  echo "$ac_t""no" 1>&6
fi

    fi

    # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
    echo $ac_n "checking for remove""... $ac_c" 1>&6
echo "configure:5733: checking for remove" >&5
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5738 "configure"
#define remove innocuous_remove
#include "confdefs.h"
#undef remove
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char remove(); below.  */
#define remove innocuous_remove
#include <assert.h>
#undef remove
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char remove();

int main() {

/* 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_remove) || defined (__stub___remove)
choke me
#else
remove();
#endif

; return 0; }
EOF
if { (eval echo configure:5765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_remove=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_remove=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'remove`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
fi

    if test $ac_cv_func_remove = no; then
      echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
echo "configure:5786: checking for remove in -lposix" >&5
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lposix  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5794 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char remove();

int main() {
remove()
; return 0; }
EOF
if { (eval echo configure:5805: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
else
  echo "$ac_t""no" 1>&6
fi

    fi

    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
    echo $ac_n "checking for shmat""... $ac_c" 1>&6
echo "configure:5829: checking for shmat" >&5
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 5834 "configure"
#define shmat innocuous_shmat
#include "confdefs.h"
#undef shmat
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char shmat(); below.  */
#define shmat innocuous_shmat
#include <assert.h>
#undef shmat
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char shmat();

int main() {

/* 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_shmat) || defined (__stub___shmat)
choke me
#else
shmat();
#endif

; return 0; }
EOF
if { (eval echo configure:5861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func_shmat=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func_shmat=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'shmat`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  :
else
  echo "$ac_t""no" 1>&6
fi

    if test $ac_cv_func_shmat = no; then
      echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
echo "configure:5882: checking for shmat in -lipc" >&5
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lipc  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5890 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char shmat();

int main() {
shmat()
; return 0; }
EOF
if { (eval echo configure:5901: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
else
  echo "$ac_t""no" 1>&6
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.
  #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
  echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
echo "configure:5934: checking for IceConnectionNumber in -lICE" >&5
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lICE $X_EXTRA_LIBS $LIBS"
cat > conftest.$ac_ext <<EOF
#line 5942 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char IceConnectionNumber();

int main() {
IceConnectionNumber()
; return 0; }
EOF
if { (eval echo configure:5953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
else
  echo "$ac_t""no" 1>&6
fi

  LDFLAGS="$ac_save_LDFLAGS"

fi


XCFLAGS="$X_CFLAGS"

fi # COMPILE_ENVIRONMENT

MOZILLA_VERSION=`$PYTHON $srcdir/python/mozbuild/mozbuild/milestone.py --topsrcdir $srcdir`
MOZILLA_UAVERSION=`$PYTHON $srcdir/python/mozbuild/mozbuild/milestone.py --topsrcdir $srcdir --uaversion`
MOZILLA_SYMBOLVERSION=`$PYTHON $srcdir/python/mozbuild/mozbuild/milestone.py --topsrcdir $srcdir --symbolversion`
if test -z "$MOZILLA_VERSION"; then
  { echo "configure: error: failed to read version info from milestone file" 1>&2; echo "configure: error: failed to read version info from milestone file" 1>&5; exit 1; }
fi

cat >> confdefs.pytmp <<EOF
    (''' MOZILLA_VERSION ''', r''' "$MOZILLA_VERSION" ''')
EOF
cat >> confdefs.h <<EOF
#define MOZILLA_VERSION "$MOZILLA_VERSION"
EOF

cat >> confdefs.pytmp <<EOF
    (''' MOZILLA_VERSION_U ''', r''' $MOZILLA_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define MOZILLA_VERSION_U $MOZILLA_VERSION
EOF

cat >> confdefs.pytmp <<EOF
    (''' MOZILLA_UAVERSION ''', r''' "$MOZILLA_UAVERSION" ''')
EOF
cat >> confdefs.h <<EOF
#define MOZILLA_UAVERSION "$MOZILLA_UAVERSION"
EOF



# Separate version into components for use in shared object naming etc

MOZJS_MAJOR_VERSION=`echo $MOZILLA_VERSION | sed "s|\(^[0-9]*\)\.[0-9]*.*|\1|"`
MOZJS_MINOR_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.\([0-9]*\).*|\1|"`
MOZJS_PATCH_VERSION=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9]*[^0-9]*||"`
IS_ALPHA=`echo $MOZILLA_VERSION | grep '[ab]'`

JS_SHELL_NAME=js
JS_CONFIG_NAME=js-config


if test -n "$IS_ALPHA"; then
  
  MOZJS_ALPHA=`echo $MOZILLA_VERSION | sed "s|^[0-9]*\.[0-9\.]*\([^0-9]\).*|\1|"`
  
fi
cat >> confdefs.pytmp <<EOF
    (''' MOZJS_MAJOR_VERSION ''', r''' $MOZJS_MAJOR_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define MOZJS_MAJOR_VERSION $MOZJS_MAJOR_VERSION
EOF

cat >> confdefs.pytmp <<EOF
    (''' MOZJS_MINOR_VERSION ''', r''' $MOZJS_MINOR_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define MOZJS_MINOR_VERSION $MOZJS_MINOR_VERSION
EOF









AS_BIN=$AS
AR_LIST='$(AR) t'
AR_EXTRACT='$(AR) x'
AR_DELETE='$(AR) d'
AS='$(CC)'
AS_DASH_C_FLAG='-c'
DLL_PREFIX=lib
LIB_PREFIX=lib
DLL_SUFFIX=.so
OBJ_SUFFIX=o
LIB_SUFFIX=a
ASM_SUFFIX=s
IMPORT_LIB_SUFFIX=
TARGET_MD_ARCH=unix
DIRENT_INO=d_ino
MOZ_USER_DIR=".mozilla"

MOZ_FIX_LINK_PATHS="-Wl,-rpath-link,${DIST}/bin -Wl,-rpath-link,${prefix}/lib"

USE_DEPENDENT_LIBS=1

_PLATFORM_DEFAULT_TOOLKIT=cairo-gtk2

if test -n "$CROSS_COMPILE"; then
    OS_TARGET="${target_os}"
    OS_ARCH=`echo $target_os | sed -e 's|/|_|g'`
    OS_RELEASE=
    case "${target_os}" in
        linux*)       OS_ARCH=Linux OS_TARGET=Linux ;;
        kfreebsd*-gnu) OS_ARCH=GNU_kFreeBSD OS_TARGET=GNU/kFreeBSD ;;
        gnu*)         OS_ARCH=GNU ;;
        solaris*)     OS_ARCH=SunOS OS_RELEASE=5 ;;
        mingw*)       OS_ARCH=WINNT OS_TARGET=WINNT ;;
        darwin*)      OS_ARCH=Darwin OS_TARGET=Darwin ;;
        dragonfly*)   OS_ARCH=DragonFly OS_TARGET=DragonFly ;;
        freebsd*)     OS_ARCH=FreeBSD OS_TARGET=FreeBSD ;;
        netbsd*)      OS_ARCH=NetBSD OS_TARGET=NetBSD ;;
        openbsd*)     OS_ARCH=OpenBSD OS_TARGET=OpenBSD ;;
    esac
    case "${target}" in
        *-android*|*-linuxandroid*) OS_ARCH=Linux OS_TARGET=Android ;;
    esac
else
    OS_TARGET=`uname -s`
    OS_ARCH=`uname -s | sed -e 's|/|_|g'`
    OS_RELEASE=`uname -r`
fi

# Before this used `uname -m` when not cross compiling
# but that breaks when you have a 64 bit kernel with a 32 bit userland.
OS_TEST="${target_cpu}"

HOST_OS_ARCH=`echo $host_os | sed -e 's|/|_|g'`

#######################################################################
# Master "Core Components" macros for getting the OS target           #
#######################################################################

#
# If OS_TARGET is not specified, it defaults to $(OS_ARCH), i.e., no
# cross-compilation.
#

#
# Define and override various archtecture-specific variables, including
# HOST_OS_ARCH
# OS_ARCH
# OS_TEST
# OS_TARGET
# OS_RELEASE
# OS_MINOR_RELEASE
#

case "$HOST_OS_ARCH" in
mingw*)
    HOST_OS_ARCH=WINNT
    ;;
darwin*)
    HOST_OS_ARCH=Darwin
    ;;
linux*)
    HOST_OS_ARCH=Linux
    ;;
kfreebsd*-gnu)
    HOST_OS_ARCH=GNU_kFreeBSD
    ;;
gnu*)
    HOST_OS_ARCH=GNU
    ;;
dragonfly*)
    HOST_OS_ARCH=DragonFly
    ;;
freebsd*)
    HOST_OS_ARCH=FreeBSD
    ;;
netbsd*)
    HOST_OS_ARCH=NetBSD
    ;;
openbsd*)
    HOST_OS_ARCH=OpenBSD
    ;;
solaris*)
    HOST_OS_ARCH=SunOS
    SOLARIS_SUNPRO_CC=
    SOLARIS_SUNPRO_CXX=
    if test -z "$GNU_CC"; then
        if test "`$CC -V 2>&1 | egrep -c 'Sun.*C '`" != "0"; then
            SOLARIS_SUNPRO_CC=1
       fi
    fi

    if test -z "$GNU_CXX"; then
       if test "`$CXX -V 2>&1 | egrep -c 'Sun.*C\+\+ '`" != "0"; then
           SOLARIS_SUNPRO_CXX=1
       fi
    fi
    
    
    ;;
esac

case "$OS_ARCH" in
WINNT)
    if test -z "$CROSS_COMPILE" ; then
        OS_TEST=`uname -p`
    fi
    ;;
Windows_NT)
#
# If uname -s returns "Windows_NT", we assume that we are using
# the uname.exe in MKS toolkit.
#
# The -r option of MKS uname only returns the major version number.
# So we need to use its -v option to get the minor version number.
# Moreover, it doesn't have the -p option, so we need to use uname -m.
#
    OS_ARCH=WINNT
    OS_TARGET=WINNT
    OS_MINOR_RELEASE=`uname -v`
    if test "$OS_MINOR_RELEASE" = "00"; then
        OS_MINOR_RELEASE=0
    fi
    OS_RELEASE="${OS_RELEASE}.${OS_MINOR_RELEASE}"
    ;;
MINGW*_NT*)
#
# If uname -s returns MINGW32_NT-5.1, we assume that we are using
# the uname.exe in the MSYS tools.
#
    OS_RELEASE=`expr $OS_ARCH : '.*NT-\(.*\)'`
    OS_ARCH=WINNT
    OS_TARGET=WINNT
    ;;
AIX)
    OS_RELEASE=`uname -v`.`uname -r`
    OS_TEST=${target_cpu}
    if test -z "$GNU_CC"; then
        if test "`$CC -qversion 2>&1 | egrep -c 'IBM XL'`" != "0"; then
            AIX_IBM_XLC=1
        fi
    fi
    ;;
Darwin)
    case "${target_cpu}" in
    powerpc*)
        OS_TEST=ppc
        ;;
    i*86*)
        OS_TEST=i386
        ;;
    x86_64)
        OS_TEST=x86_64
        ;;
    *)
        if test -z "$CROSS_COMPILE" ; then
            OS_TEST=`uname -p`
        fi
        ;;
    esac
    ;;
esac

# Only set CPU_ARCH if we recognize the value of OS_TEST

case "$OS_TEST" in
*86 | i86pc)
    CPU_ARCH=x86
    ;;

powerpc64 | ppc64 | powerpc64le | ppc64le)
    CPU_ARCH=ppc64
    ;;

powerpc | ppc | rs6000)
    CPU_ARCH=ppc
    ;;

Alpha | alpha | ALPHA)
    CPU_ARCH=Alpha
    ;;

s390)
    CPU_ARCH=s390
    ;;

s390x)
    CPU_ARCH=s390x
    ;;

hppa* | parisc)
    CPU_ARCH=hppa
    ;;

sun4u | sparc*)
    CPU_ARCH=sparc
    ;;

x86_64 | ia64)
    CPU_ARCH="$OS_TEST"
    ;;

arm*)
    CPU_ARCH=arm
    ;;

mips|mipsel)
    CPU_ARCH="mips32"
    ;;

mips64|mips64el)
    CPU_ARCH="mips64"
    ;;

aarch64*)
    CPU_ARCH=aarch64
    ;;

esac

if test -z "$OS_TARGET"; then
    OS_TARGET=$OS_ARCH
fi
OS_CONFIG="${OS_TARGET}${OS_RELEASE}"

INTEL_ARCHITECTURE=
case "$OS_TEST" in
    x86_64|i?86)
      INTEL_ARCHITECTURE=1
esac




MOZ_THUMB=toolchain-default
MOZ_THUMB_INTERWORK=toolchain-default
MOZ_FPU=toolchain-default
MOZ_FLOAT_ABI=toolchain-default
MOZ_SOFT_FLOAT=toolchain-default
MOZ_ALIGN=toolchain-default

# Check whether --with-arch or --without-arch was given.
if test "${with_arch+set}" = set; then
  withval="$with_arch"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-arch is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-arch is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_ARCH=$withval
fi


if test -z "$MOZ_ARCH"; then
        case "${CPU_ARCH}-${OS_TARGET}" in
    arm-Android)
        MOZ_THUMB=yes
        MOZ_ARCH=armv7-a
        MOZ_FPU=vfp
        MOZ_FLOAT_ABI=softfp
        MOZ_ALIGN=no
        ;;
    arm-Darwin)
        MOZ_ARCH=toolchain-default
        ;;
    esac
fi

if test "$MOZ_ARCH" = "armv6" -a "$OS_TARGET" = "Android"; then
   MOZ_FPU=vfp
fi

# Check whether --with-thumb or --without-thumb was given.
if test "${with_thumb+set}" = set; then
  withval="$with_thumb"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-thumb is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-thumb is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_THUMB=$withval
fi


# Check whether --with-thumb-interwork or --without-thumb-interwork was given.
if test "${with_thumb_interwork+set}" = set; then
  withval="$with_thumb_interwork"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-thumb-interwork is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-thumb-interwork is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_THUMB_INTERWORK=$withval
fi


# Check whether --with-fpu or --without-fpu was given.
if test "${with_fpu+set}" = set; then
  withval="$with_fpu"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-fpu is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-fpu is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_FPU=$withval
fi


# Check whether --with-float-abi or --without-float-abi was given.
if test "${with_float_abi+set}" = set; then
  withval="$with_float_abi"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-float-abi is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-float-abi is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_FLOAT_ABI=$withval
fi


# Check whether --with-soft-float or --without-soft-float was given.
if test "${with_soft_float+set}" = set; then
  withval="$with_soft_float"
  if test -z "$GNU_CC"; then
        { echo "configure: error: --with-soft-float is not supported on non-GNU toolchains" 1>&2; echo "configure: error: --with-soft-float is not supported on non-GNU toolchains" 1>&5; exit 1; }
    fi
    MOZ_SOFT_FLOAT=$withval
fi


case "$MOZ_ARCH" in
toolchain-default|"")
    arch_flag=""
    ;;
*)
    arch_flag="-march=$MOZ_ARCH"
    ;;
esac

case "$MOZ_THUMB" in
yes)
    MOZ_THUMB2=1
    thumb_flag="-mthumb"
    ;;
no)
    MOZ_THUMB2=
    thumb_flag="-marm"
    ;;
*)
    _SAVE_CFLAGS="$CFLAGS"
    CFLAGS="$arch_flag"
    cat > conftest.$ac_ext <<EOF
#line 6411 "configure"
#include "confdefs.h"

int main() {
return sizeof(__thumb2__);
; return 0; }
EOF
if { (eval echo configure:6418: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  MOZ_THUMB2=1
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  MOZ_THUMB2=
fi
rm -f conftest*
    CFLAGS="$_SAVE_CFLAGS"
    thumb_flag=""
    ;;
esac

if test "$MOZ_THUMB2" = 1; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_THUMB2 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_THUMB2 1
EOF

fi

case "$MOZ_THUMB_INTERWORK" in
yes)
    thumb_interwork_flag="-mthumb-interwork"
    ;;
no)
    thumb_interwork_flag="-mno-thumb-interwork"
    ;;
*) # toolchain-default
    thumb_interwork_flag=""
    ;;
esac

case "$MOZ_FPU" in
toolchain-default|"")
    fpu_flag=""
    ;;
*)
    fpu_flag="-mfpu=$MOZ_FPU"
    ;;
esac

case "$MOZ_FLOAT_ABI" in
toolchain-default|"")
    float_abi_flag=""
    ;;
*)
    float_abi_flag="-mfloat-abi=$MOZ_FLOAT_ABI"
    ;;
esac

case "$MOZ_SOFT_FLOAT" in
yes)
    soft_float_flag="-msoft-float"
    ;;
no)
    soft_float_flag="-mno-soft-float"
    ;;
*) # toolchain-default
    soft_float_flag=""
    ;;
esac

case "$MOZ_ALIGN" in
no)
    align_flag="-mno-unaligned-access"
    ;;
yes)
    align_flag="-munaligned-access"
    ;;
*)
    align_flag=""
    ;;
esac

if test -n "$align_flag"; then
  _SAVE_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS $align_flag"
  echo $ac_n "checking whether alignment flag ($align_flag) is supported""... $ac_c" 1>&6
echo "configure:6501: checking whether alignment flag ($align_flag) is supported" >&5
  cat > conftest.$ac_ext <<EOF
#line 6503 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:6510: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  align_flag=""
fi
rm -f conftest*
  CFLAGS="$_SAVE_CFLAGS"
fi

all_flags=`echo $arch_flag $thumb_flag $thumb_interwork_flag $fpu_flag $float_abi_flag $soft_float_flag $align_flag`
if test -n "$all_flags"; then
    _SAVE_CFLAGS="$CFLAGS"
    CFLAGS="$all_flags"
    echo $ac_n "checking whether the chosen combination of compiler flags ($all_flags) works""... $ac_c" 1>&6
echo "configure:6527: checking whether the chosen combination of compiler flags ($all_flags) works" >&5
    cat > conftest.$ac_ext <<EOF
#line 6529 "configure"
#include "confdefs.h"

int main() {
return 0;
; return 0; }
EOF
if { (eval echo configure:6536: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: no" 1>&2; echo "configure: error: no" 1>&5; exit 1; }
fi
rm -f conftest*

    CFLAGS="$_SAVE_CFLAGS $all_flags"
    CXXFLAGS="$CXXFLAGS $all_flags"
    ASFLAGS="$ASFLAGS $all_flags"
    if test -n "$thumb_flag"; then
        LDFLAGS="$LDFLAGS $thumb_flag"
    fi
fi



if test "$CPU_ARCH" = "arm"; then
  echo $ac_n "checking for ARM SIMD support in compiler""... $ac_c" 1>&6
echo "configure:6559: checking for ARM SIMD support in compiler" >&5
  # We try to link so that this also fails when
  # building with LTO.
  cat > conftest.$ac_ext <<EOF
#line 6563 "configure"
#include "confdefs.h"

int main() {
asm("uqadd8 r1, r1, r2");
; return 0; }
EOF
if { (eval echo configure:6570: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  result="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  result="no"
fi
rm -f conftest*
  echo "$ac_t"""$result"" 1>&6
  if test "$result" = "yes"; then
      cat >> confdefs.pytmp <<\EOF
    (''' HAVE_ARM_SIMD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_ARM_SIMD 1
EOF

      HAVE_ARM_SIMD=1
  fi

  echo $ac_n "checking ARM version support in compiler""... $ac_c" 1>&6
echo "configure:6593: checking ARM version support in compiler" >&5
    ARM_ARCH=`${CC-cc} ${CFLAGS} -dM -E - < /dev/null | sed -n 's/.*__ARM_ARCH_\([0-9][0-9]*\).*/\1/p'`
  echo "$ac_t"""$ARM_ARCH"" 1>&6

  echo $ac_n "checking for ARM NEON support in compiler""... $ac_c" 1>&6
echo "configure:6598: checking for ARM NEON support in compiler" >&5
  # We try to link so that this also fails when
  # building with LTO.
  cat > conftest.$ac_ext <<EOF
#line 6602 "configure"
#include "confdefs.h"

int main() {
asm(".fpu neon\n vadd.i8 d0, d0, d0");
; return 0; }
EOF
if { (eval echo configure:6609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  result="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  result="no"
fi
rm -f conftest*
  echo "$ac_t"""$result"" 1>&6
  if test "$result" = "yes"; then
      cat >> confdefs.pytmp <<\EOF
    (''' HAVE_ARM_NEON ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_ARM_NEON 1
EOF

      HAVE_ARM_NEON=1

                  if test -n "$ARM_ARCH"; then
          if test "$ARM_ARCH" -lt 7; then
              BUILD_ARM_NEON=
          else
              cat >> confdefs.pytmp <<\EOF
    (''' BUILD_ARM_NEON ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define BUILD_ARM_NEON 1
EOF

              BUILD_ARM_NEON=1
          fi
      fi
  fi

fi # CPU_ARCH = arm






if test -n "$MOZ_ARCH"; then
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-arch=$MOZ_ARCH"
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-thumb=$MOZ_THUMB"
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-thumb-interwork=$MOZ_THUMB_INTERWORK"
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-fpu=$MOZ_FPU"
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-float-abi=$MOZ_FLOAT_ABI"
  NSPR_CONFIGURE_ARGS="$NSPR_CONFIGURE_ARGS --with-soft-float=$MOZ_SOFT_FLOAT"
fi



if test "$COMPILE_ENVIRONMENT"; then
configure_static_assert_macros='
#define CONFIGURE_STATIC_ASSERT(condition) CONFIGURE_STATIC_ASSERT_IMPL(condition, __LINE__)
#define CONFIGURE_STATIC_ASSERT_IMPL(condition, line) CONFIGURE_STATIC_ASSERT_IMPL2(condition, line)
#define CONFIGURE_STATIC_ASSERT_IMPL2(condition, line) typedef int static_assert_line_##line[(condition) ? 1 : -1]
'

echo $ac_n "checking that static assertion macros used in autoconf tests work""... $ac_c" 1>&6
echo "configure:6672: checking that static assertion macros used in autoconf tests work" >&5
if eval "test \"`echo '$''{'ac_cv_static_assertion_macros_work'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
  ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

  ac_cv_static_assertion_macros_work="yes"
  cat > conftest.$ac_ext <<EOF
#line 6686 "configure"
#include "confdefs.h"
$configure_static_assert_macros
int main() {
CONFIGURE_STATIC_ASSERT(1)
; return 0; }
EOF
if { (eval echo configure:6693: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_static_assertion_macros_work="no"
fi
rm -f conftest*
  cat > conftest.$ac_ext <<EOF
#line 6703 "configure"
#include "confdefs.h"
$configure_static_assert_macros
int main() {
CONFIGURE_STATIC_ASSERT(0)
; return 0; }
EOF
if { (eval echo configure:6710: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_static_assertion_macros_work="no"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
  ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

  cat > conftest.$ac_ext <<EOF
#line 6726 "configure"
#include "confdefs.h"
$configure_static_assert_macros
int main() {
CONFIGURE_STATIC_ASSERT(1)
; return 0; }
EOF
if { (eval echo configure:6733: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_static_assertion_macros_work="no"
fi
rm -f conftest*
  cat > conftest.$ac_ext <<EOF
#line 6743 "configure"
#include "confdefs.h"
$configure_static_assert_macros
int main() {
CONFIGURE_STATIC_ASSERT(0)
; return 0; }
EOF
if { (eval echo configure:6750: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_static_assertion_macros_work="no"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
  ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

 
fi

echo "$ac_t"""$ac_cv_static_assertion_macros_work"" 1>&6
if test "$ac_cv_static_assertion_macros_work" = "no"; then
    { echo "configure: error: Compiler cannot compile macros used in autoconf tests." 1>&2; echo "configure: error: Compiler cannot compile macros used in autoconf tests." 1>&5; exit 1; }
fi
fi # COMPILE_ENVIRONMENT




if test "$OS_TARGET" = "Android" -a -z "$gonkdir"; then
    cpu_arch_dir="$ANDROID_CPU_ARCH"
    if test "$MOZ_THUMB2" = 1; then
        cpu_arch_dir="$cpu_arch_dir/thumb"
    fi

    if test -z "$STLPORT_CPPFLAGS$STLPORT_LIBS"; then
        case "$android_cxx_stl" in
        libstdc++)
            # android-ndk-r8b and later
            ndk_base="$android_ndk/sources/cxx-stl/gnu-libstdc++/$android_gnu_compiler_version"
            ndk_libs_include="$ndk_base/libs/$ANDROID_CPU_ARCH"
            ndk_libs="$ndk_base/libs/$cpu_arch_dir"
            ndk_include="$ndk_base/include"

            if ! test -e "$ndk_libs/libgnustl_static.a"; then
                { echo "configure: error: Couldn't find path to gnu-libstdc++ in the android ndk" 1>&2; echo "configure: error: Couldn't find path to gnu-libstdc++ in the android ndk" 1>&5; exit 1; }
            fi

            STLPORT_LIBS="-L$ndk_libs -lgnustl_static"
            STLPORT_CPPFLAGS="-I$ndk_include -I$ndk_include/backward -I$ndk_libs_include/include"
            ;;
        libc++)
            # android-ndk-r8b and later
            ndk_base="$android_ndk/sources/cxx-stl"
            cxx_base="$ndk_base/llvm-libc++"
            cxx_libs="$cxx_base/libs/$cpu_arch_dir"
            cxx_include="$cxx_base/libcxx/include"
            cxxabi_base="$ndk_base/llvm-libc++abi"
            cxxabi_include="$cxxabi_base/libcxxabi/include"

            if ! test -e "$cxx_libs/libc++_static.a"; then
                { echo "configure: error: Couldn't find path to llvm-libc++ in the android ndk" 1>&2; echo "configure: error: Couldn't find path to llvm-libc++ in the android ndk" 1>&5; exit 1; }
            fi

            STLPORT_LIBS="-L$cxx_libs -lc++_static"
            # Add android/support/include/ for prototyping long double math
            # functions, locale-specific C library functions, multibyte support,
            # etc.
            STLPORT_CPPFLAGS="-I$android_ndk/sources/android/support/include -I$cxx_include -I$cxxabi_include"
            ;;
        mozstlport)
            # We don't need to set STLPORT_LIBS, because the build system will
            # take care of linking in our home-built stlport where it is needed.
            STLPORT_CPPFLAGS="-isystem $_topsrcdir/build/stlport/stlport -isystem $_topsrcdir/build/stlport/overrides -isystem $android_ndk/sources/cxx-stl/system/include"
            ;;
        *)
            { echo "configure: error: Bad value for --enable-android-cxx-stl" 1>&2; echo "configure: error: Bad value for --enable-android-cxx-stl" 1>&5; exit 1; }
            ;;
        esac
    fi
    CXXFLAGS="$CXXFLAGS $STLPORT_CPPFLAGS"
fi
MOZ_ANDROID_CXX_STL=$android_cxx_stl





if test -n "${CLANG_CC}${CLANG_CL}"; then
    _WARNINGS_CFLAGS="-Qunused-arguments ${_WARNINGS_CFLAGS}"
    CPPFLAGS="-Qunused-arguments ${CPPFLAGS}"
fi
if test -n "${CLANG_CXX}${CLANG_CL}"; then
    _WARNINGS_CXXFLAGS="-Qunused-arguments ${_WARNINGS_CXXFLAGS}"
fi

# Check whether --enable-address-sanitizer or --disable-address-sanitizer was given.
if test "${enable_address_sanitizer+set}" = set; then
  enableval="$enable_address_sanitizer"
  if test "$enableval" = "yes"; then
    MOZ_ASAN=1
  elif test "$enableval" = "no"; then
    MOZ_ASAN= 
  else
    { echo "configure: error: Option, address-sanitizer, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, address-sanitizer, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_ASAN"; then
    MOZ_LLVM_HACKS=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_ASAN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_ASAN 1
EOF

     # Extract the first word of "llvm-symbolizer", so it can be a program name with args.
set dummy llvm-symbolizer; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:6868: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_LLVM_SYMBOLIZER'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$LLVM_SYMBOLIZER" in
  /*)
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_LLVM_SYMBOLIZER="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
LLVM_SYMBOLIZER="$ac_cv_path_LLVM_SYMBOLIZER"
if test -n "$LLVM_SYMBOLIZER"; then
  echo "$ac_t""$LLVM_SYMBOLIZER" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$LLVM_SYMBOLIZER" in
    /*)
      tmp_DIRNAME=`dirname "$LLVM_SYMBOLIZER"`
      tmp_BASENAME=`basename "$LLVM_SYMBOLIZER"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      LLVM_SYMBOLIZER="$tmp_PWD/$tmp_BASENAME"
      if test -e "$LLVM_SYMBOLIZER.exe"; then
        LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER.exe"
      fi
    esac
  fi

fi


# Check whether --enable-memory-sanitizer or --disable-memory-sanitizer was given.
if test "${enable_memory_sanitizer+set}" = set; then
  enableval="$enable_memory_sanitizer"
  if test "$enableval" = "yes"; then
    MOZ_MSAN=1
  elif test "$enableval" = "no"; then
    MOZ_MSAN= 
  else
    { echo "configure: error: Option, memory-sanitizer, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, memory-sanitizer, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_MSAN"; then
    MOZ_LLVM_HACKS=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MSAN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MSAN 1
EOF

     # Extract the first word of "llvm-symbolizer", so it can be a program name with args.
set dummy llvm-symbolizer; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:6940: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_LLVM_SYMBOLIZER'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$LLVM_SYMBOLIZER" in
  /*)
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_LLVM_SYMBOLIZER="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
LLVM_SYMBOLIZER="$ac_cv_path_LLVM_SYMBOLIZER"
if test -n "$LLVM_SYMBOLIZER"; then
  echo "$ac_t""$LLVM_SYMBOLIZER" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$LLVM_SYMBOLIZER" in
    /*)
      tmp_DIRNAME=`dirname "$LLVM_SYMBOLIZER"`
      tmp_BASENAME=`basename "$LLVM_SYMBOLIZER"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      LLVM_SYMBOLIZER="$tmp_PWD/$tmp_BASENAME"
      if test -e "$LLVM_SYMBOLIZER.exe"; then
        LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER.exe"
      fi
    esac
  fi

fi


# Check whether --enable-thread-sanitizer or --disable-thread-sanitizer was given.
if test "${enable_thread_sanitizer+set}" = set; then
  enableval="$enable_thread_sanitizer"
  if test "$enableval" = "yes"; then
    MOZ_TSAN=1
  elif test "$enableval" = "no"; then
    MOZ_TSAN= 
  else
    { echo "configure: error: Option, thread-sanitizer, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, thread-sanitizer, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_TSAN"; then
    MOZ_LLVM_HACKS=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_TSAN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_TSAN 1
EOF

     # Extract the first word of "llvm-symbolizer", so it can be a program name with args.
set dummy llvm-symbolizer; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:7012: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_LLVM_SYMBOLIZER'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$LLVM_SYMBOLIZER" in
  /*)
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_LLVM_SYMBOLIZER="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  ;;
esac
fi
LLVM_SYMBOLIZER="$ac_cv_path_LLVM_SYMBOLIZER"
if test -n "$LLVM_SYMBOLIZER"; then
  echo "$ac_t""$LLVM_SYMBOLIZER" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  if test "$msyshost"; then
    case "$LLVM_SYMBOLIZER" in
    /*)
      tmp_DIRNAME=`dirname "$LLVM_SYMBOLIZER"`
      tmp_BASENAME=`basename "$LLVM_SYMBOLIZER"`
      tmp_PWD=`cd "$tmp_DIRNAME" && pwd -W`
      LLVM_SYMBOLIZER="$tmp_PWD/$tmp_BASENAME"
      if test -e "$LLVM_SYMBOLIZER.exe"; then
        LLVM_SYMBOLIZER="$LLVM_SYMBOLIZER.exe"
      fi
    esac
  fi

fi


# The LLVM symbolizer is used by all sanitizers


# Check whether --enable-llvm-hacks or --disable-llvm-hacks was given.
if test "${enable_llvm_hacks+set}" = set; then
  enableval="$enable_llvm_hacks"
  if test "$enableval" = "yes"; then
    MOZ_LLVM_HACKS=1
  elif test "$enableval" = "no"; then
    MOZ_LLVM_HACKS= 
  else
    { echo "configure: error: Option, llvm-hacks, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, llvm-hacks, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_LLVM_HACKS"; then
    MOZ_NO_WLZDEFS=1
fi

# Check whether --enable-warnings-as-errors or --disable-warnings-as-errors was given.
if test "${enable_warnings_as_errors+set}" = set; then
  enableval="$enable_warnings_as_errors"
  if test "$enableval" = "yes"; then
    MOZ_ENABLE_WARNINGS_AS_ERRORS=1
  elif test "$enableval" = "no"; then
    MOZ_ENABLE_WARNINGS_AS_ERRORS=
  else
    { echo "configure: error: Option, warnings-as-errors, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, warnings-as-errors, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$GNU_CC"; then
    # Per bug 719659 comment 2, some of the headers on ancient build machines
    # may require gnu89 inline semantics.  But otherwise, we use C99.
    # But on OS X we just use C99 plus GNU extensions, in order to fix
    # bug 917526.
    CFLAGS="$CFLAGS -std=gnu99"
    if test "${OS_ARCH}" != Darwin; then
        CFLAGS="$CFLAGS -fgnu89-inline"
    fi
    MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-h,$(DSO_SONAME) -o $@'
    MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-h,$(DSO_SONAME) -o $@'
    DSO_LDOPTS='-shared'
    if test "$GCC_USE_GNU_LD"; then
        # Some tools like ASan use a runtime library that is only
        # linked against executables, so we must allow undefined
        # symbols for shared objects in some cases.
        if test -z "$MOZ_NO_WLZDEFS"; then
            # Don't allow undefined symbols in libraries
            DSO_LDOPTS="$DSO_LDOPTS -Wl,-z,defs"
        fi
    fi
    WARNINGS_AS_ERRORS='-Werror'
    DSO_CFLAGS=''
    DSO_PIC_CFLAGS='-fPIC'
    ASFLAGS="$ASFLAGS -fPIC"
    echo $ac_n "checking for --noexecstack option to as""... $ac_c" 1>&6
echo "configure:7118: checking for --noexecstack option to as" >&5
    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS -Wa,--noexecstack"
    cat > conftest.$ac_ext <<EOF
#line 7122 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:7129: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
                     ASFLAGS="$ASFLAGS -Wa,--noexecstack"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*
    CFLAGS=$_SAVE_CFLAGS
    echo $ac_n "checking for -z noexecstack option to ld""... $ac_c" 1>&6
echo "configure:7142: checking for -z noexecstack option to ld" >&5
    _SAVE_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -Wl,-z,noexecstack"
    cat > conftest.$ac_ext <<EOF
#line 7146 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:7153: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
                  LDFLAGS=$_SAVE_LDFLAGS
fi
rm -f conftest*

    echo $ac_n "checking for -z text option to ld""... $ac_c" 1>&6
echo "configure:7166: checking for -z text option to ld" >&5
    _SAVE_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -Wl,-z,text"
    cat > conftest.$ac_ext <<EOF
#line 7170 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:7177: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
                  NSPR_LDFLAGS="$NSPR_LDFLAGS -Wl,-z,text"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
                  LDFLAGS=$_SAVE_LDFLAGS
fi
rm -f conftest*

    echo $ac_n "checking for --build-id option to ld""... $ac_c" 1>&6
echo "configure:7191: checking for --build-id option to ld" >&5
    _SAVE_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -Wl,--build-id"
    cat > conftest.$ac_ext <<EOF
#line 7195 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:7202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
                  NSPR_LDFLAGS="$NSPR_LDFLAGS -Wl,--build-id"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
                  LDFLAGS=$_SAVE_LDFLAGS
fi
rm -f conftest*

    # Turn on gcc/clang warnings:
    # https://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html
    #
    # -Wall - turn on a lot of warnings
    # -Waddress - catches suspicious uses of memory addresses
    # -Wchar-subscripts - catches array index using signed char
    # -Wcomment - catches nested comments
    # -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
    # -Wendif-labels - catches `#else FOO` and `#endif FOO` not in comment
    # -Wenum-compare - catches comparison of different enum types
    # -Wignored-qualifiers - catches returns types with qualifiers like const
    # -Wimplicit-function-declaration - catches missing C function prototypes
    # -Wint-to-pointer-cast - catches cast to pointer from integer of different size
    # -Wmissing-braces - catches aggregate initializers missing nested braces
    # -Wmultichar - catches multicharacter integer constants like 'THIS'
    # -Wnon-literal-null-conversion - catches expressions used as a null pointer constant
    # -Wnonnull - catches NULL used with functions arguments marked as non-null
    # -Wparentheses - catches `if (a=b)` and operator precedence bugs
    # -Wpointer-arith - catches pointer arithmetic using NULL or sizeof(void)
    # -Wpointer-sign - catches mixing pointers to signed and unsigned types
    # -Wpointer-to-int-cast - catches casts from pointer to different sized int
    # -Wreturn-type - catches missing returns, zero false positives
    # -Wsequence-point - catches undefined order behavior like `a = a++`
    # -Wsign-compare - catches comparison of signed and unsigned types
    # -Wswitch - catches switches without all enum cases or default case
    # -Wtrigraphs - catches unlikely use of trigraphs
    # -Wtype-limits - catches overflow bugs, few false positives
    # -Wunknown-pragmas - catches unexpected #pragma directives
    # -Wwrite-strings - catches non-const char* pointers to string literals
    #
    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wall"
    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wsign-compare"
    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wtype-limits"

    # Treat some warnings as errors if --enable-warnings-as-errors:
    if test "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=address"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=char-subscripts"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=comment"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=empty-body"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=endif-labels"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=enum-compare"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=ignored-qualifiers"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=implicit-function-declaration"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=int-to-pointer-cast"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=missing-braces"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=multichar"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=nonnull"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=parentheses"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=pointer-arith"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=pointer-sign"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=pointer-to-int-cast"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=return-type"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=sequence-point"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=switch"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=trigraphs"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=uninitialized"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=unknown-pragmas"
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=write-strings"

        
    echo $ac_n "checking whether the C compiler supports -Werror=non-literal-null-conversion""... $ac_c" 1>&6
echo "configure:7277: checking whether the C compiler supports -Werror=non-literal-null-conversion" >&5
if eval "test \"`echo '$''{'ac_c_has_werror_non_literal_null_conversion'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wnon-literal-null-conversion"
            cat > conftest.$ac_ext <<EOF
#line 7293 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7300: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_werror_non_literal_null_conversion="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_werror_non_literal_null_conversion="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_werror_non_literal_null_conversion" 1>&6
    if test "${ac_c_has_werror_non_literal_null_conversion}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=non-literal-null-conversion"
    fi

        
    echo $ac_n "checking whether the C compiler supports -Werror=sometimes-uninitialized""... $ac_c" 1>&6
echo "configure:7328: checking whether the C compiler supports -Werror=sometimes-uninitialized" >&5
if eval "test \"`echo '$''{'ac_c_has_sometimes_uninitialized'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wsometimes-uninitialized"
            cat > conftest.$ac_ext <<EOF
#line 7344 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7351: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_sometimes_uninitialized="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_sometimes_uninitialized="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_sometimes_uninitialized" 1>&6
    if test "${ac_c_has_sometimes_uninitialized}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Werror=sometimes-uninitialized"
    fi

    fi

    # Turn off the following warnings that -Wall turns on:
    # -Wno-unused - lots of violations in third-party code
    # -Wno-inline-new-delete - we inline 'new' and 'delete' in mozalloc
    # -Wno-unused-local-typedef - catches unused typedefs, which are commonly used in assertion macros
    #
    _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-unused"

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-inline-new-delete""... $ac_c" 1>&6
echo "configure:7388: checking whether the C++ compiler supports -Wno-inline-new-delete" >&5
if eval "test \"`echo '$''{'ac_cxx_has_wno_inline_new_delete'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Winline-new-delete"
            cat > conftest.$ac_ext <<EOF
#line 7404 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7411: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_wno_inline_new_delete="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_wno_inline_new_delete="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_wno_inline_new_delete" 1>&6
    if test "${ac_cxx_has_wno_inline_new_delete}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-inline-new-delete"
    fi

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-unused-local-typedef""... $ac_c" 1>&6
echo "configure:7439: checking whether the C++ compiler supports -Wno-unused-local-typedef" >&5
if eval "test \"`echo '$''{'ac_cxx_has_wno_unused_local_typedef'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wunused-local-typedef"
            cat > conftest.$ac_ext <<EOF
#line 7455 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7462: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_wno_unused_local_typedef="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_wno_unused_local_typedef="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_wno_unused_local_typedef" 1>&6
    if test "${ac_cxx_has_wno_unused_local_typedef}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-unused-local-typedef"
    fi


    if test -z "$INTEL_CC" -a -z "$CLANG_CC"; then
       # Don't use -Wcast-align with ICC or clang
       case "$CPU_ARCH" in
           # And don't use it on hppa, ia64, sparc, arm, since it's noisy there
           hppa | ia64 | sparc | arm)
           ;;
           *)
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wcast-align"
           ;;
       esac
    fi

    _DEFINES_CFLAGS='-include $(DEPTH)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
    _USE_CPP_INCLUDE_FLAG=1

elif test "$SOLARIS_SUNPRO_CC"; then
    DSO_CFLAGS=''
    if test "$CPU_ARCH" = "sparc"; then
        # for Sun Studio on Solaris/SPARC
        DSO_PIC_CFLAGS='-xcode=pic32'
    else
        DSO_PIC_CFLAGS='-KPIC'
    fi
    _DEFINES_CFLAGS='$(ACDEFINES) -D_JS_CONFDEFS_H_ -DMOZILLA_CLIENT'
else
    MKSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
    MKCSHLIB='$(LD) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'

    DSO_LDOPTS='-shared'
    if test "$GNU_LD"; then
        # Don't allow undefined symbols in libraries
        DSO_LDOPTS="$DSO_LDOPTS -z defs"
    fi

    DSO_CFLAGS=''
    DSO_PIC_CFLAGS='-KPIC'
    _DEFINES_CFLAGS='$(ACDEFINES) -D_JS_CONFDEFS_H_ -DMOZILLA_CLIENT'
fi

if test "$GNU_CXX"; then
    # Turn on gcc/clang warnings:
    # https://gcc.gnu.org/onlinedocs/gcc-4.4.0/gcc/Warning-Options.html
    #
    # -Wall - turn on a lot of warnings
    # -Wchar-subscripts - catches array index using signed char
    # -Wcomment - catches nested comments
    # -Wconversion-null - catches conversions between NULL and non-pointer types
    # -Wempty-body - catches bugs, e.g. "if (c); foo();", few false positives
    # -Wendif-labels - catches `#else FOO` and `#endif FOO` not in comment
    # -Wignored-qualifiers - catches returns types with qualifiers like const
    # -Wint-to-pointer-cast - catches cast to pointer from integer of different size
    # -Wmissing-braces - catches aggregate initializers missing nested braces
    # -Wnon-literal-null-conversion - catches expressions used as a null pointer constant
    # -Woverloaded-virtual - function declaration hides virtual function from base class
    # -Wparentheses - catches `if (a=b)` and operator precedence bugs
    # -Wpointer-arith - catches pointer arithmetic using NULL or sizeof(void)
    # -Wpointer-to-int-cast - catches casts from pointer to different sized int
    # -Wrange-loop-analysis - catches copies during range-based for loops.
    # -Wreorder - catches ctor initializer list not matching class definition order
    # -Wreturn-type - catches missing returns, zero false positives
    # -Wsequence-point - catches undefined order behavior like `a = a++`
    # -Wsign-compare - catches comparison of signed and unsigned types
    # -Wswitch - catches switches without all enum cases or default case
    # -Wtrigraphs - catches unlikely use of trigraphs
    # -Wtype-limits - catches overflow bugs, few false positives
    # -Wunknown-pragmas - catches unexpected #pragma directives
    # -Wunused-label - catches unused goto labels
    # -Wunused-value - catches unused expression results
    # -Wwrite-strings - catches non-const char* pointers to string literals
    #
    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wall"
    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wsign-compare"
    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wtype-limits"

    # Treat some warnings as errors if --enable-warnings-as-errors:
    if test "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=char-subscripts"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=comment"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=endif-labels"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=ignored-qualifiers"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=int-to-pointer-cast"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=missing-braces"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=overloaded-virtual"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=parentheses"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=pointer-arith"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=reorder"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=return-type"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=sequence-point"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=switch"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=trigraphs"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=uninitialized"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=unknown-pragmas"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=unused-label"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=unused-value"
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=write-strings"

        
    echo $ac_n "checking whether the C++ compiler supports -Werror=conversion-null""... $ac_c" 1>&6
echo "configure:7587: checking whether the C++ compiler supports -Werror=conversion-null" >&5
if eval "test \"`echo '$''{'ac_cxx_has_werror_conversion_null'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wconversion-null"
            cat > conftest.$ac_ext <<EOF
#line 7603 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7610: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_werror_conversion_null="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_werror_conversion_null="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_werror_conversion_null" 1>&6
    if test "${ac_cxx_has_werror_conversion_null}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=conversion-null"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Werror=non-literal-null-conversion""... $ac_c" 1>&6
echo "configure:7638: checking whether the C++ compiler supports -Werror=non-literal-null-conversion" >&5
if eval "test \"`echo '$''{'ac_cxx_has_werror_non_literal_null_conversion'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wnon-literal-null-conversion"
            cat > conftest.$ac_ext <<EOF
#line 7654 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7661: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_werror_non_literal_null_conversion="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_werror_non_literal_null_conversion="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_werror_non_literal_null_conversion" 1>&6
    if test "${ac_cxx_has_werror_non_literal_null_conversion}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=non-literal-null-conversion"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Werror=range-loop-analysis""... $ac_c" 1>&6
echo "configure:7689: checking whether the C++ compiler supports -Werror=range-loop-analysis" >&5
if eval "test \"`echo '$''{'ac_cxx_has_range_loop_analysis'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wrange-loop-analysis"
            cat > conftest.$ac_ext <<EOF
#line 7705 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7712: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_range_loop_analysis="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_range_loop_analysis="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_range_loop_analysis" 1>&6
    if test "${ac_cxx_has_range_loop_analysis}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=range-loop-analysis"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Werror=sometimes-uninitialized""... $ac_c" 1>&6
echo "configure:7740: checking whether the C++ compiler supports -Werror=sometimes-uninitialized" >&5
if eval "test \"`echo '$''{'ac_cxx_has_sometimes_uninitialized'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wsometimes-uninitialized"
            cat > conftest.$ac_ext <<EOF
#line 7756 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7763: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_sometimes_uninitialized="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_sometimes_uninitialized="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_sometimes_uninitialized" 1>&6
    if test "${ac_cxx_has_sometimes_uninitialized}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Werror=sometimes-uninitialized"
    fi

    fi

    # Turn off the following warnings that -Wall turns on:
    # -Wno-invalid-offsetof - we use offsetof on non-POD types frequently
    # -Wno-unused-local-typedef - catches unused typedefs, which are commonly used in assertion macros
    #
    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-invalid-offsetof"

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-unused-local-typedef""... $ac_c" 1>&6
echo "configure:7799: checking whether the C++ compiler supports -Wno-unused-local-typedef" >&5
if eval "test \"`echo '$''{'ac_cxx_has_wno_unused_local_typedef'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wunused-local-typedef"
            cat > conftest.$ac_ext <<EOF
#line 7815 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7822: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_wno_unused_local_typedef="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_wno_unused_local_typedef="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_wno_unused_local_typedef" 1>&6
    if test "${ac_cxx_has_wno_unused_local_typedef}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-unused-local-typedef"
    fi


    if test -z "$INTEL_CXX" -a -z "$CLANG_CXX"; then
       # Don't use -Wcast-align with ICC or clang
       case "$CPU_ARCH" in
           # And don't use it on hppa, ia64, sparc, arm, since it's noisy there
           hppa | ia64 | sparc | arm)
           ;;
           *)
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wcast-align"
           ;;
       esac
    fi

    _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -include $(DEPTH)/js/src/js-confdefs.h'
    _USE_CPP_INCLUDE_FLAG=1

    # Recent clang and gcc support C++11 deleted functions without warnings if
    # compiling with -std=c++0x or -std=gnu++0x (or c++11 or gnu++11 in very new
    # versions).  We can't use -std=c++0x yet, so gcc's support must remain
    # unused.  But clang's warning can be disabled, so when compiling with clang
    # we use it to opt out of the warning, enabling (macro-encapsulated) use of
    # deleted function syntax.
    if test "$CLANG_CXX"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-c++0x-extensions"
        
    echo $ac_n "checking whether the C++ compiler supports -Wno-extended-offsetof""... $ac_c" 1>&6
echo "configure:7874: checking whether the C++ compiler supports -Wno-extended-offsetof" >&5
if eval "test \"`echo '$''{'ac_cxx_has_wno_extended_offsetof'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wextended-offsetof"
            cat > conftest.$ac_ext <<EOF
#line 7890 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:7897: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_wno_extended_offsetof="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_wno_extended_offsetof="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_wno_extended_offsetof" 1>&6
    if test "${ac_cxx_has_wno_extended_offsetof}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-extended-offsetof"
    fi

    fi

else
    _DEFINES_CXXFLAGS='-DMOZILLA_CLIENT -D_JS_CONFDEFS_H_ $(ACDEFINES)'
fi

if test "$COMPILE_ENVIRONMENT"; then

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking for 64-bit OS""... $ac_c" 1>&6
echo "configure:7939: checking for 64-bit OS" >&5
cat > conftest.$ac_ext <<EOF
#line 7941 "configure"
#include "confdefs.h"
$configure_static_assert_macros
int main() {
CONFIGURE_STATIC_ASSERT(sizeof(void*) == 8)
; return 0; }
EOF
if { (eval echo configure:7948: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  result="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  result="no"
fi
rm -f conftest*
echo "$ac_t"""$result"" 1>&6
if test "$result" = "yes"; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_64BIT_BUILD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_64BIT_BUILD 1
EOF

    HAVE_64BIT_BUILD=1
fi

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

fi # COMPILE_ENVIRONMENT

# Check whether --enable-profiling or --disable-profiling was given.
if test "${enable_profiling+set}" = set; then
  enableval="$enable_profiling"
  if test "$enableval" = "yes"; then
    MOZ_PROFILING=1
  elif test "$enableval" = "no"; then
    MOZ_PROFILING= 
  else
    { echo "configure: error: Option, profiling, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, profiling, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


case "$host" in
*mingw*)
    if test -n "$_WIN32_MSVC"; then
        HOST_AR=lib
        HOST_AR_FLAGS='-NOLOGO -OUT:$@'
        HOST_CFLAGS="$HOST_CFLAGS -TC -nologo"
        HOST_RANLIB='echo ranlib'
    else
        HOST_CFLAGS="$HOST_CFLAGS -mwindows"
    fi
    HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN32 -DXP_WIN -DWIN32 -D_WIN32 -DNO_X11 -D_CRT_SECURE_NO_WARNINGS"
    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
    HOST_BIN_SUFFIX=.exe
    case "$host" in
    *mingw*)
        PERL="/bin/sh ${_topsrcdir}/build/msys-perl-wrapper"
        ;;
    esac

    case "${host_cpu}" in
    i*86)
        if test -n "$_WIN32_MSVC"; then
            HOST_LDFLAGS="$HOST_LDFLAGS -MACHINE:X86"
        fi
        ;;
    x86_64)
        if test -n "$_WIN32_MSVC"; then
            HOST_LDFLAGS="$HOST_LDFLAGS -MACHINE:X64"
        fi
        HOST_CFLAGS="$HOST_CFLAGS -D_AMD64_"
        ;;
    esac
    ;;

*-darwin*)
    HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX -DXP_MACOSX -DNO_X11"
    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
    ;;

*-linux*|*-kfreebsd*-gnu|*-gnu*)
    HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O3}"
    ;;

*)
    HOST_CFLAGS="$HOST_CFLAGS -DXP_UNIX"
    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
    ;;
esac


  cat > conftest.c <<EOF
                  int foo = 1;
EOF
  lto_is_enabled=no
  if ${CC-cc} ${CFLAGS} -S conftest.c -o conftest.s >/dev/null 2>&1; then
    if grep '^target triple =' conftest.s; then
      lto_is_enabled=yes
    fi
  fi
  rm -f conftest.cs



case "$target" in
*-aix*)
    cat >> confdefs.pytmp <<\EOF
    (''' AIX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define AIX 1
EOF

    if test ! "$GNU_CC"; then
        if test ! "$HAVE_64BIT_BUILD"; then
            # Compiling with Visual Age C++ object model compat is the
            # default. To compile with object model ibm, add
            # AIX_OBJMODEL=ibm to .mozconfig.
            if test "$AIX_OBJMODEL" = "ibm"; then
                CXXFLAGS="$CXXFLAGS -qobjmodel=ibm"
            else
                AIX_OBJMODEL=compat
            fi
        else
            AIX_OBJMODEL=compat
        fi
        
        DSO_LDOPTS='-qmkshrobj=1'
        DSO_CFLAGS='-qflag=w:w'
        DSO_PIC_CFLAGS=
        LDFLAGS="$LDFLAGS -Wl,-brtl -blibpath:/usr/lib:/lib"
        MOZ_FIX_LINK_PATHS=
        MKSHLIB='$(CXX) $(DSO_LDOPTS) -o $@'
        MKCSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
        if test "$COMPILE_ENVIRONMENT"; then
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            echo $ac_n "checking for IBM XLC/C++ compiler version >= 9.0.0.7""... $ac_c" 1>&6
echo "configure:8096: checking for IBM XLC/C++ compiler version >= 9.0.0.7" >&5
            cat > conftest.$ac_ext <<EOF
#line 8098 "configure"
#include "confdefs.h"

int main() {
#if (__IBMCPP__ < 900)
                 #error "Bad compiler"
                 #endif
; return 0; }
EOF
if { (eval echo configure:8107: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  _BAD_COMPILER=
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _BAD_COMPILER=1
fi
rm -f conftest*
            if test -n "$_BAD_COMPILER"; then
                echo "$ac_t""no" 1>&6
                { echo "configure: error: IBM XLC/C++ 9.0.0.7 or higher is required to build." 1>&2; echo "configure: error: IBM XLC/C++ 9.0.0.7 or higher is required to build." 1>&5; exit 1; }
            else
                echo "$ac_t""yes" 1>&6
            fi
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            TARGET_COMPILER_ABI="ibmc"
            CC_VERSION=`lslpp -Lcq vac.C 2>/dev/null | awk -F: '{ print $3 }'`
            CXX_VERSION=`lslpp -Lcq vacpp.cmp.core 2>/dev/null | awk -F: '{ print $3 }'`
        fi
    fi
    case "${target_os}" in
    aix4.1*)
        DLL_SUFFIX='_shr.a'
        ;;
    esac
    if test "$COMPILE_ENVIRONMENT"; then
         for ac_hdr in sys/inttypes.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:8145: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 8150 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:8158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

    fi
    cat >> confdefs.pytmp <<\EOF
    (''' NSCAP_DISABLE_DEBUG_PTR_TYPES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NSCAP_DISABLE_DEBUG_PTR_TYPES 1
EOF

    ;;

*-darwin*)
    cat >> confdefs.pytmp <<\EOF
    (''' XP_DARWIN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_DARWIN 1
EOF

    MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@'
    MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -o $@'
    MOZ_OPTIMIZE_FLAGS="-O3 -fno-stack-protector"
    CFLAGS="$CFLAGS -fno-common"
    CXXFLAGS="$CXXFLAGS -fno-common"
    DLL_SUFFIX=".dylib"
    DSO_LDOPTS=''
    STRIP="$STRIP -x -S"
    _PLATFORM_DEFAULT_TOOLKIT='cairo-cocoa'
    TARGET_NSPR_MDCPUCFG='\"md/_darwin.cfg\"'
    LDFLAGS="$LDFLAGS -lobjc"
    # The ExceptionHandling framework is needed for Objective-C exception
    # logging code in nsObjCExceptions.h. Currently we only use that in debug
    # builds.
    _SAVE_LDFLAGS=$LDFLAGS
     echo $ac_n "checking for -framework ExceptionHandling""... $ac_c" 1>&6
echo "configure:8221: checking for -framework ExceptionHandling" >&5
    LDFLAGS="$LDFLAGS -framework ExceptionHandling"
    cat > conftest.$ac_ext <<EOF
#line 8224 "configure"
#include "confdefs.h"

int main() {
return 0;
; return 0; }
EOF
if { (eval echo configure:8231: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_have_framework_exceptionhandling="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_have_framework_exceptionhandling="no"
fi
rm -f conftest*
    echo "$ac_t""$ac_cv_have_framework_exceptionhandling" 1>&6
    if test  "$ac_cv_have_framework_exceptionhandling" = "yes"; then
      MOZ_DEBUG_LDFLAGS="$MOZ_DEBUG_LDFLAGS -framework ExceptionHandling";
    fi
    LDFLAGS=$_SAVE_LDFLAGS

    if test "x$lto_is_enabled" = "xyes"; then
        echo "Skipping -dead_strip because lto is enabled."
            elif test "x$enable_dtrace" = "xyes"; then
        echo "Skipping -dead_strip because DTrace is enabled. See bug 403132."
    else
                echo $ac_n "checking for -dead_strip option to ld""... $ac_c" 1>&6
echo "configure:8253: checking for -dead_strip option to ld" >&5
        _SAVE_LDFLAGS=$LDFLAGS
        LDFLAGS="$LDFLAGS -Wl,-dead_strip"
        cat > conftest.$ac_ext <<EOF
#line 8257 "configure"
#include "confdefs.h"

int main() {
return 0;
; return 0; }
EOF
if { (eval echo configure:8264: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  _HAVE_DEAD_STRIP=1
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _HAVE_DEAD_STRIP=
fi
rm -f conftest*
        if test -n "$_HAVE_DEAD_STRIP" ; then
            echo "$ac_t""yes" 1>&6
            MOZ_OPTIMIZE_LDFLAGS="-Wl,-dead_strip"
        else
            echo "$ac_t""no" 1>&6
        fi

        LDFLAGS=$_SAVE_LDFLAGS
    fi
    MOZ_FIX_LINK_PATHS="-Wl,-executable_path,${DIST}/bin"
    ;;

ia64*-hpux*)
    DLL_SUFFIX=".so"
    if test ! "$GNU_CC"; then
       DSO_LDOPTS='-b'
       DSO_CFLAGS=""
       DSO_PIC_CFLAGS=
       MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_LDOPTS) -o $@'
       MKCSHLIB='$(CC) $(CFLAGS) $(DSO_LDOPTS) -o $@'
       CXXFLAGS="$CXXFLAGS -Wc,-ansi_for_scope,on"
    else
       DSO_LDOPTS='-b -E'
       MKSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
       MKCSHLIB='$(LD) $(DSO_LDOPTS) -o $@'
    fi
    MOZ_FIX_LINK_PATHS=
    cat >> confdefs.pytmp <<\EOF
    (''' NSCAP_DISABLE_DEBUG_PTR_TYPES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NSCAP_DISABLE_DEBUG_PTR_TYPES 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' _LARGEFILE64_SOURCE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _LARGEFILE64_SOURCE 1
EOF

    ;;

*-hpux*)
    DLL_SUFFIX=".sl"
    if test ! "$GNU_CC"; then
    	DSO_LDOPTS='-b -Wl,+s'
    	DSO_CFLAGS=""
    	DSO_PIC_CFLAGS="+Z"
    	MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_LDOPTS) -L$(DIST)/bin -o $@'
    	MKCSHLIB='$(LD) -b +s -L$(DIST)/bin -o $@'
        CXXFLAGS="$CXXFLAGS -Wc,-ansi_for_scope,on"
    else
        DSO_LDOPTS='-b -E +s'
        MKSHLIB='$(LD) $(DSO_LDOPTS) -L$(DIST)/bin -L$(DIST)/lib -o $@'
        MKCSHLIB='$(LD) $(DSO_LDOPTS) -L$(DIST)/bin -L$(DIST)/lib -o $@'
    fi
    MOZ_POST_PROGRAM_COMMAND='chatr +s enable'
    cat >> confdefs.pytmp <<\EOF
    (''' NSCAP_DISABLE_DEBUG_PTR_TYPES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NSCAP_DISABLE_DEBUG_PTR_TYPES 1
EOF

    ;;

*-android*|*-linuxandroid*)
    cat >> confdefs.pytmp <<\EOF
    (''' NO_PW_GECOS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NO_PW_GECOS 1
EOF

    no_x=yes
    _PLATFORM_DEFAULT_TOOLKIT=cairo-android
    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'

    MOZ_GFX_OPTIMIZE_MOBILE=1
    MOZ_OPTIMIZE_FLAGS="-O3 -fno-reorder-functions"
    if test -z "$CLANG_CC"; then
       MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
    fi
    # The Maemo builders don't know about this flag
    MOZ_ARM_VFP_FLAGS="-mfpu=vfp"
    ;;

*-*linux*)
    # Note: both GNU_CC and INTEL_CC are set when using Intel's C compiler.
    # Similarly for GNU_CXX and INTEL_CXX.
    if test "$INTEL_CC" -o "$INTEL_CXX"; then
        # -Os has been broken on Intel's C/C++ compilers for quite a
        # while; Intel recommends against using it.
        MOZ_OPTIMIZE_FLAGS="-O2"
    elif test "$GNU_CC" -o "$GNU_CXX"; then
        MOZ_PGO_OPTIMIZE_FLAGS="-O3"
        MOZ_OPTIMIZE_FLAGS="-O3"
        if test -z "$CLANG_CC"; then
           MOZ_OPTIMIZE_FLAGS="-freorder-blocks $MOZ_OPTIMIZE_FLAGS"
        fi
    fi

    TARGET_NSPR_MDCPUCFG='\"md/_linux.cfg\"'

    case "${target_cpu}" in
    alpha*)
    	CFLAGS="$CFLAGS -mieee"
    	CXXFLAGS="$CXXFLAGS -mieee"
    ;;
    esac

    if test -z "$MC"; then
        MC=mc.exe
    fi
    ;;

*-mingw*)
    DSO_CFLAGS=
    DSO_PIC_CFLAGS=
    DLL_SUFFIX=.dll
    RC=rc.exe
    MC=mc.exe
    if test -n "$GNU_CC" -o -n "$CLANG_CC"; then
        CC="$CC -mwindows"
        CXX="$CXX -mwindows"
        CPP="$CPP -mwindows"
        CFLAGS="$CFLAGS -mms-bitfields"
        CXXFLAGS="$CXXFLAGS -mms-bitfields"
        DSO_LDOPTS='-shared'
        MKSHLIB='$(CXX) $(DSO_LDOPTS) -o $@'
        MKCSHLIB='$(CC) $(DSO_LDOPTS) -o $@'
        RC='$(WINDRES)'
        # Use static libgcc and libstdc++
        LDFLAGS="$LDFLAGS -static"
        # Use temp file for windres (bug 213281)
        RCFLAGS='-O coff --use-temp-file'
        # mingw doesn't require kernel32, user32, and advapi32 explicitly
        LIBS="$LIBS -lgdi32 -lwinmm -lwsock32 -lpsapi"
        MOZ_FIX_LINK_PATHS=
        DLL_PREFIX=
        IMPORT_LIB_SUFFIX=a

        WIN32_CONSOLE_EXE_LDFLAGS=-mconsole
        WIN32_GUI_EXE_LDFLAGS=-mwindows

        # We use mix of both POSIX and Win32 printf format across the tree, so format
        # warnings are useless on mingw.
        
    echo $ac_n "checking whether the C compiler supports -Wno-format""... $ac_c" 1>&6
echo "configure:8424: checking whether the C compiler supports -Wno-format" >&5
if eval "test \"`echo '$''{'ac_c_has_wno_format'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wformat"
            cat > conftest.$ac_ext <<EOF
#line 8440 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:8447: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_wno_format="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_wno_format="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_wno_format" 1>&6
    if test "${ac_c_has_wno_format}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-format"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Wno-format""... $ac_c" 1>&6
echo "configure:8475: checking whether the C++ compiler supports -Wno-format" >&5
if eval "test \"`echo '$''{'ac_cxx_has_wno_format'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wformat"
            cat > conftest.$ac_ext <<EOF
#line 8491 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:8498: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_wno_format="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_wno_format="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_wno_format" 1>&6
    if test "${ac_cxx_has_wno_format}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-format"
    fi

    else
        TARGET_COMPILER_ABI=msvc
        HOST_CC='$(CC)'
        HOST_CXX='$(CXX)'
        HOST_LD='$(LD)'
        if test "$AS_BIN"; then
            AS="$(basename "$AS_BIN")"
        fi
        AR='lib'
        AR_FLAGS='-NOLOGO -OUT:$@'
        AR_EXTRACT=
        RANLIB='echo not_ranlib'
        STRIP='echo not_strip'
        PKG_SKIP_STRIP=1
        XARGS=xargs
        DOXYGEN=:
        ASM_SUFFIX=asm
        OBJ_SUFFIX=obj
        LIB_SUFFIX=lib
        DLL_PREFIX=
        LIB_PREFIX=
        IMPORT_LIB_SUFFIX=lib
        MKSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
        MKCSHLIB='$(LD) -NOLOGO -DLL -OUT:$@ -PDB:$(LINK_PDBFILE) $(DSO_LDOPTS)'
                if test "$CPU_ARCH" = "x86"; then
            WIN32_SUBSYSTEM_VERSION=5.01
        else
            WIN32_SUBSYSTEM_VERSION=6.01
        fi
        WIN32_CONSOLE_EXE_LDFLAGS=-SUBSYSTEM:CONSOLE,$WIN32_SUBSYSTEM_VERSION
        WIN32_GUI_EXE_LDFLAGS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
        DSO_LDOPTS=-SUBSYSTEM:WINDOWS,$WIN32_SUBSYSTEM_VERSION
        _USE_CPP_INCLUDE_FLAG=1
        _DEFINES_CFLAGS='-FI $(DEPTH)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
        _DEFINES_CXXFLAGS='-FI $(DEPTH)/js/src/js-confdefs.h -DMOZILLA_CLIENT'
        CFLAGS="$CFLAGS -W3 -Gy"
        CXXFLAGS="$CXXFLAGS -W3 -Gy"
        if test "$CPU_ARCH" = "x86" -a -z "$CLANG_CL"; then
                                                CFLAGS="$CFLAGS -arch:IA32"
            CXXFLAGS="$CXXFLAGS -arch:IA32"
        fi
                        CFLAGS="$CFLAGS -FS"
        CXXFLAGS="$CXXFLAGS -FS"
        # khuey says we can safely ignore MSVC warning C4251
        # MSVC warning C4244 (implicit type conversion may lose data) warns
        # and requires workarounds for perfectly valid code.  Also, GCC/clang
        # don't warn about it by default. So for consistency/sanity, we turn
        # it off on MSVC, too.
        # MSVC warning C4267 warns for narrowing type conversions from size_t
        # to 32-bit integer types on 64-bit platforms.  Since this is virtually
        # the same thing as C4244, we disable C4267, too.
        CFLAGS="$CFLAGS -wd4244 -wd4267"
        CXXFLAGS="$CXXFLAGS -wd4244 -wd4267 -wd4251"
        if test -n "$CLANG_CL"; then
            # Suppress the clang-cl warning for the inline 'new' and 'delete' in mozalloc
            CXXFLAGS="$CXXFLAGS -Wno-inline-new-delete"
        fi
        # make 'foo == bar;' error out
        CFLAGS="$CFLAGS -we4553"
        CXXFLAGS="$CXXFLAGS -we4553"
        LIBS="$LIBS kernel32.lib user32.lib gdi32.lib winmm.lib wsock32.lib advapi32.lib psapi.lib"
        MOZ_DEBUG_LDFLAGS='-DEBUG -DEBUGTYPE:CV'
        WARNINGS_AS_ERRORS='-WX'
        MOZ_OPTIMIZE_FLAGS="-O2"
        MOZ_FIX_LINK_PATHS=
        # Disable these flags on clang-cl since it doesn't ignore unknown arguments by default, and
        # autoconf insists on passing $LDFLAGS to the compiler.
        if test -z "$CLANG_CL"; then
            LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE -NXCOMPAT"
            if test -z "$DEVELOPER_OPTIONS"; then
                LDFLAGS="$LDFLAGS -RELEASE"
            fi
        fi
                PROFILE_GEN_CFLAGS="-GL"
        PROFILE_GEN_LDFLAGS="-LTCG:PGINSTRUMENT"
                                                                PROFILE_USE_CFLAGS="-GL -wd4624 -wd4952"
                        PROFILE_USE_LDFLAGS="-LTCG:PGUPDATE"
        LDFLAGS="$LDFLAGS -DYNAMICBASE"
        RCFLAGS="-nologo"
    fi
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_SNPRINTF ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_SNPRINTF 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' HAVE__MSIZE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE__MSIZE 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' _WINDOWS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _WINDOWS 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' WIN32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define WIN32 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' XP_WIN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_WIN 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' XP_WIN32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_WIN32 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' HW_THREADS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HW_THREADS 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' STDC_HEADERS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' WIN32_LEAN_AND_MEAN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define WIN32_LEAN_AND_MEAN 1
EOF

    TARGET_MD_ARCH=win32
    _PLATFORM_DEFAULT_TOOLKIT='cairo-windows'
    BIN_SUFFIX='.exe'
    MOZ_USER_DIR="Mozilla"

        TARGET_NSPR_MDCPUCFG='\"md/_win95.cfg\"'

        no_x=yes
    cat >> confdefs.pytmp <<\EOF
    (''' NO_X11 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NO_X11 1
EOF


    case "$host_os" in
    cygwin*|msvc*|mks*)
        { echo "configure: error: Using a Cygwin build environment is unsupported. Configure cannot check for presence of necessary headers. Please upgrade to MozillaBuild; see https://developer.mozilla.org/en/Windows_Build_Prerequisites." 1>&2; echo "configure: error: Using a Cygwin build environment is unsupported. Configure cannot check for presence of necessary headers. Please upgrade to MozillaBuild; see https://developer.mozilla.org/en/Windows_Build_Prerequisites." 1>&5; exit 1; }
        ;;
    esac

    case "$target" in
    i*86-*)
        if test "$HAVE_64BIT_BUILD"; then
            { echo "configure: error: You are targeting i386 but using the 64-bit compiler." 1>&2; echo "configure: error: You are targeting i386 but using the 64-bit compiler." 1>&5; exit 1; }
        fi

        if test -n "$GNU_CC"; then
            CFLAGS="$CFLAGS -mstackrealign -fno-keep-inline-dllexport"
            CXXFLAGS="$CXXFLAGS -mstackrealign -fno-keep-inline-dllexport"
            LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
        else
            DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X86"
            # Disable this flag on clang-cl since it doesn't ignore unknown arguments by default, and
            # autoconf insists on passing $LDFLAGS to the compiler.
            if test -z "$CLANG_CL"; then
                LDFLAGS="$LDFLAGS -SAFESEH"
            fi
        fi

    	cat >> confdefs.pytmp <<\EOF
    (''' _X86_ ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _X86_ 1
EOF

	;;
    x86_64-*)
        if test -n "$_WIN32_MSVC"; then
            DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X64"
        fi
        cat >> confdefs.pytmp <<\EOF
    (''' _AMD64_ ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _AMD64_ 1
EOF

        ;;
    *)
    	cat >> confdefs.pytmp <<\EOF
    (''' _CPU_ARCH_NOT_DEFINED ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _CPU_ARCH_NOT_DEFINED 1
EOF

	;;
    esac
    ;;

*-netbsd*)
    DSO_CFLAGS=''
    CFLAGS="$CFLAGS -Dunix"
    CXXFLAGS="$CXXFLAGS -Dunix"
    if $CC -E - -dM </dev/null | grep __ELF__ >/dev/null; then
        DLL_SUFFIX=".so"
        DSO_PIC_CFLAGS='-fPIC -DPIC'
        DSO_LDOPTS='-shared'
	BIN_FLAGS='-Wl,--export-dynamic'
    else
    	DSO_PIC_CFLAGS='-fPIC -DPIC'
    	DLL_SUFFIX=".so.1.0"
    	DSO_LDOPTS='-shared'
    fi
    # This will fail on a.out systems prior to 1.5.1_ALPHA.
    if test "$LIBRUNPATH"; then
	DSO_LDOPTS="-Wl,-R$LIBRUNPATH $DSO_LDOPTS"
    fi
    MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,$(DSO_SONAME) -o $@'
    MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_CFLAGS) $(DSO_LDOPTS) -Wl,-soname,$(DSO_SONAME) -o $@'
    ;;

*-openbsd*)
    DLL_SUFFIX=".so.1.0"
    DSO_CFLAGS=''
    DSO_PIC_CFLAGS='-fPIC'
    DSO_LDOPTS='-shared -fPIC'
    if test "$LIBRUNPATH"; then
	DSO_LDOPTS="-R$LIBRUNPATH $DSO_LDOPTS"
    fi
    ;;

*-solaris*)
    cat >> confdefs.pytmp <<\EOF
    (''' SOLARIS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define SOLARIS 1
EOF

    TARGET_NSPR_MDCPUCFG='\"md/_solaris.cfg\"'
    if test -z "$CROSS_COMPILE" && pkginfo -q SUNWpr && pkginfo -q SUNWprd; then
       NO_NSPR_CONFIG_SYSTEM_LDFLAGS="-L/usr/lib/mps -R/usr/lib/mps -lnspr4"
       NO_NSPR_CONFIG_SYSTEM_CFLAGS="-I/usr/include/mps"
       NO_NSPR_CONFIG_SYSTEM_VERSION="`pkgparam SUNWpr SUNW_PRODVERS | sed -e 's/^[1-9][0-9]*\.[0-9][0-9]*$/&.0/'`"
    fi
    MOZ_FIX_LINK_PATHS=
    # $ORIGIN/.. is for shared libraries under components/ to locate shared
    # libraries one level up (e.g. libnspr4.so)
    if test "$SOLARIS_SUNPRO_CC"; then
       LDFLAGS="$LDFLAGS -z ignore -R '\$\$ORIGIN:\$\$ORIGIN/..' -z lazyload -z combreloc -z muldefs"
       LIBS="-lCrun -lCstd -lc $LIBS"
       cat >> confdefs.pytmp <<\EOF
    (''' NSCAP_DISABLE_DEBUG_PTR_TYPES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NSCAP_DISABLE_DEBUG_PTR_TYPES 1
EOF

       CFLAGS="$CFLAGS -xlibmieee -xstrconst -xbuiltin=%all -D__FUNCTION__=__func__"
       CXXFLAGS="$CXXFLAGS -xlibmieee -xbuiltin=%all -features=tmplife,tmplrefstatic,extensions,no%except -norunpath -D__FUNCTION__=__func__ -template=no%extdef"
       LDFLAGS="-xildoff $LDFLAGS"
       if test -z "$CROSS_COMPILE" -a -f /usr/lib/ld/map.noexstk; then
           _SAVE_LDFLAGS=$LDFLAGS
           LDFLAGS="-M /usr/lib/ld/map.noexstk $LDFLAGS"
           cat > conftest.$ac_ext <<EOF
#line 8806 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
printf("Hello World\n");
; return 0; }
EOF
if { (eval echo configure:8813: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  LDFLAGS=$_SAVE_LDFLAGS
fi
rm -f conftest*
       fi
       MOZ_OPTIMIZE_FLAGS="-xO4"
       MKSHLIB='$(CXX) $(CXXFLAGS) $(DSO_PIC_FLAGS) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
       MKCSHLIB='$(CC) $(CFLAGS) $(DSO_PIC_FLAGS) $(DSO_LDOPTS) -h $(DSO_SONAME) -o $@'
       DSO_LDOPTS='-G'
       AR_LIST="$AR t"
       AR_EXTRACT="$AR x"
       AR_DELETE="$AR d"
       AR='$(CXX) -xar'
       AR_FLAGS='-o $@'
       AS='/usr/ccs/bin/as'
       ASFLAGS="$ASFLAGS -K PIC -L -P -D_ASM -D__STDC__=0"
       AS_DASH_C_FLAG=''
       TARGET_COMPILER_ABI="sunc"
       CC_VERSION=`$CC -V 2>&1 | grep '^cc:' 2>/dev/null | $AWK -F\: '{ print $2 }'`
       CXX_VERSION=`$CXX -V 2>&1 | grep '^CC:' 2>/dev/null | $AWK -F\: '{ print $2 }'`
       echo $ac_n "checking for Sun C++ compiler version >= 5.9""... $ac_c" 1>&6
echo "configure:8839: checking for Sun C++ compiler version >= 5.9" >&5
       
       ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

       cat > conftest.$ac_ext <<EOF
#line 8849 "configure"
#include "confdefs.h"

int main() {
#if (__SUNPRO_CC < 0x590)
           #error "Denied"
           #endif
; return 0; }
EOF
if { (eval echo configure:8858: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  _BAD_COMPILER=
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _BAD_COMPILER=1
fi
rm -f conftest*
       if test -n "$_BAD_COMPILER"; then
           _res="no"
           { echo "configure: error: Sun C++ 5.9 (Sun Studio 12) or higher is required to build. Your compiler version is $CXX_VERSION ." 1>&2; echo "configure: error: Sun C++ 5.9 (Sun Studio 12) or higher is required to build. Your compiler version is $CXX_VERSION ." 1>&5; exit 1; }
       else
           _res="yes"
       fi
       cat > conftest.$ac_ext <<EOF
#line 8875 "configure"
#include "confdefs.h"

int main() {
#if (__SUNPRO_CC >= 0x5100)
           #error "Sun C++ 5.10 or above"
           #endif
; return 0; }
EOF
if { (eval echo configure:8884: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  _ABOVE_SS12U1=
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _ABOVE_SS12U1=1
fi
rm -f conftest*
       if test "$_ABOVE_SS12U1"; then
           # disable xannotate
           CXXFLAGS="$CXXFLAGS -xannotate=no"
       fi
       echo "$ac_t""$_res" 1>&6
       ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

    else
       LDFLAGS="$LDFLAGS -Wl,-z,ignore -Wl,-R,'\$\$ORIGIN:\$\$ORIGIN/..' -Wl,-z,lazyload -Wl,-z,combreloc -Wl,-z,muldefs"
       LIBS="-lc $LIBS"
       ASFLAGS="$ASFLAGS -fPIC"
       DSO_LDOPTS='-shared'
       WARNINGS_AS_ERRORS='-Werror'
       _WARNINGS_CFLAGS=''
       _WARNINGS_CXXFLAGS=''
       if test "$OS_RELEASE" = "5.3"; then
           cat >> confdefs.pytmp <<\EOF
    (''' MUST_UNDEF_HAVE_BOOLEAN_AFTER_INCLUDES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MUST_UNDEF_HAVE_BOOLEAN_AFTER_INCLUDES 1
EOF

       fi
    fi
    if test "$OS_RELEASE" = "5.5.1"; then
        cat >> confdefs.pytmp <<\EOF
    (''' NEED_USLEEP_PROTOTYPE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NEED_USLEEP_PROTOTYPE 1
EOF

    fi
    ;;

*-sunos*)
    DSO_LDOPTS='-Bdynamic'
    MKSHLIB='-$(LD) $(DSO_LDOPTS) -o $@'
    MKCSHLIB='-$(LD) $(DSO_LDOPTS) -o $@'
    cat >> confdefs.pytmp <<\EOF
    (''' SUNOS4 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define SUNOS4 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' SPRINTF_RETURNS_STRING ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define SPRINTF_RETURNS_STRING 1
EOF

    case "$(target_os)" in
    sunos4.1*)
        DLL_SUFFIX='.so.1.0'
        ;;
    esac
    ;;

esac

cat >> confdefs.pytmp <<EOF
    (''' D_INO ''', r''' $DIRENT_INO ''')
EOF
cat >> confdefs.h <<EOF
#define D_INO $DIRENT_INO
EOF


case "$target" in
    *-linux*|*-kfreebsd*-gnu|*-gnu*)
        MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script'
        ;;
    *-solaris*)
        if test -z "$GNU_CC"; then
         MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-M $(BUILD_TOOLS)/gnu-ld-scripts/components-mapfile'
        else
         if test -z "$GCC_USE_GNU_LD"; then
          MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,-M -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-mapfile'
         else
          MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script'
         fi
        fi
        ;;
    *-darwin*)
        MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,-exported_symbols_list -Wl,$(BUILD_TOOLS)/gnu-ld-scripts/components-export-list'
        ;;
    *-mingw*)
        if test -n "$GNU_CC"; then
           MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS='-Wl,--version-script,$(BUILD_TOOLS)/gnu-ld-scripts/components-version-script'
        fi
        ;;
esac

if test -z "$COMPILE_ENVIRONMENT"; then
    SKIP_COMPILER_CHECKS=1
    SKIP_LIBRARY_CHECKS=1
fi


case "$target" in
i?86-*)
    ENABLE_ION=1
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CPU_X86 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CPU_X86 1
EOF

    ;;
x86_64*-*)
    ENABLE_ION=1
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CPU_X64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CPU_X64 1
EOF

    ;;
arm*-*)
    ENABLE_ION=1
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CPU_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CPU_ARM 1
EOF

    ;;
sparc-*)
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CPU_SPARC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CPU_SPARC 1
EOF

    ;;
mips*-*)
    ENABLE_ION=1
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CPU_MIPS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CPU_MIPS 1
EOF

    ;;
esac

if test "$HAVE_64BIT_BUILD" ; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_PUNBOX64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_PUNBOX64 1
EOF

else
    cat >> confdefs.pytmp <<\EOF
    (''' JS_NUNBOX32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_NUNBOX32 1
EOF

fi

# Check whether --enable-ion or --disable-ion was given.
if test "${enable_ion+set}" = set; then
  enableval="$enable_ion"
  if test "$enableval" = "no"; then
    ENABLE_ION= 
  elif test "$enableval" = "yes"; then
    :
  else
    { echo "configure: error: Option, ion, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, ion, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi






if test -n "$COMPILE_ENVIRONMENT"; then
    
  
if test -z "$MOZ_DEBUG_FLAGS"; then
  if test -n "$_MSC_VER"; then
    MOZ_DEBUG_FLAGS="-Zi"
  else
    MOZ_DEBUG_FLAGS="-g"
  fi
fi



# Check whether --enable-debug or --disable-debug was given.
if test "${enable_debug+set}" = set; then
  enableval="$enable_debug"
   if test "$enableval" != "no"; then
    MOZ_DEBUG=1
    if test -n "$enableval" -a "$enableval" != "yes"; then
        MOZ_DEBUG_FLAGS=`echo $enableval | sed -e 's|\\\ | |g'`
        _MOZ_DEBUG_FLAGS_SET=1
    fi
  else
    MOZ_DEBUG=
  fi 
else
  MOZ_DEBUG=
fi


if test -z "$MOZ_DEBUG" -o -n "$MOZ_ASAN"; then
    MOZ_NO_DEBUG_RTL=1
fi



MOZ_DEBUG_ENABLE_DEFS="-DDEBUG -DTRACING"
# Check whether --with-debug-label or --without-debug-label was given.
if test "${with_debug_label+set}" = set; then
  withval="$with_debug_label"
   for option in `echo $withval | sed 's/,/ /g'`; do
    MOZ_DEBUG_ENABLE_DEFS="$MOZ_DEBUG_ENABLE_DEFS -DDEBUG_${option}"
done
fi


if test -n "$MOZ_DEBUG"; then
    echo $ac_n "checking for valid debug flags""... $ac_c" 1>&6
echo "configure:9136: checking for valid debug flags" >&5
    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS $MOZ_DEBUG_FLAGS"
    cat > conftest.$ac_ext <<EOF
#line 9140 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
printf("Hello World\n");
; return 0; }
EOF
if { (eval echo configure:9147: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  _results=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _results=no
fi
rm -f conftest*
    echo "$ac_t""$_results" 1>&6
    if test "$_results" = "no"; then
        { echo "configure: error: These compiler flags are invalid: $MOZ_DEBUG_FLAGS" 1>&2; echo "configure: error: These compiler flags are invalid: $MOZ_DEBUG_FLAGS" 1>&5; exit 1; }
    fi
    CFLAGS=$_SAVE_CFLAGS

    MOZ_DEBUG_DEFINES="$MOZ_DEBUG_ENABLE_DEFS"
else
    MOZ_DEBUG_DEFINES="-DNDEBUG -DTRIMMED"
fi



# Check whether --enable-debug-symbols or --disable-debug-symbols was given.
if test "${enable_debug_symbols+set}" = set; then
  enableval="$enable_debug_symbols"
   if test "$enableval" != "no"; then
      MOZ_DEBUG_SYMBOLS=1
      if test -n "$enableval" -a "$enableval" != "yes"; then
          if test -z "$_MOZ_DEBUG_FLAGS_SET"; then
              MOZ_DEBUG_FLAGS=`echo $enableval | sed -e 's|\\\ | |g'`
          else
              { echo "configure: error: --enable-debug-symbols flags cannot be used with --enable-debug flags" 1>&2; echo "configure: error: --enable-debug-symbols flags cannot be used with --enable-debug flags" 1>&5; exit 1; }
          fi
      fi
  else
      MOZ_DEBUG_SYMBOLS=
  fi 
else
  MOZ_DEBUG_SYMBOLS=1
fi


if test -n "$MOZ_DEBUG" -o -n "$MOZ_DEBUG_SYMBOLS"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_DEBUG_SYMBOLS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_DEBUG_SYMBOLS 1
EOF

    export MOZ_DEBUG_SYMBOLS
fi


  
# Check whether --enable-cpp-rtti or --disable-cpp-rtti was given.
if test "${enable_cpp_rtti+set}" = set; then
  enableval="$enable_cpp_rtti"
  if test "$enableval" = "yes"; then
     _MOZ_USE_RTTI=1 
  elif test "$enableval" = "no"; then
     _MOZ_USE_RTTI= 
  else
    { echo "configure: error: Option, cpp-rtti, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, cpp-rtti, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test -z "$_MOZ_USE_RTTI"; then
    if test "$GNU_CC"; then
        CXXFLAGS="$CXXFLAGS -fno-rtti"
    else
        case "$target" in
        *-mingw*)
            CXXFLAGS="$CXXFLAGS -GR-"
        esac
    fi
fi

if test "$CLANG_CXX"; then
    ## We disable return-type-c-linkage because jsval is defined as a C++ type but is
    ## returned by C functions. This is possible because we use knowledge about the ABI
    ## to typedef it to a C type with the same layout when the headers are included
    ## from C.
    _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-unknown-warning-option -Wno-return-type-c-linkage"
fi

echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) actually is a C++ compiler""... $ac_c" 1>&6
echo "configure:9236: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) actually is a C++ compiler" >&5

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

_SAVE_LIBS=$LIBS
LIBS=
cat > conftest.$ac_ext <<EOF
#line 9248 "configure"
#include "confdefs.h"
#include <new>
int main() {
int *foo = new int;
; return 0; }
EOF
if { (eval echo configure:9255: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
            { echo "configure: error: $CXX $CXXFLAGS $LDFLAGS failed to compile and link a simple C++ source." 1>&2; echo "configure: error: $CXX $CXXFLAGS $LDFLAGS failed to compile and link a simple C++ source." 1>&5; exit 1; }
fi
rm -f conftest*
LIBS=$_SAVE_LIBS
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo "$ac_t""yes" 1>&6

if test -n "$DEVELOPER_OPTIONS"; then
    MOZ_FORCE_GOLD=1
fi

# Check whether --enable-gold or --disable-gold was given.
if test "${enable_gold+set}" = set; then
  enableval="$enable_gold"
  if test "$enableval" = "yes"; then
    MOZ_FORCE_GOLD=1
  elif test "$enableval" = "no"; then
    MOZ_FORCE_GOLD=
    
  else
    { echo "configure: error: Option, gold, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, gold, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$GNU_CC" -a -n "$MOZ_FORCE_GOLD"; then
            if $CC -Wl,--version 2>&1 | grep -q "GNU ld"; then
        GOLD=$($CC -print-prog-name=ld.gold)
        case "$GOLD" in
        /*)
            ;;
        *)
            GOLD=$(which $GOLD)
            ;;
        esac
        if test -n "$GOLD"; then
            mkdir -p $_objdir/build/unix/gold
            rm -f $_objdir/build/unix/gold/ld
            ln -s "$GOLD" $_objdir/build/unix/gold/ld
            if $CC -B $_objdir/build/unix/gold -Wl,--version 2>&1 | grep -q "GNU gold"; then
                LDFLAGS="$LDFLAGS -B $_objdir/build/unix/gold"
            else
                rm -rf $_objdir/build/unix/gold
            fi
        fi
    fi
fi
if test "$GNU_CC"; then
    if $CC $LDFLAGS -Wl,--version 2>&1 | grep -q "GNU ld"; then
        LD_IS_BFD=1
    fi
fi



if test "$GNU_CC"; then
    if test -z "$DEVELOPER_OPTIONS"; then
        CFLAGS="$CFLAGS -ffunction-sections -fdata-sections"
        CXXFLAGS="$CXXFLAGS -ffunction-sections -fdata-sections"
    fi
    CFLAGS="$CFLAGS -fno-math-errno"
    CXXFLAGS="$CXXFLAGS -fno-exceptions -fno-math-errno"
fi


# Check whether --enable-icf or --disable-icf was given.
if test "${enable_icf+set}" = set; then
  enableval="$enable_icf"
  if test "$enableval" = "no"; then
    MOZ_DISABLE_ICF=1
  elif test "$enableval" = "yes"; then
    MOZ_DISABLE_ICF= 
  else
    { echo "configure: error: Option, icf, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, icf, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -z "$MOZ_DISABLE_ICF" -a -z "$DEVELOPER_OPTIONS"; then
    echo $ac_n "checking whether the linker supports Identical Code Folding""... $ac_c" 1>&6
echo "configure:9348: checking whether the linker supports Identical Code Folding" >&5
if eval "test \"`echo '$''{'LD_SUPPORTS_ICF'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'int foo() {return 42;}' \
              'int bar() {return 42;}' \
              'int main() {return foo() - bar();}' > conftest.${ac_ext}
        # If the linker supports ICF, foo and bar symbols will have
        # the same address
        if { ac_try='${CC-cc} -o conftest${ac_exeext} $LDFLAGS -Wl,--icf=safe -ffunction-sections conftest.${ac_ext} $LIBS 1>&2'; { (eval echo configure:9357: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } &&
           test -s conftest${ac_exeext} &&
           objdump -t conftest${ac_exeext} | awk '{a[$6] = $1} END {if (a["foo"] && (a["foo"] != a["bar"])) { exit 1 }}'; then
            LD_SUPPORTS_ICF=yes
        else
            LD_SUPPORTS_ICF=no
        fi
        rm -rf conftest*
fi

echo "$ac_t""$LD_SUPPORTS_ICF" 1>&6
    if test "$LD_SUPPORTS_ICF" = yes; then
        _SAVE_LDFLAGS="$LDFLAGS -Wl,--icf=safe"
        LDFLAGS="$LDFLAGS -Wl,--icf=safe -Wl,--print-icf-sections"
        cat > conftest.$ac_ext <<EOF
#line 9372 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:9379: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  LD_PRINT_ICF_SECTIONS=-Wl,--print-icf-sections
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  LD_PRINT_ICF_SECTIONS=
fi
rm -f conftest*
        
        LDFLAGS="$_SAVE_LDFLAGS"
    fi
fi


if test "$GNU_CC" -a "$GCC_USE_GNU_LD" -a -z "$DEVELOPER_OPTIONS"; then
    if test -n "$MOZ_DEBUG_FLAGS"; then
                echo $ac_n "checking whether removing dead symbols breaks debugging""... $ac_c" 1>&6
echo "configure:9398: checking whether removing dead symbols breaks debugging" >&5
if eval "test \"`echo '$''{'GC_SECTIONS_BREAKS_DEBUG_RANGES'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo 'int foo() {return 42;}' \
                  'int bar() {return 1;}' \
                  'int main() {return foo();}' > conftest.${ac_ext}
            if { ac_try='${CC-cc} -o conftest.${ac_objext} $CFLAGS $MOZ_DEBUG_FLAGS -c conftest.${ac_ext} 1>&2'; { (eval echo configure:9405: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } &&
                { ac_try='${CC-cc} -o conftest${ac_exeext} $LDFLAGS $MOZ_DEBUG_FLAGS -Wl,--gc-sections conftest.${ac_objext} $LIBS 1>&2'; { (eval echo configure:9406: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } &&
                test -s conftest${ac_exeext} -a -s conftest.${ac_objext}; then
                 if test "`$PYTHON -m mozbuild.configure.check_debug_ranges conftest.${ac_objext} conftest.${ac_ext}`" = \
                         "`$PYTHON -m mozbuild.configure.check_debug_ranges conftest${ac_exeext} conftest.${ac_ext}`"; then
                     GC_SECTIONS_BREAKS_DEBUG_RANGES=no
                 else
                     GC_SECTIONS_BREAKS_DEBUG_RANGES=yes
                 fi
             else
                                    GC_SECTIONS_BREAKS_DEBUG_RANGES="no, but it's broken in some other way"
             fi
             rm -rf conftest*
fi

echo "$ac_t""$GC_SECTIONS_BREAKS_DEBUG_RANGES" 1>&6
         if test "$GC_SECTIONS_BREAKS_DEBUG_RANGES" = no; then
             DSO_LDOPTS="$DSO_LDOPTS -Wl,--gc-sections"
         fi
    else
        DSO_LDOPTS="$DSO_LDOPTS -Wl,--gc-sections"
    fi
fi

# bionic in Android < 4.1 doesn't support PIE
# On OSX, the linker defaults to building PIE programs when targetting OSX 10.7+,
# but not when targetting OSX < 10.7. OSX < 10.7 doesn't support running PIE
# programs, so as long as support for OSX 10.6 is kept, we can't build PIE.
# Even after dropping 10.6 support, MOZ_PIE would not be useful since it's the
# default (and clang says the -pie option is not used).
# On other Unix systems, some file managers (Nautilus) can't start PIE programs
if test -n "$gonkdir" && test "$ANDROID_VERSION" -ge 16; then
    MOZ_PIE=1
else
    MOZ_PIE=
fi

# Check whether --enable-pie or --disable-pie was given.
if test "${enable_pie+set}" = set; then
  enableval="$enable_pie"
  if test "$enableval" = "yes"; then
    MOZ_PIE=1
  elif test "$enableval" = "no"; then
    MOZ_PIE= 
  else
    { echo "configure: error: Option, pie, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, pie, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$GNU_CC" -a -n "$MOZ_PIE"; then
    echo $ac_n "checking for PIE support""... $ac_c" 1>&6
echo "configure:9457: checking for PIE support" >&5
    _SAVE_LDFLAGS=$LDFLAGS
    LDFLAGS="$LDFLAGS -pie"
    cat > conftest.$ac_ext <<EOF
#line 9461 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:9468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
                  MOZ_PROGRAM_LDFLAGS="$MOZ_PROGRAM_LDFLAGS -pie"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
                  { echo "configure: error: --enable-pie requires PIE support from the linker." 1>&2; echo "configure: error: --enable-pie requires PIE support from the linker." 1>&5; exit 1; }
fi
rm -f conftest*
    LDFLAGS=$_SAVE_LDFLAGS
fi



if test -n "$GCC_USE_GNU_LD"; then
  case "$LDFLAGS" in
  *-fsanitize=address*)
    LDFLAGS="$LDFLAGS -Wl,-Bsymbolic"
    ;;
  esac
fi


fi

if test -z "$SKIP_COMPILER_CHECKS"; then
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
echo "configure:9498: checking for ANSI C header files" >&5
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9503 "configure"
#include "confdefs.h"
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
EOF
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
{ (eval echo configure:9511: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
if test -z "$ac_err"; then
  rm -rf conftest*
  ac_cv_header_stdc=yes
else
  echo "$ac_err" >&5
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_header_stdc=no
fi
rm -f conftest*

if test $ac_cv_header_stdc = yes; then
  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
cat > conftest.$ac_ext <<EOF
#line 9528 "configure"
#include "confdefs.h"
#include <string.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "memchr" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  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 > conftest.$ac_ext <<EOF
#line 9546 "configure"
#include "confdefs.h"
#include <stdlib.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "free" >/dev/null 2>&1; then
  :
else
  rm -rf conftest*
  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 > conftest.$ac_ext <<EOF
#line 9567 "configure"
#include "confdefs.h"
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#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)) exit(2);
exit (0); }

EOF
if { (eval echo configure:9578: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_header_stdc=no
fi
rm -fr conftest*
fi

fi
fi

echo "$ac_t""$ac_cv_header_stdc" 1>&6
if test $ac_cv_header_stdc = yes; then
  cat >> confdefs.pytmp <<\EOF
    (''' STDC_HEADERS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define STDC_HEADERS 1
EOF

fi

echo $ac_n "checking for working const""... $ac_c" 1>&6
echo "configure:9605: checking for working const" >&5
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9610 "configure"
#include "confdefs.h"

int main() {

/* Ultrix mips cc rejects this.  */
typedef int charset[2]; const charset x;
/* SunOS 4.1.1 cc rejects this.  */
char const *const *ccp;
char **p;
/* NEC SVR4.0.2 mips cc rejects this.  */
struct point {int x, y;};
static struct point const zero = {0,0};
/* AIX XL C 1.02.0.0 rejects this.
   It does not let you subtract one const X* pointer from another in an arm
   of an if-expression whose if-part is not a constant expression */
const char *g = "string";
ccp = &g + (g ? g-g : 0);
/* HPUX 7.0 cc rejects these. */
++ccp;
p = (char**) ccp;
ccp = (char const *const *) p;
{ /* SCO 3.2v4 cc rejects this.  */
  char *t;
  char const *s = 0 ? (char *) 0 : (char const *) 0;

  *t++ = 0;
}
{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
  int x[] = {25, 17};
  const int *foo = &x[0];
  ++foo;
}
{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
  typedef const int *iptr;
  iptr p = 0;
  ++p;
}
{ /* AIX XL C 1.02.0.0 rejects this saying
     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
  struct s { int j; const int *ap[3]; };
  struct s *b; b->j = 5;
}
{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
  const int foo = 10;
}

; return 0; }
EOF
if { (eval echo configure:9659: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_c_const=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_c_const=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_c_const" 1>&6
if test $ac_cv_c_const = no; then
  cat >> confdefs.pytmp <<\EOF
    (''' const ''', r'''  ''')
EOF
cat >> confdefs.h <<\EOF
#define const 
EOF

fi

echo $ac_n "checking for mode_t""... $ac_c" 1>&6
echo "configure:9683: checking for mode_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9688 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_mode_t=yes
else
  rm -rf conftest*
  ac_cv_type_mode_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_mode_t" 1>&6
if test $ac_cv_type_mode_t = no; then
  cat >> confdefs.pytmp <<\EOF
    (''' mode_t ''', r''' int ''')
EOF
cat >> confdefs.h <<\EOF
#define mode_t int
EOF

fi

echo $ac_n "checking for off_t""... $ac_c" 1>&6
echo "configure:9719: checking for off_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_off_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9724 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])off_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_off_t=yes
else
  rm -rf conftest*
  ac_cv_type_off_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_off_t" 1>&6
if test $ac_cv_type_off_t = no; then
  cat >> confdefs.pytmp <<\EOF
    (''' off_t ''', r''' long ''')
EOF
cat >> confdefs.h <<\EOF
#define off_t long
EOF

fi

echo $ac_n "checking for pid_t""... $ac_c" 1>&6
echo "configure:9755: checking for pid_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9760 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_pid_t=yes
else
  rm -rf conftest*
  ac_cv_type_pid_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_pid_t" 1>&6
if test $ac_cv_type_pid_t = no; then
  cat >> confdefs.pytmp <<\EOF
    (''' pid_t ''', r''' int ''')
EOF
cat >> confdefs.h <<\EOF
#define pid_t int
EOF

fi

echo $ac_n "checking for size_t""... $ac_c" 1>&6
echo "configure:9791: checking for size_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9796 "configure"
#include "confdefs.h"
#include <sys/types.h>
#if STDC_HEADERS
#include <stdlib.h>
#include <stddef.h>
#endif
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_type_size_t=yes
else
  rm -rf conftest*
  ac_cv_type_size_t=no
fi
rm -f conftest*

fi
echo "$ac_t""$ac_cv_type_size_t" 1>&6
if test $ac_cv_type_size_t = no; then
  cat >> confdefs.pytmp <<\EOF
    (''' size_t ''', r''' unsigned ''')
EOF
cat >> confdefs.h <<\EOF
#define size_t unsigned
EOF

fi

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

echo $ac_n "checking for ssize_t""... $ac_c" 1>&6
echo "configure:9841: checking for ssize_t" >&5
if eval "test \"`echo '$''{'ac_cv_type_ssize_t'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 9846 "configure"
#include "confdefs.h"
#include <stdio.h>
                  #include <sys/types.h>
int main() {
ssize_t foo = 0;
; return 0; }
EOF
if { (eval echo configure:9854: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_type_ssize_t=true
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_type_ssize_t=false
fi
rm -f conftest*
fi

if test "$ac_cv_type_ssize_t" = true ; then
  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_SSIZE_T ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_SSIZE_T 1
EOF

  echo "$ac_t""yes" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

 for ac_hdr in endian.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:9883: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 9888 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:9896: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

if test "$ac_cv_header_endian_h" = yes; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_HAVE_ENDIAN_H ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_HAVE_ENDIAN_H 1
EOF

fi

 for ac_hdr in machine/endian.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:9939: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 9944 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:9952: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

if test "$ac_cv_header_machine_endian_h" = yes; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_HAVE_MACHINE_ENDIAN_H ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_HAVE_MACHINE_ENDIAN_H 1
EOF

fi

 for ac_hdr in sys/isa_defs.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:9995: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10000 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10008: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

if test "$ac_cv_header_sys_isa_defs_h" = yes; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_HAVE_SYS_ISA_DEFS_H ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_HAVE_SYS_ISA_DEFS_H 1
EOF

fi

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross



ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

if test "$GNU_CXX"; then
    CXXFLAGS="$CXXFLAGS -std=gnu++0x"
    _ADDED_CXXFLAGS="-std=gnu++0x"

    echo $ac_n "checking for gcc c++0x headers bug without rtti""... $ac_c" 1>&6
echo "configure:10068: checking for gcc c++0x headers bug without rtti" >&5
if eval "test \"`echo '$''{'ac_cv_cxx0x_headers_bug'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10073 "configure"
#include "confdefs.h"
#include <memory>
int main() {

; return 0; }
EOF
if { (eval echo configure:10080: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_cxx0x_headers_bug="no"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_cxx0x_headers_bug="yes"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_cxx0x_headers_bug" 1>&6

    if test "$CLANG_CXX" -a "$ac_cv_cxx0x_headers_bug" = "yes"; then
        CXXFLAGS="$CXXFLAGS -I$_topsrcdir/build/unix/headers"
        _ADDED_CXXFLAGS="$_ADDED_CXXFLAGS -I$_topsrcdir/build/unix/headers"
        echo $ac_n "checking whether workaround for gcc c++0x headers conflict with clang works""... $ac_c" 1>&6
echo "configure:10098: checking whether workaround for gcc c++0x headers conflict with clang works" >&5
if eval "test \"`echo '$''{'ac_cv_cxx0x_clang_workaround'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10103 "configure"
#include "confdefs.h"
#include <memory>
int main() {

; return 0; }
EOF
if { (eval echo configure:10110: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_cxx0x_clang_workaround="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_cxx0x_clang_workaround="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_cxx0x_clang_workaround" 1>&6

        if test "ac_cv_cxx0x_clang_workaround" = "no"; then
            { echo "configure: error: Your toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&2; echo "configure: error: Your toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&5; exit 1; }
        fi
    elif test "$ac_cv_cxx0x_headers_bug" = "yes"; then
        { echo "configure: error: Your toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&2; echo "configure: error: Your toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&5; exit 1; }
    fi

    echo $ac_n "checking whether 64-bits std::atomic requires -latomic""... $ac_c" 1>&6
echo "configure:10132: checking whether 64-bits std::atomic requires -latomic" >&5
if eval "test \"`echo '$''{'ac_cv_needs_atomic'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10137 "configure"
#include "confdefs.h"
#include <cstdint>
             #include <atomic>
int main() {
 std::atomic<uint64_t> foo; foo = 1; 
; return 0; }
EOF
if { (eval echo configure:10145: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_needs_atomic=no
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _SAVE_LIBS="$LIBS"
            LIBS="$LIBS -latomic"
            cat > conftest.$ac_ext <<EOF
#line 10155 "configure"
#include "confdefs.h"
#include <cstdint>
                 #include <atomic>
int main() {
 std::atomic<uint64_t> foo; foo = 1; 
; return 0; }
EOF
if { (eval echo configure:10163: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_needs_atomic=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_needs_atomic="do not know; assuming no"
fi
rm -f conftest*
            LIBS="$_SAVE_LIBS"
        
fi
rm -f conftest*
    
fi

echo "$ac_t""$ac_cv_needs_atomic" 1>&6
    if test "$ac_cv_needs_atomic" = yes; then
      MOZ_NEEDS_LIBATOMIC=1
    else
      MOZ_NEEDS_LIBATOMIC=
    fi
    
fi

if test -n "$CROSS_COMPILE"; then
        cat > conftest.C <<EOF
#if defined(__clang__)
COMPILER CLANG __clang_major__.__clang_minor__.__clang_patchlevel__
#elif defined(__GNUC__)
COMPILER GCC __GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__
#endif
EOF
read dummy host_compiler HOST_CC_VERSION <<EOF
$($HOST_CC -E conftest.C 2>/dev/null | grep COMPILER)
EOF
read dummy host_cxxcompiler HOST_CXX_VERSION <<EOF
$($HOST_CXX -E conftest.C 2>/dev/null | grep COMPILER)
EOF
    rm conftest.C
    if test "$host_compiler" != "$host_cxxcompiler"; then
        { echo "configure: error: Your C and C++ host compilers are different.  You need to use the same compiler." 1>&2; echo "configure: error: Your C and C++ host compilers are different.  You need to use the same compiler." 1>&5; exit 1; }
    fi
    if test "$HOST_CC_VERSION" != "$HOST_CXX_VERSION"; then
        # This may not be strictly necessary, but if we want to drop it,
        # we should make sure any version checks below apply to both the
        # C and C++ compiler versions.
        { echo "configure: error: Your C and C++ host compiler versions are different.  You need to use the same compiler version." 1>&2; echo "configure: error: Your C and C++ host compiler versions are different.  You need to use the same compiler version." 1>&5; exit 1; }
    fi
    if test -n "$host_compiler"; then
        if test "$host_compiler" = "GCC" ; then
            
            HOST_GCC_VERSION_FULL="$HOST_CXX_VERSION"
            HOST_GCC_VERSION=`echo "$HOST_GCC_VERSION_FULL" | $PERL -pe '(split(/\./))[0]>=4&&s/(^\d*\.\d*).*/$1/;'`

            HOST_GCC_MAJOR_VERSION=`echo ${HOST_GCC_VERSION} | $AWK -F\. '{ print $1 }'`
            HOST_GCC_MINOR_VERSION=`echo ${HOST_GCC_VERSION} | $AWK -F\. '{ print $2 }'`
            

            if test "$HOST_GCC_MAJOR_VERSION" -eq 4 -a "$HOST_GCC_MINOR_VERSION" -lt 7 ||
               test "$HOST_GCC_MAJOR_VERSION" -lt 4; then
                { echo "configure: error: Only GCC 4.7 or newer supported for host compiler" 1>&2; echo "configure: error: Only GCC 4.7 or newer supported for host compiler" 1>&5; exit 1; }
            fi
        fi

        HOST_CXXFLAGS="$HOST_CXXFLAGS -std=gnu++0x"

        _SAVE_CXXFLAGS="$CXXFLAGS"
        _SAVE_CPPFLAGS="$CPPFLAGS"
        _SAVE_CXX="$CXX"
        CXXFLAGS="$HOST_CXXFLAGS"
        CPPFLAGS="$HOST_CPPFLAGS"
        CXX="$HOST_CXX"
        echo $ac_n "checking for host gcc c++0x headers bug without rtti""... $ac_c" 1>&6
echo "configure:10238: checking for host gcc c++0x headers bug without rtti" >&5
if eval "test \"`echo '$''{'ac_cv_host_cxx0x_headers_bug'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10243 "configure"
#include "confdefs.h"
#include <memory>
int main() {

; return 0; }
EOF
if { (eval echo configure:10250: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_host_cxx0x_headers_bug="no"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_host_cxx0x_headers_bug="yes"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_host_cxx0x_headers_bug" 1>&6

        if test "$host_compiler" = CLANG -a "$ac_cv_host_cxx0x_headers_bug" = "yes"; then
            CXXFLAGS="$CXXFLAGS -I$_topsrcdir/build/unix/headers"
            echo $ac_n "checking whether workaround for host gcc c++0x headers conflict with host clang works""... $ac_c" 1>&6
echo "configure:10267: checking whether workaround for host gcc c++0x headers conflict with host clang works" >&5
if eval "test \"`echo '$''{'ac_cv_host_cxx0x_clang_workaround'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10272 "configure"
#include "confdefs.h"
#include <memory>
int main() {

; return 0; }
EOF
if { (eval echo configure:10279: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_host_cxx0x_clang_workaround="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_host_cxx0x_clang_workaround="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_host_cxx0x_clang_workaround" 1>&6

            if test "ac_cv_host_cxx0x_clang_workaround" = "no"; then
                { echo "configure: error: Your host toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&2; echo "configure: error: Your host toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&5; exit 1; }
            fi
            HOST_CXXFLAGS="$CXXFLAGS"
        elif test "$ac_cv_host_cxx0x_headers_bug" = "yes"; then
            { echo "configure: error: Your host toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&2; echo "configure: error: Your host toolchain does not support C++0x/C++11 mode properly. Please upgrade your toolchain" 1>&5; exit 1; }
        fi
        CXXFLAGS="$_SAVE_CXXFLAGS"
        CPPFLAGS="$_SAVE_CPPFLAGS"
        CXX="$_SAVE_CXX"
    fi
elif test "$GNU_CXX"; then
    HOST_CXXFLAGS="$HOST_CXXFLAGS $_ADDED_CXXFLAGS"
fi
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross



if test "$GNU_CC" -a "$OS_TARGET" != WINNT; then
  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VISIBILITY_HIDDEN_ATTRIBUTE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VISIBILITY_HIDDEN_ATTRIBUTE 1
EOF

  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VISIBILITY_ATTRIBUTE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VISIBILITY_ATTRIBUTE 1
EOF

  case "$OS_TARGET" in
  Darwin)
    VISIBILITY_FLAGS='-fvisibility=hidden -fvisibility-inlines-hidden'
    ;;
  *)
    case $GCC_VERSION in
    4.6*)
      VISIBILITY_FLAGS="-I${DIST}/system_wrappers -include ${_topsrcdir}/config/gcc_hidden_dso_handle.h"
      ;;
    *)
      VISIBILITY_FLAGS="-I${DIST}/system_wrappers -include ${_topsrcdir}/config/gcc_hidden.h"
      ;;
    esac
    WRAP_SYSTEM_INCLUDES=1
    ;;
  esac
fi         # GNU_CC

# visibility hidden flag for Sun Studio on Solaris
if test "$SOLARIS_SUNPRO_CC"; then
VISIBILITY_FLAGS='-xldscope=hidden'
fi         # Sun Studio on Solaris

case "${OS_TARGET}" in
WINNT|Darwin|Android)
  ;;
*)
  STL_FLAGS="-I${DIST}/stl_wrappers"
  WRAP_STL_INCLUDES=1
  ;;
esac




ac_header_dirent=no
for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
echo "configure:10371: checking for $ac_hdr that defines DIR" >&5
if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10376 "configure"
#include "confdefs.h"
#include <sys/types.h>
#include <$ac_hdr>
int main() {
DIR *dirp = 0;
; return 0; }
EOF
if { (eval echo configure:10384: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_dirent_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_dirent_$ac_safe=no"
fi
rm -f conftest*
fi
if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 ac_header_dirent=$ac_hdr; break
else
  echo "$ac_t""no" 1>&6
fi
done
# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
if test $ac_header_dirent = dirent.h; then
echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
echo "configure:10412: checking for opendir in -ldir" >&5
ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-ldir  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 10420 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char opendir();

int main() {
opendir()
; return 0; }
EOF
if { (eval echo configure:10431: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -ldir"
else
  echo "$ac_t""no" 1>&6
fi

else
echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
echo "configure:10453: checking for opendir in -lx" >&5
ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lx  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 10461 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char opendir();

int main() {
opendir()
; return 0; }
EOF
if { (eval echo configure:10472: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  LIBS="$LIBS -lx"
else
  echo "$ac_t""no" 1>&6
fi

fi

case "$target_os" in
freebsd*)
# for stuff like -lXshm
    CPPFLAGS="${CPPFLAGS} ${X_CFLAGS}"
    ;;
esac
 for ac_hdr in sys/byteorder.h compat.h getopt.h sys/bitypes.h \
        memory.h unistd.h gnu/libc-version.h nl_types.h malloc.h \
        X11/XKBlib.h io.h cpuid.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:10506: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10511 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10519: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done



 for ac_hdr in sys/statvfs.h sys/statfs.h sys/vfs.h sys/mount.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:10554: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10559 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10567: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done


 for ac_hdr in sys/quota.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:10601: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10606 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10614: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

 for ac_hdr in linux/quota.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:10647: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10652 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10660: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done


# Check whether --enable-dtrace or --disable-dtrace was given.
if test "${enable_dtrace+set}" = set; then
  enableval="$enable_dtrace"
  if test "$enableval" = "yes"; then
    enable_dtrace="yes"
  elif test "$enableval" = "no"; then
    :
  else
    { echo "configure: error: Option, dtrace, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, dtrace, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test "x$enable_dtrace" = "xyes"; then
     ac_safe=`echo "sys/sdt.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for sys/sdt.h""... $ac_c" 1>&6
echo "configure:10705: checking for sys/sdt.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10710 "configure"
#include "confdefs.h"

#include <sys/sdt.h>
int main() {

; return 0; }
EOF
if { (eval echo configure:10718: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
    HAVE_DTRACE=1
  else
    echo "$ac_t""no" 1>&6
    
  fi

  if test -n "$HAVE_DTRACE"; then
      cat >> confdefs.pytmp <<\EOF
    (''' INCLUDE_MOZILLA_DTRACE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define INCLUDE_MOZILLA_DTRACE 1
EOF

  else
      { echo "configure: error: dtrace enabled but sys/sdt.h not found" 1>&2; echo "configure: error: dtrace enabled but sys/sdt.h not found" 1>&5; exit 1; };
  fi
fi


case $target in
*-aix4.3*|*-aix5*)
	;;
*)
     for ac_hdr in sys/cdefs.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:10760: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10765 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:10773: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

	;;
esac



# Check whether --with-linux-headers or --without-linux-headers was given.
if test "${with_linux_headers+set}" = set; then
  withval="$with_linux_headers"
  linux_headers=$withval
fi


LINUX_HEADERS_INCLUDES=

if test "$linux_headers"; then
    LINUX_HEADERS_INCLUDES="-I$linux_headers"
fi

_SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $LINUX_HEADERS_INCLUDES"

   ac_safe=`echo "linux/perf_event.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for linux/perf_event.h""... $ac_c" 1>&6
echo "configure:10825: checking for linux/perf_event.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 10830 "configure"
#include "confdefs.h"

#include <linux/perf_event.h>
int main() {

; return 0; }
EOF
if { (eval echo configure:10838: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
    echo $ac_n "checking for perf_event_open system call""... $ac_c" 1>&6
echo "configure:10853: checking for perf_event_open system call" >&5
if eval "test \"`echo '$''{'ac_cv_perf_event_open'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 10858 "configure"
#include "confdefs.h"
#include <asm/unistd.h>
int main() {
return sizeof(__NR_perf_event_open);
; return 0; }
EOF
if { (eval echo configure:10865: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_perf_event_open=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_perf_event_open=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_perf_event_open" 1>&6
  else
    echo "$ac_t""no" 1>&6
    
  fi

if test "$ac_cv_perf_event_open" = "yes"; then
    HAVE_LINUX_PERF_EVENT_H=1
else
    HAVE_LINUX_PERF_EVENT_H=
    LINUX_HEADERS_INCLUDES=
fi



CFLAGS="$_SAVE_CFLAGS"



case $target in
*-hpux11.*)
	;;
*)
	echo $ac_n "checking for gethostbyname_r in -lc_r""... $ac_c" 1>&6
echo "configure:10901: checking for gethostbyname_r in -lc_r" >&5
ac_lib_var=`echo c_r'_'gethostbyname_r | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lc_r  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 10909 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gethostbyname_r();

int main() {
gethostbyname_r()
; return 0; }
EOF
if { (eval echo configure:10920: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_lib=HAVE_LIB`echo c_r | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_lib ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF

  LIBS="-lc_r $LIBS"

else
  echo "$ac_t""no" 1>&6
fi

	;;
esac

case $target in
*-darwin*)
    ;;
*)
    
echo $ac_n "checking for library containing dlopen""... $ac_c" 1>&6
echo "configure:10959: checking for library containing dlopen" >&5
if eval "test \"`echo '$''{'ac_cv_search_dlopen'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_func_search_save_LIBS="$LIBS"
ac_cv_search_dlopen="no"
cat > conftest.$ac_ext <<EOF
#line 10966 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dlopen();

int main() {
dlopen()
; return 0; }
EOF
if { (eval echo configure:10977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_search_dlopen="none required"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
test "$ac_cv_search_dlopen" = "no" && for i in dl; do
LIBS="-l$i  $ac_func_search_save_LIBS"
cat > conftest.$ac_ext <<EOF
#line 10988 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char dlopen();

int main() {
dlopen()
; return 0; }
EOF
if { (eval echo configure:10999: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_search_dlopen="-l$i"
break
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
fi
rm -f conftest*
done
LIBS="$ac_func_search_save_LIBS"
fi

echo "$ac_t""$ac_cv_search_dlopen" 1>&6
if test "$ac_cv_search_dlopen" != "no"; then
  test "$ac_cv_search_dlopen" = "none required" || LIBS="$ac_cv_search_dlopen $LIBS"
     ac_safe=`echo "dlfcn.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for dlfcn.h""... $ac_c" 1>&6
echo "configure:11017: checking for dlfcn.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 11022 "configure"
#include "confdefs.h"

#include <dlfcn.h>
int main() {

; return 0; }
EOF
if { (eval echo configure:11030: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_DLOPEN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_DLOPEN 1
EOF

  else
    echo "$ac_t""no" 1>&6
    
  fi

else :
  
fi
    ;;
esac

if test ! "$GNU_CXX"; then

    case $target in
    *-aix*)
	echo $ac_n "checking for demangle in -lC_r""... $ac_c" 1>&6
echo "configure:11067: checking for demangle in -lC_r" >&5
ac_lib_var=`echo C_r'_'demangle | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lC_r  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11075 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char demangle();

int main() {
demangle()
; return 0; }
EOF
if { (eval echo configure:11086: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_lib=HAVE_LIB`echo C_r | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_lib ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF

  LIBS="-lC_r $LIBS"

else
  echo "$ac_t""no" 1>&6
fi

	;;
     *)
	echo $ac_n "checking for demangle in -lC""... $ac_c" 1>&6
echo "configure:11119: checking for demangle in -lC" >&5
ac_lib_var=`echo C'_'demangle | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lC  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11127 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char demangle();

int main() {
demangle()
; return 0; }
EOF
if { (eval echo configure:11138: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_lib=HAVE_LIB`echo C | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_lib ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF

  LIBS="-lC $LIBS"

else
  echo "$ac_t""no" 1>&6
fi

	;;
     esac
fi

echo $ac_n "checking for socket in -lsocket""... $ac_c" 1>&6
echo "configure:11173: checking for socket in -lsocket" >&5
ac_lib_var=`echo socket'_'socket | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lsocket  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11181 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char socket();

int main() {
socket()
; return 0; }
EOF
if { (eval echo configure:11192: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_lib=HAVE_LIB`echo socket | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_lib ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF

  LIBS="-lsocket $LIBS"

else
  echo "$ac_t""no" 1>&6
fi


case "$target_os" in
darwin*)
    USE_PTHREADS=1
    ;;
*)
    echo $ac_n "checking for pthread_create in -lpthreads""... $ac_c" 1>&6
echo "configure:11229: checking for pthread_create in -lpthreads" >&5
ac_lib_var=`echo pthreads'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthreads  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11237 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_create();

int main() {
pthread_create()
; return 0; }
EOF
if { (eval echo configure:11248: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthreads"
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
echo "configure:11267: checking for pthread_create in -lpthread" >&5
ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lpthread  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11275 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_create();

int main() {
pthread_create()
; return 0; }
EOF
if { (eval echo configure:11286: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthread"
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for pthread_create in -lc_r""... $ac_c" 1>&6
echo "configure:11305: checking for pthread_create in -lc_r" >&5
ac_lib_var=`echo c_r'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lc_r  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11313 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_create();

int main() {
pthread_create()
; return 0; }
EOF
if { (eval echo configure:11324: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lc_r"
else
  echo "$ac_t""no" 1>&6
echo $ac_n "checking for pthread_create in -lc""... $ac_c" 1>&6
echo "configure:11343: checking for pthread_create in -lc" >&5
ac_lib_var=`echo c'_'pthread_create | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lc  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11351 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char pthread_create();

int main() {
pthread_create()
; return 0; }
EOF
if { (eval echo configure:11362: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  USE_PTHREADS=1
                
else
  echo "$ac_t""no" 1>&6
fi

            
fi

        
fi

    
fi

    ;;
esac

# Check whether --with-pthreads or --without-pthreads was given.
if test "${with_pthreads+set}" = set; then
  withval="$with_pthreads"
  if test "$withval" = "yes"; then
     if test "$USE_PTHREADS"x = x; then
    { echo "configure: error:  --with-pthreads specified for a system without pthread support " 1>&2; echo "configure: error:  --with-pthreads specified for a system without pthread support " 1>&5; exit 1; };
fi
  elif test "$withval" = "no"; then
    USE_PTHREADS=
    _PTHREAD_LDFLAGS=

  else
    { echo "configure: error: Option, pthreads, does not take an argument ($withval)." 1>&2; echo "configure: error: Option, pthreads, does not take an argument ($withval)." 1>&5; exit 1; }
  fi
fi


if test "$USE_PTHREADS"x != x
then
				rm -f conftest*
	ac_cv_have_dash_pthread=no
	echo $ac_n "checking whether ${CC-cc} accepts -pthread""... $ac_c" 1>&6
echo "configure:11417: checking whether ${CC-cc} accepts -pthread" >&5
	echo 'int main() { return 0; }' | cat > conftest.c
	${CC-cc} -pthread -o conftest conftest.c > conftest.out 2>&1
	if test $? -eq 0; then
		if test -z "`egrep -i '(unrecognize|unknown)' conftest.out | grep pthread`" -a -z "`egrep -i '(error|incorrect)' conftest.out`" ; then
			ac_cv_have_dash_pthread=yes
	        case "$target_os" in
	        freebsd*)
# Freebsd doesn't use -pthread for compiles, it uses them for linking
                ;;
	        *)
			    CFLAGS="$CFLAGS -pthread"
			    CXXFLAGS="$CXXFLAGS -pthread"
                ;;
	        esac
		fi
	fi
	rm -f conftest*
    echo "$ac_t""$ac_cv_have_dash_pthread" 1>&6

			    ac_cv_have_dash_pthreads=no
    if test "$ac_cv_have_dash_pthread" = "no"; then
	    echo $ac_n "checking whether ${CC-cc} accepts -pthreads""... $ac_c" 1>&6
echo "configure:11440: checking whether ${CC-cc} accepts -pthreads" >&5
    	echo 'int main() { return 0; }' | cat > conftest.c
	    ${CC-cc} -pthreads -o conftest conftest.c > conftest.out 2>&1
    	if test $? -eq 0; then
	    	if test -z "`egrep -i '(unrecognize|unknown)' conftest.out | grep pthreads`" -a -z "`egrep -i '(error|incorrect)' conftest.out`" ; then
			    ac_cv_have_dash_pthreads=yes
			    CFLAGS="$CFLAGS -pthreads"
			    CXXFLAGS="$CXXFLAGS -pthreads"
		    fi
	    fi
	    rm -f conftest*
    	echo "$ac_t""$ac_cv_have_dash_pthreads" 1>&6
    fi

	case "$target" in
	    *-*-freebsd*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			cat >> confdefs.pytmp <<\EOF
    (''' _THREAD_SAFE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _THREAD_SAFE 1
EOF

						if test "$ac_cv_have_dash_pthread" = "yes"; then
				_PTHREAD_LDFLAGS="-pthread"
			fi
			;;

	    *-*-openbsd*|*-*-bsdi*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			cat >> confdefs.pytmp <<\EOF
    (''' _THREAD_SAFE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _THREAD_SAFE 1
EOF

						if test "$ac_cv_have_dash_pthread" = "yes"; then
                _PTHREAD_LDFLAGS="-pthread"
			fi
			;;

	    *-*-linux*|*-*-kfreebsd*-gnu|*-*-gnu*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			;;

	    *-aix4.3*|*-aix5*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			;;

	    *-hpux11.*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			;;

	    *-*-solaris*)
			cat >> confdefs.pytmp <<\EOF
    (''' _REENTRANT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define _REENTRANT 1
EOF

			if test "$SOLARIS_SUNPRO_CC"; then
				CFLAGS="$CFLAGS -mt"
				CXXFLAGS="$CXXFLAGS -mt"
			fi
			;;
	esac
    LDFLAGS="${_PTHREAD_LDFLAGS} ${LDFLAGS}"
fi


if test $ac_cv_prog_gcc = yes; then
    echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6
echo "configure:11545: checking whether ${CC-cc} needs -traditional" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
    ac_pattern="Autoconf.*'x'"
  cat > conftest.$ac_ext <<EOF
#line 11551 "configure"
#include "confdefs.h"
#include <sgtty.h>
Autoconf TIOCGETP
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "$ac_pattern" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_prog_gcc_traditional=yes
else
  rm -rf conftest*
  ac_cv_prog_gcc_traditional=no
fi
rm -f conftest*


  if test $ac_cv_prog_gcc_traditional = no; then
    cat > conftest.$ac_ext <<EOF
#line 11569 "configure"
#include "confdefs.h"
#include <termio.h>
Autoconf TCGETA
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "$ac_pattern" >/dev/null 2>&1; then
  rm -rf conftest*
  ac_cv_prog_gcc_traditional=yes
fi
rm -f conftest*

  fi
fi

echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6
  if test $ac_cv_prog_gcc_traditional = yes; then
    CC="$CC -traditional"
  fi
fi

echo $ac_n "checking for 8-bit clean memcmp""... $ac_c" 1>&6
echo "configure:11591: checking for 8-bit clean memcmp" >&5
if eval "test \"`echo '$''{'ac_cv_func_memcmp_clean'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_func_memcmp_clean=no
else
  cat > conftest.$ac_ext <<EOF
#line 11599 "configure"
#include "confdefs.h"

main()
{
  char c0 = 0x40, c1 = 0x80, c2 = 0x81;
  exit(memcmp(&c0, &c2, 1) < 0 && memcmp(&c1, &c2, 1) < 0 ? 0 : 1);
}

EOF
if { (eval echo configure:11609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_func_memcmp_clean=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_func_memcmp_clean=no
fi
rm -fr conftest*
fi

fi

echo "$ac_t""$ac_cv_func_memcmp_clean" 1>&6
test $ac_cv_func_memcmp_clean = no && LIBOBJS="$LIBOBJS memcmp.${ac_objext}"

for ac_func in getc_unlocked _getc_nolock gmtime_r localtime_r
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:11629: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 11634 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:11661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done


echo $ac_n "checking for clock_gettime(CLOCK_MONOTONIC)""... $ac_c" 1>&6
echo "configure:11690: checking for clock_gettime(CLOCK_MONOTONIC)" >&5
if eval "test \"`echo '$''{'ac_cv_clock_monotonic'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  for libs in "" -lrt; do
                    _SAVE_LIBS="$LIBS"
                    LIBS="$LIBS $libs"
                    cat > conftest.$ac_ext <<EOF
#line 11698 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
 struct timespec ts;
                                   clock_gettime(CLOCK_MONOTONIC, &ts); 
; return 0; }
EOF
if { (eval echo configure:11706: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_clock_monotonic=$libs
                                 LIBS="$_SAVE_LIBS"
                                 break
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_clock_monotonic=no
fi
rm -f conftest*
                    LIBS="$_SAVE_LIBS"
                done
fi

echo "$ac_t""$ac_cv_clock_monotonic" 1>&6
if test "$ac_cv_clock_monotonic" != "no"; then
    HAVE_CLOCK_MONOTONIC=1
    REALTIME_LIBS=$ac_cv_clock_monotonic
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_CLOCK_MONOTONIC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_CLOCK_MONOTONIC 1
EOF

    
    
fi

echo $ac_n "checking for sin in -lm""... $ac_c" 1>&6
echo "configure:11738: checking for sin in -lm" >&5
ac_lib_var=`echo m'_'sin | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lm  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11746 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char sin();

int main() {
sin()
; return 0; }
EOF
if { (eval echo configure:11757: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_lib=HAVE_LIB`echo m | sed -e 's/[^a-zA-Z0-9_]/_/g' \
    -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_lib ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_lib 1
EOF

  LIBS="-lm $LIBS"

else
  echo "$ac_t""no" 1>&6
fi

echo $ac_n "checking for __sincos in -lm""... $ac_c" 1>&6
echo "configure:11788: checking for __sincos in -lm" >&5
ac_lib_var=`echo m'_'__sincos | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lm  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 11796 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char __sincos();

int main() {
__sincos()
; return 0; }
EOF
if { (eval echo configure:11807: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_SINCOS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_SINCOS 1
EOF

else
  echo "$ac_t""no" 1>&6
fi

for ac_func in log2 log1p expm1 sqrt1pm1 acosh asinh atanh cbrt
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:11836: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 11841 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:11868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done



if test -z "$MACOS_DEPLOYMENT_TARGET" || test "$MACOS_DEPLOYMENT_TARGET" -ge "100300"; then

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

echo $ac_n "checking for wcrtomb""... $ac_c" 1>&6
echo "configure:11907: checking for wcrtomb" >&5
if eval "test \"`echo '$''{'ac_cv_have_wcrtomb'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 11912 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t ps={0};wcrtomb(0,'f',&ps);
; return 0; }
EOF
if { (eval echo configure:11919: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_have_wcrtomb="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_have_wcrtomb="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_have_wcrtomb" 1>&6
if test "$ac_cv_have_wcrtomb" = "yes"; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_WCRTOMB ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_WCRTOMB 1
EOF

fi
echo $ac_n "checking for mbrtowc""... $ac_c" 1>&6
echo "configure:11942: checking for mbrtowc" >&5
if eval "test \"`echo '$''{'ac_cv_have_mbrtowc'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 11947 "configure"
#include "confdefs.h"
#include <wchar.h>
int main() {
mbstate_t ps={0};mbrtowc(0,0,0,&ps);
; return 0; }
EOF
if { (eval echo configure:11954: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_have_mbrtowc="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_have_mbrtowc="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_have_mbrtowc" 1>&6
if test "$ac_cv_have_mbrtowc" = "yes"; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_MBRTOWC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_MBRTOWC 1
EOF

fi
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

fi

echo $ac_n "checking for res_ninit()""... $ac_c" 1>&6
echo "configure:11986: checking for res_ninit()" >&5
if eval "test \"`echo '$''{'ac_cv_func_res_ninit'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$OS_TARGET" = NetBSD -o "$OS_TARGET" = OpenBSD; then
                ac_cv_func_res_ninit=no
     else
       cat > conftest.$ac_ext <<EOF
#line 11994 "configure"
#include "confdefs.h"

            #ifdef linux
            #define _BSD_SOURCE 1
            #endif
            #include <sys/types.h>
            #include <netinet/in.h>
            #include <arpa/nameser.h>
            #include <resolv.h>
            
int main() {
int foo = res_ninit(&_res);
; return 0; }
EOF
if { (eval echo configure:12009: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_func_res_ninit=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_func_res_ninit=no
fi
rm -f conftest*
     fi
    
fi

echo "$ac_t""$ac_cv_func_res_ninit" 1>&6

if test "$ac_cv_func_res_ninit" = "yes"; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_RES_NINIT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_RES_NINIT 1
EOF

fi


  echo $ac_n "checking for nl_langinfo and CODESET""... $ac_c" 1>&6
echo "configure:12037: checking for nl_langinfo and CODESET" >&5
if eval "test \"`echo '$''{'am_cv_langinfo_codeset'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12042 "configure"
#include "confdefs.h"
#include <langinfo.h>
int main() {
char* cs = nl_langinfo(CODESET);
; return 0; }
EOF
if { (eval echo configure:12049: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  am_cv_langinfo_codeset=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  am_cv_langinfo_codeset=no
fi
rm -f conftest*
    
fi

echo "$ac_t""$am_cv_langinfo_codeset" 1>&6
  if test $am_cv_langinfo_codeset = yes; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_LANGINFO_CODESET ''', r''' 1 ''')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_LANGINFO_CODESET 1
EOF

      HAVE_LANGINFO_CODESET=1
  fi


ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross


echo $ac_n "checking for an implementation of va_copy()""... $ac_c" 1>&6
echo "configure:12084: checking for an implementation of va_copy()" >&5
if eval "test \"`echo '$''{'ac_cv_va_copy'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12089 "configure"
#include "confdefs.h"
#include <stdarg.h>
                     #include <stdlib.h>
        void f (int i, ...) {
            va_list args1, args2;
            va_start (args1, i);
            va_copy (args2, args1);
            if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
                exit (1);
            va_end (args1); va_end (args2);
        }
int main() {
f(0, 42); return 0
; return 0; }
EOF
if { (eval echo configure:12105: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_va_copy=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_va_copy=no
    
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_va_copy" 1>&6
echo $ac_n "checking whether va_list can be copied by value""... $ac_c" 1>&6
echo "configure:12121: checking whether va_list can be copied by value" >&5
if eval "test \"`echo '$''{'ac_cv_va_val_copy'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12126 "configure"
#include "confdefs.h"
#include <stdarg.h>
                     #include <stdlib.h>
        void f (int i, ...) {
            va_list args1, args2;
            va_start (args1, i);
            args2 = args1;
            if (va_arg (args2, int) != 42 || va_arg (args1, int) != 42)
                exit (1);
            va_end (args1); va_end (args2);
        }
int main() {
f(0, 42); return 0
; return 0; }
EOF
if { (eval echo configure:12142: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_va_val_copy=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_va_val_copy=no
fi
rm -f conftest*

fi

echo "$ac_t""$ac_cv_va_val_copy" 1>&6
if test "x$ac_cv_va_copy" = "xyes"; then
    cat >> confdefs.pytmp <<\EOF
    (''' VA_COPY ''', r''' va_copy ''')
EOF
cat >> confdefs.h <<\EOF
#define VA_COPY va_copy
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VA_COPY ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VA_COPY 1
EOF

fi

if test "x$ac_cv_va_val_copy" = "xno"; then
   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VA_LIST_AS_ARRAY ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VA_LIST_AS_ARRAY 1
EOF

fi

ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross


ARM_ABI_PREFIX=
if test "$GNU_CC"; then
  if test "$CPU_ARCH" = "arm" ; then
    echo $ac_n "checking for ARM EABI""... $ac_c" 1>&6
echo "configure:12195: checking for ARM EABI" >&5
if eval "test \"`echo '$''{'ac_cv_gcc_arm_eabi'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12200 "configure"
#include "confdefs.h"

int main() {

#if defined(__ARM_EABI__)
  return 0;
#else
#error Not ARM EABI.
#endif
                        
; return 0; }
EOF
if { (eval echo configure:12213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_gcc_arm_eabi="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_gcc_arm_eabi="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_gcc_arm_eabi" 1>&6
    if test "$ac_cv_gcc_arm_eabi" = "yes"; then
        HAVE_ARM_EABI=1
        ARM_ABI_PREFIX=eabi-
    else
        ARM_ABI_PREFIX=oabi-
    fi
  fi

  TARGET_COMPILER_ABI="${TARGET_COMPILER_ABI-${ARM_ABI_PREFIX}gcc3}"
fi

echo $ac_n "checking whether the C++ \"using\" keyword resolves ambiguity""... $ac_c" 1>&6
echo "configure:12238: checking whether the C++ \"using\" keyword resolves ambiguity" >&5
if eval "test \"`echo '$''{'ac_cv_cpp_ambiguity_resolving_using'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12243 "configure"
#include "confdefs.h"
class X {
                                 public: int go(const X&) {return 3;}
                                         int jo(const X&) {return 3;}
                               };
                               class Y : public X {
                                 public:  int go(int) {return 2;}
                                          int jo(int) {return 2;}
                                          using X::jo;
                                 private: using X::go;
                               };
int main() {
X x; Y y; y.jo(x);
; return 0; }
EOF
if { (eval echo configure:12259: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_cpp_ambiguity_resolving_using=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_cpp_ambiguity_resolving_using=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_cpp_ambiguity_resolving_using" 1>&6
if test "$ac_cv_cpp_ambiguity_resolving_using" = yes ; then
   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_CPP_AMBIGUITY_RESOLVING_USING ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_CPP_AMBIGUITY_RESOLVING_USING 1
EOF

fi

echo $ac_n "checking for C++ dynamic_cast to void*""... $ac_c" 1>&6
echo "configure:12283: checking for C++ dynamic_cast to void*" >&5
if eval "test \"`echo '$''{'ac_cv_cpp_dynamic_cast_void_ptr'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  if test "$cross_compiling" = yes; then
  ac_cv_cpp_dynamic_cast_void_ptr=no
else
  cat > conftest.$ac_ext <<EOF
#line 12291 "configure"
#include "confdefs.h"
class X { int i; public: virtual ~X() { } };
                            class Y { int j; public: virtual ~Y() { } };
                            class Z : public X, public Y { int k; };

                            int main() {
                                 Z mdo;
                                 X *subx = (X*)&mdo;
                                 Y *suby = (Y*)&mdo;
                                 return !((((void*)&mdo != (void*)subx) &&
                                           ((void*)&mdo == dynamic_cast<void*>(subx))) ||
                                          (((void*)&mdo != (void*)suby) &&
                                           ((void*)&mdo == dynamic_cast<void*>(suby))));
                            }
EOF
if { (eval echo configure:12307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
then
  ac_cv_cpp_dynamic_cast_void_ptr=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -fr conftest*
  ac_cv_cpp_dynamic_cast_void_ptr=no
fi
rm -fr conftest*
fi

fi

echo "$ac_t""$ac_cv_cpp_dynamic_cast_void_ptr" 1>&6
if test "$ac_cv_cpp_dynamic_cast_void_ptr" = yes ; then
   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_CPP_DYNAMIC_CAST_TO_VOID_PTR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_CPP_DYNAMIC_CAST_TO_VOID_PTR 1
EOF

fi


# try harder, when checking for __thread support, see bug 521750 comment #33 and below
# We pass MOZ_OPTIMIZE_LDFLAGS to the linker because if dead_strip is
# enabled, the linker in xcode 4.1 will crash. Without this it would crash when
# linking XUL.
_SAVE_LDFLAGS=$LDFLAGS
LDFLAGS="$LDFLAGS $DSO_PIC_CFLAGS $DSO_LDOPTS $MOZ_OPTIMIZE_LDFLAGS"
echo $ac_n "checking for __thread keyword for TLS variables""... $ac_c" 1>&6
echo "configure:12340: checking for __thread keyword for TLS variables" >&5
if eval "test \"`echo '$''{'ac_cv_thread_keyword'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12345 "configure"
#include "confdefs.h"
__thread bool tlsIsMainThread = false;
int main() {
return tlsIsMainThread;
; return 0; }
EOF
if { (eval echo configure:12352: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  ac_cv_thread_keyword=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_thread_keyword=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_thread_keyword" 1>&6
LDFLAGS=$_SAVE_LDFLAGS
if test "$ac_cv_thread_keyword" = yes; then
  # mips builds fail with TLS variables because of a binutils bug.
  # See bug 528687
  case "${target}" in
    mips*-*)
      :
      ;;
    *-android*|*-linuxandroid*)
      :
      ;;
    *)
      cat >> confdefs.pytmp <<\EOF
    (''' HAVE_THREAD_TLS_KEYWORD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_THREAD_TLS_KEYWORD 1
EOF

      ;;
  esac
fi


echo $ac_n "checking for __attribute__((always_inline))""... $ac_c" 1>&6
echo "configure:12390: checking for __attribute__((always_inline))" >&5
if eval "test \"`echo '$''{'ac_cv_attribute_always_inline'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12395 "configure"
#include "confdefs.h"
inline void f(void) __attribute__((always_inline));
int main() {

; return 0; }
EOF
if { (eval echo configure:12402: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_attribute_always_inline=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_attribute_always_inline=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_attribute_always_inline" 1>&6

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross



echo $ac_n "checking for LC_MESSAGES""... $ac_c" 1>&6
echo "configure:12426: checking for LC_MESSAGES" >&5
if eval "test \"`echo '$''{'ac_cv_i18n_lc_messages'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12431 "configure"
#include "confdefs.h"
#include <locale.h>
int main() {
int category = LC_MESSAGES;
; return 0; }
EOF
if { (eval echo configure:12438: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_i18n_lc_messages=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_i18n_lc_messages=no
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_i18n_lc_messages" 1>&6
if test "$ac_cv_i18n_lc_messages" = yes; then
   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_I18N_LC_MESSAGES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_I18N_LC_MESSAGES 1
EOF

fi

for ac_func in localeconv
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:12464: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 12469 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:12496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

fi # ! SKIP_COMPILER_CHECKS

TARGET_XPCOM_ABI=
if test -n "${CPU_ARCH}" -a -n "${TARGET_COMPILER_ABI}"; then
    TARGET_XPCOM_ABI="${CPU_ARCH}-${TARGET_COMPILER_ABI}"
fi


if test -n "$SKIP_COMPILER_CHECKS"; then
      cat >> confdefs.pytmp <<\EOF
    (''' MALLOC_H ''', r''' <malloc.h> ''')
EOF
cat >> confdefs.h <<\EOF
#define MALLOC_H <malloc.h>
EOF

   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_FORCEINLINE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_FORCEINLINE 1
EOF

   cat >> confdefs.pytmp <<\EOF
    (''' HAVE_LOCALECONV ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_LOCALECONV 1
EOF

fi # SKIP_COMPILER_CHECKS



# app update channel is 'default' when not supplied.
# Check whether --enable-update-channel or --disable-update-channel was given.
if test "${enable_update_channel+set}" = set; then
  enableval="$enable_update_channel"
  MOZ_UPDATE_CHANNEL=`echo $enableval | tr A-Z a-z`
fi


if test -z "$MOZ_UPDATE_CHANNEL"; then
    MOZ_UPDATE_CHANNEL=default
fi
cat >> confdefs.pytmp <<EOF
    (''' MOZ_UPDATE_CHANNEL ''', r''' $MOZ_UPDATE_CHANNEL ''')
EOF
cat >> confdefs.h <<EOF
#define MOZ_UPDATE_CHANNEL $MOZ_UPDATE_CHANNEL
EOF




GRE_MILESTONE=`tail -n 1 "$_topsrcdir"/config/milestone.txt 2>/dev/null || tail -1 "$_topsrcdir"/config/milestone.txt`


case "$GRE_MILESTONE" in
  *a1*)
      NIGHTLY_BUILD=1
      cat >> confdefs.pytmp <<\EOF
    (''' NIGHTLY_BUILD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NIGHTLY_BUILD 1
EOF

      ;;
  *a*)
      ;;
  *)
      RELEASE_BUILD=1
      cat >> confdefs.pytmp <<\EOF
    (''' RELEASE_BUILD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define RELEASE_BUILD 1
EOF

      ;;
esac



# External Packages






# Check whether --with-nspr-cflags or --without-nspr-cflags was given.
if test "${with_nspr_cflags+set}" = set; then
  withval="$with_nspr_cflags"
  NSPR_CFLAGS=$withval
fi

# Check whether --with-nspr-libs or --without-nspr-libs was given.
if test "${with_nspr_libs+set}" = set; then
  withval="$with_nspr_libs"
  NSPR_LIBS=$withval
fi



    # Check whether --enable-nspr-build or --disable-nspr-build was given.
if test "${enable_nspr_build+set}" = set; then
  enableval="$enable_nspr_build"
  if test "$enableval" = "yes"; then
    MOZ_BUILD_NSPR=1
  elif test "$enableval" = "no"; then
    MOZ_BUILD_NSPR=
  else
    { echo "configure: error: Option, nspr-build, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, nspr-build, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi



if test -z "$BUILDING_JS" || test -n "$JS_STANDALONE"; then
  _IS_OUTER_CONFIGURE=1
fi

# Check whether --with-system-nspr or --without-system-nspr was given.
if test "${with_system_nspr+set}" = set; then
  withval="$with_system_nspr"
  if test "$withval" = "yes"; then
    _USE_SYSTEM_NSPR=1 
  elif test "$withval" = "no"; then
    :
  else
    { echo "configure: error: Option, system-nspr, does not take an argument ($withval)." 1>&2; echo "configure: error: Option, system-nspr, does not take an argument ($withval)." 1>&5; exit 1; }
  fi
fi


JS_POSIX_NSPR=unset

    if test -n "$JS_STANDALONE"; then
      case "$target" in
        *linux*|*darwin*|*dragonfly*|*freebsd*|*netbsd*|*openbsd*)
          if test -z "$_HAS_NSPR"; then
            JS_POSIX_NSPR_DEFAULT=1
          fi
          ;;
      esac
    fi

    # Check whether --enable-posix-nspr-emulation or --disable-posix-nspr-emulation was given.
if test "${enable_posix_nspr_emulation+set}" = set; then
  enableval="$enable_posix_nspr_emulation"
  if test "$enableval" = "yes"; then
    JS_POSIX_NSPR=1
  elif test "$enableval" = "no"; then
    JS_POSIX_NSPR=
  else
    { echo "configure: error: Option, posix-nspr-emulation, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, posix-nspr-emulation, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi




echo $ac_n "checking NSPR selection""... $ac_c" 1>&6
echo "configure:12688: checking NSPR selection" >&5
nspr_opts=
which_nspr=default
if test -n "$_USE_SYSTEM_NSPR"; then
    nspr_opts="x$nspr_opts"
    which_nspr="system"
fi
if test -n "$NSPR_CFLAGS" -o -n "$NSPR_LIBS"; then
    nspr_opts="x$nspr_opts"
    which_nspr="command-line"
fi
if test -n "$MOZ_BUILD_NSPR"; then
    nspr_opts="x$nspr_opts"
    which_nspr="source-tree"
fi
if test "$JS_POSIX_NSPR" = unset; then
    JS_POSIX_NSPR=
else
    nspr_opts="x$nspr_opts"
    which_nspr="posix-wrapper"
fi

if test -z "$nspr_opts"; then
    if test -z "$BUILDING_JS"; then
            MOZ_BUILD_NSPR=1
      which_nspr="source-tree"
    else
                  JS_POSIX_NSPR="$JS_POSIX_NSPR_DEFAULT"
      if test -z "$JS_POSIX_NSPR"; then
        MOZ_BUILD_NSPR=1
        which_nspr="source-tree"
      else
        which_nspr="posix-wrapper"
      fi
   fi
fi

if test -z "$nspr_opts" || test "$nspr_opts" = x; then
    echo "$ac_t""$which_nspr" 1>&6
else
    { echo "configure: error: only one way of using NSPR may be selected. See 'configure --help'." 1>&2; echo "configure: error: only one way of using NSPR may be selected. See 'configure --help'." 1>&5; exit 1; }
fi



if test -n "$BUILDING_JS"; then
  if test "$JS_POSIX_NSPR" = 1; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_POSIX_NSPR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_POSIX_NSPR 1
EOF

  fi
  
fi

# A (sub)configure invoked by the toplevel configure will always receive
# --with-nspr-libs on the command line. It will never need to figure out
# anything itself.
if test -n "$_IS_OUTER_CONFIGURE"; then

if test -n "$_USE_SYSTEM_NSPR"; then
    
# Check whether --with-nspr-prefix or --without-nspr-prefix was given.
if test "${with_nspr_prefix+set}" = set; then
  withval="$with_nspr_prefix"
  nspr_config_prefix="$withval"
else
  nspr_config_prefix=""
fi


# Check whether --with-nspr-exec-prefix or --without-nspr-exec-prefix was given.
if test "${with_nspr_exec_prefix+set}" = set; then
  withval="$with_nspr_exec_prefix"
  nspr_config_exec_prefix="$withval"
else
  nspr_config_exec_prefix=""
fi


	if test -n "$nspr_config_exec_prefix"; then
		nspr_config_args="$nspr_config_args --exec-prefix=$nspr_config_exec_prefix"
		if test -z "$NSPR_CONFIG"; then
			NSPR_CONFIG=$nspr_config_exec_prefix/bin/nspr-config
		fi
	fi
	if test -n "$nspr_config_prefix"; then
		nspr_config_args="$nspr_config_args --prefix=$nspr_config_prefix"
		if test -z "$NSPR_CONFIG"; then
			NSPR_CONFIG=$nspr_config_prefix/bin/nspr-config
		fi
	fi

	unset ac_cv_path_NSPR_CONFIG
	# Extract the first word of "nspr-config", so it can be a program name with args.
set dummy nspr-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:12788: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_NSPR_CONFIG'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$NSPR_CONFIG" in
  /*)
  ac_cv_path_NSPR_CONFIG="$NSPR_CONFIG" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_NSPR_CONFIG="$NSPR_CONFIG" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_NSPR_CONFIG="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_NSPR_CONFIG" && ac_cv_path_NSPR_CONFIG="no"
  ;;
esac
fi
NSPR_CONFIG="$ac_cv_path_NSPR_CONFIG"
if test -n "$NSPR_CONFIG"; then
  echo "$ac_t""$NSPR_CONFIG" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

	min_nspr_version=$NSPR_MINVER
	echo $ac_n "checking for NSPR - version >= $min_nspr_version""... $ac_c" 1>&6
echo "configure:12823: checking for NSPR - version >= $min_nspr_version" >&5

	no_nspr=""
	if test "$NSPR_CONFIG" != "no"; then
		NSPR_CFLAGS=`$NSPR_CONFIG $nspr_config_args --cflags`
		NSPR_LIBS=`$NSPR_CONFIG $nspr_config_args --libs`
		NSPR_VERSION_STRING=`$NSPR_CONFIG $nspr_config_args --version`	
	elif test -n "${NO_NSPR_CONFIG_SYSTEM_VERSION}"; then
	    NSPR_CFLAGS="${NO_NSPR_CONFIG_SYSTEM_CFLAGS}"
		NSPR_LIBS="${NO_NSPR_CONFIG_SYSTEM_LDFLAGS}"
		NSPR_VERSION_STRING="$NO_NSPR_CONFIG_SYSTEM_VERSION"
	else
	    no_nspr="yes"
	fi

	if test -z "$no_nspr"; then
		nspr_config_major_version=`echo $NSPR_VERSION_STRING | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\1/'`
		nspr_config_minor_version=`echo $NSPR_VERSION_STRING | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\2/'`
		nspr_config_micro_version=`echo $NSPR_VERSION_STRING | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\4/'`
		if test -z "$nspr_config_micro_version"; then
			nspr_config_micro_version="0"
		fi

		min_nspr_major_version=`echo $min_nspr_version | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\1/'`
		min_nspr_minor_version=`echo $min_nspr_version | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\2/'`
		min_nspr_micro_version=`echo $min_nspr_version | \
			sed 's/\([0-9]*\)\.\([0-9]*\)\(\.\([0-9]*\)\)\{0,1\}/\4/'`
		if test -z "$min_nspr_micro_version"; then
			min_nspr_micro_version="0"
		fi

		if test "$nspr_config_major_version" -ne "$min_nspr_major_version"; then
			no_nspr="yes"
		elif test "$nspr_config_major_version" -eq "$min_nspr_major_version" &&
		     test "$nspr_config_minor_version" -lt "$min_nspr_minor_version"; then
			no_nspr="yes"
		elif test "$nspr_config_major_version" -eq "$min_nspr_major_version" &&
		     test "$nspr_config_minor_version" -eq "$min_nspr_minor_version" &&
		     test "$nspr_config_micro_version" -lt "$min_nspr_micro_version"; then
			no_nspr="yes"
		fi
	fi

	if test -z "$no_nspr"; then
		echo "$ac_t""yes" 1>&6
		MOZ_NATIVE_NSPR=1     
	else
		echo "$ac_t""no" 1>&6
		{ echo "configure: error: you do not have NSPR installed or your version is older than $NSPR_MINVER." 1>&2; echo "configure: error: you do not have NSPR installed or your version is older than $NSPR_MINVER." 1>&5; exit 1; }
	fi


	
	


fi

if test -n "$MOZ_NATIVE_NSPR" -o -n "$NSPR_CFLAGS" -o -n "$NSPR_LIBS"; then
    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS $NSPR_CFLAGS"
    cat > conftest.$ac_ext <<EOF
#line 12890 "configure"
#include "confdefs.h"
#include "prtypes.h"
int main() {
#ifndef PR_STATIC_ASSERT
                 #error PR_STATIC_ASSERT not defined or requires including prtypes.h
                 #endif
; return 0; }
EOF
if { (eval echo configure:12899: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: system NSPR does not support PR_STATIC_ASSERT or including prtypes.h does not provide it" 1>&2; echo "configure: error: system NSPR does not support PR_STATIC_ASSERT or including prtypes.h does not provide it" 1>&5; exit 1; }
fi
rm -f conftest*
    cat > conftest.$ac_ext <<EOF
#line 12909 "configure"
#include "confdefs.h"
#include "prtypes.h"
int main() {
#ifndef PR_UINT64
                 #error PR_UINT64 not defined or requires including prtypes.h
                 #endif
; return 0; }
EOF
if { (eval echo configure:12918: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: system NSPR does not support PR_UINT64 or including prtypes.h does not provide it" 1>&2; echo "configure: error: system NSPR does not support PR_UINT64 or including prtypes.h does not provide it" 1>&5; exit 1; }
fi
rm -f conftest*
    CFLAGS=$_SAVE_CFLAGS
elif test -z "$JS_POSIX_NSPR"; then
    NSPR_CFLAGS="-I${DIST}/include/nspr"
    if test -n "$GNU_CC"; then
        NSPR_LIBS="-L${DIST}/lib -lnspr${NSPR_VERSION} -lplc${NSPR_VERSION} -lplds${NSPR_VERSION}"
    else
        NSPR_LIBS="${DIST}/lib/nspr${NSPR_VERSION}.lib ${DIST}/lib/plc${NSPR_VERSION}.lib ${DIST}/lib/plds${NSPR_VERSION}.lib "
    fi
fi



NSPR_PKGCONF_CHECK="nspr"
if test -n "$MOZ_NATIVE_NSPR"; then
    # piggy back on $MOZ_NATIVE_NSPR to set a variable for the nspr check for js.pc
    NSPR_PKGCONF_CHECK="nspr >= $NSPR_MINVER"

    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS $NSPR_CFLAGS"
    cat > conftest.$ac_ext <<EOF
#line 12947 "configure"
#include "confdefs.h"
#include "prlog.h"
int main() {
#ifndef PR_STATIC_ASSERT
                 #error PR_STATIC_ASSERT not defined
                 #endif
; return 0; }
EOF
if { (eval echo configure:12956: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  :
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: system NSPR does not support PR_STATIC_ASSERT" 1>&2; echo "configure: error: system NSPR does not support PR_STATIC_ASSERT" 1>&5; exit 1; }
fi
rm -f conftest*
    CFLAGS=$_SAVE_CFLAGS
fi


fi # _IS_OUTER_CONFIGURE



if test -n "$JS_STANDALONE"; then
    ZLIB_DIR=yes
fi



MOZZLIB=1.2.3

# Check whether --with-system-zlib or --without-system-zlib was given.
if test "${with_system_zlib+set}" = set; then
  withval="$with_system_zlib"
  ZLIB_DIR=$withval
fi


if test -z "$MOZ_ZLIB_LIBS$MOZ_ZLIB_CFLAGS$SKIP_LIBRARY_CHECKS"; then
    _SAVE_CFLAGS=$CFLAGS
    _SAVE_LDFLAGS=$LDFLAGS
    _SAVE_LIBS=$LIBS

    if test -n "${ZLIB_DIR}" -a "${ZLIB_DIR}" != "yes"; then
        MOZ_ZLIB_CFLAGS="-I${ZLIB_DIR}/include"
        MOZ_ZLIB_LIBS="-L${ZLIB_DIR}/lib"
        CFLAGS="$MOZ_ZLIB_CFLAGS $CFLAGS"
        LDFLAGS="$MOZ_ZLIB_LIBS $LDFLAGS"
    fi
    if test -z "$ZLIB_DIR" -o "$ZLIB_DIR" = no; then
        MOZ_NATIVE_ZLIB=
    else
        echo $ac_n "checking for gzread in -lz""... $ac_c" 1>&6
echo "configure:13003: checking for gzread in -lz" >&5
ac_lib_var=`echo z'_'gzread | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lz  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 13011 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char gzread();

int main() {
gzread()
; return 0; }
EOF
if { (eval echo configure:13022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  MOZ_NATIVE_ZLIB=1 MOZ_ZLIB_LIBS="$MOZ_ZLIB_LIBS -lz"
else
  echo "$ac_t""no" 1>&6
MOZ_NATIVE_ZLIB=
fi

        if test "$MOZ_NATIVE_ZLIB" = 1; then
            MOZZLIBNUM=`echo $MOZZLIB | awk -F. '{printf "0x%x\n", ((($1 * 16 + $2) * 16) + $3) * 16 + $4}'`
            cat > conftest.$ac_ext <<EOF
#line 13046 "configure"
#include "confdefs.h"
 #include <stdio.h>
                             #include <string.h>
                             #include <zlib.h> 
int main() {
 #if ZLIB_VERNUM < $MOZZLIBNUM
                             #error "Insufficient zlib version ($MOZZLIBNUM required)."
                             #endif 
; return 0; }
EOF
if { (eval echo configure:13057: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  MOZ_NATIVE_ZLIB=1
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  { echo "configure: error: Insufficient zlib version for --with-system-zlib ($MOZZLIB required)" 1>&2; echo "configure: error: Insufficient zlib version for --with-system-zlib ($MOZZLIB required)" 1>&5; exit 1; }
fi
rm -f conftest*
        fi
    fi
    CFLAGS=$_SAVE_CFLAGS
    LDFLAGS=$_SAVE_LDFLAGS
    LIBS=$_SAVE_LIBS
fi







if test -n "$ZLIB_IN_MOZGLUE"; then
    cat >> confdefs.pytmp <<\EOF
    (''' ZLIB_IN_MOZGLUE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define ZLIB_IN_MOZGLUE 1
EOF

fi




# Check whether --enable-system-ffi or --disable-system-ffi was given.
if test "${enable_system_ffi+set}" = set; then
  enableval="$enable_system_ffi"
  if test "$enableval" = "yes"; then
    MOZ_NATIVE_FFI=1 
  elif test "$enableval" = "no"; then
    :
  else
    { echo "configure: error: Option, system-ffi, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, system-ffi, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test -n "$MOZ_NATIVE_FFI"; then
    # Vanilla libffi 3.0.9 needs a few patches from upcoming version 3.0.10
    # for non-GCC compilers.
    if test -z "$GNU_CC"; then
        succeeded=no

  if test -z "$PKG_CONFIG"; then
    # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:13116: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$PKG_CONFIG" in
  /*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
  ;;
esac
fi
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
if test -n "$PKG_CONFIG"; then
  echo "$ac_t""$PKG_CONFIG" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  fi

  if test "$PKG_CONFIG" = "no" ; then
     echo "*** The pkg-config script could not be found. Make sure it is"
     echo "*** in your path, or set the PKG_CONFIG environment variable"
     echo "*** to the full path to pkg-config."
     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
  else
     PKG_CONFIG_MIN_VERSION=0.9.0
     if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
        echo $ac_n "checking for libffi > 3.0.9""... $ac_c" 1>&6
echo "configure:13160: checking for libffi > 3.0.9" >&5

        if $PKG_CONFIG --exists "libffi > 3.0.9" ; then
            echo "$ac_t""yes" 1>&6
            succeeded=yes

            echo $ac_n "checking MOZ_FFI_CFLAGS""... $ac_c" 1>&6
echo "configure:13167: checking MOZ_FFI_CFLAGS" >&5
            MOZ_FFI_CFLAGS=`$PKG_CONFIG --cflags "libffi > 3.0.9"`
            echo "$ac_t""$MOZ_FFI_CFLAGS" 1>&6

            echo $ac_n "checking MOZ_FFI_LIBS""... $ac_c" 1>&6
echo "configure:13172: checking MOZ_FFI_LIBS" >&5
            ## Remove evil flags like -Wl,--export-dynamic
            MOZ_FFI_LIBS="`$PKG_CONFIG --libs \"libffi > 3.0.9\" |sed s/-Wl,--export-dynamic//g`"
            echo "$ac_t""$MOZ_FFI_LIBS" 1>&6
        else
            MOZ_FFI_CFLAGS=""
            MOZ_FFI_LIBS=""
            ## If we have a custom action on failure, don't print errors, but 
            ## do set a variable so people can do so.
            MOZ_FFI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libffi > 3.0.9"`
            echo $MOZ_FFI_PKG_ERRORS
        fi

        
        
     else
        echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
        echo "*** See http://www.freedesktop.org/software/pkgconfig"
     fi
  fi

  if test $succeeded = yes; then
     :
  else
     if test "$COMPILE_ENVIRONMENT"; then 
       { echo "configure: error: Library requirements (libffi > 3.0.9) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&2; echo "configure: error: Library requirements (libffi > 3.0.9) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&5; exit 1; }
     fi
  fi

    else
        succeeded=no

  if test -z "$PKG_CONFIG"; then
    # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:13208: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$PKG_CONFIG" in
  /*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
  ;;
esac
fi
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
if test -n "$PKG_CONFIG"; then
  echo "$ac_t""$PKG_CONFIG" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  fi

  if test "$PKG_CONFIG" = "no" ; then
     echo "*** The pkg-config script could not be found. Make sure it is"
     echo "*** in your path, or set the PKG_CONFIG environment variable"
     echo "*** to the full path to pkg-config."
     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
  else
     PKG_CONFIG_MIN_VERSION=0.9.0
     if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
        echo $ac_n "checking for libffi >= 3.0.9""... $ac_c" 1>&6
echo "configure:13252: checking for libffi >= 3.0.9" >&5

        if $PKG_CONFIG --exists "libffi >= 3.0.9" ; then
            echo "$ac_t""yes" 1>&6
            succeeded=yes

            echo $ac_n "checking MOZ_FFI_CFLAGS""... $ac_c" 1>&6
echo "configure:13259: checking MOZ_FFI_CFLAGS" >&5
            MOZ_FFI_CFLAGS=`$PKG_CONFIG --cflags "libffi >= 3.0.9"`
            echo "$ac_t""$MOZ_FFI_CFLAGS" 1>&6

            echo $ac_n "checking MOZ_FFI_LIBS""... $ac_c" 1>&6
echo "configure:13264: checking MOZ_FFI_LIBS" >&5
            ## Remove evil flags like -Wl,--export-dynamic
            MOZ_FFI_LIBS="`$PKG_CONFIG --libs \"libffi >= 3.0.9\" |sed s/-Wl,--export-dynamic//g`"
            echo "$ac_t""$MOZ_FFI_LIBS" 1>&6
        else
            MOZ_FFI_CFLAGS=""
            MOZ_FFI_LIBS=""
            ## If we have a custom action on failure, don't print errors, but 
            ## do set a variable so people can do so.
            MOZ_FFI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libffi >= 3.0.9"`
            echo $MOZ_FFI_PKG_ERRORS
        fi

        
        
     else
        echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
        echo "*** See http://www.freedesktop.org/software/pkgconfig"
     fi
  fi

  if test $succeeded = yes; then
     :
  else
     if test "$COMPILE_ENVIRONMENT"; then 
       { echo "configure: error: Library requirements (libffi >= 3.0.9) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&2; echo "configure: error: Library requirements (libffi >= 3.0.9) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&5; exit 1; }
     fi
  fi

    fi
fi






# Application

ENABLE_TESTS=1

USE_ARM_KUSER=

case "${target}" in
    arm*-android*|arm*-linuxandroid*)
        USE_ARM_KUSER=1
        ;;
esac

# Check whether --with-arm-kuser or --without-arm-kuser was given.
if test "${with_arm_kuser+set}" = set; then
  withval="$with_arm_kuser"
  if test "$withval" = "yes"; then
    USE_ARM_KUSER=1
  elif test "$withval" = "no"; then
    :
  else
    { echo "configure: error: Option, arm-kuser, does not take an argument ($withval)." 1>&2; echo "configure: error: Option, arm-kuser, does not take an argument ($withval)." 1>&5; exit 1; }
  fi
fi

if test -n "$USE_ARM_KUSER"; then
   cat >> confdefs.pytmp <<\EOF
    (''' USE_ARM_KUSER ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define USE_ARM_KUSER 1
EOF

fi

# Components and Features

# Check whether --enable-ui-locale or --disable-ui-locale was given.
if test "${enable_ui_locale+set}" = set; then
  enableval="$enable_ui_locale"
  MOZ_UI_LOCALE=$enableval 
fi



# Check whether --enable-tests or --disable-tests was given.
if test "${enable_tests+set}" = set; then
  enableval="$enable_tests"
  if test "$enableval" = "no"; then
    ENABLE_TESTS=
  elif test "$enableval" = "yes"; then
    ENABLE_TESTS=1 
  else
    { echo "configure: error: Option, tests, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, tests, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


# Individual module options

# Debugging and Optimizations

if test "$ENABLE_METHODJIT_SPEW"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_METHODJIT_SPEW ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_METHODJIT_SPEW 1
EOF

fi

if test -z "$MOZ_OPTIMIZE_FLAGS"; then
	MOZ_OPTIMIZE_FLAGS="-O"
fi

# Check whether --enable-optimize or --disable-optimize was given.
if test "${enable_optimize+set}" = set; then
  enableval="$enable_optimize"
   if test "$enableval" != "no"; then
    MOZ_OPTIMIZE=1
    if test -n "$enableval" -a "$enableval" != "yes"; then
        MOZ_OPTIMIZE_FLAGS=`echo "$enableval" | sed -e 's|\\\ | |g'`
        MOZ_OPTIMIZE=2
    fi
else
    MOZ_OPTIMIZE=
fi 
else
  MOZ_OPTIMIZE=1
fi



  case "$target" in
  *android*)
    unwind_tables="-funwind-tables"
    ;;
  esac
  if test "$GNU_CC"; then
    MOZ_ENABLE_FRAME_PTR="-fno-omit-frame-pointer $unwind_tables"
    MOZ_DISABLE_FRAME_PTR="-fomit-frame-pointer"
    if test "$CPU_ARCH" = arm; then
      # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54398
      MOZ_ENABLE_FRAME_PTR="$unwind_tables"
    fi
  else
    case "$target" in
    *-mingw*)
      MOZ_ENABLE_FRAME_PTR="-Oy-"
      MOZ_DISABLE_FRAME_PTR="-Oy"
    ;;
    esac
  fi

  # if we are debugging, profiling or using sanitizers, we want a frame pointer.
  if test -z "$MOZ_OPTIMIZE" -o \
          -n "$MOZ_PROFILING" -o \
          -n "$MOZ_DEBUG" -o \
          -n "$MOZ_MSAN" -o \
          -n "$MOZ_ASAN"; then
    MOZ_FRAMEPTR_FLAGS="$MOZ_ENABLE_FRAME_PTR"
  else
    MOZ_FRAMEPTR_FLAGS="$MOZ_DISABLE_FRAME_PTR"
  fi


if test "$COMPILE_ENVIRONMENT"; then
if test -n "$MOZ_OPTIMIZE"; then
    echo $ac_n "checking for valid optimization flags""... $ac_c" 1>&6
echo "configure:13430: checking for valid optimization flags" >&5
    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS $MOZ_OPTIMIZE_FLAGS"
    cat > conftest.$ac_ext <<EOF
#line 13434 "configure"
#include "confdefs.h"
#include <stdio.h>
int main() {
printf("Hello World\n");
; return 0; }
EOF
if { (eval echo configure:13441: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  _results=yes
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  _results=no
fi
rm -f conftest*
    echo "$ac_t""$_results" 1>&6
    if test "$_results" = "no"; then
        { echo "configure: error: These compiler flags are invalid: $MOZ_OPTIMIZE_FLAGS" 1>&2; echo "configure: error: These compiler flags are invalid: $MOZ_OPTIMIZE_FLAGS" 1>&5; exit 1; }
    fi
    CFLAGS=$_SAVE_CFLAGS
fi
fi # COMPILE_ENVIRONMENT







ENABLE_TRACE_LOGGING=1
# Check whether --enable-trace-logging or --disable-trace-logging was given.
if test "${enable_trace_logging+set}" = set; then
  enableval="$enable_trace_logging"
  if test "$enableval" = "no"; then
    ENABLE_TRACE_LOGGING= 
  elif test "$enableval" = "yes"; then
    :
  else
    { echo "configure: error: Option, trace-logging, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, trace-logging, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi




if test -n "$ENABLE_TRACE_LOGGING"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_TRACE_LOGGING ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_TRACE_LOGGING 1
EOF

fi

if test -z "$MOZ_ENABLE_WARNINGS_AS_ERRORS"; then
   WARNINGS_AS_ERRORS=''
elif test "$GNU_CC"; then
    # Prevent the following GCC warnings from being treated as errors:
    # -Wmaybe-uninitialized - too many false positives
    # -Wdeprecated-declarations - we don't want our builds held hostage when a
    #   platform-specific API becomes deprecated.
    # -Wfree-nonheap-object - false positives during PGO
    # -Warray-bounds - false positives depending on optimization
    
    echo $ac_n "checking whether the C compiler supports -Wno-error=maybe-uninitialized""... $ac_c" 1>&6
echo "configure:13502: checking whether the C compiler supports -Wno-error=maybe-uninitialized" >&5
if eval "test \"`echo '$''{'ac_c_has_noerror_maybe_uninitialized'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wno-error=maybe-uninitialized"
            cat > conftest.$ac_ext <<EOF
#line 13518 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13525: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_noerror_maybe_uninitialized="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_noerror_maybe_uninitialized="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_noerror_maybe_uninitialized" 1>&6
    if test "${ac_c_has_noerror_maybe_uninitialized}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-error=maybe-uninitialized"
    fi

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-error=maybe-uninitialized""... $ac_c" 1>&6
echo "configure:13553: checking whether the C++ compiler supports -Wno-error=maybe-uninitialized" >&5
if eval "test \"`echo '$''{'ac_cxx_has_noerror_maybe_uninitialized'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wno-error=maybe-uninitialized"
            cat > conftest.$ac_ext <<EOF
#line 13569 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13576: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_noerror_maybe_uninitialized="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_noerror_maybe_uninitialized="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_noerror_maybe_uninitialized" 1>&6
    if test "${ac_cxx_has_noerror_maybe_uninitialized}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-error=maybe-uninitialized"
    fi

    
    echo $ac_n "checking whether the C compiler supports -Wno-error=deprecated-declarations""... $ac_c" 1>&6
echo "configure:13604: checking whether the C compiler supports -Wno-error=deprecated-declarations" >&5
if eval "test \"`echo '$''{'ac_c_has_noerror_deprecated_declarations'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wno-error=deprecated-declarations"
            cat > conftest.$ac_ext <<EOF
#line 13620 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13627: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_noerror_deprecated_declarations="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_noerror_deprecated_declarations="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_noerror_deprecated_declarations" 1>&6
    if test "${ac_c_has_noerror_deprecated_declarations}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-error=deprecated-declarations"
    fi

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-error=deprecated-declarations""... $ac_c" 1>&6
echo "configure:13655: checking whether the C++ compiler supports -Wno-error=deprecated-declarations" >&5
if eval "test \"`echo '$''{'ac_cxx_has_noerror_deprecated_declarations'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wno-error=deprecated-declarations"
            cat > conftest.$ac_ext <<EOF
#line 13671 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13678: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_noerror_deprecated_declarations="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_noerror_deprecated_declarations="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_noerror_deprecated_declarations" 1>&6
    if test "${ac_cxx_has_noerror_deprecated_declarations}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-error=deprecated-declarations"
    fi

    
    echo $ac_n "checking whether the C compiler supports -Wno-error=array-bounds""... $ac_c" 1>&6
echo "configure:13706: checking whether the C compiler supports -Wno-error=array-bounds" >&5
if eval "test \"`echo '$''{'ac_c_has_noerror_array_bounds'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wno-error=array-bounds"
            cat > conftest.$ac_ext <<EOF
#line 13722 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13729: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_noerror_array_bounds="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_noerror_array_bounds="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_noerror_array_bounds" 1>&6
    if test "${ac_c_has_noerror_array_bounds}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-error=array-bounds"
    fi

    
    echo $ac_n "checking whether the C++ compiler supports -Wno-error=array-bounds""... $ac_c" 1>&6
echo "configure:13757: checking whether the C++ compiler supports -Wno-error=array-bounds" >&5
if eval "test \"`echo '$''{'ac_cxx_has_noerror_array_bounds'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wno-error=array-bounds"
            cat > conftest.$ac_ext <<EOF
#line 13773 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13780: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_noerror_array_bounds="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_noerror_array_bounds="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_noerror_array_bounds" 1>&6
    if test "${ac_cxx_has_noerror_array_bounds}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-error=array-bounds"
    fi


    if test -n "$MOZ_PGO"; then
        
    echo $ac_n "checking whether the C compiler supports -Wno-error=coverage-mismatch""... $ac_c" 1>&6
echo "configure:13810: checking whether the C compiler supports -Wno-error=coverage-mismatch" >&5
if eval "test \"`echo '$''{'ac_c_has_noerror_coverage_mismatch'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wno-error=coverage-mismatch"
            cat > conftest.$ac_ext <<EOF
#line 13826 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13833: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_noerror_coverage_mismatch="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_noerror_coverage_mismatch="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_noerror_coverage_mismatch" 1>&6
    if test "${ac_c_has_noerror_coverage_mismatch}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-error=coverage-mismatch"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Wno-error=coverage-mismatch""... $ac_c" 1>&6
echo "configure:13861: checking whether the C++ compiler supports -Wno-error=coverage-mismatch" >&5
if eval "test \"`echo '$''{'ac_cxx_has_noerror_coverage_mismatch'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wno-error=coverage-mismatch"
            cat > conftest.$ac_ext <<EOF
#line 13877 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13884: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_noerror_coverage_mismatch="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_noerror_coverage_mismatch="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_noerror_coverage_mismatch" 1>&6
    if test "${ac_cxx_has_noerror_coverage_mismatch}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-error=coverage-mismatch"
    fi

        
    echo $ac_n "checking whether the C compiler supports -Wno-error=free-nonheap-object""... $ac_c" 1>&6
echo "configure:13912: checking whether the C compiler supports -Wno-error=free-nonheap-object" >&5
if eval "test \"`echo '$''{'ac_c_has_noerror_free_nonheap_object'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

            _SAVE_CFLAGS="$CFLAGS"
            CFLAGS="$CFLAGS -Werror -Wno-error=free-nonheap-object"
            cat > conftest.$ac_ext <<EOF
#line 13928 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13935: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_c_has_noerror_free_nonheap_object="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_c_has_noerror_free_nonheap_object="no"
fi
rm -f conftest*
            CFLAGS="$_SAVE_CFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_c_has_noerror_free_nonheap_object" 1>&6
    if test "${ac_c_has_noerror_free_nonheap_object}" = "yes"; then
        _WARNINGS_CFLAGS="${_WARNINGS_CFLAGS} -Wno-error=free-nonheap-object"
    fi

        
    echo $ac_n "checking whether the C++ compiler supports -Wno-error=free-nonheap-object""... $ac_c" 1>&6
echo "configure:13963: checking whether the C++ compiler supports -Wno-error=free-nonheap-object" >&5
if eval "test \"`echo '$''{'ac_cxx_has_noerror_free_nonheap_object'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  
            
            ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

            _SAVE_CXXFLAGS="$CXXFLAGS"
            CXXFLAGS="$CXXFLAGS -Werror -Wno-error=free-nonheap-object"
            cat > conftest.$ac_ext <<EOF
#line 13979 "configure"
#include "confdefs.h"

int main() {
return(0);
; return 0; }
EOF
if { (eval echo configure:13986: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cxx_has_noerror_free_nonheap_object="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cxx_has_noerror_free_nonheap_object="no"
fi
rm -f conftest*
            CXXFLAGS="$_SAVE_CXXFLAGS"
            ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

        
fi

echo "$ac_t""$ac_cxx_has_noerror_free_nonheap_object" 1>&6
    if test "${ac_cxx_has_noerror_free_nonheap_object}" = "yes"; then
        _WARNINGS_CXXFLAGS="${_WARNINGS_CXXFLAGS} -Wno-error=free-nonheap-object"
    fi

    fi
fi


# Check whether --enable-dmd or --disable-dmd was given.
if test "${enable_dmd+set}" = set; then
  enableval="$enable_dmd"
  if test "$enableval" = "yes"; then
    MOZ_DMD=1
  elif test "$enableval" = "no"; then
    MOZ_DMD= 
  else
    { echo "configure: error: Option, dmd, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, dmd, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$MOZ_DMD"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_DMD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_DMD 1
EOF


    if test "${CPU_ARCH}" = "arm"; then
        CFLAGS="$CFLAGS -funwind-tables"
        CXXFLAGS="$CXXFLAGS -funwind-tables"
    fi
fi


LOCAL_MOZ_MEMORY=1
# Check whether --enable-jemalloc or --disable-jemalloc was given.
if test "${enable_jemalloc+set}" = set; then
  enableval="$enable_jemalloc"
  if test "$enableval" = "no"; then
    LOCAL_MOZ_MEMORY=
  elif test "$enableval" = "yes"; then
    :
  else
    { echo "configure: error: Option, jemalloc, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, jemalloc, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test "$JS_STANDALONE"; then
    MOZ_MEMORY=$LOCAL_MOZ_MEMORY
fi

case "${OS_TARGET}" in
Android|WINNT|Darwin)
  MOZ_GLUE_IN_PROGRAM=
  ;;
*)
    MOZ_GLUE_IN_PROGRAM=1
  cat >> confdefs.pytmp <<\EOF
    (''' MOZ_GLUE_IN_PROGRAM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_GLUE_IN_PROGRAM 1
EOF

  ;;
esac

if test "$MOZ_MEMORY"; then
  cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY 1
EOF

  if test "x$MOZ_DEBUG" = "x1"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_DEBUG ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_DEBUG 1
EOF

  fi
        case "${target}" in
  *-darwin*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_DARWIN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_DARWIN 1
EOF

    ;;
  *-*freebsd*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_BSD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_BSD 1
EOF

    ;;
  *-android*|*-linuxandroid*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_LINUX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_LINUX 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_ANDROID ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_ANDROID 1
EOF

    ;;
  *-*linux*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_LINUX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_LINUX 1
EOF

    ;;
  *-netbsd*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_BSD ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_BSD 1
EOF

    ;;
  *-solaris*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_SOLARIS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_SOLARIS 1
EOF

    ;;
  *-mingw*)
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_MEMORY_WINDOWS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_MEMORY_WINDOWS 1
EOF

    ;;
  *)
    { echo "configure: error: --enable-jemalloc not supported on ${target}" 1>&2; echo "configure: error: --enable-jemalloc not supported on ${target}" 1>&5; exit 1; }
    ;;
  esac
fi


if test -n "$MOZ_JEMALLOC4"; then
  cat >> confdefs.pytmp <<\EOF
    (''' MOZ_JEMALLOC4 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_JEMALLOC4 1
EOF

fi




# Check whether --enable-wrap-malloc or --disable-wrap-malloc was given.
if test "${enable_wrap_malloc+set}" = set; then
  enableval="$enable_wrap_malloc"
  if test "$enableval" = "yes"; then
    _WRAP_MALLOC=1
  elif test "$enableval" = "no"; then
    _WRAP_MALLOC= 
  else
    { echo "configure: error: Option, wrap-malloc, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, wrap-malloc, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test -n "$_WRAP_MALLOC"; then
    if test "$GNU_CC"; then
        WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=malloc,--wrap=calloc,--wrap=valloc,--wrap=free,--wrap=realloc,--wrap=memalign"
        WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=__builtin_new,--wrap=__builtin_vec_new,--wrap=__builtin_delete,--wrap=__builtin_vec_delete"
        WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=strdup,--wrap=strndup"
        WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=posix_memalign,--wrap=malloc_usable_size"
                if test "$OS_TARGET" = "Android"; then
            WRAP_LDFLAGS="${WRAP_LDFLAGS} -Wl,--wrap=_Znwj,--wrap=_Znaj,--wrap=_ZdlPv,--wrap=_ZdaPv"
        fi
    else
        { echo "configure: error: --enable-wrap-malloc is not supported for non-GNU toolchains" 1>&2; echo "configure: error: --enable-wrap-malloc is not supported for non-GNU toolchains" 1>&5; exit 1; }
    fi
fi

# Check whether --with-wrap-malloc or --without-wrap-malloc was given.
if test "${with_wrap_malloc+set}" = set; then
  withval="$with_wrap_malloc"
  WRAP_LDFLAGS="${WRAP_LDFLAGS} $withval"
fi


# Check whether --enable-small-chunk-size or --disable-small-chunk-size was given.
if test "${enable_small_chunk_size+set}" = set; then
  enableval="$enable_small_chunk_size"
  if test "$enableval" = "yes"; then
    JS_GC_SMALL_CHUNK_SIZE=1
  elif test "$enableval" = "no"; then
    JS_GC_SMALL_CHUNK_SIZE= 
  else
    { echo "configure: error: Option, small-chunk-size, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, small-chunk-size, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_GC_SMALL_CHUNK_SIZE"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_GC_SMALL_CHUNK_SIZE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_GC_SMALL_CHUNK_SIZE 1
EOF

fi

# Check whether --enable-gc-trace or --disable-gc-trace was given.
if test "${enable_gc_trace+set}" = set; then
  enableval="$enable_gc_trace"
  if test "$enableval" = "yes"; then
    JS_GC_TRACE=1
  elif test "$enableval" = "no"; then
    JS_GC_TRACE= 
  else
    { echo "configure: error: Option, gc-trace, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, gc-trace, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_GC_TRACE"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_GC_TRACE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_GC_TRACE 1
EOF

fi

# Check whether --enable-valgrind or --disable-valgrind was given.
if test "${enable_valgrind+set}" = set; then
  enableval="$enable_valgrind"
  if test "$enableval" = "yes"; then
    MOZ_VALGRIND=1
  elif test "$enableval" = "no"; then
    MOZ_VALGRIND= 
  else
    { echo "configure: error: Option, valgrind, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, valgrind, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_VALGRIND"; then
       ac_safe=`echo "valgrind/valgrind.h" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for valgrind/valgrind.h""... $ac_c" 1>&6
echo "configure:14280: checking for valgrind/valgrind.h" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 14285 "configure"
#include "confdefs.h"

#include <valgrind/valgrind.h>
int main() {

; return 0; }
EOF
if { (eval echo configure:14293: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
    :
  else
    echo "$ac_t""no" 1>&6
    { echo "configure: error: --enable-valgrind specified but Valgrind is not installed" 1>&2; echo "configure: error: --enable-valgrind specified but Valgrind is not installed" 1>&5; exit 1; }
  fi

    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_VALGRIND ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_VALGRIND 1
EOF

    MOZ_VALGRIND=1
fi


# Check whether --enable-simulator or --disable-simulator was given.
if test "${enable_simulator+set}" = set; then
  enableval="$enable_simulator"
  JS_SIMULATOR="$enableval"
fi


if test -n "$JS_SIMULATOR"; then
    case "$JS_SIMULATOR" in
        arm|arm64|mips32|mips64) ;;
        no)
            JS_SIMULATOR=
            ;;
        *) { echo "configure: error: Invalid simulator. Valid simulators are: arm, arm64, mips32, mips64." 1>&2; echo "configure: error: Invalid simulator. Valid simulators are: arm, arm64, mips32, mips64." 1>&5; exit 1; } ;;
    esac
fi

if test -z "$ENABLE_ION"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_NONE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_NONE 1
EOF

    JS_CODEGEN_NONE=1
elif test "$JS_SIMULATOR" = arm; then
    if test "$CPU_ARCH" != "x86"; then
        { echo "configure: error: The ARM simulator only works on x86." 1>&2; echo "configure: error: The ARM simulator only works on x86." 1>&5; exit 1; }
    fi
    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR_ARM 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_DISASM_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_DISASM_ARM 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_ARM 1
EOF

    JS_SIMULATOR_ARM=1
    JS_DISASM_ARM=1
    JS_CODEGEN_ARM=1
elif test "$JS_SIMULATOR" = arm64; then
    if test "$CPU_ARCH" != "x86_64"; then
        { echo "configure: error: The ARM64 simulator only works on x86_64." 1>&2; echo "configure: error: The ARM64 simulator only works on x86_64." 1>&5; exit 1; }
    fi
    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR_ARM64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR_ARM64 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_ARM64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_ARM64 1
EOF

    JS_SIMULATOR_ARM64=1
    JS_CODEGEN_ARM64=1
elif test "$JS_SIMULATOR" = mips32; then
    if test "$CPU_ARCH" != "x86"; then
        { echo "configure: error: The MIPS32 simulator only works on x86." 1>&2; echo "configure: error: The MIPS32 simulator only works on x86." 1>&5; exit 1; }
    fi
    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR_MIPS32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR_MIPS32 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_MIPS32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_MIPS32 1
EOF

    JS_SIMULATOR_MIPS32=1
    JS_CODEGEN_MIPS32=1
elif test "$JS_SIMULATOR" = mips64; then
    if test "$CPU_ARCH" != "x86_64"; then
        { echo "configure: error: The MIPS64 simulator only works on x86_64." 1>&2; echo "configure: error: The MIPS64 simulator only works on x86_64." 1>&5; exit 1; }
    fi
    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_SIMULATOR_MIPS64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_SIMULATOR_MIPS64 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_MIPS64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_MIPS64 1
EOF

    JS_SIMULATOR_MIPS64=1
    JS_CODEGEN_MIPS64=1
elif test "$CPU_ARCH" = "x86"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_X86 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_X86 1
EOF

    JS_CODEGEN_X86=1
elif test "$CPU_ARCH" = "x86_64"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_X64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_X64 1
EOF

    JS_CODEGEN_X64=1

            cat >> confdefs.pytmp <<\EOF
    (''' ASMJS_MAY_USE_SIGNAL_HANDLERS_FOR_OOB ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define ASMJS_MAY_USE_SIGNAL_HANDLERS_FOR_OOB 1
EOF

    ASMJS_MAY_USE_SIGNAL_HANDLERS_FOR_OOB=1
elif test "$CPU_ARCH" = "arm"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_ARM 1
EOF

    JS_CODEGEN_ARM=1
    if test -n "$MOZ_DEBUG"; then
        cat >> confdefs.pytmp <<\EOF
    (''' JS_DISASM_ARM ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_DISASM_ARM 1
EOF

        JS_DISASM_ARM=1
    fi
elif test "$CPU_ARCH" = "mips32"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_MIPS32 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_MIPS32 1
EOF

    JS_CODEGEN_MIPS32=1
elif test "$CPU_ARCH" = "mips64"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_CODEGEN_MIPS64 ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_CODEGEN_MIPS64 1
EOF

    JS_CODEGEN_MIPS64=1
fi
















# Check whether --enable-jprof or --disable-jprof was given.
if test "${enable_jprof+set}" = set; then
  enableval="$enable_jprof"
  if test "$enableval" = "yes"; then
    MOZ_JPROF=1
  elif test "$enableval" = "no"; then
    MOZ_JPROF= 
  else
    { echo "configure: error: Option, jprof, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, jprof, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_JPROF"; then
    MOZ_PROFILING=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_JPROF ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_JPROF 1
EOF

fi

# Check whether --enable-instruments or --disable-instruments was given.
if test "${enable_instruments+set}" = set; then
  enableval="$enable_instruments"
  if test "$enableval" = "yes"; then
    MOZ_INSTRUMENTS=1
  elif test "$enableval" = "no"; then
    MOZ_INSTRUMENTS= 
  else
    { echo "configure: error: Option, instruments, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, instruments, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_INSTRUMENTS"; then
    MOZ_PROFILING=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_INSTRUMENTS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_INSTRUMENTS 1
EOF

    LIBS="$LIBS -framework CoreFoundation"
fi

# Check whether --enable-callgrind or --disable-callgrind was given.
if test "${enable_callgrind+set}" = set; then
  enableval="$enable_callgrind"
  if test "$enableval" = "yes"; then
    MOZ_CALLGRIND=1
  elif test "$enableval" = "no"; then
    MOZ_CALLGRIND= 
  else
    { echo "configure: error: Option, callgrind, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, callgrind, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$MOZ_CALLGRIND"; then
    MOZ_PROFILING=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_CALLGRIND ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_CALLGRIND 1
EOF

fi

# Check whether --enable-vtune or --disable-vtune was given.
if test "${enable_vtune+set}" = set; then
  enableval="$enable_vtune"
  if test "$enableval" = "yes"; then
    MOZ_VTUNE=1
  elif test "$enableval" = "no"; then
    MOZ_VTUNE= 
  else
    { echo "configure: error: Option, vtune, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, vtune, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


# Check whether --enable-jitspew or --disable-jitspew was given.
if test "${enable_jitspew+set}" = set; then
  enableval="$enable_jitspew"
  if test "$enableval" = "yes"; then
    JS_JITSPEW=1
  elif test "$enableval" = "no"; then
    JS_JITSPEW= 
  else
    { echo "configure: error: Option, jitspew, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, jitspew, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test -n "$JS_JITSPEW" -o -n "$MOZ_DEBUG"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_JITSPEW ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_JITSPEW 1
EOF

fi



if test -n "$MOZ_DEBUG"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_DEBUG ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_DEBUG 1
EOF

fi

if test -n "$MOZ_PROFILING"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_PROFILING ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_PROFILING 1
EOF


    case "$OS_TARGET" in
        Linux) MOZ_VTUNE=1 ;;
        WINNT) MOZ_VTUNE=1 ;;
    esac
fi

if test -n "$MOZ_VTUNE"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_VTUNE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_VTUNE 1
EOF

fi

# Check whether --enable-gczeal or --disable-gczeal was given.
if test "${enable_gczeal+set}" = set; then
  enableval="$enable_gczeal"
  if test "$enableval" = "yes"; then
    JS_GC_ZEAL=1
  elif test "$enableval" = "no"; then
    JS_GC_ZEAL= 
  else
    { echo "configure: error: Option, gczeal, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, gczeal, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_GC_ZEAL" -o -n "$MOZ_DEBUG"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_GC_ZEAL ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_GC_ZEAL 1
EOF

fi

# Check whether --enable-perf or --disable-perf was given.
if test "${enable_perf+set}" = set; then
  enableval="$enable_perf"
  if test "$enableval" = "yes"; then
    JS_ION_PERF=1
  elif test "$enableval" = "no"; then
    JS_ION_PERF= 
  else
    { echo "configure: error: Option, perf, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, perf, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_ION_PERF"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_ION_PERF ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_ION_PERF 1
EOF

fi

# Check whether --enable-more-deterministic or --disable-more-deterministic was given.
if test "${enable_more_deterministic+set}" = set; then
  enableval="$enable_more_deterministic"
  if test "$enableval" = "yes"; then
    JS_MORE_DETERMINISTIC=1
  elif test "$enableval" = "no"; then
    JS_MORE_DETERMINISTIC= 
  else
    { echo "configure: error: Option, more-deterministic, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, more-deterministic, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_MORE_DETERMINISTIC"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_MORE_DETERMINISTIC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_MORE_DETERMINISTIC 1
EOF

fi

# Check whether --enable-oom-breakpoint or --disable-oom-breakpoint was given.
if test "${enable_oom_breakpoint+set}" = set; then
  enableval="$enable_oom_breakpoint"
  if test "$enableval" = "yes"; then
    JS_OOM_BREAKPOINT=1
  elif test "$enableval" = "no"; then
    JS_OOM_BREAKPOINT= 
  else
    { echo "configure: error: Option, oom-breakpoint, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, oom-breakpoint, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$JS_OOM_BREAKPOINT"; then
    cat >> confdefs.pytmp <<\EOF
    (''' JS_OOM_BREAKPOINT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_OOM_BREAKPOINT 1
EOF

fi




# Check whether --enable-clang-plugin or --disable-clang-plugin was given.
if test "${enable_clang_plugin+set}" = set; then
  enableval="$enable_clang_plugin"
  if test "$enableval" = "yes"; then
    ENABLE_CLANG_PLUGIN=1
  elif test "$enableval" = "no"; then
    ENABLE_CLANG_PLUGIN= 
  else
    { echo "configure: error: Option, clang-plugin, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, clang-plugin, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

if test -n "$ENABLE_CLANG_PLUGIN"; then
    if test -z "$CLANG_CC"; then
        { echo "configure: error: Can't use clang plugin without clang." 1>&2; echo "configure: error: Can't use clang plugin without clang." 1>&5; exit 1; }
    fi

    echo $ac_n "checking for llvm-config""... $ac_c" 1>&6
echo "configure:14799: checking for llvm-config" >&5
    if test -z "$LLVMCONFIG"; then
      LLVMCONFIG=`$CXX -print-prog-name=llvm-config`
    fi

    if test -z "$LLVMCONFIG"; then
      LLVMCONFIG=`which llvm-config`
    fi

    if test ! -x "$LLVMCONFIG"; then
      echo "$ac_t""not found" 1>&6
      { echo "configure: error: Cannot find an llvm-config binary for building a clang plugin" 1>&2; echo "configure: error: Cannot find an llvm-config binary for building a clang plugin" 1>&5; exit 1; }
    fi

    echo "$ac_t""$LLVMCONFIG" 1>&6

    if test -z "$LLVMCONFIG"; then
        { echo "configure: error: Cannot find an llvm-config binary for building a clang plugin" 1>&2; echo "configure: error: Cannot find an llvm-config binary for building a clang plugin" 1>&5; exit 1; }
    fi
    LLVM_CXXFLAGS=`$LLVMCONFIG --cxxflags`
                LLVM_LDFLAGS=`$LLVMCONFIG --system-libs | xargs`
    LLVM_LDFLAGS="$LLVM_LDFLAGS `$LLVMCONFIG --ldflags --libs core mc analysis asmparser mcparser bitreader option | xargs`"

    if test "${HOST_OS_ARCH}" = "Darwin"; then
        CLANG_LDFLAGS="-lclangFrontend -lclangDriver -lclangSerialization"
        CLANG_LDFLAGS="$CLANG_LDFLAGS -lclangParse -lclangSema -lclangAnalysis"
        CLANG_LDFLAGS="$CLANG_LDFLAGS -lclangEdit -lclangAST -lclangLex"
        CLANG_LDFLAGS="$CLANG_LDFLAGS -lclangBasic -lclangASTMatchers"
    else
        CLANG_LDFLAGS="-lclangASTMatchers"
    fi

    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_CLANG_PLUGIN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_CLANG_PLUGIN 1
EOF

fi










# Check whether --with-sixgill or --without-sixgill was given.
if test "${with_sixgill+set}" = set; then
  withval="$with_sixgill"
  SIXGILL_PATH=$withval
else
  SIXGILL_PATH= 
fi


if test -n "$SIXGILL_PATH"; then
    if test ! -x "$SIXGILL_PATH/bin/xdbfind" || test ! -f "$SIXGILL_PATH/gcc/xgill.so" || test ! -x "$SIXGILL_PATH/scripts/wrap_gcc/g++"; then
        { echo "configure: error: The sixgill plugin and binaries are not at the specified path." 1>&2; echo "configure: error: The sixgill plugin and binaries are not at the specified path." 1>&5; exit 1; }
    fi
fi


# Check whether --enable-strip or --disable-strip was given.
if test "${enable_strip+set}" = set; then
  enableval="$enable_strip"
  if test "$enableval" = "yes"; then
    ENABLE_STRIP=1
  elif test "$enableval" = "no"; then
    ENABLE_STRIP= 
  else
    { echo "configure: error: Option, strip, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, strip, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


# Check whether --enable-install-strip or --disable-install-strip was given.
if test "${enable_install_strip+set}" = set; then
  enableval="$enable_install_strip"
  if test "$enableval" = "yes"; then
    PKG_SKIP_STRIP= 
  elif test "$enableval" = "no"; then
    PKG_SKIP_STRIP=1
  else
    { echo "configure: error: Option, install-strip, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, install-strip, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


# Profiling and Instrumenting

if test -z "$SKIP_LIBRARY_CHECKS"; then
    
    ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross

    for ac_func in __cxa_demangle
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:14905: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 14910 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
#ifdef __cplusplus
extern "C"
#endif
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:14940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 HAVE_DEMANGLE=1
else
  echo "$ac_t""no" 1>&6
HAVE_DEMANGLE=
fi
done

    ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross

fi

# Demangle only for debug or DMD builds
MOZ_DEMANGLE_SYMBOLS=
if test "$HAVE_DEMANGLE" && test "$MOZ_DEBUG" -o "$MOZ_DMD"; then
    MOZ_DEMANGLE_SYMBOLS=1
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_DEMANGLE_SYMBOLS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_DEMANGLE_SYMBOLS 1
EOF

fi



# Check whether --with-jitreport-granularity or --without-jitreport-granularity was given.
if test "${with_jitreport_granularity+set}" = set; then
  withval="$with_jitreport_granularity"
  JITREPORT_GRANULARITY=$withval
else
  JITREPORT_GRANULARITY=3
fi


cat >> confdefs.pytmp <<EOF
    (''' JS_DEFAULT_JITREPORT_GRANULARITY ''', r''' $JITREPORT_GRANULARITY ''')
EOF
cat >> confdefs.h <<EOF
#define JS_DEFAULT_JITREPORT_GRANULARITY $JITREPORT_GRANULARITY
EOF


# Misc. Options

# Check whether --enable-xterm-updates or --disable-xterm-updates was given.
if test "${enable_xterm_updates+set}" = set; then
  enableval="$enable_xterm_updates"
  if test "$enableval" = "yes"; then
    MOZ_UPDATE_XTERM=1
  elif test "$enableval" = "no"; then
    MOZ_UPDATE_XTERM= 
  else
    { echo "configure: error: Option, xterm-updates, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, xterm-updates, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


if test -z "$SKIP_COMPILER_CHECKS"; then
# Compiler Options

echo $ac_n "checking for -pipe support""... $ac_c" 1>&6
echo "configure:15028: checking for -pipe support" >&5
if test -n "$GNU_CC" -a -n "$GNU_CXX"; then
        CFLAGS="$CFLAGS -pipe"
    CXXFLAGS="$CXXFLAGS -pipe"
    echo "$ac_t""yes" 1>&6
else
    echo "$ac_t""no" 1>&6
fi


_SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -fprofile-generate -fprofile-correction"

echo $ac_n "checking whether C compiler supports -fprofile-generate""... $ac_c" 1>&6
echo "configure:15042: checking whether C compiler supports -fprofile-generate" >&5
cat > conftest.$ac_ext <<EOF
#line 15044 "configure"
#include "confdefs.h"

int main() {
return 0;
; return 0; }
EOF
if { (eval echo configure:15051: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
   PROFILE_GEN_CFLAGS="-fprofile-generate"
                 result="yes" 
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  result="no"
fi
rm -f conftest*
echo "$ac_t""$result" 1>&6

if test $result = "yes"; then
  PROFILE_GEN_LDFLAGS="-fprofile-generate"
  PROFILE_USE_CFLAGS="-fprofile-use -fprofile-correction -Wcoverage-mismatch"
  PROFILE_USE_LDFLAGS="-fprofile-use"
fi

CFLAGS="$_SAVE_CFLAGS"

if test -n "$INTEL_CC"; then
  PROFILE_GEN_CFLAGS="-prof-gen -prof-dir ."
  PROFILE_GEN_LDFLAGS=
  PROFILE_USE_CFLAGS="-prof-use -prof-dir ."
  PROFILE_USE_LDFLAGS=
fi

if test "$SOLARIS_SUNPRO_CC"; then
  PROFILE_GEN_CFLAGS="-xprofile=collect:$_objdir/$enable_application"
  PROFILE_GEN_LDFLAGS="-xprofile=collect:$_objdir/$enable_application"
  PROFILE_USE_CFLAGS="-xprofile=use:$_objdir/$enable_application"
  PROFILE_USE_LDFLAGS="-xprofile=use:$_objdir/$enable_application"
fi






ac_ext=C
# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CXXCPP $CPPFLAGS'
ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cxx_cross


echo $ac_n "checking for tm_zone tm_gmtoff in struct tm""... $ac_c" 1>&6
echo "configure:15100: checking for tm_zone tm_gmtoff in struct tm" >&5
if eval "test \"`echo '$''{'ac_cv_struct_tm_zone_tm_gmtoff'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 15105 "configure"
#include "confdefs.h"
#include <time.h>
int main() {
struct tm tm; tm.tm_zone = 0; tm.tm_gmtoff = 1;
; return 0; }
EOF
if { (eval echo configure:15112: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  ac_cv_struct_tm_zone_tm_gmtoff="yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  ac_cv_struct_tm_zone_tm_gmtoff="no"
fi
rm -f conftest*
fi

echo "$ac_t""$ac_cv_struct_tm_zone_tm_gmtoff" 1>&6
if test "$ac_cv_struct_tm_zone_tm_gmtoff" = "yes" ; then
    cat >> confdefs.pytmp <<\EOF
    (''' HAVE_TM_ZONE_TM_GMTOFF ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_TM_ZONE_TM_GMTOFF 1
EOF

fi
fi # ! SKIP_COMPILER_CHECKS

cat >> confdefs.pytmp <<\EOF
    (''' CPP_THROW_NEW ''', r''' throw() ''')
EOF
cat >> confdefs.h <<\EOF
#define CPP_THROW_NEW throw()
EOF

ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
ac_cpp='$CPP $CPPFLAGS'
ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
cross_compiling=$ac_cv_prog_cc_cross




echo $ac_n "checking what kind of list files are supported by the linker""... $ac_c" 1>&6
echo "configure:15154: checking what kind of list files are supported by the linker" >&5
if eval "test \"`echo '$''{'EXPAND_LIBS_LIST_STYLE'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  echo "int main() {return 0;}" > conftest.${ac_ext}
     if { ac_try='${CC-cc} -o conftest.${OBJ_SUFFIX} -c $CFLAGS $CPPFLAGS conftest.${ac_ext} 1>&5'; { (eval echo configure:15159: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.${OBJ_SUFFIX}; then
         echo "INPUT(conftest.${OBJ_SUFFIX})" > conftest.list
         if { ac_try='${CC-cc} -o conftest${ac_exeext} $LDFLAGS conftest.list $LIBS 1>&5'; { (eval echo configure:15161: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest${ac_exeext}; then
             EXPAND_LIBS_LIST_STYLE=linkerscript
         else
             echo "conftest.${OBJ_SUFFIX}" > conftest.list
                                                                 if { ac_try='${CC-cc} -o conftest${ac_exeext} $LDFLAGS -Wl,-filelist,conftest.list $LIBS 1>&5'; { (eval echo configure:15165: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest${ac_exeext}; then
                 EXPAND_LIBS_LIST_STYLE=filelist
             elif { ac_try='${CC-cc} -o conftest${ac_exeext} $LDFLAGS @conftest.list $LIBS 1>&5'; { (eval echo configure:15167: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest${ac_exeext}; then
                 EXPAND_LIBS_LIST_STYLE=list
             else
                 EXPAND_LIBS_LIST_STYLE=none
             fi
         fi
     else
                  { echo "configure: error: couldn't compile a simple C file" 1>&2; echo "configure: error: couldn't compile a simple C file" 1>&5; exit 1; }
     fi
     rm -rf conftest*
fi

echo "$ac_t""$EXPAND_LIBS_LIST_STYLE" 1>&6

LIBS_DESC_SUFFIX=desc



if test "$GCC_USE_GNU_LD"; then
    echo $ac_n "checking what kind of ordering can be done with the linker""... $ac_c" 1>&6
echo "configure:15187: checking what kind of ordering can be done with the linker" >&5
if eval "test \"`echo '$''{'EXPAND_LIBS_ORDER_STYLE'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  > conftest.order
         _SAVE_LDFLAGS="$LDFLAGS"
         LDFLAGS="${LDFLAGS} -Wl,--section-ordering-file,conftest.order"
         cat > conftest.$ac_ext <<EOF
#line 15195 "configure"
#include "confdefs.h"

int main() {

; return 0; }
EOF
if { (eval echo configure:15202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  EXPAND_LIBS_ORDER_STYLE=section-ordering-file
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  EXPAND_LIBS_ORDER_STYLE=
fi
rm -f conftest*
         LDFLAGS="$_SAVE_LDFLAGS"
         if test -z "$EXPAND_LIBS_ORDER_STYLE"; then
             if { ac_try='${CC-cc} ${DSO_LDOPTS} ${LDFLAGS} -o ${DLL_PREFIX}conftest${DLL_SUFFIX} -Wl'; { (eval echo configure:15214: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
                 EXPAND_LIBS_ORDER_STYLE=linkerscript
             else
                 EXPAND_LIBS_ORDER_STYLE=none
             fi
             rm -f ${DLL_PREFIX}conftest${DLL_SUFFIX}
         fi
fi

echo "$ac_t""$EXPAND_LIBS_ORDER_STYLE" 1>&6
fi




# Build dependencies

if test "$GNU_CC" -a "$GNU_CXX"; then
  _DEPEND_CFLAGS='-MD -MP -MF $(MDDEPDIR)/$(@F).pp'
elif test "$SOLARIS_SUNPRO_CC"; then
  _DEPEND_CFLAGS=
else
    if test -z "$_WIN32_MSVC"; then
    _USE_CPP_INCLUDE_FLAG=
    _DEFINES_CFLAGS='$(ACDEFINES) -D_JS_CONFDEFS_H_ -DMOZILLA_CLIENT'
    _DEFINES_CXXFLAGS='$(ACDEFINES) -D_JS_CONFDEFS_H_ -DMOZILLA_CLIENT'
  else
    echo '#include <stdio.h>' > dummy-hello.c
    
        _CL_PREFIX_REGEX="^\([^:]*:.*[ :] \)\(.*\\\stdio.h\)$"
    CL_INCLUDES_PREFIX=`${CC} -showIncludes -c -Fonul dummy-hello.c 2>&1 | sed -ne 's/'"$_CL_PREFIX_REGEX"'/\1/p'`
    _CL_STDIO_PATH=`${CC} -showIncludes -c -Fonul dummy-hello.c 2>&1 | sed -ne 's/'"$_CL_PREFIX_REGEX"'/\2/p'`
    
    if ! test -e "$_CL_STDIO_PATH"; then
        { echo "configure: error: Unable to parse cl -showIncludes prefix. This compiler's locale has an unsupported formatting." 1>&2; echo "configure: error: Unable to parse cl -showIncludes prefix. This compiler's locale has an unsupported formatting." 1>&5; exit 1; }
    fi
    if test -z "$CL_INCLUDES_PREFIX"; then
        { echo "configure: error: Cannot find cl -showIncludes prefix." 1>&2; echo "configure: error: Cannot find cl -showIncludes prefix." 1>&5; exit 1; }
    fi
    
    rm -f dummy-hello.c

                NONASCII=$'\241\241'
    
  fi
fi

if test -n "$GNU_CC" -a -z "$CLANG_CC"; then
        if test "$GCC_MAJOR_VERSION" -eq "4" -a "$GCC_MINOR_VERSION" -lt "5" ; then
        CFLAGS="$CFLAGS -fno-strict-aliasing"
        CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"
    fi
fi

# Check whether --enable-readline or --disable-readline was given.
if test "${enable_readline+set}" = set; then
  enableval="$enable_readline"
  if test "$enableval" = "yes"; then
    JS_WANT_READLINE=1
  elif test "$enableval" = "no"; then
    JS_WANT_READLINE= 
  else
    { echo "configure: error: Option, readline, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, readline, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi


JS_BUNDLED_EDITLINE=
EDITLINE_LIBS=
JS_DISABLE_SHELL=

case "$target" in
*-mingw*)
    NO_EDITLINE=1
    ;;
*)
    ;;
esac

if test -z "$SKIP_LIBRARY_CHECKS" -a -z "$NO_EDITLINE"; then
  if test -n "$JS_WANT_READLINE"; then
    echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6
echo "configure:15296: checking for readline in -lreadline" >&5
ac_lib_var=`echo readline'_'readline | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  ac_save_LIBS="$LIBS"
LIBS="-lreadline  $LIBS"
cat > conftest.$ac_ext <<EOF
#line 15304 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char readline();

int main() {
readline()
; return 0; }
EOF
if { (eval echo configure:15315: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"

fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
  echo "$ac_t""yes" 1>&6
  EDITLINE_LIBS="-lreadline"
else
  echo "$ac_t""no" 1>&6
{ echo "configure: error: No system readline library found." 1>&2; echo "configure: error: No system readline library found." 1>&5; exit 1; }
fi

  else
        JS_BUNDLED_EDITLINE=1
  fi

    cat >> confdefs.pytmp <<\EOF
    (''' EDITLINE ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define EDITLINE 1
EOF

fi




# Standalone module options (Not for building Mozilla)

# Check whether --enable-ctypes or --disable-ctypes was given.
if test "${enable_ctypes+set}" = set; then
  enableval="$enable_ctypes"
  if test "$enableval" = "yes"; then
    BUILD_CTYPES=1
  elif test "$enableval" = "no"; then
    BUILD_CTYPES= 
  else
    { echo "configure: error: Option, ctypes, does not take an argument ($enableval)." 1>&2; echo "configure: error: Option, ctypes, does not take an argument ($enableval)." 1>&5; exit 1; }
  fi
fi

JS_HAS_CTYPES=$BUILD_CTYPES


if test "$JS_HAS_CTYPES"; then
    if test -n "$_MSC_VER" -a \( "$AS" != "ml.exe" -a "$AS" != "ml64.exe" \); then
    { echo "configure: error: \"$AS\" is not a suitable assembler to build js-ctypes. If you are building with MS Visual Studio 8 Express, you may download the MASM 8.0 package, upgrade to Visual Studio 9 Express, or install the Vista SDK. Or do not use --enable-ctypes." 1>&2; echo "configure: error: \"$AS\" is not a suitable assembler to build js-ctypes. If you are building with MS Visual Studio 8 Express, you may download the MASM 8.0 package, upgrade to Visual Studio 9 Express, or install the Vista SDK. Or do not use --enable-ctypes." 1>&5; exit 1; }
  fi
  cat >> confdefs.pytmp <<\EOF
    (''' JS_HAS_CTYPES ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define JS_HAS_CTYPES 1
EOF

fi

if test "$MOZ_DEBUG" -o "$MOZ_DMD"; then
    MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS=
fi


# Check whether --with-qemu-exe or --without-qemu-exe was given.
if test "${with_qemu_exe+set}" = set; then
  withval="$with_qemu_exe"
  QEMU_EXE=$withval
fi


# Check whether --with-cross-lib or --without-cross-lib was given.
if test "${with_cross_lib+set}" = set; then
  withval="$with_cross_lib"
  CROSS_LIB=$withval
else
  CROSS_LIB=/usr/$target
fi
























































CFLAGS=`echo \
	$_WARNINGS_CFLAGS \
	$CFLAGS`

CXXFLAGS=`echo \
	$_WARNINGS_CXXFLAGS \
	$CXXFLAGS`

COMPILE_CFLAGS=`echo \
    $_DEFINES_CFLAGS \
	$_DEPEND_CFLAGS \
    $COMPILE_CFLAGS`

COMPILE_CXXFLAGS=`echo \
    $_DEFINES_CXXFLAGS \
	$_DEPEND_CFLAGS \
    $COMPILE_CXXFLAGS`

HOST_CFLAGS=`echo \
    $HOST_CFLAGS \
    $_DEPEND_CFLAGS`

HOST_CXXFLAGS=`echo \
    $HOST_CXXFLAGS \
    $_DEPEND_CFLAGS`



if test -n "$MOZ_NUWA_PROCESS"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_NUWA_PROCESS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_NUWA_PROCESS 1
EOF

fi

OS_CFLAGS="$CFLAGS"
OS_CXXFLAGS="$CXXFLAGS"
OS_CPPFLAGS="$CPPFLAGS"
OS_COMPILE_CFLAGS="$COMPILE_CFLAGS"
OS_COMPILE_CXXFLAGS="$COMPILE_CXXFLAGS"
OS_LDFLAGS="$LDFLAGS"
OS_LIBS="$LIBS"












































cat >> confdefs.pytmp <<EOF
    (''' MOZ_DLL_SUFFIX ''', r''' "$DLL_SUFFIX" ''')
EOF
cat >> confdefs.h <<EOF
#define MOZ_DLL_SUFFIX "$DLL_SUFFIX"
EOF














for ac_func in posix_fadvise posix_fallocate
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:15569: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 15574 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:15601: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done



if test "$OS_ARCH" = "Darwin"; then
  if test -n "$MOZ_IOS"; then
    cat >> confdefs.pytmp <<\EOF
    (''' XP_IOS ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_IOS 1
EOF

  else
    cat >> confdefs.pytmp <<\EOF
    (''' XP_MACOSX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_MACOSX 1
EOF

  fi
  cat >> confdefs.pytmp <<\EOF
    (''' XP_DARWIN ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_DARWIN 1
EOF

  cat >> confdefs.pytmp <<\EOF
    (''' XP_UNIX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_UNIX 1
EOF

elif test "$OS_ARCH" != "WINNT"; then
  cat >> confdefs.pytmp <<\EOF
    (''' XP_UNIX ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define XP_UNIX 1
EOF

fi

if test "$MOZ_DEBUG"; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_REFLOW_PERF ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_REFLOW_PERF 1
EOF

    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_REFLOW_PERF_DSP ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_REFLOW_PERF_DSP 1
EOF

fi

if test "$ACCESSIBILITY" -a "$MOZ_ENABLE_GTK" ; then
    cat >> confdefs.pytmp <<\EOF
    (''' MOZ_ACCESSIBILITY_ATK ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define MOZ_ACCESSIBILITY_ATK 1
EOF

    ATK_FULL_VERSION=`$PKG_CONFIG --modversion atk`
    ATK_MAJOR_VERSION=`echo ${ATK_FULL_VERSION} | $AWK -F\. '{ print $1 }'`
    ATK_MINOR_VERSION=`echo ${ATK_FULL_VERSION} | $AWK -F\. '{ print $2 }'`
    ATK_REV_VERSION=`echo ${ATK_FULL_VERSION} | $AWK -F\. '{ print $3 }'`
    cat >> confdefs.pytmp <<EOF
    (''' ATK_MAJOR_VERSION ''', r''' $ATK_MAJOR_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define ATK_MAJOR_VERSION $ATK_MAJOR_VERSION
EOF

    cat >> confdefs.pytmp <<EOF
    (''' ATK_MINOR_VERSION ''', r''' $ATK_MINOR_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define ATK_MINOR_VERSION $ATK_MINOR_VERSION
EOF

    cat >> confdefs.pytmp <<EOF
    (''' ATK_REV_VERSION ''', r''' $ATK_REV_VERSION ''')
EOF
cat >> confdefs.h <<EOF
#define ATK_REV_VERSION $ATK_REV_VERSION
EOF

fi


if test -z "$GNU_CC" -a "$OS_ARCH" = "WINNT"; then
    PREPROCESS_OPTION="-P -Fi"
else
    PREPROCESS_OPTION="-E -o "
fi




_INTL_API=yes



ICU_LIB_NAMES=
MOZ_NATIVE_ICU=
# Check whether --with-system-icu or --without-system-icu was given.
if test "${with_system_icu+set}" = set; then
  withval="$with_system_icu"
  if test "$withval" = "yes"; then
    MOZ_NATIVE_ICU=1
  elif test "$withval" = "no"; then
    :
  else
    { echo "configure: error: Option, system-icu, does not take an argument ($withval)." 1>&2; echo "configure: error: Option, system-icu, does not take an argument ($withval)." 1>&5; exit 1; }
  fi
fi


if test -n "$MOZ_NATIVE_ICU"; then
    succeeded=no

  if test -z "$PKG_CONFIG"; then
    # Extract the first word of "pkg-config", so it can be a program name with args.
set dummy pkg-config; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:15760: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PKG_CONFIG'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  case "$PKG_CONFIG" in
  /*)
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path.
  ;;
  ?:/*)			 
  ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a dos path.
  ;;
  *)
  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS=":"
  ac_dummy="$PATH"
  for ac_dir in $ac_dummy; do 
    test -z "$ac_dir" && ac_dir=.
    if test -f $ac_dir/$ac_word; then
      ac_cv_path_PKG_CONFIG="$ac_dir/$ac_word"
      break
    fi
  done
  IFS="$ac_save_ifs"
  test -z "$ac_cv_path_PKG_CONFIG" && ac_cv_path_PKG_CONFIG="no"
  ;;
esac
fi
PKG_CONFIG="$ac_cv_path_PKG_CONFIG"
if test -n "$PKG_CONFIG"; then
  echo "$ac_t""$PKG_CONFIG" 1>&6
else
  echo "$ac_t""no" 1>&6
fi

  fi

  if test "$PKG_CONFIG" = "no" ; then
     echo "*** The pkg-config script could not be found. Make sure it is"
     echo "*** in your path, or set the PKG_CONFIG environment variable"
     echo "*** to the full path to pkg-config."
     echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
  else
     PKG_CONFIG_MIN_VERSION=0.9.0
     if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
        echo $ac_n "checking for icu-i18n >= 50.1""... $ac_c" 1>&6
echo "configure:15804: checking for icu-i18n >= 50.1" >&5

        if $PKG_CONFIG --exists "icu-i18n >= 50.1" ; then
            echo "$ac_t""yes" 1>&6
            succeeded=yes

            echo $ac_n "checking MOZ_ICU_CFLAGS""... $ac_c" 1>&6
echo "configure:15811: checking MOZ_ICU_CFLAGS" >&5
            MOZ_ICU_CFLAGS=`$PKG_CONFIG --cflags "icu-i18n >= 50.1"`
            echo "$ac_t""$MOZ_ICU_CFLAGS" 1>&6

            echo $ac_n "checking MOZ_ICU_LIBS""... $ac_c" 1>&6
echo "configure:15816: checking MOZ_ICU_LIBS" >&5
            ## Remove evil flags like -Wl,--export-dynamic
            MOZ_ICU_LIBS="`$PKG_CONFIG --libs \"icu-i18n >= 50.1\" |sed s/-Wl,--export-dynamic//g`"
            echo "$ac_t""$MOZ_ICU_LIBS" 1>&6
        else
            MOZ_ICU_CFLAGS=""
            MOZ_ICU_LIBS=""
            ## If we have a custom action on failure, don't print errors, but 
            ## do set a variable so people can do so.
            MOZ_ICU_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "icu-i18n >= 50.1"`
            echo $MOZ_ICU_PKG_ERRORS
        fi

        
        
     else
        echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
        echo "*** See http://www.freedesktop.org/software/pkgconfig"
     fi
  fi

  if test $succeeded = yes; then
     :
  else
     if test "$COMPILE_ENVIRONMENT"; then 
       { echo "configure: error: Library requirements (icu-i18n >= 50.1) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&2; echo "configure: error: Library requirements (icu-i18n >= 50.1) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them." 1>&5; exit 1; }
     fi
  fi

    MOZ_SHARED_ICU=1
else
    MOZ_ICU_INCLUDES="/intl/icu/source/common /intl/icu/source/i18n"
fi




# Check whether --with-intl-api or --without-intl-api was given.
if test "${with_intl_api+set}" = set; then
  withval="$with_intl_api"
  _INTL_API=$withval
fi


ENABLE_INTL_API=
EXPOSE_INTL_API=
case "$_INTL_API" in
no)
    ;;
build)
    ENABLE_INTL_API=1
    ;;
yes)
    ENABLE_INTL_API=1
    EXPOSE_INTL_API=1
    ;;
*)
    { echo "configure: error: Invalid value passed to --with-intl-api: $_INTL_API" 1>&2; echo "configure: error: Invalid value passed to --with-intl-api: $_INTL_API" 1>&5; exit 1; }
    ;;
esac

if test -n "$ENABLE_INTL_API"; then
    USE_ICU=1
fi

if test -n "$EXPOSE_INTL_API"; then
    cat >> confdefs.pytmp <<\EOF
    (''' EXPOSE_INTL_API ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define EXPOSE_INTL_API 1
EOF

fi

if test -n "$ENABLE_INTL_API"; then
    cat >> confdefs.pytmp <<\EOF
    (''' ENABLE_INTL_API ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define ENABLE_INTL_API 1
EOF

fi

if test -n "$USE_ICU"; then
    icudir="$_topsrcdir/intl/icu/source"
    if test ! -d "$icudir"; then
        icudir="$_topsrcdir/../../intl/icu/source"
        if test ! -d "$icudir"; then
            { echo "configure: error: Cannot find the ICU directory" 1>&2; echo "configure: error: Cannot find the ICU directory" 1>&5; exit 1; }
        fi
    fi

    version=`sed -n 's/^[:space:]*#[[:space:]]*define[[:space:]][[:space:]]*U_ICU_VERSION_MAJOR_NUM[[:space:]][[:space:]]*\([0-9][0-9]*\)[[:space:]]*$/\1/p' "$icudir/common/unicode/uvernum.h"`
    if test x"$version" = x; then
       { echo "configure: error: cannot determine icu version number from uvernum.h header file $lineno" 1>&2; echo "configure: error: cannot determine icu version number from uvernum.h header file $lineno" 1>&5; exit 1; }
    fi
    MOZ_ICU_VERSION="$version"

    if test "$OS_TARGET" = WINNT; then
        MOZ_SHARED_ICU=1
    fi

    if test -z "${JS_STANDALONE}" -a -n "${JS_SHARED_LIBRARY}${MOZ_NATIVE_ICU}"; then
        MOZ_SHARED_ICU=1
    fi

    
    

    if test -z "$MOZ_NATIVE_ICU"; then
        case "$OS_TARGET" in
            WINNT)
                ICU_LIB_NAMES="icuin icuuc icudt"
                MOZ_ICU_DBG_SUFFIX=
                if test -n "$MOZ_DEBUG" -a -z "$MOZ_NO_DEBUG_RTL"; then
                    MOZ_ICU_DBG_SUFFIX=d
                fi
                ;;
            Darwin|Linux|DragonFly|FreeBSD|NetBSD|OpenBSD|GNU/kFreeBSD|SunOS|Android)
                ICU_LIB_NAMES="icui18n icuuc icudata"
                ;;
            *)
                { echo "configure: error: ECMAScript Internationalization API is not yet supported on this platform" 1>&2; echo "configure: error: ECMAScript Internationalization API is not yet supported on this platform" 1>&5; exit 1; }
        esac
    fi
fi






if test -n "$USE_ICU" -a -z "$MOZ_NATIVE_ICU"; then
        if test -z "$MOZ_SHARED_ICU"; then
        cat >> confdefs.pytmp <<\EOF
    (''' U_STATIC_IMPLEMENTATION ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define U_STATIC_IMPLEMENTATION 1
EOF

    fi
            cat >> confdefs.pytmp <<\EOF
    (''' U_USING_ICU_NAMESPACE ''', r''' 0 ''')
EOF
cat >> confdefs.h <<\EOF
#define U_USING_ICU_NAMESPACE 0
EOF

fi






if test -z "$BUILDING_JS" -o -n "$JS_STANDALONE"; then

    if test -n "$USE_ICU" -a -z "$MOZ_NATIVE_ICU"; then
        # Set ICU compile options
        ICU_CPPFLAGS=""
        # don't use icu namespace automatically in client code
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_USING_ICU_NAMESPACE=0"
        # don't include obsolete header files
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1"
        # remove chunks of the library that we don't need (yet)
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_LEGACY_CONVERSION"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_TRANSLITERATION"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_REGULAR_EXPRESSIONS"
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DUCONFIG_NO_BREAK_ITERATION"
        # we don't need to pass data to and from legacy char* APIs
        ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_CHARSET_IS_UTF8"
        # make sure to not accidentally pick up system-icu headers
        ICU_CPPFLAGS="$ICU_CPPFLAGS -I$icudir/common -I$icudir/i18n"

        ICU_CROSS_BUILD_OPT=""

        if test "$CROSS_COMPILE"; then
            # Remove _DEPEND_CFLAGS from HOST_FLAGS to avoid configure error
            HOST_ICU_CFLAGS="$HOST_CFLAGS"
            HOST_ICU_CXXFLAGS="$HOST_CXXFLAGS"

            HOST_ICU_CFLAGS=`echo $HOST_ICU_CFLAGS | sed "s|$_DEPEND_CFLAGS||g"`
            HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CFXXLAGS | sed "s|$_DEPEND_CFLAGS||g"`

            # ICU requires RTTI
            if test "$GNU_CC"; then
                HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CXXFLAGS | sed 's|-fno-rtti|-frtti|g'`
            elif test "$_MSC_VER"; then
                HOST_ICU_CXXFLAGS=`echo $HOST_ICU_CXXFLAGS | sed 's|-GR-|-GR|g'`
            fi

            HOST_ICU_BUILD_OPTS=""
            if test -n "$MOZ_DEBUG"; then
                HOST_ICU_BUILD_OPTS="$HOST_ICU_BUILD_OPTS --enable-debug"
            fi

            abs_srcdir=`(cd $srcdir; pwd)`
            mkdir -p $_objdir/intl/icu/host
            (export AR="$HOST_AR"
             export RANLIB="$HOST_RANLIB"
             export CC="$HOST_CC"
             export CXX="$HOST_CXX"
             export CPP="$HOST_CPP"
             export LD="$HOST_LD"
             export CFLAGS="$HOST_ICU_CFLAGS $HOST_OPTIMIZE_FLAGS"
             export CPPFLAGS="$ICU_CPPFLAGS"
             export CXXFLAGS="$HOST_ICU_CXXFLAGS $HOST_OPTIMIZE_FLAGS"
             export LDFLAGS="$HOST_LDFLAGS"
             ac_configure_args="$HOST_ICU_BUILD_OPTS"
             ac_configure_args="$ac_configure_args --enable-static --disable-shared --enable-extras=no --enable-icuio=no --enable-layout=no --enable-tests=no --enable-samples=no"
             
for moz_config_dir_ in intl/icu/source:intl/icu/host; do
  for moz_config_dir in $moz_config_dir_; do
  _CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
  case "$moz_config_dir" in
  *:*)
    objdir=$(echo $moz_config_dir | awk -F: '{print $2}')
    ;;
  *)
    objdir=$moz_config_dir
    ;;
  esac
          echo $objdir >> subconfigures

  dumpenv="true | "
  case "$host" in
  *-mingw*)
    _CONFIG_SHELL=$(cd $(dirname $_CONFIG_SHELL); pwd -W)/$(basename $_CONFIG_SHELL)
    if test ! -e "$_CONFIG_SHELL" -a -e "${_CONFIG_SHELL}.exe"; then
        _CONFIG_SHELL="${_CONFIG_SHELL}.exe"
    fi
                        dumpenv="$PERL $_topsrcdir/build/win32/dumpenv4python.pl $ac_configure_args | "
    ;;
  esac

  eval $dumpenv $PYTHON $_topsrcdir/build/subconfigure.py --prepare "$srcdir" "$moz_config_dir" "$_CONFIG_SHELL" $ac_configure_args 

  done

  tail -1 subconfigures >> skip_subconfigures
  if test "$no_recursion" != yes; then
  trap '' EXIT
  if ! $PYTHON $_topsrcdir/build/subconfigure.py `tail -1 skip_subconfigures`; then
      exit 1
  fi
  trap '[ "$?" != 0 ] && echo "------ config.log ------" && tail -n 25 config.log' EXIT

fi

done

            ) || exit 1
            # generate config/icucross.mk
            $GMAKE -C $_objdir/intl/icu/host/ config/icucross.mk

            # --with-cross-build requires absolute path
            ICU_HOST_PATH=`cd $_objdir/intl/icu/host && pwd`
            ICU_CROSS_BUILD_OPT="--with-cross-build=$ICU_HOST_PATH --disable-tools"
            ICU_TARGET_OPT="--build=$build --host=$target"
        else
            # CROSS_COMPILE isn't set build and target are i386 and x86-64.
            # So we must set target for --build and --host.
            ICU_TARGET_OPT="--build=$target --host=$target"
        fi

        if test -z "$MOZ_SHARED_ICU"; then
            # To reduce library size, use static linking
            ICU_LINK_OPTS="--enable-static --disable-shared"
        else
            ICU_LINK_OPTS="--disable-static --enable-shared"
        fi
        # Force the ICU static libraries to be position independent code
        ICU_CFLAGS="$DSO_PIC_CFLAGS $CFLAGS"
        ICU_CXXFLAGS="$DSO_PIC_CFLAGS $CXXFLAGS"

        ICU_BUILD_OPTS=""
        if test -n "$MOZ_DEBUG" -o "MOZ_DEBUG_SYMBOLS"; then
            ICU_CFLAGS="$ICU_CFLAGS $MOZ_DEBUG_FLAGS"
            ICU_CXXFLAGS="$ICU_CXXFLAGS $MOZ_DEBUG_FLAGS"
            if test -n "$CROSS_COMPILE" -a "$OS_TARGET" = "Darwin" \
                    -a "$HOST_OS_ARCH" != "Darwin"
            then
                # Bug 951758: Cross-OSX builds with non-Darwin hosts have issues
                # with -g and friends (like -gdwarf and -gfull) because they try
                # to run dsymutil
                
                ICU_CFLAGS=`echo $ICU_CFLAGS | sed 's|-g[^ \t]*||g'`
                ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-g[^ \t]*||g'`
                
            fi

            ICU_LDFLAGS="$MOZ_DEBUG_LDFLAGS"
            if test -z "$MOZ_DEBUG"; then
                # To generate debug symbols, it requires MOZ_DEBUG_FLAGS.
                # But, not debug build.
                ICU_CFLAGS="$ICU_CFLAGS -UDEBUG -DNDEBUG"
                ICU_CXXFLAGS="$ICU_CXXFLAGS -UDEBUG -DNDEBUG"
            elif test -z "$MOZ_NO_DEBUG_RTL"; then
                ICU_BUILD_OPTS="$ICU_BUILD_OPTS --enable-debug"
            fi
        fi
        if test -z "$MOZ_OPTIMIZE"; then
            ICU_BUILD_OPTS="$ICU_BUILD_OPTS --disable-release"
        else
            ICU_CFLAGS="$ICU_CFLAGS $MOZ_OPTIMIZE_FLAGS"
            ICU_CXXFLAGS="$ICU_CXXFLAGS $MOZ_OPTIMIZE_FLAGS"
        fi

        if test "$am_cv_langinfo_codeset" = "no"; then
            # ex. Android
            ICU_CPPFLAGS="$ICU_CPPFLAGS -DU_HAVE_NL_LANGINFO_CODESET=0"
        fi

        # ICU requires RTTI
        if test "$GNU_CC"; then
            ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-fno-rtti|-frtti|g'`
        else
            if test "$_MSC_VER"; then
                ICU_CXXFLAGS=`echo $ICU_CXXFLAGS | sed 's|-GR-|-GR|g'`
            fi

            # Add RTL flags for MSVCRT.DLL
            if test -n "$MOZ_DEBUG" -a -z "$MOZ_NO_DEBUG_RTL"; then
                ICU_CFLAGS="$ICU_CFLAGS -MDd"
                ICU_CXXFLAGS="$ICU_CXXFLAGS -MDd"
            else
                ICU_CFLAGS="$ICU_CFLAGS -MD"
                ICU_CXXFLAGS="$ICU_CXXFLAGS -MD"
            fi

            # add disable optimize flag for workaround for bug 899948
            if test -z "$MOZ_OPTIMIZE"; then
                ICU_CFLAGS="$ICU_CFLAGS -Od"
                ICU_CXXFLAGS="$ICU_CXXFLAGS -Od"
            fi
        fi

        if test -n "$gonkdir"; then
            ICU_CXXFLAGS="-I$gonkdir/abi/cpp/include $ICU_CXXFLAGS"
        elif test "$OS_TARGET" = Android -a "$MOZ_ANDROID_CXX_STL" = mozstlport; then
            ICU_CXXFLAGS="-I$_topsrcdir/build/gabi++/include $ICU_CXXFLAGS"
        fi

        if test -z "$MOZ_SHARED_ICU"; then
          ICU_CXXFLAGS="$ICU_CXXFLAGS -DU_STATIC_IMPLEMENTATION"
          ICU_CFLAGS="$ICU_CFLAGS -DU_STATIC_IMPLEMENTATION"
          if test "$GNU_CC"; then
            ICU_CFLAGS="$ICU_CFLAGS -fvisibility=hidden"
            ICU_CXXFLAGS="$ICU_CXXFLAGS -fvisibility=hidden"
          fi
        fi

        (export AR="$AR"
         export RANLIB="$RANLIB"
         export CC="$CC"
         export CXX="$CXX"
         export LD="$LD"
         export ARFLAGS="$ARFLAGS"
         export CPPFLAGS="$ICU_CPPFLAGS $CPPFLAGS"
         export CFLAGS="$ICU_CFLAGS"
         export CXXFLAGS="$ICU_CXXFLAGS"
         export LDFLAGS="$ICU_LDFLAGS $LDFLAGS"
         ac_configure_args="$ICU_BUILD_OPTS $ICU_CROSS_BUILD_OPT $ICU_LINK_OPTS $ICU_TARGET_OPT"
         ac_configure_args="$ac_configure_args --disable-extras --disable-icuio --disable-layout --disable-tests --disable-samples --disable-strict"
         for moz_config_dir in intl/icu/source:intl/icu/target; do
  _CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
  case "$moz_config_dir" in
  *:*)
    objdir=$(echo $moz_config_dir | awk -F: '{print $2}')
    ;;
  *)
    objdir=$moz_config_dir
    ;;
  esac
          echo $objdir >> subconfigures

  dumpenv="true | "
  case "$host" in
  *-mingw*)
    _CONFIG_SHELL=$(cd $(dirname $_CONFIG_SHELL); pwd -W)/$(basename $_CONFIG_SHELL)
    if test ! -e "$_CONFIG_SHELL" -a -e "${_CONFIG_SHELL}.exe"; then
        _CONFIG_SHELL="${_CONFIG_SHELL}.exe"
    fi
                        dumpenv="$PERL $_topsrcdir/build/win32/dumpenv4python.pl $ac_configure_args | "
    ;;
  esac

  eval $dumpenv $PYTHON $_topsrcdir/build/subconfigure.py --prepare "$srcdir" "$moz_config_dir" "$_CONFIG_SHELL" $ac_configure_args 

  done

        ) || exit 1
    fi

fi






MALLOC_HEADERS="malloc.h malloc_np.h malloc/malloc.h sys/malloc.h"
MALLOC_H=

for file in $MALLOC_HEADERS; do
     ac_safe=`echo "$file" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $file""... $ac_c" 1>&6
echo "configure:16226: checking for $file" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 16231 "configure"
#include "confdefs.h"

#include <$file>
int main() {

; return 0; }
EOF
if { (eval echo configure:16239: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
    MALLOC_H=$file
  else
    echo "$ac_t""no" 1>&6
    
  fi

  if test "$MALLOC_H" != ""; then
    cat >> confdefs.pytmp <<EOF
    (''' MALLOC_H ''', r''' <$MALLOC_H> ''')
EOF
cat >> confdefs.h <<EOF
#define MALLOC_H <$MALLOC_H>
EOF

    break
  fi
done

 for ac_hdr in alloca.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:16275: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 16280 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:16288: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  else
    echo "$ac_t""no" 1>&6
    
  fi

  done


for ac_func in strndup posix_memalign memalign
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:16321: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 16326 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:16353: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done


for ac_func in malloc_usable_size
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:16384: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 16389 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:16416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done

MALLOC_USABLE_SIZE_CONST_PTR=const
 for ac_hdr in malloc.h
  do
       ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
echo "configure:16448: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
   cat > conftest.$ac_ext <<EOF
#line 16453 "configure"
#include "confdefs.h"

#include <$ac_hdr>
int main() {

; return 0; }
EOF
if { (eval echo configure:16461: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_header_$ac_safe=no"
fi
rm -f conftest* 
fi

  if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
    echo "$ac_t""yes" 1>&6
     ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
                       cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_hdr ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_hdr 1
EOF
 
  echo $ac_n "checking whether malloc_usable_size definition can use const argument""... $ac_c" 1>&6
echo "configure:16484: checking whether malloc_usable_size definition can use const argument" >&5
  cat > conftest.$ac_ext <<EOF
#line 16486 "configure"
#include "confdefs.h"
#include <malloc.h>
                  #include <stddef.h>
                  size_t malloc_usable_size(const void *ptr);
int main() {
return malloc_usable_size(0);
; return 0; }
EOF
if { (eval echo configure:16495: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
  rm -rf conftest*
  echo "$ac_t""yes" 1>&6
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
                  MALLOC_USABLE_SIZE_CONST_PTR=
fi
rm -f conftest*

  else
    echo "$ac_t""no" 1>&6
    
  fi

  done

cat >> confdefs.pytmp <<EOF
    (''' MALLOC_USABLE_SIZE_CONST_PTR ''', r''' $MALLOC_USABLE_SIZE_CONST_PTR ''')
EOF
cat >> confdefs.h <<EOF
#define MALLOC_USABLE_SIZE_CONST_PTR $MALLOC_USABLE_SIZE_CONST_PTR
EOF



echo $ac_n "checking for valloc in malloc.h""... $ac_c" 1>&6
echo "configure:16524: checking for valloc in malloc.h" >&5
cat > conftest.$ac_ext <<EOF
#line 16526 "configure"
#include "confdefs.h"
#include <malloc.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "valloc" >/dev/null 2>&1; then
  rm -rf conftest*
  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VALLOC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VALLOC 1
EOF

                echo "$ac_t""yes" 1>&6
else
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*


echo $ac_n "checking for valloc in unistd.h""... $ac_c" 1>&6
echo "configure:16549: checking for valloc in unistd.h" >&5
cat > conftest.$ac_ext <<EOF
#line 16551 "configure"
#include "confdefs.h"
#include <unistd.h>
EOF
if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
  egrep "valloc" >/dev/null 2>&1; then
  rm -rf conftest*
  cat >> confdefs.pytmp <<\EOF
    (''' HAVE_VALLOC ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define HAVE_VALLOC 1
EOF

                echo "$ac_t""yes" 1>&6
else
  rm -rf conftest*
  echo "$ac_t""no" 1>&6
fi
rm -f conftest*





for ac_func in setlocale localeconv
do
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
echo "configure:16579: checking for $ac_func" >&5
if eval "test \"`echo '$''{'ac_cv_func2_$ac_func'+set}'`\" = set"; then
  echo $ac_n "(cached) $ac_c" 1>&6
else
  cat > conftest.$ac_ext <<EOF
#line 16584 "configure"
#define $ac_func innocuous_$ac_func
#include "confdefs.h"
#undef $ac_func
/* System header to define __stub macros and hopefully few prototypes,
    which can conflict with char $ac_func(); below.  */
#define $ac_func innocuous_$ac_func
#include <assert.h>
#undef $ac_func
/* Override any gcc2 internal prototype to avoid an error.  */
/* We use char because int might match the return type of a gcc2
    builtin and then its argument prototype would still apply.  */
char $ac_func();

int main() {

/* 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_$ac_func) || defined (__stub___$ac_func)
choke me
#else
$ac_func();
#endif

; return 0; }
EOF
if { (eval echo configure:16611: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=yes"
else
  echo "configure: failed program was:" >&5
  cat conftest.$ac_ext >&5
  rm -rf conftest*
  eval "ac_cv_func2_$ac_func=no"
fi
rm -f conftest*
fi

if eval "test \"`echo '$ac_cv_func2_'$ac_func`\" = yes"; then
  echo "$ac_t""yes" 1>&6
    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
  cat >> confdefs.pytmp <<EOF
    (''' $ac_tr_func ''', ' 1 ')
EOF
cat >> confdefs.h <<EOF
#define $ac_tr_func 1
EOF
 
else
  echo "$ac_t""no" 1>&6
fi
done








if test -n "$JS_STANDALONE"; then
MOZ_APP_NAME="mozjs"
MOZ_APP_VERSION="$MOZILLA_SYMBOLVERSION"
JS_LIBRARY_NAME="mozjs-$MOZILLA_SYMBOLVERSION"
else
JS_LIBRARY_NAME="mozjs"
fi
JS_CONFIG_LIBS="$NSPR_LIBS $LIBS"
if test -n "$GNU_CC"; then
JS_CONFIG_MOZ_JS_LIBS='-L${libdir} -l${JS_LIBRARY_NAME}'
else
JS_CONFIG_MOZ_JS_LIBS='${libdir}/${JS_LIBRARY_NAME}.lib'
fi




if test -n "$MOZ_BUILD_NSPR"; then
    

if test -z "$MOZ_NATIVE_NSPR"; then
    ac_configure_args="$_SUBDIR_CONFIG_ARGS --with-dist-prefix=$MOZ_BUILD_ROOT/dist --with-mozilla"
    if test -n "$MOZ_USING_CCACHE"; then
        # Avoid double prepending ccache by omitting --with-ccache in building NSPR.
        ac_configure_args="`echo $ac_configure_args | sed -e 's/--with-ccache[^ ]*//'`"
    fi

    if test -z "$MOZ_DEBUG"; then
        ac_configure_args="$ac_configure_args --disable-debug"
    else
        ac_configure_args="$ac_configure_args --enable-debug"
        if test -n "$MOZ_NO_DEBUG_RTL"; then
            ac_configure_args="$ac_configure_args --disable-debug-rtl"
        fi
    fi
    if test "$MOZ_OPTIMIZE" = "1"; then
        ac_configure_args="$ac_configure_args --enable-optimize"
    elif test -z "$MOZ_OPTIMIZE"; then
        ac_configure_args="$ac_configure_args --disable-optimize"
    fi
    if test -n "$HAVE_64BIT_BUILD"; then
        ac_configure_args="$ac_configure_args --enable-64bit"
    fi
    if test -n "$USE_ARM_KUSER"; then
        ac_configure_args="$ac_configure_args --with-arm-kuser"
    fi
    # A configure script generated by autoconf 2.68 does not allow the cached
    # values of "precious" variables such as CFLAGS and LDFLAGS to differ from
    # the values passed to the configure script. Since we modify CFLAGS and
    # LDFLAGS before passing them to NSPR's configure script, we cannot share
    # config.cache with NSPR. As a result, we cannot pass AS, CC, CXX, etc. to
    # NSPR via a shared config.cache file and must pass them to NSPR on the
    # configure command line.
    for var in AS CC CXX CPP LD AR RANLIB STRIP; do
        ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
    done
    # A configure script generated by autoconf 2.68 warns if --host is
    # specified but --build isn't. So we always pass --build to NSPR's
    # configure script.
    ac_configure_args="$ac_configure_args --build=$build"
    ac_configure_args="$ac_configure_args $NSPR_CONFIGURE_ARGS"

    # Save these, so we can mess with them for the subconfigure ..
    _SAVE_CFLAGS="$CFLAGS"
    _SAVE_CPPFLAGS="$CPPFLAGS"
    _SAVE_LDFLAGS="$LDFLAGS"

    if test -n "$MOZ_LINKER" -a "$ac_cv_func_dladdr" = no ; then
      # dladdr is supported by the new linker, even when the system linker doesn't
      # support it. Trick nspr into using dladdr when it's not supported.
      export CPPFLAGS="-include $_topsrcdir/mozglue/linker/dladdr.h $CPPFLAGS"
    fi
    export LDFLAGS="$LDFLAGS $NSPR_LDFLAGS"
    export CFLAGS="$CFLAGS $MOZ_FRAMEPTR_FLAGS $MOZ_FOLD_LIBS_FLAGS"

    for moz_config_dir in nsprpub; do
  _CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
  case "$moz_config_dir" in
  *:*)
    objdir=$(echo $moz_config_dir | awk -F: '{print $2}')
    ;;
  *)
    objdir=$moz_config_dir
    ;;
  esac
          echo $objdir >> subconfigures

  dumpenv="true | "
  case "$host" in
  *-mingw*)
    _CONFIG_SHELL=$(cd $(dirname $_CONFIG_SHELL); pwd -W)/$(basename $_CONFIG_SHELL)
    if test ! -e "$_CONFIG_SHELL" -a -e "${_CONFIG_SHELL}.exe"; then
        _CONFIG_SHELL="${_CONFIG_SHELL}.exe"
    fi
                        dumpenv="$PERL $_topsrcdir/build/win32/dumpenv4python.pl $ac_configure_args | "
    ;;
  esac

  eval $dumpenv $PYTHON $_topsrcdir/build/subconfigure.py --prepare "$srcdir" "$moz_config_dir" "$_CONFIG_SHELL" $ac_configure_args 

  done


    # .. and restore them
    CFLAGS="$_SAVE_CFLAGS"
    CPPFLAGS="$_SAVE_CPPFLAGS"
    LDFLAGS="$_SAVE_LDFLAGS"

    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
fi


fi

if test -z "$BUILDING_JS" -o -n "$JS_STANDALONE"; then

  if test "$BUILD_CTYPES" -a -z "$MOZ_NATIVE_FFI"; then
    # Run the libffi 'configure' script.
    ac_configure_args="--disable-shared --enable-static --disable-raw-api"
    if test "$MOZ_DEBUG"; then
      ac_configure_args="$ac_configure_args --enable-debug"
    fi
    if test "$DSO_PIC_CFLAGS"; then
      ac_configure_args="$ac_configure_args --with-pic"
    fi
    for var in AS CC CXX CPP LD AR RANLIB STRIP; do
      ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
    done
    if test "$CROSS_COMPILE"; then
      export CPPFLAGS CFLAGS LDFLAGS
    fi
    ac_configure_args="$ac_configure_args --build=$build --host=$target"
    if test "$_MSC_VER"; then
      # Use a wrapper script for cl and ml that looks more like gcc.
      # autotools can't quite handle an MSVC build environment yet.
      LDFLAGS=
      CFLAGS=
      ac_configure_args="$ac_configure_args LD=link CPP=\"$CC -nologo -EP\" \
                         CXXCPP=\"$CXX -nologo -EP\" SHELL=sh.exe"
      flags=
      if test -z "$MOZ_NO_DEBUG_RTL" -a -n "$MOZ_DEBUG"; then
        flags=" -DUSE_DEBUG_RTL"
      fi
      if test -n "$CLANG_CL"; then
        flags="$flags -clang-cl"
      fi
      case "${target_cpu}" in
      x86_64)
        # Need target since MSYS tools into mozilla-build may be 32bit
        ac_configure_args="$ac_configure_args \
                           CC=\"$_topsrcdir/js/src/ctypes/libffi/msvcc.sh -m64$flags\" \
                           CXX=\"$_topsrcdir/js/src/ctypes/libffi/msvcc.sh -m64$flags\""
        ;;
      *)
        ac_configure_args="$ac_configure_args \
                           CC=\"$_topsrcdir/js/src/ctypes/libffi/msvcc.sh$flags\" \
                           CXX=\"$_topsrcdir/js/src/ctypes/libffi/msvcc.sh$flags\""
        ;;
      esac
    fi
    if test "$SOLARIS_SUNPRO_CC"; then
      # Always use gcc for libffi on Solaris
      if test ! "$HAVE_64BIT_BUILD"; then
        ac_configure_args="$ac_configure_args CC=gcc CFLAGS=-m32 LD= LDFLAGS="
      else
        ac_configure_args="$ac_configure_args CC=gcc CFLAGS=-m64 LD= LDFLAGS="
      fi
    fi
    if test "$AIX_IBM_XLC"; then
      # Always use gcc for libffi on IBM AIX5/AIX6
      if test ! "$HAVE_64BIT_BUILD"; then
        ac_configure_args="$ac_configure_args CC=gcc CFLAGS=-maix32"
      else
        ac_configure_args="$ac_configure_args CC=gcc CFLAGS=-maix64"
      fi
    fi

    # Use a separate cache file for libffi, since it does things differently
    # from our configure.
    old_config_files=$CONFIG_FILES
    unset CONFIG_FILES
    for moz_config_dir in js/src/ctypes/libffi; do
  _CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
  case "$moz_config_dir" in
  *:*)
    objdir=$(echo $moz_config_dir | awk -F: '{print $2}')
    ;;
  *)
    objdir=$moz_config_dir
    ;;
  esac
          echo $objdir >> subconfigures

  dumpenv="true | "
  case "$host" in
  *-mingw*)
    _CONFIG_SHELL=$(cd $(dirname $_CONFIG_SHELL); pwd -W)/$(basename $_CONFIG_SHELL)
    if test ! -e "$_CONFIG_SHELL" -a -e "${_CONFIG_SHELL}.exe"; then
        _CONFIG_SHELL="${_CONFIG_SHELL}.exe"
    fi
                        dumpenv="$PERL $_topsrcdir/build/win32/dumpenv4python.pl $ac_configure_args | "
    ;;
  esac

  eval $dumpenv $PYTHON $_topsrcdir/build/subconfigure.py --prepare "$srcdir" "$moz_config_dir" "$_CONFIG_SHELL" $ac_configure_args 

  done

    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
    CONFIG_FILES=$old_config_files
  fi

fi



if test -z "$BUILDING_JS" -o -n "$JS_STANDALONE"; then

  # Run jemalloc configure script

  if test -z "$MOZ_NATIVE_JEMALLOC" -a "$MOZ_MEMORY" && test -n "$MOZ_JEMALLOC4" -o -n "$MOZ_REPLACE_MALLOC"; then
    ac_configure_args="--build=$build --host=$target --enable-stats --with-jemalloc-prefix=je_ --disable-valgrind"
    # We're using memalign for _aligned_malloc in memory/build/mozmemory_wrap.c
    # on Windows, so just export memalign on all platforms.
    ac_configure_args="$ac_configure_args ac_cv_func_memalign=yes"
    if test -n "$MOZ_REPLACE_MALLOC"; then
      # When using replace_malloc, we always want valloc exported from jemalloc.
      ac_configure_args="$ac_configure_args ac_cv_func_valloc=yes"
      if test "${OS_ARCH}" = Darwin; then
        # We also need to enable pointer validation on Mac because jemalloc's
        # zone allocator is not used.
        ac_configure_args="$ac_configure_args --enable-ivsalloc"
      fi
    fi
    if test -n "$MOZ_JEMALLOC4"; then
      case "${OS_ARCH}" in
        WINNT|Darwin)
          # We want jemalloc functions to be kept hidden on both Mac and Windows
          # See memory/build/mozmemory_wrap.h for details.
          ac_configure_args="$ac_configure_args --without-export"
          ;;
      esac
      if test "${OS_ARCH}" = WINNT; then
        # Lazy lock initialization doesn't play well with lazy linking of
        # mozglue.dll on Windows XP (leads to startup crash), so disable it.
        ac_configure_args="$ac_configure_args --disable-lazy-lock"
      fi
    elif test "${OS_ARCH}" = Darwin; then
      # When building as a replace-malloc lib, disabling the zone allocator
      # forces to use pthread_atfork.
      ac_configure_args="$ac_configure_args --disable-zone-allocator"
    fi
    _MANGLE="malloc posix_memalign aligned_alloc calloc realloc free memalign valloc malloc_usable_size"
    JEMALLOC_WRAPPER=
    if test -z "$MOZ_REPLACE_MALLOC"; then
      case "$OS_ARCH" in
        Linux|DragonFly|FreeBSD|NetBSD|OpenBSD)
          MANGLE=$_MANGLE
          ;;
      esac
    elif test -z "$MOZ_JEMALLOC4"; then
      MANGLE=$_MANGLE
      JEMALLOC_WRAPPER=replace_
    fi
    if test -n "$MANGLE"; then
      MANGLED=
      for mangle in ${MANGLE}; do
        if test -n "$MANGLED"; then
          MANGLED="$mangle:$JEMALLOC_WRAPPER$mangle,$MANGLED"
        else
          MANGLED="$mangle:$JEMALLOC_WRAPPER$mangle"
        fi
      done
      ac_configure_args="$ac_configure_args --with-mangling=$MANGLED"
    fi
    unset CONFIG_FILES
    if test -z "$MOZ_TLS"; then
      ac_configure_args="$ac_configure_args --disable-tls"
    fi
    EXTRA_CFLAGS="$CFLAGS"
    for var in AS CC CXX CPP LD AR RANLIB STRIP CPPFLAGS EXTRA_CFLAGS LDFLAGS; do
      ac_configure_args="$ac_configure_args $var='`eval echo \\${${var}}`'"
    done
    # Force disable DSS support in jemalloc.
    ac_configure_args="$ac_configure_args ac_cv_func_sbrk=false"

    # Make Linux builds munmap freed chunks instead of recycling them.
    ac_configure_args="$ac_configure_args --enable-munmap"

    # Disable cache oblivious behavior that appears to have a performance
    # impact on Firefox.
    ac_configure_args="$ac_configure_args --disable-cache-oblivious"

    if ! test -e memory/jemalloc; then
      mkdir -p memory/jemalloc
    fi

    # jemalloc's configure runs git to determine the version. But when building
    # from a gecko git clone, the git commands it uses is going to pick gecko's
    # information, not jemalloc's, which is useless. So pretend we don't have git
    # at all. That will make jemalloc's configure pick the in-tree VERSION file.
    (PATH="$srcdir/memory/jemalloc/helper:$PATH";
    for moz_config_dir in memory/jemalloc/src; do
  _CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
  case "$moz_config_dir" in
  *:*)
    objdir=$(echo $moz_config_dir | awk -F: '{print $2}')
    ;;
  *)
    objdir=$moz_config_dir
    ;;
  esac
          echo $objdir >> subconfigures

  dumpenv="true | "
  case "$host" in
  *-mingw*)
    _CONFIG_SHELL=$(cd $(dirname $_CONFIG_SHELL); pwd -W)/$(basename $_CONFIG_SHELL)
    if test ! -e "$_CONFIG_SHELL" -a -e "${_CONFIG_SHELL}.exe"; then
        _CONFIG_SHELL="${_CONFIG_SHELL}.exe"
    fi
                        dumpenv="$PERL $_topsrcdir/build/win32/dumpenv4python.pl $ac_configure_args | "
    ;;
  esac

  eval $dumpenv $PYTHON $_topsrcdir/build/subconfigure.py --prepare "$srcdir" "$moz_config_dir" "$_CONFIG_SHELL" $ac_configure_args 

  done

    ) || exit 1
    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
  fi

fi



# Avoid using obsolete NSPR features
cat >> confdefs.pytmp <<\EOF
    (''' NO_NSPR_10_SUPPORT ''', ' 1 ')
EOF
cat >> confdefs.h <<\EOF
#define NO_NSPR_10_SUPPORT 1
EOF


WIN_TOP_SRC=
encoding=utf-8
case "$host_os" in
mingw*)
    WIN_TOP_SRC=`cd $srcdir; pwd -W`
    encoding=mbcs
    ;;
esac


top_srcdir=$srcdir


trap '' 1 2 15
cat > confcache <<\EOF
# 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.  It is not useful on other systems.
# If it contains results you don't want to keep, you may remove or edit it.
#
# By default, configure uses ./config.cache as the cache file,
# creating it if it does not exist already.  You can give configure
# the --cache-file=FILE option to use a different cache file; that is
# what configure does when it calls configure scripts in
# subdirectories, so they share the cache.
# Giving --cache-file=/dev/null disables caching, for debugging configure.
# config.status only pays attention to the cache file if you give it the
# --recheck option to rerun configure.
#
EOF
# The following way of writing the cache mishandles newlines in values,
# but we know of no workaround that is simple, portable, and efficient.
# So, don't put newlines in cache variables' values.
# 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.
(set) 2>&1 |
  case `(ac_space=' '; set | grep ac_space) 2>&1` in
  *ac_space=\ *)
    # `set' does not quote correctly, so add quotes (double-quote substitution
    # turns \\\\ into \\, and sed turns \\ into \).
    sed -n \
      -e "s/'/'\\\\''/g" \
      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
    ;;
  *)
    # `set' quotes correctly as required by POSIX, so do not add quotes.
    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
    ;;
  esac >> confcache
if cmp -s $cache_file confcache; then
  :
else
  if test -w $cache_file; then
    echo "updating cache $cache_file"
    cat confcache > $cache_file
  else
    echo "not updating unwritable cache $cache_file"
  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}'

trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
: ${CONFIG_STATUS=./config.status}

echo creating $CONFIG_STATUS

extra_python_path=${COMM_BUILD:+"'mozilla', "}

cat > $CONFIG_STATUS <<EOF
#!${PYTHON}
# coding=$encoding

import os
import types
topsrcdir = '''${WIN_TOP_SRC:-$srcdir}'''
if not os.path.isabs(topsrcdir):
    rel = os.path.join(os.path.dirname(__file__), topsrcdir)
    topsrcdir = os.path.abspath(rel)
topsrcdir = os.path.normpath(topsrcdir)

topobjdir = os.path.abspath(os.path.dirname(__file__))

def unique_list(l):
    result = []
    for i in l:
        if l not in result:
            result.append(i)
    return result

defines = [(name[1:-1], value[1:-1]) for name, value in [
EOF

sed 's/$/,/' confdefs.pytmp >> $CONFIG_STATUS
rm confdefs.pytmp confdefs.h

cat >> $CONFIG_STATUS <<\EOF
] ]

substs = [(name[1:-1], value[1:-1] if isinstance(value, types.StringTypes) else value) for name, value in [
EOF

sed 's/$/,/' >> $CONFIG_STATUS <<EOF
    (''' SHELL ''', r''' $SHELL ''')
    (''' exec_prefix ''', r''' $exec_prefix ''')
    (''' prefix ''', r''' $prefix ''')
    (''' program_transform_name ''', r''' $program_transform_name ''')
    (''' bindir ''', r''' $bindir ''')
    (''' sbindir ''', r''' $sbindir ''')
    (''' libexecdir ''', r''' $libexecdir ''')
    (''' datadir ''', r''' $datadir ''')
    (''' sysconfdir ''', r''' $sysconfdir ''')
    (''' sharedstatedir ''', r''' $sharedstatedir ''')
    (''' localstatedir ''', r''' $localstatedir ''')
    (''' libdir ''', r''' $libdir ''')
    (''' includedir ''', r''' $includedir ''')
    (''' oldincludedir ''', r''' $oldincludedir ''')
    (''' infodir ''', r''' $infodir ''')
    (''' mandir ''', r''' $mandir ''')
    (''' host ''', r''' $host ''')
    (''' host_alias ''', r''' $host_alias ''')
    (''' host_cpu ''', r''' $host_cpu ''')
    (''' host_vendor ''', r''' $host_vendor ''')
    (''' host_os ''', r''' $host_os ''')
    (''' target ''', r''' $target ''')
    (''' target_alias ''', r''' $target_alias ''')
    (''' target_cpu ''', r''' $target_cpu ''')
    (''' target_vendor ''', r''' $target_vendor ''')
    (''' target_os ''', r''' $target_os ''')
    (''' build ''', r''' $build ''')
    (''' build_alias ''', r''' $build_alias ''')
    (''' build_cpu ''', r''' $build_cpu ''')
    (''' build_vendor ''', r''' $build_vendor ''')
    (''' build_os ''', r''' $build_os ''')
    (''' AWK ''', r''' $AWK ''')
    (''' BUILD_BACKENDS ''', unique_list(r''' $BUILD_BACKENDS '''.split()))
    (''' DEVELOPER_OPTIONS ''', r''' $DEVELOPER_OPTIONS ''')
    (''' CC ''', r''' $CC ''')
    (''' CXX ''', r''' $CXX ''')
    (''' COMPILE_ENVIRONMENT ''', r''' $COMPILE_ENVIRONMENT ''')
    (''' PERL ''', r''' $PERL ''')
    (''' JS_SHARED_LIBRARY ''', r''' $JS_SHARED_LIBRARY ''')
    (''' JS_STANDALONE ''', r''' $JS_STANDALONE ''')
    (''' autoconfmk ''', r''' $autoconfmk ''')
    (''' ANDROID_NDK ''', r''' $ANDROID_NDK ''')
    (''' ANDROID_TOOLCHAIN ''', r''' $ANDROID_TOOLCHAIN ''')
    (''' ANDROID_PLATFORM ''', r''' $ANDROID_PLATFORM ''')
    (''' MOZ_IOS ''', r''' $MOZ_IOS ''')
    (''' HOST_CC ''', r''' $HOST_CC ''')
    (''' HOST_CXX ''', r''' $HOST_CXX ''')
    (''' HOST_RANLIB ''', r''' $HOST_RANLIB ''')
    (''' HOST_AR ''', r''' $HOST_AR ''')
    (''' RANLIB ''', r''' $RANLIB ''')
    (''' AR ''', r''' $AR ''')
    (''' AS ''', r''' $AS ''')
    (''' LD ''', r''' $LD ''')
    (''' STRIP ''', r''' $STRIP ''')
    (''' WINDRES ''', r''' $WINDRES ''')
    (''' OTOOL ''', r''' $OTOOL ''')
    (''' CLANG_CXX ''', r''' $CLANG_CXX ''')
    (''' CLANG_CL ''', r''' $CLANG_CL ''')
    (''' CCACHE ''', r''' $CCACHE ''')
    (''' MOZ_USING_CCACHE ''', r''' $MOZ_USING_CCACHE ''')
    (''' MOZ_USING_COMPILER_WRAPPER ''', r''' $MOZ_USING_COMPILER_WRAPPER ''')
    (''' CPP ''', r''' $CPP ''')
    (''' CXXCPP ''', r''' $CXXCPP ''')
    (''' RUSTC ''', r''' $RUSTC ''')
    (''' MOZ_RUST ''', r''' $MOZ_RUST ''')
    (''' MSVC_C_RUNTIME_DLL ''', r''' $MSVC_C_RUNTIME_DLL ''')
    (''' MSVC_CXX_RUNTIME_DLL ''', r''' $MSVC_CXX_RUNTIME_DLL ''')
    (''' MSVC_APPCRT_DLL ''', r''' $MSVC_APPCRT_DLL ''')
    (''' MSVC_DESKTOPCRT_DLL ''', r''' $MSVC_DESKTOPCRT_DLL ''')
    (''' SBCONF ''', r''' $SBCONF ''')
    (''' QEMU_CANT_RUN_JS_SHELL ''', r''' $QEMU_CANT_RUN_JS_SHELL ''')
    (''' _MSC_VER ''', r''' $_MSC_VER ''')
    (''' GNU_AS ''', r''' $GNU_AS ''')
    (''' GNU_LD ''', r''' $GNU_LD ''')
    (''' GNU_CC ''', r''' $GNU_CC ''')
    (''' GNU_CXX ''', r''' $GNU_CXX ''')
    (''' INTEL_CC ''', r''' $INTEL_CC ''')
    (''' INTEL_CXX ''', r''' $INTEL_CXX ''')
    (''' INSTALL_PROGRAM ''', r''' $INSTALL_PROGRAM ''')
    (''' INSTALL_SCRIPT ''', r''' $INSTALL_SCRIPT ''')
    (''' INSTALL_DATA ''', r''' $INSTALL_DATA ''')
    (''' LN_S ''', r''' $LN_S ''')
    (''' TAR ''', r''' $TAR ''')
    (''' PYTHON ''', r''' $PYTHON ''')
    (''' PYTHON_SITE_PACKAGES ''', r''' $PYTHON_SITE_PACKAGES ''')
    (''' NSINSTALL_BIN ''', r''' $NSINSTALL_BIN ''')
    (''' DOXYGEN ''', r''' $DOXYGEN ''')
    (''' AUTOCONF ''', r''' $AUTOCONF ''')
    (''' XARGS ''', r''' $XARGS ''')
    (''' UNIVERSAL_BINARY ''', r''' $UNIVERSAL_BINARY ''')
    (''' MOZ_CAN_RUN_PROGRAMS ''', r''' $MOZ_CAN_RUN_PROGRAMS ''')
    (''' MACOSX_DEPLOYMENT_TARGET ''', r''' $MACOSX_DEPLOYMENT_TARGET ''')
    (''' MACOS_SDK_DIR ''', r''' $MACOS_SDK_DIR ''')
    (''' GMAKE ''', r''' $GMAKE ''')
    (''' X_CFLAGS ''', r''' $X_CFLAGS ''')
    (''' X_PRE_LIBS ''', r''' $X_PRE_LIBS ''')
    (''' X_LIBS ''', r''' $X_LIBS ''')
    (''' X_EXTRA_LIBS ''', r''' $X_EXTRA_LIBS ''')
    (''' MOZILLA_SYMBOLVERSION ''', r''' $MOZILLA_SYMBOLVERSION ''')
    (''' JS_SHELL_NAME ''', r''' $JS_SHELL_NAME ''')
    (''' JS_CONFIG_NAME ''', r''' $JS_CONFIG_NAME ''')
    (''' MOZJS_MAJOR_VERSION ''', r''' $MOZJS_MAJOR_VERSION ''')
    (''' MOZJS_MINOR_VERSION ''', r''' $MOZJS_MINOR_VERSION ''')
    (''' MOZJS_PATCH_VERSION ''', r''' $MOZJS_PATCH_VERSION ''')
    (''' MOZJS_ALPHA ''', r''' $MOZJS_ALPHA ''')
    (''' SOLARIS_SUNPRO_CC ''', r''' $SOLARIS_SUNPRO_CC ''')
    (''' SOLARIS_SUNPRO_CXX ''', r''' $SOLARIS_SUNPRO_CXX ''')
    (''' MOZ_THUMB2 ''', r''' $MOZ_THUMB2 ''')
    (''' HAVE_ARM_SIMD ''', r''' $HAVE_ARM_SIMD ''')
    (''' HAVE_ARM_NEON ''', r''' $HAVE_ARM_NEON ''')
    (''' BUILD_ARM_NEON ''', r''' $BUILD_ARM_NEON ''')
    (''' ARM_ARCH ''', r''' $ARM_ARCH ''')
    (''' MOZ_ANDROID_CXX_STL ''', r''' $MOZ_ANDROID_CXX_STL ''')
    (''' STLPORT_LIBS ''', r''' $STLPORT_LIBS ''')
    (''' LLVM_SYMBOLIZER ''', r''' $LLVM_SYMBOLIZER ''')
    (''' MOZ_ASAN ''', r''' $MOZ_ASAN ''')
    (''' MOZ_MSAN ''', r''' $MOZ_MSAN ''')
    (''' MOZ_TSAN ''', r''' $MOZ_TSAN ''')
    (''' HAVE_64BIT_BUILD ''', r''' $HAVE_64BIT_BUILD ''')
    (''' AIX_OBJMODEL ''', r''' $AIX_OBJMODEL ''')
    (''' ENABLE_METHODJIT_SPEW ''', r''' $ENABLE_METHODJIT_SPEW ''')
    (''' ENABLE_ION ''', r''' $ENABLE_ION ''')
    (''' MOZ_DEBUG_FLAGS ''', r''' $MOZ_DEBUG_FLAGS ''')
    (''' MOZ_NO_DEBUG_RTL ''', r''' $MOZ_NO_DEBUG_RTL ''')
    (''' MOZ_DEBUG_DEFINES ''', r''' $MOZ_DEBUG_DEFINES ''')
    (''' LD_IS_BFD ''', r''' $LD_IS_BFD ''')
    (''' LD_PRINT_ICF_SECTIONS ''', r''' $LD_PRINT_ICF_SECTIONS ''')
    (''' MOZ_PROGRAM_LDFLAGS ''', r''' $MOZ_PROGRAM_LDFLAGS ''')
    (''' MOZ_NEEDS_LIBATOMIC ''', r''' $MOZ_NEEDS_LIBATOMIC ''')
    (''' WRAP_SYSTEM_INCLUDES ''', r''' $WRAP_SYSTEM_INCLUDES ''')
    (''' VISIBILITY_FLAGS ''', list(r''' $VISIBILITY_FLAGS '''.split()))
    (''' HAVE_DTRACE ''', r''' $HAVE_DTRACE ''')
    (''' HAVE_LINUX_PERF_EVENT_H ''', r''' $HAVE_LINUX_PERF_EVENT_H ''')
    (''' LINUX_HEADERS_INCLUDES ''', r''' $LINUX_HEADERS_INCLUDES ''')
    (''' LIBOBJS ''', r''' $LIBOBJS ''')
    (''' HAVE_CLOCK_MONOTONIC ''', r''' $HAVE_CLOCK_MONOTONIC ''')
    (''' REALTIME_LIBS ''', list(r''' $REALTIME_LIBS '''.split()))
    (''' MOZ_UPDATE_CHANNEL ''', r''' $MOZ_UPDATE_CHANNEL ''')
    (''' GRE_MILESTONE ''', r''' $GRE_MILESTONE ''')
    (''' NIGHTLY_BUILD ''', r''' $NIGHTLY_BUILD ''')
    (''' RELEASE_BUILD ''', r''' $RELEASE_BUILD ''')
    (''' MOZ_BUILD_NSPR ''', r''' $MOZ_BUILD_NSPR ''')
    (''' JS_POSIX_NSPR ''', r''' $JS_POSIX_NSPR ''')
    (''' NSPR_CONFIG ''', r''' $NSPR_CONFIG ''')
    (''' NSPR_CFLAGS ''', list(r''' $NSPR_CFLAGS '''.split()))
    (''' NSPR_LIBS ''', list(r''' $NSPR_LIBS '''.split()))
    (''' NSPR_PKGCONF_CHECK ''', r''' $NSPR_PKGCONF_CHECK ''')
    (''' MOZ_ZLIB_CFLAGS ''', list(r''' $MOZ_ZLIB_CFLAGS '''.split()))
    (''' MOZ_ZLIB_LIBS ''', list(r''' $MOZ_ZLIB_LIBS '''.split()))
    (''' MOZ_NATIVE_ZLIB ''', r''' $MOZ_NATIVE_ZLIB ''')
    (''' ZLIB_IN_MOZGLUE ''', r''' $ZLIB_IN_MOZGLUE ''')
    (''' PKG_CONFIG ''', r''' $PKG_CONFIG ''')
    (''' MOZ_FFI_CFLAGS ''', list(r''' $MOZ_FFI_CFLAGS '''.split()))
    (''' MOZ_FFI_LIBS ''', list(r''' $MOZ_FFI_LIBS '''.split()))
    (''' MOZ_NATIVE_FFI ''', r''' $MOZ_NATIVE_FFI ''')
    (''' MOZ_UI_LOCALE ''', r''' $MOZ_UI_LOCALE ''')
    (''' MOZ_OPTIMIZE ''', r''' $MOZ_OPTIMIZE ''')
    (''' MOZ_FRAMEPTR_FLAGS ''', r''' $MOZ_FRAMEPTR_FLAGS ''')
    (''' MOZ_OPTIMIZE_FLAGS ''', r''' $MOZ_OPTIMIZE_FLAGS ''')
    (''' MOZ_OPTIMIZE_LDFLAGS ''', r''' $MOZ_OPTIMIZE_LDFLAGS ''')
    (''' MOZ_PGO_OPTIMIZE_FLAGS ''', r''' $MOZ_PGO_OPTIMIZE_FLAGS ''')
    (''' ENABLE_TRACE_LOGGING ''', r''' $ENABLE_TRACE_LOGGING ''')
    (''' MOZ_MEMORY ''', r''' $MOZ_MEMORY ''')
    (''' MOZ_JEMALLOC4 ''', r''' $MOZ_JEMALLOC4 ''')
    (''' MOZ_CRT ''', r''' $MOZ_CRT ''')
    (''' MOZ_GLUE_IN_PROGRAM ''', r''' $MOZ_GLUE_IN_PROGRAM ''')
    (''' MOZ_GLUE_WRAP_LDFLAGS ''', list(r''' $MOZ_GLUE_WRAP_LDFLAGS '''.split()))
    (''' MOZ_VALGRIND ''', r''' $MOZ_VALGRIND ''')
    (''' JS_SIMULATOR ''', r''' $JS_SIMULATOR ''')
    (''' JS_SIMULATOR_ARM ''', r''' $JS_SIMULATOR_ARM ''')
    (''' JS_SIMULATOR_ARM64 ''', r''' $JS_SIMULATOR_ARM64 ''')
    (''' JS_SIMULATOR_MIPS32 ''', r''' $JS_SIMULATOR_MIPS32 ''')
    (''' JS_SIMULATOR_MIPS64 ''', r''' $JS_SIMULATOR_MIPS64 ''')
    (''' JS_CODEGEN_ARM ''', r''' $JS_CODEGEN_ARM ''')
    (''' JS_CODEGEN_ARM64 ''', r''' $JS_CODEGEN_ARM64 ''')
    (''' JS_CODEGEN_MIPS32 ''', r''' $JS_CODEGEN_MIPS32 ''')
    (''' JS_CODEGEN_MIPS64 ''', r''' $JS_CODEGEN_MIPS64 ''')
    (''' JS_CODEGEN_X86 ''', r''' $JS_CODEGEN_X86 ''')
    (''' JS_CODEGEN_X64 ''', r''' $JS_CODEGEN_X64 ''')
    (''' JS_CODEGEN_NONE ''', r''' $JS_CODEGEN_NONE ''')
    (''' JS_DISASM_ARM ''', r''' $JS_DISASM_ARM ''')
    (''' ASMJS_MAY_USE_SIGNAL_HANDLERS_FOR_OOB ''', r''' $ASMJS_MAY_USE_SIGNAL_HANDLERS_FOR_OOB ''')
    (''' JS_JITSPEW ''', r''' $JS_JITSPEW ''')
    (''' LLVM_CXXFLAGS ''', r''' $LLVM_CXXFLAGS ''')
    (''' LLVM_LDFLAGS ''', r''' $LLVM_LDFLAGS ''')
    (''' CLANG_LDFLAGS ''', r''' $CLANG_LDFLAGS ''')
    (''' ENABLE_CLANG_PLUGIN ''', r''' $ENABLE_CLANG_PLUGIN ''')
    (''' SIXGILL_PATH ''', r''' $SIXGILL_PATH ''')
    (''' MOZ_DEMANGLE_SYMBOLS ''', r''' $MOZ_DEMANGLE_SYMBOLS ''')
    (''' PROFILE_GEN_CFLAGS ''', r''' $PROFILE_GEN_CFLAGS ''')
    (''' PROFILE_GEN_LDFLAGS ''', r''' $PROFILE_GEN_LDFLAGS ''')
    (''' PROFILE_USE_CFLAGS ''', r''' $PROFILE_USE_CFLAGS ''')
    (''' PROFILE_USE_LDFLAGS ''', r''' $PROFILE_USE_LDFLAGS ''')
    (''' LIBS_DESC_SUFFIX ''', r''' $LIBS_DESC_SUFFIX ''')
    (''' EXPAND_LIBS_LIST_STYLE ''', r''' $EXPAND_LIBS_LIST_STYLE ''')
    (''' EXPAND_LIBS_ORDER_STYLE ''', r''' $EXPAND_LIBS_ORDER_STYLE ''')
    (''' CL_INCLUDES_PREFIX ''', r''' $CL_INCLUDES_PREFIX ''')
    (''' NONASCII ''', r''' $NONASCII ''')
    (''' JS_BUNDLED_EDITLINE ''', r''' $JS_BUNDLED_EDITLINE ''')
    (''' JS_DISABLE_SHELL ''', r''' $JS_DISABLE_SHELL ''')
    (''' EDITLINE_LIBS ''', list(r''' $EDITLINE_LIBS '''.split()))
    (''' JS_HAS_CTYPES ''', r''' $JS_HAS_CTYPES ''')
    (''' BUILD_CTYPES ''', r''' $BUILD_CTYPES ''')
    (''' QEMU_EXE ''', r''' $QEMU_EXE ''')
    (''' CROSS_LIB ''', r''' $CROSS_LIB ''')
    (''' AR_FLAGS ''', r''' $AR_FLAGS ''')
    (''' AR_LIST ''', r''' $AR_LIST ''')
    (''' AR_EXTRACT ''', r''' $AR_EXTRACT ''')
    (''' AR_DELETE ''', r''' $AR_DELETE ''')
    (''' ASFLAGS ''', r''' $ASFLAGS ''')
    (''' AS_DASH_C_FLAG ''', r''' $AS_DASH_C_FLAG ''')
    (''' RC ''', r''' $RC ''')
    (''' RCFLAGS ''', r''' $RCFLAGS ''')
    (''' MC ''', r''' $MC ''')
    (''' IMPLIB ''', r''' $IMPLIB ''')
    (''' FILTER ''', r''' $FILTER ''')
    (''' BIN_FLAGS ''', r''' $BIN_FLAGS ''')
    (''' MOZ_DEBUG ''', r''' $MOZ_DEBUG ''')
    (''' MOZ_DEBUG_SYMBOLS ''', r''' $MOZ_DEBUG_SYMBOLS ''')
    (''' MOZ_DEBUG_LDFLAGS ''', r''' $MOZ_DEBUG_LDFLAGS ''')
    (''' WARNINGS_AS_ERRORS ''', r''' $WARNINGS_AS_ERRORS ''')
    (''' MOZ_JPROF ''', r''' $MOZ_JPROF ''')
    (''' MOZ_INSTRUMENTS ''', r''' $MOZ_INSTRUMENTS ''')
    (''' MOZ_CALLGRIND ''', r''' $MOZ_CALLGRIND ''')
    (''' MOZ_VTUNE ''', r''' $MOZ_VTUNE ''')
    (''' MOZ_PROFILING ''', r''' $MOZ_PROFILING ''')
    (''' LIBICONV ''', r''' $LIBICONV ''')
    (''' ENABLE_TESTS ''', r''' $ENABLE_TESTS ''')
    (''' ENABLE_STRIP ''', r''' $ENABLE_STRIP ''')
    (''' PKG_SKIP_STRIP ''', r''' $PKG_SKIP_STRIP ''')
    (''' INCREMENTAL_LINKER ''', r''' $INCREMENTAL_LINKER ''')
    (''' MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS ''', r''' $MOZ_COMPONENTS_VERSION_SCRIPT_LDFLAGS ''')
    (''' MOZ_FIX_LINK_PATHS ''', r''' $MOZ_FIX_LINK_PATHS ''')
    (''' USE_DEPENDENT_LIBS ''', r''' $USE_DEPENDENT_LIBS ''')
    (''' MOZ_BUILD_ROOT ''', r''' $MOZ_BUILD_ROOT ''')
    (''' MOZ_POST_DSO_LIB_COMMAND ''', r''' $MOZ_POST_DSO_LIB_COMMAND ''')
    (''' MOZ_POST_PROGRAM_COMMAND ''', r''' $MOZ_POST_PROGRAM_COMMAND ''')
    (''' MOZ_APP_NAME ''', r''' $MOZ_APP_NAME ''')
    (''' MOZ_APP_DISPLAYNAME ''', r''' $MOZ_APP_DISPLAYNAME ''')
    (''' MOZ_APP_VERSION ''', r''' $MOZ_APP_VERSION ''')
    (''' MOZ_PKG_SPECIAL ''', r''' $MOZ_PKG_SPECIAL ''')
    (''' MOZILLA_OFFICIAL ''', r''' $MOZILLA_OFFICIAL ''')
    (''' MOZ_BROWSE_INFO ''', r''' $MOZ_BROWSE_INFO ''')
    (''' MOZ_NATIVE_NSPR ''', r''' $MOZ_NATIVE_NSPR ''')
    (''' OS_CFLAGS ''', r''' $OS_CFLAGS ''')
    (''' OS_CXXFLAGS ''', r''' $OS_CXXFLAGS ''')
    (''' OS_CPPFLAGS ''', r''' $OS_CPPFLAGS ''')
    (''' OS_COMPILE_CFLAGS ''', r''' $OS_COMPILE_CFLAGS ''')
    (''' OS_COMPILE_CXXFLAGS ''', r''' $OS_COMPILE_CXXFLAGS ''')
    (''' OS_LDFLAGS ''', r''' $OS_LDFLAGS ''')
    (''' OS_LIBS ''', r''' $OS_LIBS ''')
    (''' CROSS_COMPILE ''', r''' $CROSS_COMPILE ''')
    (''' HOST_CFLAGS ''', r''' $HOST_CFLAGS ''')
    (''' HOST_CXXFLAGS ''', r''' $HOST_CXXFLAGS ''')
    (''' HOST_LDFLAGS ''', r''' $HOST_LDFLAGS ''')
    (''' HOST_OPTIMIZE_FLAGS ''', r''' $HOST_OPTIMIZE_FLAGS ''')
    (''' HOST_AR_FLAGS ''', r''' $HOST_AR_FLAGS ''')
    (''' HOST_LD ''', r''' $HOST_LD ''')
    (''' HOST_BIN_SUFFIX ''', r''' $HOST_BIN_SUFFIX ''')
    (''' HOST_OS_ARCH ''', r''' $HOST_OS_ARCH ''')
    (''' TARGET_CPU ''', r''' $TARGET_CPU ''')
    (''' TARGET_VENDOR ''', r''' $TARGET_VENDOR ''')
    (''' TARGET_OS ''', r''' $TARGET_OS ''')
    (''' TARGET_NSPR_MDCPUCFG ''', r''' $TARGET_NSPR_MDCPUCFG ''')
    (''' TARGET_MD_ARCH ''', r''' $TARGET_MD_ARCH ''')
    (''' TARGET_XPCOM_ABI ''', r''' $TARGET_XPCOM_ABI ''')
    (''' OS_TARGET ''', r''' $OS_TARGET ''')
    (''' OS_ARCH ''', r''' $OS_ARCH ''')
    (''' OS_RELEASE ''', r''' $OS_RELEASE ''')
    (''' OS_TEST ''', r''' $OS_TEST ''')
    (''' CPU_ARCH ''', r''' $CPU_ARCH ''')
    (''' INTEL_ARCHITECTURE ''', r''' $INTEL_ARCHITECTURE ''')
    (''' WRAP_LDFLAGS ''', r''' $WRAP_LDFLAGS ''')
    (''' MKSHLIB ''', r''' $MKSHLIB ''')
    (''' MKCSHLIB ''', r''' $MKCSHLIB ''')
    (''' DSO_CFLAGS ''', r''' $DSO_CFLAGS ''')
    (''' DSO_PIC_CFLAGS ''', r''' $DSO_PIC_CFLAGS ''')
    (''' DSO_LDOPTS ''', r''' $DSO_LDOPTS ''')
    (''' LIB_PREFIX ''', r''' $LIB_PREFIX ''')
    (''' DLL_PREFIX ''', r''' $DLL_PREFIX ''')
    (''' DLL_SUFFIX ''', r''' $DLL_SUFFIX ''')
    (''' LIB_SUFFIX ''', r''' $LIB_SUFFIX ''')
    (''' OBJ_SUFFIX ''', r''' $OBJ_SUFFIX ''')
    (''' BIN_SUFFIX ''', r''' $BIN_SUFFIX ''')
    (''' ASM_SUFFIX ''', r''' $ASM_SUFFIX ''')
    (''' IMPORT_LIB_SUFFIX ''', r''' $IMPORT_LIB_SUFFIX ''')
    (''' USE_N32 ''', r''' $USE_N32 ''')
    (''' CC_VERSION ''', r''' $CC_VERSION ''')
    (''' CXX_VERSION ''', r''' $CXX_VERSION ''')
    (''' MSMANIFEST_TOOL ''', r''' $MSMANIFEST_TOOL ''')
    (''' MOZ_LINKER ''', r''' $MOZ_LINKER ''')
    (''' WIN32_CONSOLE_EXE_LDFLAGS ''', r''' $WIN32_CONSOLE_EXE_LDFLAGS ''')
    (''' WIN32_GUI_EXE_LDFLAGS ''', r''' $WIN32_GUI_EXE_LDFLAGS ''')
    (''' PREPROCESS_OPTION ''', r''' $PREPROCESS_OPTION ''')
    (''' MOZ_ICU_CFLAGS ''', list(r''' $MOZ_ICU_CFLAGS '''.split()))
    (''' MOZ_ICU_LIBS ''', list(r''' $MOZ_ICU_LIBS '''.split()))
    (''' MOZ_ICU_INCLUDES ''', list(r''' $MOZ_ICU_INCLUDES '''.split()))
    (''' MOZ_NATIVE_ICU ''', r''' $MOZ_NATIVE_ICU ''')
    (''' MOZ_ICU_VERSION ''', r''' $MOZ_ICU_VERSION ''')
    (''' MOZ_SHARED_ICU ''', r''' $MOZ_SHARED_ICU ''')
    (''' MOZ_ICU_DBG_SUFFIX ''', r''' $MOZ_ICU_DBG_SUFFIX ''')
    (''' ENABLE_INTL_API ''', r''' $ENABLE_INTL_API ''')
    (''' USE_ICU ''', r''' $USE_ICU ''')
    (''' ICU_LIB_NAMES ''', list(r''' $ICU_LIB_NAMES '''.split()))
    (''' MOZILLA_VERSION ''', r''' $MOZILLA_VERSION ''')
    (''' ac_configure_args ''', r''' $ac_configure_args ''')
    (''' TOOLCHAIN_PREFIX ''', r''' $TOOLCHAIN_PREFIX ''')
    (''' JS_LIBRARY_NAME ''', r''' $JS_LIBRARY_NAME ''')
    (''' JS_CONFIG_MOZ_JS_LIBS ''', r''' $JS_CONFIG_MOZ_JS_LIBS ''')
    (''' JS_CONFIG_LIBS ''', r''' $JS_CONFIG_LIBS ''')
    (''' WIN_TOP_SRC ''', r''' $WIN_TOP_SRC ''')
    (''' top_srcdir ''', r''' $top_srcdir ''')
EOF

for ac_subst_arg in $_subconfigure_ac_subst_args; do
  variable='$'$ac_subst_arg
  echo "    (''' $ac_subst_arg ''', r''' `eval echo $variable` ''')," >> $CONFIG_STATUS
done

cat >> $CONFIG_STATUS <<\EOF
] ]

non_global_defines = [
EOF

if test -n "$_NON_GLOBAL_ACDEFINES"; then
  for var in $_NON_GLOBAL_ACDEFINES; do
    echo "    '$var'," >> $CONFIG_STATUS
  done
fi

cat >> $CONFIG_STATUS <<EOF
]

__all__ = ['topobjdir', 'topsrcdir', 'defines', 'non_global_defines', 'substs']
EOF

# We don't want js/src/config.status to do anything in gecko builds.
if test -z "$BUILDING_JS" -o -n "$JS_STANDALONE"; then

    cat >> $CONFIG_STATUS <<EOF
if __name__ == '__main__':
    args = dict([(name, globals()[name]) for name in __all__])
    from mozbuild.config_status import config_status
    config_status(**args)
EOF

fi



chmod +x $CONFIG_STATUS


if test "$JS_STANDALONE"; then
  


if test "$no_recursion" != yes; then
  trap '' EXIT
  if ! $PYTHON $_topsrcdir/build/subconfigure.py --list subconfigures --skip skip_subconfigures; then
      exit 1
  fi
  trap '[ "$?" != 0 ] && echo "------ config.log ------" && tail -n 25 config.log' EXIT

fi



rm -fr confdefs* $ac_clean_files
if test "$no_create" != yes && ! ${PYTHON} $CONFIG_STATUS; then
    trap '' EXIT
    exit 1
fi

fi
