dnl -*- Mode: Autoconf; tab-width: 4; indent-tabs-mode: nil; -*-
dnl vi: set tabstop=4 shiftwidth=4 expandtab syntax=m4:
dnl This Source Code Form is subject to the terms of the Mozilla Public
dnl License, v. 2.0. If a copy of the MPL was not distributed with this
dnl file, You can obtain one at http://mozilla.org/MPL/2.0/.

dnl Process this file with autoconf to produce a configure script.
dnl ========================================================
AC_PREREQ(2.13)
AC_INIT(js/src/jsapi.h)
AC_CONFIG_AUX_DIR(${srcdir}/build/autoconf)
AC_CANONICAL_SYSTEM

dnl ========================================================
dnl =
dnl = Don't change the following lines. Doing so breaks:
dnl =
dnl = CFLAGS="-foo" ./configure
dnl =
dnl ========================================================
CFLAGS="${CFLAGS=}"
CPPFLAGS="${CPPFLAGS=}"
CXXFLAGS="${CXXFLAGS=}"
LDFLAGS="${LDFLAGS=}"
HOST_CFLAGS="${HOST_CFLAGS=}"
HOST_CXXFLAGS="${HOST_CXXFLAGS=}"
HOST_LDFLAGS="${HOST_LDFLAGS=}"

dnl Set the minimum version of toolkit libs used by mozilla
dnl ========================================================
W32API_VERSION=3.14

dnl Set various checks
dnl ========================================================
MISSING_X=

dnl Initialize the Pthread test variables early so they can be
dnl  overridden by each platform.
dnl ========================================================
USE_PTHREADS=
_PTHREAD_LDFLAGS=""

LDFLAGS="$LDFLAGS $LINKER_LDFLAGS $PACK_REL_RELOC_FLAGS"
HOST_LDFLAGS="$HOST_LDFLAGS $HOST_LINKER_LDFLAGS"

if test -z "$JS_STANDALONE"; then
  autoconfmk=autoconf-js.mk
fi
AC_SUBST(autoconfmk)

jsconfdefs=$_objdir/js/src/js-confdefs.h

MOZ_ANDROID_NDK

dnl ========================================================
dnl Checks for compilers.
dnl ========================================================

if test "$COMPILE_ENVIRONMENT"; then

# Run some logic to figure out exe extensions (mostly for mingw's sake)
AC_EXEEXT

# 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
    MOZ_CROSS_COMPILER
else
    AC_PROG_CC
    AC_PROG_CXX
fi

MOZ_TOOL_VARIABLES

dnl Special win32 checks
dnl ========================================================

