##*****************************************************************************
#  AUTHOR:
#    Chris Dunlap <cdunlap@llnl.gov>
#
#  SYNOPSIS:
#    X_AC_DEBUG
#
#  DESCRIPTION:
#    Add support for the "--enable-debug", "--enable-memory-leak-debug",
#    "--disable-partial-attach", "--enable-front-end", and "--enable-developer"
#    configure script options.
#
#    options.
#    If debugging is enabled, CFLAGS will be prepended with the debug flags.
#    The NDEBUG macro (used by assert) will also be set accordingly.
#
#  WARNINGS:
#    This macro must be placed after AC_PROG_CC or equivalent.
##*****************************************************************************

AC_DEFUN([X_AC_DEBUG], [

  AC_MSG_CHECKING([whether optimizations are enabled])
  AC_ARG_ENABLE(
    [optimizations],
    AS_HELP_STRING(--disable-optimizations, disable optimizations (sets -O0)),
    [ case "$enableval" in
        yes) x_ac_optimizations=yes ;;
         no) x_ac_optimizations=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-optimizations]) ;;
      esac
    ],
    [x_ac_optimizations=yes]
  )
  AC_MSG_RESULT([${x_ac_optimizations}])

  AC_MSG_CHECKING([whether or not developer options are enabled])
  AC_ARG_ENABLE(
    [developer],
    AS_HELP_STRING(--enable-developer,enable developer options (asserts, -Werror - also sets --enable-debug as well)),
    [ case "$enableval" in
        yes) x_ac_developer=yes ;;
         no) x_ac_developer=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-developer]) ;;
      esac
    ]
  )
  if test "$x_ac_developer" = yes; then
    test "$GCC" = yes && CFLAGS="$CFLAGS -Werror"
    test "$GXX" = yes && CXXFLAGS="$CXXFLAGS -Werror"
    # automatically turn on --enable-debug if being a developer
    x_ac_debug=yes
  else
    AC_DEFINE([NDEBUG], [1],
      [Define to 1 if you are building a production release.]
    )
  fi
  AC_MSG_RESULT([${x_ac_developer=no}])

  AC_MSG_CHECKING([whether debugging is enabled])
  AC_ARG_ENABLE(
    [debug],
    AS_HELP_STRING(--disable-debug,disable debugging symbols and compile with optimizations),
    [ case "$enableval" in
        yes) x_ac_debug=yes ;;
         no) x_ac_debug=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-debug]) ;;
      esac
    ],
    [x_ac_debug=yes]
  )
  if test "$x_ac_debug" = yes; then
    # you will most likely get a -O2 in you compile line, but the last option
    # is the only one that is looked at.
    # We used to force this to -O0, but this precludes the use of FSTACK_PROTECT
    # which is injected into RHEL7/SuSE12 RPM builds rather aggressively.
    AX_CHECK_COMPILE_FLAG([-ggdb3], [CFLAGS="$CFLAGS -ggdb3"])

    test "$GCC" = yes && CFLAGS="$CFLAGS -Wall -g -O1 -fno-strict-aliasing"
    test "$GXX" = yes && CXXFLAGS="$CXXFLAGS -Wall -g -O1 -fno-strict-aliasing"
  fi
  AC_MSG_RESULT([${x_ac_debug=no}])

  AC_MSG_CHECKING([whether memory leak debugging is enabled])
  AC_ARG_ENABLE(
    [memory-leak-debug],
    AS_HELP_STRING(--enable-memory-leak-debug,enable memory leak debugging code for development),
    [ case "$enableval" in
        yes) x_ac_memory_debug=yes ;;
         no) x_ac_memory_debug=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-memory-leak-debug]) ;;
      esac
    ]
  )
  if test "$x_ac_memory_debug" = yes; then
    AC_DEFINE(MEMORY_LEAK_DEBUG, 1, [Define to 1 for memory leak debugging.])
  fi
  AC_MSG_RESULT([${x_ac_memory_debug=no}])

  AC_MSG_CHECKING([whether debugger partial attach enabled])
  AC_ARG_ENABLE(
    [partial-attach],
    AS_HELP_STRING(--disable-partial-attach,disable debugger partial task attach support),
    [ case "$enableval" in
        yes) x_ac_partial_attach=yes ;;
         no) x_ac_partial_attach=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-partial-leak-attach]) ;;
      esac
    ]
  )
  if test "$x_ac_partial_attach" != "no"; then
    AC_DEFINE(DEBUGGER_PARTIAL_ATTACH, 1, [Define to 1 for debugger partial task attach support.])
  fi
  AC_MSG_RESULT([${x_ac_partial_attach=no}])

  AC_MSG_CHECKING([whether salloc should kill child processes at job termination])
  AC_ARG_ENABLE(
    [salloc-kill-cmd],
    AS_HELP_STRING(--enable-salloc-kill-cmd,salloc should kill child processes at job termination),
    [ case "$enableval" in
        yes) x_ac_salloc_kill_cmd=yes ;;
         no) x_ac_salloc_kill_cmd=no ;;
          *) AC_MSG_RESULT([doh!])
             AC_MSG_ERROR([bad value "$enableval" for --enable-salloc-kill-cmd]) ;;
      esac
    ]
  )
  if test "$x_ac_salloc_kill_cmd" = yes; then
    AC_DEFINE(SALLOC_KILL_CMD, 1, [Define to 1 for salloc to kill child processes at job termination])
    AC_MSG_RESULT([yes])
  else
    AC_MSG_RESULT([no])
  fi

  if test "$x_ac_optimizations" = no; then
    test "$GCC" = yes && CFLAGS="$CFLAGS -O0"
  fi
])
