dnl ===========================================================================
dnl Support for plugable mysql server modules
dnl ===========================================================================
dnl
dnl WorkLog#3201
dnl
dnl Framework for pluggable static and dynamic modules for mysql
dnl
dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE
dnl
dnl Syntax:
dnl   MYSQL_MODULE([name],[Plugin module name],
dnl                [Plugin module description],
dnl                [group,group...])
dnl   
dnl What it does:
dnl   First declaration for a plugin module (mandatory).
dnl   Adds module as member to configuration groups (if specified)
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE],[ dnl
 _MYSQL_MODULE(
  [$1],
  [__MYSQL_MODULE_]AS_TR_CPP([$1])[__],
  m4_default([$2], [$1 plugin]),
  m4_default([$3], [plugin for $1]),
  m4_default([$4], []),
 ) dnl
])

AC_DEFUN([_MYSQL_MODULE],[ dnl
 m4_ifdef([$2], [ dnl
  AC_FATAL([[Duplicate MYSQL_MODULE declaration for ]][$3]) dnl
 ],[ dnl 
  m4_define([$2], [$1]) dnl
  _MYSQL_PLUGAPPEND([__mysql_plugin_list__],[$1]) dnl
  m4_define([MYSQL_MODULE_NAME_]AS_TR_CPP([$1]), [$3]) dnl
  m4_define([MYSQL_MODULE_DESC_]AS_TR_CPP([$1]), [$4]) dnl
  ifelse([$5], [], [], [ dnl
   _MYSQL_PLUGAPPEND_OPTS([$1], $5) dnl
  ]) dnl
 ]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_STORAGE_ENGINE
dnl
dnl What it does:
dnl   Short cut for storage engine declarations
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_STORAGE_ENGINE],[ dnl
 MYSQL_MODULE([$1], [$3], [$4], [[$5]]) dnl
 MYSQL_MODULE_DEFINE([$1], [WITH_]AS_TR_CPP([$1])[_STORAGE_ENGINE]) dnl
 ifelse([$2],[no],[],[ dnl
  _MYSQL_LEGACY_STORAGE_ENGINE([$1],m4_default([$2], [$1-storage-engine])) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_LEGACY_STORAGE_ENGINE],[
if test "[${with_]m4_bpatsubst($2, -, _)[+set}]" = set; then
  [with_module_]m4_bpatsubst($1, -, _)="[$with_]m4_bpatsubst($2, -, _)"
fi dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_DEFINE
dnl
dnl What it does:
dnl   When a plugin module is to be statically linked, define the C macro
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_DEFINE],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 m4_define([MYSQL_MODULE_DEFINE_]AS_TR_CPP([$1]), [$2]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_DIRECTORY
dnl
dnl What it does:
dnl   Adds a directory to the build process
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_DIRECTORY],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 m4_define([MYSQL_MODULE_DIRECTORY_]AS_TR_CPP([$1]), [$2]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_STATIC
dnl
dnl What it does:
dnl   Declare the name for the static library 
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_STATIC],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 m4_define([MYSQL_MODULE_STATIC_]AS_TR_CPP([$1]), [$2]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_DYNAMIC
dnl
dnl What it does:
dnl   Declare the name for the shared library
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_DYNAMIC],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 m4_define([MYSQL_MODULE_DYNAMIC_]AS_TR_CPP([$1]), [$2]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_MANDATORY
dnl
dnl What it does:
dnl   Marks the specified plugin as a mandatory module
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_MANDATORY],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 _MYSQL_MODULE_MANDATORY([$1],
  [MYSQL_MODULE_MANDATORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1])
 ) dnl
])

AC_DEFUN([_MYSQL_MODULE_MANDATORY],[ dnl
 m4_define([$2], [yes]) dnl
 m4_ifdef([$3], [ dnl
  AC_WARNING([syntax],[Mandatory plugin $1 has been disabled]) dnl
  m4_undefine([$2]) dnl
 ]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_DISABLED
dnl
dnl What it does:
dnl   Marks the specified plugin as a disabled module
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_DISABLED],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 _MYSQL_MODULE_DISABLED([$1], 
  [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_MANDATORY_]AS_TR_CPP([$1])
 ) dnl
])

AC_DEFUN([_MYSQL_MODULE_DISABLED],[ dnl
 m4_define([$2], [yes]) dnl
 m4_ifdef([$3], [ dnl
  AC_FATAL([attempt to disable mandatory plugin $1]) dnl
  m4_undefine([$2]) dnl
 ]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_DEPENDS
dnl
dnl What it does:
dnl   Enables other modules neccessary for this module
dnl   Dependency checking is not recursive so if any 
dnl   required module requires further modules, list them
dnl   here too!
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_DEPENDS],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  AC_FATAL([[bad number of arguments]]) dnl
 ], $#, 2, [ dnl
  _MYSQL_MODULE_DEPEND([$1],[$2]) dnl
 ],[ dnl
  _MYSQL_MODULE_DEPEND([$1],[$2]) dnl
  MYSQL_MODULE_DEPENDS([$1], m4_shift(m4_shift($@))) dnl
 ])
])