WINVER=0A00

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
        CXXFLAGS="$CXXFLAGS -TP"
        # _CRT_SECURE_NO_WARNINGS disables warnings about using MSVC-specific
        # secure CRT functions.
        CXXFLAGS="$CXXFLAGS -D_CRT_SECURE_NO_WARNINGS"
        AC_LANG_SAVE
        AC_LANG_C
        AC_TRY_COMPILE([#include <stdio.h>],
            [ printf("Hello World\n"); ],,
            AC_MSG_ERROR([\$(CC) test failed.  You must have MS VC++ in your path to build.]) )

        AC_LANG_CPLUSPLUS
        AC_TRY_COMPILE([#include <new.h>],
            [ unsigned *test = new unsigned(42); ],,
            AC_MSG_ERROR([\$(CXX) test failed.  You must have MS VC++ in your path to build.]) )
        AC_LANG_RESTORE

        AC_DEFINE(_CRT_SECURE_NO_WARNINGS)
        AC_DEFINE(_CRT_NONSTDC_NO_WARNINGS)

        MSVC_C_RUNTIME_DLL=vcruntime140.dll
        if test -n "$IS_VS2019_OR_MORE" -a "$TARGET_CPU" != "x86"; then
            MSVC_C_RUNTIME_1_DLL=vcruntime140_1.dll
        fi
        MSVC_CXX_RUNTIME_DLL=msvcp140.dll

        # -Zc:sizedDealloc- disables C++14 global sized deallocation (see bug 1160146)
        CXXFLAGS="$CXXFLAGS -Zc:sizedDealloc-"

        AC_SUBST(MSVC_C_RUNTIME_DLL)
        AC_SUBST(MSVC_C_RUNTIME_1_DLL)
        AC_SUBST(MSVC_CXX_RUNTIME_DLL)

        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 }'`
        AC_MSG_CHECKING([for w32api version >= $W32API_VERSION])
        AC_TRY_COMPILE([#include <w32api.h>],
            #if (__W32API_MAJOR_VERSION < $_W32API_MAJOR_VERSION) || \
                (__W32API_MAJOR_VERSION == $_W32API_MAJOR_VERSION && \
                 __W32API_MINOR_VERSION < $_W32API_MINOR_VERSION)
                #error "test failed."
            #endif
            , [ res=yes ], [ res=no ])
        AC_MSG_RESULT([$res])
        if test "$res" != "yes"; then
            AC_MSG_ERROR([w32api version $W32API_VERSION or higher required.])
        fi
    fi # !GNU_CC

    AC_DEFINE(_USE_MATH_DEFINES) # Otherwise Windows' math.h doesn't #define M_PI.

    AC_DEFINE_UNQUOTED(WINVER,0x$WINVER)
    AC_DEFINE_UNQUOTED(_WIN32_WINNT,0x$WINVER)
    AC_DEFINE_UNQUOTED(_WIN32_IE,0x0A00)

    ;;
esac

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

fi # COMPILE_ENVIRONMENT

AC_SUBST(GNU_CC)
AC_SUBST(GNU_CXX)

dnl ========================================================
dnl set the defaults first
dnl ========================================================
MOZ_FIX_LINK_PATHS="-Wl,-rpath-link,${DIST}/bin -Wl,-rpath-link,${prefix}/lib"

dnl Configure platform-specific CPU architecture compiler options.
dnl ==============================================================
MOZ_ARCH_OPTS

MOZ_CONFIG_SANITIZE

dnl ========================================================
dnl GNU specific defaults
dnl ========================================================
if test "$GNU_CC"; then
    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_ASAN$MOZ_MSAN$MOZ_UBSAN$MOZ_TSAN$FUZZING_INTERFACES"; then
            # Don't allow undefined symbols in libraries
            DSO_LDOPTS="$DSO_LDOPTS -Wl,-z,defs"
        fi
    fi

    if test "$OS_ARCH" != "WINNT"; then
        DSO_PIC_CFLAGS='-fPIC'
        ASFLAGS="$ASFLAGS -fPIC"
    fi

    _DEFINES_CFLAGS="-include $jsconfdefs -DMOZILLA_CLIENT"
fi

if test "$GNU_CXX"; then
    _DEFINES_CXXFLAGS="-DMOZILLA_CLIENT -include $jsconfdefs"
fi

dnl ========================================================
dnl System overrides of the defaults for host
dnl ========================================================
case "$host" in
*mingw*)
    if test -n "$_WIN32_MSVC"; then
        HOST_CFLAGS="$HOST_CFLAGS"
    else
        HOST_CFLAGS="$HOST_CFLAGS -mwindows"
    fi
    HOST_CFLAGS="$HOST_CFLAGS -DXP_WIN -DWIN32 -D_WIN32 -D_CRT_SECURE_NO_WARNINGS"
    HOST_OPTIMIZE_FLAGS="${HOST_OPTIMIZE_FLAGS=-O2}"
    HOST_BIN_SUFFIX=.exe

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

dnl ========================================================
dnl System overrides of the defaults for target
dnl ========================================================

case "$target" in
*-darwin*)
    MOZ_OPTIMIZE_FLAGS="-O3"
    DSO_LDOPTS=''

    dnl DTrace and -dead_strip don't interact well. See bug 403132.
    dnl ===================================================================
    if test "x$enable_dtrace" = "xyes"; then
        echo "Skipping -dead_strip because DTrace is enabled. See bug 403132."
    else
        dnl check for the presence of the -dead_strip linker flag
        AC_MSG_CHECKING([for -dead_strip option to ld])
        _SAVE_LDFLAGS=$LDFLAGS
        LDFLAGS="$LDFLAGS -Wl,-dead_strip"
        AC_TRY_LINK(,[return 0;],_HAVE_DEAD_STRIP=1,_HAVE_DEAD_STRIP=)
        if test -n "$_HAVE_DEAD_STRIP" ; then
            AC_MSG_RESULT([yes])
            MOZ_OPTIMIZE_LDFLAGS="-Wl,-dead_strip"
        else
            AC_MSG_RESULT([no])
        fi

        LDFLAGS=$_SAVE_LDFLAGS
    fi
    MOZ_FIX_LINK_PATHS=
    ;;

