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_RUST_SUPPORT], [
  MOZ_PATH_PROG(RUSTC, rustc)
  if test -n "$RUSTC"; then
    AC_MSG_CHECKING([rustc version])
    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`
    AC_MSG_RESULT([$RUSTC_VERSION (v${_RUSTC_MAJOR_VERSION}.${_RUSTC_MINOR_VERSION}.${_RUSTC_PATCH_VERSION})])
  fi
  MOZ_ARG_ENABLE_BOOL([rust],
                      [  --enable-rust           Include Rust language sources],
                      [MOZ_RUST=1],
                      [MOZ_RUST= ])
  if test -z "$RUSTC" -a -n "$MOZ_RUST"; then
    AC_MSG_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.])
  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
    AC_MSG_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'.])
  fi
  AC_SUBST(MOZ_RUST)
])