AC_DEFUN([_MYSQL_MODULE_DEPEND],[ dnl
 REQUIRE_PLUGIN([$2]) dnl
 _MYSQL_PLUGAPPEND([__mysql_plugdepends_$1__],[$2]) dnl
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_MODULE_ACTIONS
dnl
dnl What it does:
dnl   Declares additional actions required to configure the module
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_MODULE_ACTIONS],[ dnl
 REQUIRE_PLUGIN([$1]) dnl
 m4_ifdef([$2],[ dnl
   m4_define([MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1]),m4_defn([$2])) dnl
 ],[ dnl
   m4_define([MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1]), [$2]) dnl
 ])
])


dnl ---------------------------------------------------------------------------
dnl Macro: MYSQL_CONFIGURE_PLUGINS
dnl
dnl What it does:
dnl   Called last, emits all required shell code to configure the modules
dnl
dnl ---------------------------------------------------------------------------

AC_DEFUN([MYSQL_CONFIGURE_PLUGINS],[ dnl
 m4_ifdef([__mysql_plugin_configured__],[ dnl
   AC_FATAL([cannot call [MYSQL_CONFIGURE_PLUGINS] multiple times]) dnl
 ],[ dnl
   m4_define([__mysql_plugin_configured__],[done]) dnl
   m4_ifdef([__mysql_plugin_list__],[ dnl
    _MYSQL_CHECK_PLUGIN_ARGS([$1])
    _MYSQL_CONFIGURE_PLUGINS(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
    _MYSQL_DO_PLUGIN_ACTIONS(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
    _MYSQL_POST_PLUGIN_FIXUP()
   ]) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_CONFIGURE_PLUGINS],[ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_CHECK_PLUGIN([$1]) dnl
 ],[ dnl
  _MYSQL_CHECK_PLUGIN([$1]) dnl
  _MYSQL_CONFIGURE_PLUGINS(m4_shift($@)) dnl
 ])
])

AC_DEFUN([_MYSQL_CHECK_PLUGIN],[ dnl
 _DO_MYSQL_CHECK_PLUGIN(
  [$1],
  [$1-plugin],
  [MYSQL_MODULE_NAME_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DESC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DEFINE_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DIRECTORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_STATIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DYNAMIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_MANDATORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1])
 ) dnl
])

AC_DEFUN([_DO_MYSQL_CHECK_PLUGIN],[ dnl
 m4_ifdef([$5],[ dnl
  AH_TEMPLATE($5, [Include ]$4[ into mysqld])
 ])
 AC_MSG_CHECKING([whether to use ]$3) dnl
 m4_ifdef([$10],[
  if test "[$mysql_module_]m4_bpatsubst([$1], -, _)" = yes -a \
          "[$with_module_]m4_bpatsubst([$1], -, _)" != no -o \
          "[$with_module_]m4_bpatsubst([$1], -, _)" = yes; then
    AC_MSG_ERROR([disabled])
  fi
  AC_MSG_RESULT([no]) dnl
 ],[ dnl
  m4_ifdef([$9],[
   if test "[$with_module_]m4_bpatsubst([$1], -, _)" = no; then
     AC_MSG_ERROR([cannot disable mandatory module])
   fi
   [mysql_module_]m4_bpatsubst([$1], -, _)=yes dnl
  ])
  if test "[$with_module_]m4_bpatsubst([$1], -, _)" != no; then
    if test "[$mysql_module_]m4_bpatsubst([$1], -, _)" != yes -a \
            "[$with_module_]m4_bpatsubst([$1], -, _)" != yes; then dnl
      m4_ifdef([$8],[ dnl
       m4_ifdef([$6],[
        mysql_plugin_dirs="$mysql_plugin_dirs $6" dnl
       ])
       AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_shared_target], "$8")
       AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_static_target], [""])
       [with_module_]m4_bpatsubst([$1], -, _)=yes
       AC_MSG_RESULT([plugin]) dnl
      ],[
       [with_module_]m4_bpatsubst([$1], -, _)=no
       AC_MSG_RESULT([no]) dnl
      ])
    else dnl
      m4_ifdef([$7],[
       ifelse(m4_bregexp($7, [^lib[^.]+\.a$]), -2, [ dnl
        m4_ifdef([$6],[
         mysql_plugin_dirs="$mysql_plugin_dirs $6"
         mysql_plugin_libs="$mysql_plugin_libs -L[\$(top_builddir)]/$6" dnl
        ])
        mysql_plugin_libs="$mysql_plugin_libs dnl
[-l]m4_bregexp($7, [^lib\([^.]+\)], [\1])" dnl
       ], m4_bregexp($7, [^\\\$]), 0, [ dnl
        m4_ifdef([$6],[
         mysql_plugin_dirs="$mysql_plugin_dirs $6" dnl
        ])
        mysql_plugin_libs="$mysql_plugin_libs $7" dnl
       ], [ dnl
        m4_ifdef([$6],[
         mysql_plugin_dirs="$mysql_plugin_dirs $6"
         mysql_plugin_libs="$mysql_plugin_libs \$(top_builddir)/$6/$7" dnl
        ],[
         mysql_plugin_libs="$mysql_plugin_libs $7" dnl
        ]) dnl
       ]) dnl
       m4_ifdef([$5],[
        AC_DEFINE($5) dnl
       ])
       AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_static_target], "$7")
       AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_shared_target], [""]) dnl
      ],[ dnl
       m4_ifdef([$6],[
        AC_FATAL([plugin directory specified without library for ]$3) dnl
       ],[ dnl
        m4_ifdef([$5],[
         AC_DEFINE($5)
         AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_static_target], ["yes"])
         AC_SUBST([plugin_]m4_bpatsubst([$1], -, _)[_shared_target], [""]) dnl
        ]) dnl
       ]) dnl
      ])
      mysql_plugin_defs="$mysql_plugin_defs, [builtin_]m4_bpatsubst([$2], -, _)"
      [with_module_]m4_bpatsubst([$1], -, _)=yes
      AC_MSG_RESULT([yes])
    fi
  else
    AC_MSG_RESULT([no])
  fi dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_DO_PLUGIN_ACTIONS],[ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_PLUGIN_ACTIONS([$1]) dnl
 ],[ dnl
  _MYSQL_PLUGIN_ACTIONS([$1]) dnl
  _MYSQL_DO_PLUGIN_ACTIONS(m4_shift($@)) dnl
 ])
])