*-android*|*-linuxandroid*)
    MOZ_OPTIMIZE_FLAGS="-O3"
    if test -z "$CLANG_CC"; then
       MOZ_OPTIMIZE_FLAGS="-fno-reorder-functions $MOZ_OPTIMIZE_FLAGS"
    fi
    ;;

*-*linux*)
    if test "$GNU_CC" -o "$GNU_CXX"; then
        MOZ_PGO_OPTIMIZE_FLAGS="-O3"
        MOZ_OPTIMIZE_FLAGS="-O3"
    fi

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

*-mingw*)
    DSO_PIC_CFLAGS=
    if test -n "$GNU_CC" -o -n "$CLANG_CC"; then
        # $GNU_CC will match gcc and clang; while $CLANG_CC will match only clang
        if test -z "$CLANG_CC"; then
            AC_MSG_ERROR(Firefox cannot be built with mingw-gcc and requires a mingw-clang toolchain to work)
        fi

        DSO_LDOPTS='-shared'
        MOZ_FIX_LINK_PATHS=

        # Silence problematic clang warnings
        CXXFLAGS="$CXXFLAGS -Wno-incompatible-ms-struct"
        LDFLAGS="$LDFLAGS -Wl,--no-insert-timestamp"

        MOZ_OPTIMIZE_FLAGS="-O2"

        WIN32_CONSOLE_EXE_LDFLAGS=-mconsole
        WIN32_GUI_EXE_LDFLAGS=-mwindows
    else
        TARGET_COMPILER_ABI=msvc
        WIN32_SUBSYSTEM_VERSION=10.0
        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
        _DEFINES_CFLAGS="-FI $jsconfdefs -DMOZILLA_CLIENT"
        _DEFINES_CXXFLAGS="-FI $jsconfdefs -DMOZILLA_CLIENT"
        CFLAGS="$CFLAGS -Gy -Zc:inline"
        CXXFLAGS="$CXXFLAGS -Gy -Zc:inline"
        if test "$TARGET_CPU" = "x86";then
          dnl VS2012+ defaults to -arch:SSE2. We want to target nothing
          dnl more recent, so set that explicitly here unless another
          dnl target arch has already been set.
          changequote(,)
          if test -z `echo $CFLAGS | grep -i [-/]arch:` ; then
            CFLAGS="$CFLAGS -arch:SSE2"
          fi
          if test -z `echo $CXXFLAGS | grep -i [-/]arch:` ; then
            CXXFLAGS="$CXXFLAGS -arch:SSE2"
          fi
          changequote([,])
        fi
        dnl VS2013+ supports -Gw for better linker optimizations.
        dnl http://blogs.msdn.com/b/vcblog/archive/2013/09/11/introducing-gw-compiler-switch.aspx
        dnl Disabled on ASan because it causes false-positive ODR violations.
        if test -z "$MOZ_ASAN"; then
            CFLAGS="$CFLAGS -Gw"
            CXXFLAGS="$CXXFLAGS -Gw"
        else
            # String tail merging doesn't play nice with ASan's ODR checker.
            LDFLAGS="$LDFLAGS -opt:nolldtailmerge"
        fi
        MOZ_DEBUG_LDFLAGS='-DEBUG'
        if test "$HOST_OS_ARCH" != "WINNT"; then
          # %_PDB% is a special signal to emit only the PDB basename. This
          # avoids problems in Windows tools that don't like forward-slashes.
          MOZ_DEBUG_LDFLAGS="$MOZ_DEBUG_LDFLAGS -PDBALTPATH:%_PDB%"
        fi
        MOZ_OPTIMIZE_FLAGS="-O2"
        MOZ_FIX_LINK_PATHS=
        LDFLAGS="$LDFLAGS -LARGEADDRESSAWARE"
    fi
    AC_DEFINE(HAVE__MSIZE)
    AC_DEFINE(WIN32_LEAN_AND_MEAN)
    dnl See http://support.microsoft.com/kb/143208 to use STL
    AC_DEFINE(NOMINMAX)
    BIN_SUFFIX='.exe'

    case "$host_os" in
    cygwin*|msvc*|mks*)
        AC_MSG_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.])
        ;;
    esac

    case "$target" in
    i*86-*)
        if test -n "$GNU_CC"; then
            CFLAGS="$CFLAGS -mstackrealign"
            CXXFLAGS="$CXXFLAGS -mstackrealign"
            LDFLAGS="$LDFLAGS -Wl,--large-address-aware"
        else
            DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X86"
            LDFLAGS="$LDFLAGS -SAFESEH"
        fi

    	AC_DEFINE(_X86_)
	;;
    x86_64-*)
        if test -n "$_WIN32_MSVC"; then
            DSO_LDOPTS="$DSO_LDOPTS -MACHINE:X64"
        fi
        AC_DEFINE(_AMD64_)
        ;;
    aarch64-*)
        if test -n "$_WIN32_MSVC"; then
            DSO_LDOPTS="$DSO_LDOPTS -MACHINE:ARM64"
        fi
        AC_DEFINE(_ARM64_)
        ;;
    *)
    	AC_DEFINE(_CPU_ARCH_NOT_DEFINED)
	;;
    esac
    ;;

