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/.

AC_DEFUN([MOZ_CONFIG_FFI], [

MOZ_ARG_ENABLE_BOOL(system-ffi,
[  --enable-system-ffi       Use system libffi (located with pkgconfig)],
    MOZ_NATIVE_FFI=1 )

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
        PKG_CHECK_MODULES(MOZ_FFI, libffi > 3.0.9)
    else
        PKG_CHECK_MODULES(MOZ_FFI, libffi >= 3.0.9)
    fi
fi

AC_SUBST(MOZ_NATIVE_FFI)

])

AC_DEFUN([MOZ_SUBCONFIGURE_FFI], [
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
    AC_OUTPUT_SUBDIRS(js/src/ctypes/libffi)
    ac_configure_args="$_SUBDIR_CONFIG_ARGS"
    CONFIG_FILES=$old_config_files
  fi

fi
])