AC_DEFUN([_MYSQL_PLUGIN_ACTIONS],[ dnl
 _DO_MYSQL_PLUGIN_ACTIONS(
  [$1],
  [$1-plugin],
  [MYSQL_MODULE_NAME_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DESC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DEFINE_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DIRECTORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_STATIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DYNAMIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_MANDATORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1])
 ) dnl
])


AC_DEFUN([_DO_MYSQL_PLUGIN_ACTIONS],[ dnl
 m4_ifdef([$10], [], [
  if test "[$with_module_]m4_bpatsubst([$1], -, _)" = yes; then
    if test -z "[$plugin_]m4_bpatsubst([$1], -, _)[_static_target]" -a \
            -z "[$plugin_]m4_bpatsubst([$1], -, _)[_shared_target]"; then
      AC_MSG_ERROR([thats strange, $1 failed sanity check])
    fi
    $11
  fi dnl
 ]) dnl
])



dnl ===========================================================================
dnl  Private helper macros
dnl ===========================================================================


AC_DEFUN([REQUIRE_PLUGIN],[ dnl
 _REQUIRE_PLUGIN([$1], [__MYSQL_MODULE_]AS_TR_CPP([$1])[__]) dnl
])

define([_REQUIRE_PLUGIN],[ dnl
 ifdef([$2],[ dnl
  ifelse($2, [$1], [], [ dnl
   AC_FATAL([[Misspelt MYSQL_MODULE declaration for ]][$1]) dnl
  ]) dnl
 ],[ dnl
  AC_FATAL([[Missing MYSQL_MODULE declaration for ]][$1]) dnl
 ])
])