*-netbsd*)
    CFLAGS="$CFLAGS -Dunix"
    CXXFLAGS="$CXXFLAGS -Dunix"
    if $CC -E - -dM </dev/null | grep __ELF__ >/dev/null; then
        DSO_PIC_CFLAGS='-fPIC -DPIC'
        DSO_LDOPTS='-shared'
        MOZ_PROGRAM_LDFLAGS="$MOZ_PROGRAM_LDFLAGS -Wl,--export-dynamic"
    else
    	DSO_PIC_CFLAGS='-fPIC -DPIC'
    	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
    ;;

*-openbsd*)
    DSO_PIC_CFLAGS='-fPIC'
    DSO_LDOPTS='-shared -fPIC'
    if test "$LIBRUNPATH"; then
	DSO_LDOPTS="-R$LIBRUNPATH $DSO_LDOPTS"
    fi
    ;;

*-solaris*)
    MOZ_FIX_LINK_PATHS="-L${DIST}/bin"
    ;;

*-wasi*)
    CXXFLAGS="$CXXFLAGS -mthread-model single"
    MOZ_FIX_LINK_PATHS=
    ;;

esac

CFLAGS="$CFLAGS $DSO_PIC_CFLAGS"
CXXFLAGS="$CXXFLAGS $DSO_PIC_CFLAGS"

if test -z "$MOZ_OPTIMIZE_FLAGS"; then
	MOZ_OPTIMIZE_FLAGS="-O"
fi

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

if test -n "$COMPILE_ENVIRONMENT"; then
    MOZ_COMPILER_OPTS
fi

if test -z "$SKIP_COMPILER_CHECKS"; then
dnl Checks for typedefs, structures, and compiler characteristics.
dnl ========================================================
AC_C_CONST
AC_TYPE_MODE_T
AC_TYPE_OFF_T
AC_TYPE_PID_T
AC_TYPE_SIZE_T
AC_LANG_CPLUSPLUS
AC_LANG_C
AC_MSG_CHECKING(for ssize_t)
AC_CACHE_VAL(ac_cv_type_ssize_t,
 [AC_TRY_COMPILE([#include <stdio.h>
                  #include <sys/types.h>],
                 [ssize_t foo = 0;],
                 [ac_cv_type_ssize_t=true],
                 [ac_cv_type_ssize_t=false])])
if test "$ac_cv_type_ssize_t" = true ; then
  AC_DEFINE(HAVE_SSIZE_T)
  AC_MSG_RESULT(yes)
else
  AC_MSG_RESULT(no)
fi

AC_LANG_CPLUSPLUS

MOZ_CXX11

dnl Checks for header files.
dnl ========================================================
AC_HEADER_DIRENT

dnl Checks for libraries.
dnl ========================================================
AC_CHECK_LIB(c_r, gethostbyname_r)

dnl We don't want to link with libdl even if it's present on OS X, since
dnl it's not used and not part of the default installation. OS/2 has dlfcn
dnl in libc.
dnl We don't want to link against libm or libpthread on Darwin since
dnl they both are just symlinks to libSystem and explicitly linking
dnl against libSystem causes issues when debugging (see bug 299601).
case $target in
*-darwin*)
    ;;
