# SYNOPSIS
#
#   SAGE_SPKG_CONFIGURE(PACKAGE-NAME,[CHECK],[REQUIRED-CHECK],[PRE],[POST])
#   SAGE_SPKG_CONFIGURE_BASE(PACKAGE-NAME,[CHECK],[REQUIRED-CHECK],[PRE],[POST],[DEPS])
#
# DESCRIPTION
#
#   This macro should be used in the build/<spkg>/spkg-configure.m4 templates 
#   for each SPKG (if defined) to specify how to check whether or not it is
#   required to be installed, and whether or not it's already installed.
#
#   The macro takes five arguments.  The first, PACKAGE-NAME, is simply the
#   base name of the SPKG.  The first two arguments, both optional,
#   implement two different kinds of checks (the first of which is more
#   common).
#
#   The next argument (which is less commonly needed) is an optional list of
#   initialization instructions which should be performed by the configure
#   script regardless whether or not the SPKG should be installed (e.g. setting
#   up --with and --enable flags).  The last argument is again commands that
#   are always run, but after the checks are performed (or if they are not
#   performed):
#
#   - CHECK - this should implement a test for whether the package is already
#     available on the system and/or meets any feature tests required for
#     Sage.  If this test fails it sets the shell variable
#     sage_spkg_install_<packagename> to "yes".  Otherwise it defaults to "no",
#     i.e., SageMath may not need to install the package.
#
#   - REQUIRED-CHECK - this checks whether or not the package is a required
#     dependency of Sage at all, depending typically on the platform.  Some
#     packages (e.g. sqlite) are only dependencies in some circumstances
#     and otherwise do not need to be checked for at all.  If
#     a REQUIRED-CHECK determines that the package is not required it sets
#     sage_require_<packagename>="no".
#
#   - PRE - always perform these actions even if the SPKG is already installed
#
#   - POST - always pwerform these actions regardless whether the SPKG will
#     be installed.
#
#   - DEPS - to pass dependencies generated by SAGE_SPKG_CONFIGURE_BASE
#
AC_DEFUN([SAGE_SPKG_CONFIGURE_BASE], [
AC_DEFUN_ONCE([SAGE_SPKG_CONFIGURE_]m4_toupper($1), [
dnl The name of this SPKG
m4_pushdef([SPKG_NAME], [$1])
dnl Whether SageMath needs to install this package
m4_pushdef([SPKG_INSTALL], [sage_spkg_install_]SPKG_NAME)
dnl Whether SageMath requires this package to be present somehow
m4_pushdef([SPKG_REQUIRE], [sage_require_]SPKG_NAME)
dnl Whether we want the system to provide this package:
dnl * "yes", attempt to use the system package
dnl * "no", do not attempt to use the system package
dnl * "force", use the system package and fail if it was deemed not suitable
dnl * other values mean that we do not want to use the system package but
dnl   indicate why
m4_pushdef([SPKG_USE_SYSTEM], [sage_use_system_]SPKG_NAME)
# BEGIN SAGE_SPKG_CONFIGURE_]m4_toupper($1)[

dnl Hide the output from Python (system site package) checks
dnl when --enable-system-site-packages was not given. This
dnl doesn't affect the test results but it minimizes the noise
dnl in the ./configure output. The config.log however retains
dnl everything.
dnl
dnl Open descriptor 9 as a copy of AS_MESSAGE_FD, so that it
dnl can later be used to restore AS_MESSAGE_FD. Afterwards,
dnl send AS_MESSAGE_FD to /dev/null. We'll restore it if this
dnl isn't a python package or if --enable-system-site-packages
dnl was given (or at the end of this macro, if nothing else).
exec 9<&AS_MESSAGE_FD
exec AS_MESSAGE_FD>/dev/null

AS_IF([test "${enable_system_site_packages}" = "yes"], [
  dnl Python package checks are enabled, so restore AS_MESSAGE_FD
  exec AS_MESSAGE_FD<&9
])

SPKG_CONFIGURE="${SAGE_ROOT}/build/pkgs/$1/spkg-configure.m4"
AS_IF([! grep -q [SAGE_PYTHON_PACKAGE_CHECK] "${SPKG_CONFIGURE}"],[
  dnl Not a python package, so restore AS_MESSAGE_FD
  exec AS_MESSAGE_FD<&9
])

echo "-----------------------------------------------------------------------------" >& AS_MESSAGE_FD
echo "Checking whether SageMath should install SPKG $1..." >& AS_MESSAGE_FD
AS_BOX([Checking whether SageMath should install SPKG $1...]) >& AS_MESSAGE_LOG_FD

AC_ARG_WITH([system-]SPKG_NAME,
       AS_HELP_STRING(--with-system-SPKG_NAME={no|yes (default)|force (exit with an error if no usable version is found)},
           [detect and use an existing system SPKG_NAME]),
       [AS_VAR_SET(SPKG_USE_SYSTEM, [$withval])]
)

AS_VAR_SET([sage_spkg_name], SPKG_NAME)

dnl Default value for most packages
AS_VAR_SET_IF([SPKG_USE_SYSTEM], [], [AS_VAR_SET([SPKG_USE_SYSTEM], [yes])])

dnl The default is not to install a package, unless a check below finds that we should.
AS_VAR_SET(SPKG_INSTALL, [no])

dnl Run DEPS
$6

dnl Run PRE
$4

dnl If a version of this package is already installed in local/ we have no
dnl choice but to use it and we will actually also update it even if it is not
dnl required.
AS_IF([test -n "`ls "${SAGE_LOCAL}/var/lib/sage/installed/${sage_spkg_name}"-* 2>/dev/null`"], [
    AC_MSG_NOTICE(m4_normalize(SPKG_NAME[ has already been installed by SageMath]))
    AS_VAR_SET(SPKG_INSTALL, [yes])
    AS_VAR_SET(SPKG_USE_SYSTEM, [installed])
])

dnl Perform REQUIRED-CHECK if present.
AS_VAR_SET_IF(SPKG_REQUIRE, [], [AS_VAR_SET(SPKG_REQUIRE, [yes])])
$3

AS_VAR_IF(SPKG_INSTALL, [no], [
    AS_VAR_IF(SPKG_REQUIRE, [no], [
        AC_MSG_NOTICE(m4_normalize([SPKG ]SPKG_NAME[ is not required on this system]))
    ], [
        dnl If this is a required package and nothing before has found that we
        dnl should install the SPKG, we run the checks to determine whether we
        dnl can use a system package.
        AS_VAR_IF(SPKG_USE_SYSTEM, [no], [
            dnl We were asked not to use the system package, so no checks are needed
            AS_VAR_SET(SPKG_INSTALL, [yes])
        ], [
            m4_ifval([$2], [
                dnl If there is a CHECK, run it to determine whether the system package is suitable
                $2
                AS_VAR_IF(SPKG_INSTALL, [no], [
                    dnl Since force did not make a difference, no need to report that force was used
                    AS_VAR_SET(SPKG_USE_SYSTEM, [yes])
                    AC_MSG_NOTICE(m4_normalize([will use system package and not install SPKG ]SPKG_NAME))
                ], [
                    AS_VAR_IF(SPKG_USE_SYSTEM, [force], [
                        AS_VAR_APPEND([SAGE_SPKG_ERRORS], ["
    Given --with-system-]SPKG_NAME[=force, but no system package could be used.
    That's an error.  Please install the indicated package to continue.
    (To override this error, use ./configure --without-system-]SPKG_NAME[)"])
                    ], [
                        AC_MSG_NOTICE(m4_normalize([no suitable system package found for SPKG ]SPKG_NAME))
                    ])
                ])
            ], [
                dnl If there is no CHECK, install the SPKG unless forced not to
                AS_VAR_IF(SPKG_USE_SYSTEM, [force], [
                    AC_MSG_NOTICE(m4_normalize([will use system package and not install SPKG ]SPKG_NAME))
                    AS_VAR_SET(SPKG_INSTALL, [no])
                ], [
                    AC_MSG_NOTICE(m4_normalize([no suitable system package found for SPKG ]SPKG_NAME))
                    AS_VAR_SET(SPKG_INSTALL, [yes])
                ])
            ])
        ])
    ])
])

dnl Run POST
$5

dnl Restore the message file descriptor that we clobbered earlier
dnl for the sake of hiding site package check noise. It's possible
dnl that we've already done this above, but it doesn't hurt to do
dnl it again, and we want everything "back to normal" at the end
dnl of this macro.
exec AS_MESSAGE_FD<&9

# END SAGE_SPKG_CONFIGURE_]m4_toupper($1)[
m4_popdef([SPKG_USE_SYSTEM])
m4_popdef([SPKG_REQUIRE])
m4_popdef([SPKG_INSTALL])
m4_popdef([SPKG_NAME])
])
])
AC_DEFUN([SAGE_SPKG_CONFIGURE], [
    SAGE_SPKG_CONFIGURE_BASE([$1], [$2], [$3], [$4], [$5], [AC_REQUIRE([SAGE_SPKG_CONFIGURE_GCC])])
])

# SYNOPSIS
#
#   SAGE_SPKG_DEPCHECK(PACKAGE-DEPENDENCIES, FURTHER-CHECK)
#                                 $1              $2
#
# DESCRIPTION
#     *** to be called from SAGE_SPKG_CONFIGURE* ***
#     check for space-separated list of package dependencies $1 of package SPKG_NAME
#     do $2 if successful
#
AC_DEFUN([SAGE_SPKG_DEPCHECK], [
    m4_foreach_w([DEP], $1, [
       AC_REQUIRE([SAGE_SPKG_CONFIGURE_]m4_toupper(DEP))])
    AC_MSG_CHECKING([whether any of $1 is installed as or will be installed as SPKG])
    AS_IF([test x = y m4_foreach_w([DEP], $1, [ -o [x$sage_spkg_install_]DEP = xyes])], [
        AC_MSG_RESULT([yes; install SPKG_NAME as well])
        [sage_spkg_install_]SPKG_NAME=yes], [
        AC_MSG_RESULT([no])
        $2
        ])
])