dnl ---------------------------------------------------------------------------


AC_DEFUN([_MYSQL_MODULE_META_CHECK], [ifelse($#, 0, [], $#, 1, dnl
[_MYSQL_CHECK_PLUGIN_META([$1], [__mysql_]m4_bpatsubst($1, -, _)[_plugins__]) dnl
], dnl
[_MYSQL_CHECK_PLUGIN_META([$1], [__mysql_]m4_bpatsubst($1, -, _)[_plugins__]) dnl
_MYSQL_MODULE_META_CHECK(m4_shift($@))]) dnl
])

AC_DEFUN([_MYSQL_CHECK_PLUGIN_META], [
  [$1] ) dnl
m4_ifdef([$2], [
    mysql_modules='m4_bpatsubst($2, :, [ ])' dnl
],[
    mysql_modules='' dnl
])
    ;; dnl
])


dnl ---------------------------------------------------------------------------


AC_DEFUN([_MYSQL_PLUGAPPEND],[ dnl
 m4_ifdef([$1],[ dnl
  m4_define([__plugin_append_tmp__], m4_defn([$1])) dnl
  m4_undefine([$1]) dnl
  m4_define([$1], __plugin_append_tmp__[:$2]) dnl
  m4_undefine([__plugin_append_tmp__]) dnl
 ],[ dnl
  m4_define([$1], [$2]) dnl
  $3 dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_PLUGAPPEND_OPTS],[ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  AC_FATAL([[bad number of args]])
 ], $#, 2, [ dnl
  _MYSQL_PLUGAPPEND_OPTONE([$1],[$2]) dnl
 ],[ dnl
  _MYSQL_PLUGAPPEND_OPTONE([$1],[$2]) dnl
  _MYSQL_PLUGAPPEND_OPTS([$1], m4_shift(m4_shift($@)))
 ])
])

AC_DEFUN([_MYSQL_PLUGAPPEND_OPTONE],[ dnl
 ifelse([$2], [all], [ dnl
  AC_FATAL([[protected plugin group: all]]) dnl
 ],[ dnl
  ifelse([$2], [none], [ dnl
   AC_FATAL([[protected plugin group: none]]) dnl
  ],[ dnl
   _MYSQL_PLUGAPPEND([__mysql_$1_configs__],[$2]) dnl
   _MYSQL_PLUGAPPEND([__mysql_]m4_bpatsubst($2, -, _)[_plugins__],[$1], [ dnl
    _MYSQL_PLUGAPPEND([__mysql_metaplugin_list__],[$2]) dnl
   ]) dnl
  ]) dnl
 ]) dnl
])


dnl ---------------------------------------------------------------------------