*)
    AC_SEARCH_LIBS(dlopen, dl,
        MOZ_CHECK_HEADER(dlfcn.h,
        AC_DEFINE(HAVE_DLOPEN)))
    ;;
esac

_SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -D_GNU_SOURCE"
AC_CHECK_FUNCS(dladdr)
CFLAGS="$_SAVE_CFLAGS"

if test ! "$GNU_CXX"; then
    AC_CHECK_LIB(C, demangle)
fi

AC_CHECK_LIB(socket, socket)

dnl ========================================================
dnl = pthread support
dnl = Start by checking whether the system support pthreads
dnl ========================================================
case "$target_os" in
darwin*)
    USE_PTHREADS=1
    ;;
*)
    AC_CHECK_LIB(pthreads, pthread_create,
        USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthreads",
        AC_CHECK_LIB(pthread, pthread_create,
            USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lpthread",
            AC_CHECK_LIB(c_r, pthread_create,
                USE_PTHREADS=1 _PTHREAD_LDFLAGS="-lc_r",
                AC_CHECK_LIB(c, pthread_create,
                    USE_PTHREADS=1
                )
            )
        )
    )
    ;;
esac

dnl ========================================================
dnl Do the platform specific pthread hackery
dnl ========================================================
if test "$USE_PTHREADS"x != x
then
	dnl
	dnl See if -pthread is supported.
	dnl
	rm -f conftest*
	ac_cv_have_dash_pthread=no
	AC_MSG_CHECKING(whether ${CC-cc} accepts -pthread)
	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 "`grep -E -i '(unrecognize|unknown)' conftest.out | grep pthread`" -a -z "`grep -E -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*
    AC_MSG_RESULT($ac_cv_have_dash_pthread)

	dnl
	dnl See if -pthreads is supported.
	dnl
    ac_cv_have_dash_pthreads=no
    if test "$ac_cv_have_dash_pthread" = "no"; then
	    AC_MSG_CHECKING(whether ${CC-cc} accepts -pthreads)
    	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 "`grep -E -i '(unrecognize|unknown)' conftest.out | grep pthreads`" -a -z "`grep -E -i '(error|incorrect)' conftest.out`" ; then
			    ac_cv_have_dash_pthreads=yes
			    CFLAGS="$CFLAGS -pthreads"
			    CXXFLAGS="$CXXFLAGS -pthreads"
		    fi
	    fi
	    rm -f conftest*
    	AC_MSG_RESULT($ac_cv_have_dash_pthreads)
    fi

	case "$target" in
	    *-*-freebsd*)
			AC_DEFINE(_REENTRANT)
			AC_DEFINE(_THREAD_SAFE)
			dnl -pthread links in -lpthread, so don't specify it explicitly.
			if test "$ac_cv_have_dash_pthread" = "yes"; then
				_PTHREAD_LDFLAGS="-pthread"
			fi
			;;

	    *-*-openbsd*|*-*-bsdi*)
			AC_DEFINE(_REENTRANT)
			AC_DEFINE(_THREAD_SAFE)
			dnl -pthread links in -lc_r, so don't specify it explicitly.
			if test "$ac_cv_have_dash_pthread" = "yes"; then
                _PTHREAD_LDFLAGS="-pthread"
			fi
			;;

	    *-*-linux*|*-*-kfreebsd*-gnu|*-*-gnu*)
			AC_DEFINE(_REENTRANT)
			;;

	esac
    LDFLAGS="${_PTHREAD_LDFLAGS} ${LDFLAGS}"
fi


dnl Checks for library functions.
dnl ========================================================

dnl check for clock_gettime(), the CLOCK_MONOTONIC clock
AC_CACHE_CHECK(for clock_gettime(CLOCK_MONOTONIC),
               ac_cv_clock_monotonic,
               [for libs in "" -lrt; do
                    _SAVE_LIBS="$LIBS"
                    LIBS="$LIBS $libs"
dnl clock_gettime is available on OSX since 10.12, so depending on MACOSX_DEPLOYMENT_TARGET,
dnl we should or not be able to use it. To detect if we can, we need to make the
dnl availability attribute strict, so that compilation fails when the target is < 10.12.
                    AC_TRY_LINK([#define availability(os, ...) availability(os, strict, __VA_ARGS)
                                 #include <time.h>],
                                 [ struct timespec ts;
                                   clock_gettime(CLOCK_MONOTONIC, &ts); ],
                                 ac_cv_clock_monotonic=$libs
                                 LIBS="$_SAVE_LIBS"
                                 break,
                                 ac_cv_clock_monotonic=no)
                    LIBS="$_SAVE_LIBS"
                done])
if test "$ac_cv_clock_monotonic" != "no"; then
    HAVE_CLOCK_MONOTONIC=1
    REALTIME_LIBS=$ac_cv_clock_monotonic
    AC_DEFINE(HAVE_CLOCK_MONOTONIC)
    AC_SUBST(HAVE_CLOCK_MONOTONIC)
    AC_SUBST_LIST(REALTIME_LIBS)
fi

dnl Checks for math functions.
dnl ========================================================
AC_CHECK_LIB(m, sin)

AC_CACHE_CHECK(
    [for res_ninit()],
    ac_cv_func_res_ninit,
    [if test "$OS_TARGET" = NetBSD -o "$OS_TARGET" = OpenBSD; then
        dnl no need for res_ninit() on NetBSD and OpenBSD
        ac_cv_func_res_ninit=no
     else
       AC_TRY_LINK([
            #ifdef linux
            #define _BSD_SOURCE 1
            #endif
            #include <sys/types.h>
            #include <netinet/in.h>
            #include <arpa/nameser.h>
            #include <resolv.h>
            ],
            [int foo = res_ninit(&_res);],
            [ac_cv_func_res_ninit=yes],
            [ac_cv_func_res_ninit=no])
     fi
    ])

if test "$ac_cv_func_res_ninit" = "yes"; then
    AC_DEFINE(HAVE_RES_NINIT)
dnl must add the link line we do something as foolish as this... dougt
dnl else
dnl    AC_CHECK_LIB(bind, res_ninit, AC_DEFINE(HAVE_RES_NINIT),
dnl        AC_CHECK_LIB(resolv, res_ninit, AC_DEFINE(HAVE_RES_NINIT)))
fi

AM_LANGINFO_CODESET

AC_LANG_C

dnl ===================================================================
dnl ========================================================
dnl Put your C++ language/feature checks below
dnl ========================================================
AC_LANG_CPLUSPLUS

ARM_ABI_PREFIX=
if test "$GNU_CC"; then
  if test "$TARGET_CPU" = "arm" ; then
    AC_CACHE_CHECK(for ARM EABI,
        ac_cv_gcc_arm_eabi,
        [AC_TRY_COMPILE([],
                        [
#if defined(__ARM_EABI__)
  return 0;
#else
#error Not ARM EABI.
#endif
                        ],
                        ac_cv_gcc_arm_eabi="yes",
                        ac_cv_gcc_arm_eabi="no")])
    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

# 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_LDOPTS $MOZ_OPTIMIZE_LDFLAGS"
AC_CACHE_CHECK(for __thread keyword for TLS variables,
               ac_cv_thread_keyword,
               [AC_TRY_LINK([__thread bool tlsIsMainThread = false;],
                            [return tlsIsMainThread;],
                            ac_cv_thread_keyword=yes,
                            ac_cv_thread_keyword=no)])
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*)
      :
      ;;
    *)
      AC_DEFINE(HAVE_THREAD_TLS_KEYWORD)
      ;;
  esac
fi