AC_DEFUN([MYSQL_LIST_PLUGINS],[ dnl
 m4_ifdef([__mysql_plugin_list__],[ dnl
  _MYSQL_LIST_PLUGINS(m4_bpatsubst(__mysql_plugin_list__, :, [,])) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_LIST_PLUGINS],[ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  MYSQL_SHOW_PLUGIN([$1]) dnl
 ],[ dnl
  MYSQL_SHOW_PLUGIN([$1]) dnl
  _MYSQL_LIST_PLUGINS(m4_shift($@)) dnl
 ]) dnl
])

AC_DEFUN([MYSQL_SHOW_PLUGIN],[ dnl
 _MYSQL_SHOW_PLUGIN(
  [$1],
  [$1-plugin],
  [MYSQL_MODULE_NAME_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DESC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DEFINE_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DIRECTORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_STATIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DYNAMIC_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_MANDATORY_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
  [MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1]),
  __mysql_[$1]_configs__,
 )
])

AC_DEFUN([_MYSQL_SHOW_PLUGIN],[
  === Plug-in: $3 ===
  Module Name:      [$1]
  Description:      $4
  Supports build:   _PLUGIN_BUILD_TYPE([$7],[$8]) dnl
m4_ifdef([$12],[
  Configurations:   m4_bpatsubst($12, :, [, ])]) dnl
m4_ifdef([$10],[
  Status:           disabled], [ dnl
m4_ifdef([$9],[
  Status:           mandatory])])])

AC_DEFUN([_PLUGIN_BUILD_TYPE], dnl
[m4_ifdef([$1],[ifelse($1,[no],[],[static ]m4_ifdef([$2],[and dnl
]))])[]m4_ifdef([$2],[dynamic],[m4_ifdef([$1],[],[static])])])


dnl ---------------------------------------------------------------------------


AC_DEFUN([_MYSQL_MODULE_ARGS_CHECK],[ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_CHECK_PLUGIN_ARG([$1],
   [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
   [MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1])) dnl
 ],[ dnl
  _MYSQL_CHECK_PLUGIN_ARG([$1],
   [MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),
   [MYSQL_MODULE_ACTIONS_]AS_TR_CPP([$1])) dnl
  _MYSQL_MODULE_ARGS_CHECK(m4_shift($@)) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_CHECK_PLUGIN_ARG],[ dnl
 m4_ifdef([$3], [], [m4_define([$3],[ ])])
    [$1] ) dnl
 m4_ifdef([$2],[
      AC_MSG_ERROR([plugin $1 is disabled]) dnl
 ],[
      [mysql_module_]m4_bpatsubst([$1], -, _)=yes dnl
 ])
      ;; dnl
])

AC_DEFUN([_MYSQL_SANE_VARS], [ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_SANEVAR([$1]) dnl
 ],[ dnl
  _MYSQL_SANEVAR([$1]) dnl
  _MYSQL_SANE_VARS(m4_shift($@)) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_SANEVAR], [
   test -z "[$mysql_module_]m4_bpatsubst([$1], -, _)" && dnl
[mysql_module_]m4_bpatsubst([$1], -, _)='.'
   test -z "[$with_module_]m4_bpatsubst([$1], -, _)" && dnl
[with_module_]m4_bpatsubst([$1], -, _)='.' dnl
])