dnl End of C++ language/feature checks
AC_LANG_C

fi # ! SKIP_COMPILER_CHECKS

TARGET_XPCOM_ABI=
if test -n "${TARGET_CPU}" -a -n "${TARGET_COMPILER_ABI}"; then
    TARGET_XPCOM_ABI="${TARGET_CPU}-${TARGET_COMPILER_ABI}"
fi

dnl We can't run TRY_COMPILE tests on Windows, so hard-code some
dnl features that Windows actually does support.

if test -n "$SKIP_COMPILER_CHECKS"; then
   dnl Windows has malloc.h
   AC_DEFINE(MALLOC_H, [<malloc.h>])
   AC_DEFINE(HAVE_FORCEINLINE)
fi # SKIP_COMPILER_CHECKS

dnl Mozilla specific options
dnl ========================================================
dnl The macros used for command line options
dnl are defined in build/autoconf/altoptions.m4.

dnl ========================================================
dnl = Enable code optimization. ON by default.
dnl ========================================================

# Use value from moz.configure if one is defined. Else use our computed
# value.
if test -n "${MOZ_CONFIGURE_OPTIMIZE_FLAGS}"; then
    MOZ_OPTIMIZE_FLAGS=${MOZ_CONFIGURE_OPTIMIZE_FLAGS}
fi

if test "$COMPILE_ENVIRONMENT"; then
if test -n "$MOZ_OPTIMIZE"; then
    AC_MSG_CHECKING([for valid optimization flags])
    _SAVE_CFLAGS=$CFLAGS
    CFLAGS="$CFLAGS $MOZ_OPTIMIZE_FLAGS"
    AC_TRY_COMPILE([#include <stdio.h>],
        [printf("Hello World\n");],
        _results=yes,
        _results=no)
    AC_MSG_RESULT([$_results])
    if test "$_results" = "no"; then
        AC_MSG_ERROR([These compiler flags are invalid: $MOZ_OPTIMIZE_FLAGS])
    fi
    CFLAGS=$_SAVE_CFLAGS
    if test -n "$MOZ_LTO" -a -n "$CLANG_CC"; then
        # When using llvm-based LTO, non numeric optimization levels are
        # not supported by the linker, so force the linker to use -O2 (
        # which doesn't influence the level compilation units are actually
        # compiled at).
        case " $MOZ_OPTIMIZE_FLAGS " in
        *\ -Os\ *|*\ -Oz\ *)
            MOZ_OPTIMIZE_LDFLAGS="$MOZ_OPTIMIZE_LDFLAGS -O2"
            ;;
        esac
    fi
fi
fi # COMPILE_ENVIRONMENT

AC_SUBST_LIST(MOZ_OPTIMIZE_FLAGS)
AC_SUBST_LIST(MOZ_OPTIMIZE_LDFLAGS)
AC_SUBST_LIST(MOZ_PGO_OPTIMIZE_FLAGS)

dnl ========================================================
dnl = Enable jemalloc
dnl ========================================================

if test "$JS_STANDALONE" -a -z "$MOZ_MEMORY"; then
  MOZ_GLUE_IN_PROGRAM=
else
  case "${OS_TARGET}" in
  Android|WINNT|Darwin)
    MOZ_GLUE_IN_PROGRAM=
    ;;
  *)
    dnl On !Android !Windows !OSX, we only want to link executables against mozglue
    MOZ_GLUE_IN_PROGRAM=1
    AC_DEFINE(MOZ_GLUE_IN_PROGRAM)
    ;;
  esac
fi

if test "$MOZ_MEMORY"; then
  dnl The generic feature tests that determine how to compute ncpus are long and
  dnl complicated.  Therefore, simply define special cpp variables for the
  dnl platforms we have special knowledge of.
  case "${target}" in
  *-mingw*)
    export MOZ_NO_DEBUG_RTL=1
    ;;
  esac
fi
AC_SUBST(MOZ_GLUE_IN_PROGRAM)

dnl ========================================================
dnl instruments
dnl ========================================================
if test -n "$MOZ_INSTRUMENTS"; then
    LIBS="$LIBS -framework CoreFoundation"
fi