AC_DEFUN([_MYSQL_CHECK_DEPENDENCIES], [ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_CHECK_DEPENDS([$1],[__mysql_plugdepends_$1__]) dnl
 ],[ dnl
  _MYSQL_CHECK_DEPENDS([$1],[__mysql_plugdepends_$1__]) dnl
  _MYSQL_CHECK_DEPENDENCIES(m4_shift($@)) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_CHECK_DEPENDS], [ dnl
 m4_ifdef([$2], [
   if test "[$mysql_module_]m4_bpatsubst([$1], -, _)" = yes -a \
           "[$with_module_]m4_bpatsubst([$1], -, _)" != no -o \
           "[$with_module_]m4_bpatsubst([$1], -, _)" = yes; then dnl
     _MYSQL_GEN_DEPENDS(m4_bpatsubst($2, :, [,]))
   fi dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_GEN_DEPENDS], [ dnl
 ifelse($#, 0, [], $#, 1, [ dnl
  _MYSQL_GEN_DEPEND([$1]) dnl
 ],[ dnl
  _MYSQL_GEN_DEPEND([$1]) dnl
  _MYSQL_GEN_DEPENDS(m4_shift($@)) dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_GEN_DEPEND], [ dnl
 m4_ifdef([MYSQL_MODULE_DISABLED_]AS_TR_CPP([$1]),[
      AC_MSG_ERROR([depends upon disabled module $1]) dnl
 ],[
      [mysql_module_]m4_bpatsubst([$1], -, _)=yes
      if test "[$with_module_]m4_bpatsubst([$1], -, _)" = no; then
        AC_MSG_ERROR([depends upon disabled module $1])
      fi dnl
 ]) dnl
])

AC_DEFUN([_MYSQL_CHECK_PLUGIN_ARGS],[
 AC_ARG_WITH([modules], [
   --with-modules=PLUGIN[[,PLUGIN..]]
m4_text_wrap([Plugin modules to include in mysqld. (default is: $1)
Must be configuration name or a comma seperated list of modules.],
[                          ])
m4_text_wrap([Available configurations are: ]
m4_bpatsubst(m4_ifdef([__mysql_metaplugin_list__], dnl
none:all:__mysql_metaplugin_list__,none:all), :, [ ])[.],
[                          ])
m4_text_wrap([Available plugin modules are: ] dnl
m4_bpatsubst(__mysql_plugin_list__, :, [ ])[.], [                          ])
  --without-module-PLUGIN
m4_text_wrap([Disable the named module from being built. Otherwise, 
for modules which are not selected for inclusion in mysqld will be 
built dynamically (if supported)],[                          ])
],[mysql_modules="`echo $withval | tr ',.:;*[]' '       '`"], 
  [mysql_modules=['$1']])

m4_divert_once([HELP_VAR_END],[
Description of plugin modules:
m4_indir([MYSQL_LIST_PLUGINS])
])

  case "$mysql_modules" in
  all )
    mysql_modules='m4_bpatsubst(__mysql_plugin_list__, :, [ ])'
    ;;
  none )
    mysql_modules=''
    ;; dnl
m4_ifdef([__mysql_metaplugin_list__],[ dnl
_MYSQL_MODULE_META_CHECK(m4_bpatsubst(__mysql_metaplugin_list__, :, [,])) dnl
])
  esac

  for plugin in $mysql_modules; do
    case "$plugin" in
    all )
      AC_MSG_ERROR([bad module name: $plugin])
      ;;
    none )
      AC_MSG_ERROR([bad module name: $plugin])
      ;; dnl
_MYSQL_MODULE_ARGS_CHECK(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
    * )
      AC_MSG_ERROR([unknown plugin module: $plugin])
      ;;
    esac
  done

  _MYSQL_SANE_VARS(m4_bpatsubst(__mysql_plugin_list__, :, [,]))  
  _MYSQL_CHECK_DEPENDENCIES(m4_bpatsubst(__mysql_plugin_list__, :, [,]))
])

AC_DEFUN([_MYSQL_POST_PLUGIN_FIXUP],[
  for plugdir in $mysql_plugin_dirs; do
    case "$plugdir" in
    storage/* )
      mysql_se_dirs="$mysql_se_dirs `echo $plugdir | sed -e 's@^storage/@@'`"
      ;;
    plugin/* )
      mysql_pg_dirs="$mysql_pg_dirs `echo $plugdir | sed -e 's@^plugin/@@'`"
      ;;
    *)
      AC_MSG_ERROR([don't know how to handle plugin dir $plugdir])      
      ;;    
    esac
  done
  AC_SUBST(mysql_se_dirs)
  AC_SUBST(mysql_pg_dirs)
])

dnl ===========================================================================