dnl ========================================================
dnl = Enable using the clang plugin to build
dnl ========================================================

if test -n "$COMPILE_ENVIRONMENT"; then
MOZ_CONFIG_CLANG_PLUGIN
fi # COMPILE_ENVIRONMENT

MOZ_EXPAND_LIBS

dnl ========================================================
dnl =
dnl = Maintainer debug option (no --enable equivalent)
dnl =
dnl ========================================================

AC_SUBST_LIST(ASFLAGS)
AC_SUBST_LIST(MOZ_DEBUG_LDFLAGS)

AC_SUBST_LIST(MOZ_FIX_LINK_PATHS)

AC_SUBST(MOZ_POST_PROGRAM_COMMAND)

AC_SUBST(MOZ_APP_DISPLAYNAME)

AC_SUBST(MOZ_PKG_SPECIAL)

dnl Echo the CFLAGS to remove extra whitespace.
CFLAGS=`echo \
	$_COMPILATION_CFLAGS \
	$CFLAGS`

CXXFLAGS=`echo \
	$_COMPILATION_CXXFLAGS \
	$CXXFLAGS`

ASFLAGS=`echo \
    $_COMPILATION_ASFLAGS \
    $ASFLAGS`

COMPILE_CFLAGS=`echo \
    $_DEFINES_CFLAGS \
    $COMPILE_CFLAGS`

COMPILE_CXXFLAGS=`echo \
    $_DEFINES_CXXFLAGS \
    $COMPILE_CXXFLAGS`

HOST_CFLAGS=`echo \
    $_COMPILATION_HOST_CFLAGS \
    $HOST_CFLAGS`

HOST_CXXFLAGS=`echo \
    $_COMPILATION_HOST_CXXFLAGS \
    $HOST_CXXFLAGS`

LDFLAGS=`echo \
    $LDFLAGS \
    $_COMPILATION_LDFLAGS`

HOST_LDFLAGS=`echo \
    $HOST_LDFLAGS \
    $_COMPILATION_HOST_LDFLAGS`

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"
AC_SUBST_LIST(OS_CFLAGS)
AC_SUBST_LIST(OS_CXXFLAGS)
AC_SUBST_LIST(OS_CPPFLAGS)
AC_SUBST_LIST(OS_COMPILE_CFLAGS)
AC_SUBST_LIST(OS_COMPILE_CXXFLAGS)
AC_SUBST_LIST(OS_LDFLAGS)
AC_SUBST(OS_LIBS)

AC_SUBST(HOST_CC)
AC_SUBST(HOST_CXX)
AC_SUBST_LIST(HOST_CFLAGS)
AC_SUBST_LIST(HOST_CPPFLAGS)
AC_SUBST_LIST(HOST_CXXFLAGS)
AC_SUBST(HOST_LDFLAGS)
AC_SUBST_LIST(HOST_OPTIMIZE_FLAGS)
AC_SUBST(HOST_BIN_SUFFIX)

AC_SUBST(TARGET_XPCOM_ABI)

AC_SUBST(DSO_LDOPTS)
AC_SUBST(BIN_SUFFIX)
AC_SUBST(USE_N32)
AC_SUBST(WIN32_CONSOLE_EXE_LDFLAGS)
AC_SUBST(WIN32_GUI_EXE_LDFLAGS)

dnl Set various defines and substitutions
dnl ========================================================

AC_SUBST(MOZ_DEV_EDITION)
if test -n "$MOZ_DEV_EDITION"; then
    AC_DEFINE(MOZ_DEV_EDITION)
fi

dnl ========================================================
dnl JavaScript shell
dnl ========================================================

MOZ_CHECK_ALLOCATOR

if test -n "$JS_STANDALONE"; then
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
AC_SUBST(JS_LIBRARY_NAME)
AC_SUBST(JS_CONFIG_MOZ_JS_LIBS)
AC_SUBST(JS_CONFIG_LIBS)

# Avoid using obsolete NSPR features
AC_DEFINE(NO_NSPR_10_SUPPORT)

dnl Spit out some output
dnl ========================================================
MOZ_CREATE_CONFIG_STATUS()

rm -fr confdefs* $ac_clean_files