AC_CONFIG_HEADERS([include/config.h include/lttng/ust-config.h include/lttng/ust-version.h])
AC_CONFIG_AUX_DIR([config])
AC_CONFIG_MACRO_DIR([m4])
-AC_CONFIG_SRCDIR([include/lttng/tracepoint.h])
AC_CANONICAL_TARGET
AC_CANONICAL_HOST
# Set os specific options
AS_CASE([$host_os],
- [freebsd*], [NO_NUMA=1]
+ [freebsd*], [AE_FEATURE_DISABLE([numa])]
)
# Set architecture specific options
[powerpc64le], [],
[s390], [],
[s390x], [],
- [arm*], [
- NO_NUMA=1
- ],
+ [arm*], [AE_FEATURE_DISABLE([numa])],
[aarch64*], [],
[mips*], [],
[tile*], [],
PKG_CHECK_MODULES([URCU], [liburcu >= 0.12])
-AM_CONDITIONAL([HAVE_CMAKE], [test "x$CMAKE" != "x"])
+## ##
+## User variables ##
+## ##
-AC_MSG_CHECKING([whether shared libraries are enabled])
-AS_IF([test "x$enable_shared" = "xyes"], [
- AC_MSG_RESULT([yes])
-], [
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([LTTng-UST requires shared libraries to be enabled])
-])
+# Additional variables captured during ./configure
-# Configuration options, which will be installed in the config.h
-AH_TEMPLATE([LTTNG_UST_HAVE_SDT_INTEGRATION], [SystemTap integration via sdt.h])
+AC_ARG_VAR([CLASSPATH], [Java class path])
-AM_CONDITIONAL([ENABLE_UST_DL], [test "x${ac_cv_have_decl_RTLD_DI_LINKMAP}" = "xyes"])
+## ##
+## Optionnal features selection ##
+## ##
-# numa.h integration
-AS_IF([test "x$NO_NUMA" = "x1"],[
- AS_IF([test "x$enable_numa" = "x" ], [enable_numa=no])
-])
+# numa integration
+# Enabled by default, except on some platforms
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([numa],[disable NUMA support])
-AC_ARG_ENABLE([numa], [
-AS_HELP_STRING([--disable-numa], [disable NUMA support])
-], [
- enable_numa=$enableval
-], [
- enable_numa=yes
-])
+# Java JNI interface library
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([jni-interface], [build JNI interface between C and Java])
-AS_IF([test "x$enable_numa" = "xyes"], [
- # numa - check that numa lib is available
- AC_CHECK_LIB([numa], [numa_available], [],
-[AC_MSG_ERROR([libnuma is not available. Please either install it (e.g. libnuma-dev) or use [LDFLAGS]=-Ldir to specify the right location, or use --disable-numa configure argument to disable NUMA support.])])
- have_libnuma=yes
-])
-AM_CONDITIONAL([ENABLE_NUMA], [test "x$have_libnuma" = "xyes"])
+# Build the Java Logging API agent
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([java-agent-jul],[build the LTTng UST Java agent with JUL support])
-AM_CONDITIONAL([HAVE_PERF_EVENT], [test "x$ac_cv_header_linux_perf_event_h" = "xyes"])
+# Build the Java Log4j agent
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([java-agent-log4j],[build the LTTng UST Java agent with Log4j support])
-# Check for JNI header files if requested
-AC_ARG_ENABLE([jni-interface], [
-AS_HELP_STRING([--enable-jni-interface], [build JNI interface between C and Java. Needs Java include files [default=no]])
-], [
- jni_interface=$enableval
-], [
- jni_interface=no
-])
+# Build both Java agents
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([java-agent-all],[build the LTTng UST Java agent with all supported backends])
-AM_CONDITIONAL([ENABLE_JNI_INTERFACE], [test "x$jni_interface" = "xyes"])
+# Build the Python agent
+# Disabled by default
+AE_FEATURE_DEFAULT_DISABLE
+AE_FEATURE([python-agent],[build the LTTng UST Python agent])
+# Build the examples
+# Disabled by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([examples],[Do not build and install examples])
-AC_ARG_ENABLE([java-agent-jul], [
-AS_HELP_STRING([--enable-java-agent-jul], [build the LTTng UST Java agent with JUL support [default=no]])
-], [
- java_agent_jul=$enableval
-], [
- java_agent_jul=no
-])
+# Man pages
+# Enabled by default
+AE_FEATURE_DEFAULT_ENABLE
+AE_FEATURE([man-pages],[Do not build and install man pages (already built in a distributed tarball)])
+
+# Systemtap sdt.h integration
+# Disabled by default
+AC_ARG_WITH([sdt],
+ [AS_HELP_STRING([--with-sdt], [provide SystemTap integration via sdt.h [default=no]])]
+)
-AC_ARG_ENABLE([java-agent-log4j], [
-AS_HELP_STRING([--enable-java-agent-log4j], [build the LTTng UST Java agent with Log4j support [default=no]])
+# Override the default runtime directory
+AC_ARG_WITH([lttng-system-rundir], [
+AS_HELP_STRING([--with-lttng-system-rundir], [Location of the system directory where LTTng-UST expects the system-wide lttng-sessiond runtime files. The default is "/var/run/lttng".]),
], [
- java_agent_log4j=$enableval
+ lttng_system_rundir="$withval"
], [
- java_agent_log4j=no
+ lttng_system_rundir="/var/run/lttng"
])
-AC_ARG_ENABLE([java-agent-all], [
-AS_HELP_STRING([--enable-java-agent-all], [build the LTTng UST Java agent with all supported backends [default=no]])
-], [
- java_agent_jul=$enableval
- java_agent_log4j=$enableval
-], [:])
+# Add the java command line arguments like '--wit-java-prefix'
+AX_JAVA_OPTIONS
-AM_CONDITIONAL([ENABLE_JAVA_AGENT], [test "x$java_agent_jul" = "xyes" || test "x$java_agent_log4j" = "xyes"])
-AM_CONDITIONAL([ENABLE_JAVA_AGENT_WITH_JUL], [test "x$java_agent_jul" = "xyes"])
-AM_CONDITIONAL([ENABLE_JAVA_AGENT_WITH_LOG4J], [test "x$java_agent_log4j" = "xyes"])
-AS_IF([test "x$jni_interface" = "xyes" || test "x$java_agent_jul" = "xyes" || test "x$java_agent_log4j" = "xyes"], [
- AX_JAVA_OPTIONS
- AC_ARG_VAR([CLASSPATH], [Java class path])
+## ##
+## Check for conflicting features selection ##
+## ##
- AX_JNI_INCLUDE_DIR
- for JNI_INCLUDE_DIR in $JNI_INCLUDE_DIRS
- do
- JNI_CPPFLAGS="$JNI_CPPFLAGS -I$JNI_INCLUDE_DIR"
- done
+AE_IF_FEATURE_DISABLED([shared], [
+ AC_MSG_ERROR(LTTng-UST requires shared libraries to be enabled)
+])
- saved_CPPFLAGS="$CPPFLAGS"
- CPPFLAGS="$CPPFLAGS $JNI_CPPFLAGS"
- AX_PROG_JAVAH
- CPPFLAGS="$saved_CPPFLAGS"
+AE_IF_FEATURE_ENABLED([java-agent-all], [
+ AE_FEATURE_ENABLE([java-agent-jul])
+ AE_FEATURE_ENABLE([java-agent-log4j])
])
-AM_CONDITIONAL([HAVE_JAVAH], [test "x$JAVAH" != "x"])
-AS_IF([test "x$java_agent_log4j" = "xyes"], [
- AX_CHECK_CLASSPATH
- AX_CHECK_CLASS([org.apache.log4j.Logger])
- AS_IF([test "x$ac_cv_class_org_apache_log4j_Logger" = "xno"], [
- AC_MSG_ERROR([The UST Java agent support for log4j was requested but the Log4j classes were not found. Please specify the location of the Log4j jar via the Java CLASSPATH e.g: export CLASSPATH="/path/to/log4j.jar"])
- ])
+## ##
+## Check for optional features dependencies ##
+## ##
+
+# The numa integration requires libnuma
+AE_IF_FEATURE_ENABLED([numa], [
+ AC_CHECK_LIB([numa], [numa_available], [], [
+ AC_MSG_ERROR([dnl
+libnuma is not available. Please either install it (e.g. libnuma-dev) or use
+[LDFLAGS]=-Ldir to specify the right location, or use --disable-numa configure
+argument to disable NUMA support.
+ ])
+ ])
])
-# Option to build the python agent
-AC_ARG_ENABLE([python-agent], [
-AS_HELP_STRING([--enable-python-agent], [build the LTTng UST Python agent [default=no]])
-], [
- python_agent=$enableval
-], [:])
-AM_CONDITIONAL([ENABLE_PYTHON_AGENT], [test "x$python_agent" = "xyes"])
+# The JNI interface and Java Agents require a working Java JDK
+AS_IF([AE_IS_FEATURE_ENABLED([jni-interface]) || AE_IS_FEATURE_ENABLED([java-agent-jul]) || AE_IS_FEATURE_ENABLED([java-agent-log4j])], [
+ # We detected a java compiler earlier, make sure it works
+ AX_PROG_JAVAC_WORKS
+
+ # Get the CPPFLAGS required to build jni libaries
+ AX_JNI_INCLUDE_DIR
+ for jni_include_dir in $JNI_INCLUDE_DIRS; do
+ JNI_CPPFLAGS="$JNI_CPPFLAGS -I$jni_include_dir"
+ done
+
+ # Check for javah and jni.h
+ saved_CPPFLAGS="$CPPFLAGS"
+ CPPFLAGS="$CPPFLAGS $JNI_CPPFLAGS"
+ AX_PROG_JAVAH
+ CPPFLAGS="$saved_CPPFLAGS"
+])
-# sdt.h integration
-AC_ARG_WITH([sdt], [
-AS_HELP_STRING([--with-sdt], [provide SystemTap integration via sdt.h [default=no]])
-], [
- with_sdt=$withval
-], [
- with_sdt="no"
+# The log4j agent requires the log4j jar in the classpath
+AE_IF_FEATURE_ENABLED([java-agent-log4j], [
+ AX_CHECK_CLASS([org.apache.log4j.Logger])
+ AS_IF([test "x$ac_cv_class_org_apache_log4j_Logger" = "xno"], [
+ AC_MSG_ERROR([dnl
+The UST Java agent support for log4j was requested but the Log4j classes were
+not found. Please specify the location of the Log4j jar via the Java CLASSPATH
+environment variable, e.g. ./configure CLASSPATH="/path/to/log4j.jar"
+
+Current CLASSPATH: "$CLASSPATH"
+ ])
+ ])
])
-AS_IF([test "x$with_sdt" = "xyes"], [
- AC_MSG_CHECKING([STAP_PROBEV()])
- AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
- #define SDT_USE_VARIADIC
- #include <sys/sdt.h>
- void fct(void)
- {
- STAP_PROBEV(provider,name,1,2,3,4,5,6,7,8,9,10);
- }
- ]])], [
- AC_MSG_RESULT([yes])
- AC_DEFINE([LTTNG_UST_HAVE_SDT_INTEGRATION], [1])
- ], [
- AC_MSG_RESULT([no])
- AC_MSG_ERROR([The sdt.h integration was requested but the STAP_PROBEV define cannot be used. Make sure it is installed, and up to date, or use CPPFLAGS=-I/path/ to specify a non-standard path to sys/sdt.h])
- ])
+# The python agent requires a python interpreter
+AE_IF_FEATURE_ENABLED([python-agent], [
+ AS_IF([test "x$PYTHON" = "x"], [
+ AC_MSG_ERROR([dnl
+Cannot find a suitable python interpreter. You can override it with the PYTHON
+environment variable.
+ ])
+ ])
])
-AC_ARG_WITH([lttng-system-rundir], [
-AS_HELP_STRING([--with-lttng-system-rundir], [Location of the system directory where LTTng-UST expects the system-wide lttng-sessiond runtime files. The default is "/var/run/lttng".]),
-], [
- lttng_system_rundir="$withval"
-], [
- lttng_system_rundir="/var/run/lttng"
+# Check for asciidoc and xmlto if we enabled building the man pages.
+AE_IF_FEATURE_ENABLED([man-pages], [
+ AS_IF([test "x$ASCIIDOC" = "x" || test "x$XMLTO" = "x"], [
+ AE_IF_IN_GIT_REPO([
+ # This is an error because we're in the Git repo, which
+ # means the man pages are not already generated for us,
+ # thus asciidoc/xmlto are required because we were asked
+ # to build the man pages.
+ AC_MSG_ERROR([dnl
+Both asciidoc and xmlto are needed to build the LTTng-UST man pages. Use
+--disable-man-pages to disable building the man pages, in which case
+they will not be installed.
+ ])
+ ], [
+ # Only warn here: since we're in the tarball, the man
+ # pages should already be generated at this point, thus
+ # asciidoc/xmlto are not strictly required.
+ warn_prebuilt_man_pages=yes
+ ])
+ ], [
+ have_asciidoc_xmlto=yes
+ ])
+])
+
+AS_IF([test "x$with_sdt" = "xyes"], [
+ AC_MSG_CHECKING([STAP_PROBEV()])
+ AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
+ #define SDT_USE_VARIADIC
+ #include <sys/sdt.h>
+ void fct(void)
+ {
+ STAP_PROBEV(provider,name,1,2,3,4,5,6,7,8,9,10);
+ }
+ ]])], [
+ AC_MSG_RESULT([yes])
+ AC_DEFINE([LTTNG_UST_HAVE_SDT_INTEGRATION], [1], [SystemTap integration via sdt.h])
+ ], [
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([dnl
+The sdt.h integration was requested but the STAP_PROBEV define cannot be used.
+Make sure it is installed, and up to date, or use CPPFLAGS=-I/path/ to specify
+a non-standard path to sys/sdt.h
+ ])
+ ])
])
+
+
+AM_CONDITIONAL([HAVE_CMAKE], [test "x$CMAKE" != "x"])
+
+# Configuration options, which will be installed in the config.h
+AH_TEMPLATE([LTTNG_UST_HAVE_SDT_INTEGRATION], [SystemTap integration via sdt.h])
+
+
+AM_CONDITIONAL([ENABLE_UST_DL], [test "x${ac_cv_have_decl_RTLD_DI_LINKMAP}" = "xyes"])
+
+
+AM_CONDITIONAL([ENABLE_NUMA], [test "x$have_libnuma" = "xyes"])
+
+AM_CONDITIONAL([HAVE_PERF_EVENT], [test "x$ac_cv_header_linux_perf_event_h" = "xyes"])
+
+AM_CONDITIONAL([ENABLE_JNI_INTERFACE], [test "x$jni_interface" = "xyes"])
+AM_CONDITIONAL([ENABLE_JAVA_AGENT], [test "x$java_agent_jul" = "xyes" || test "x$java_agent_log4j" = "xyes"])
+AM_CONDITIONAL([ENABLE_JAVA_AGENT_WITH_JUL], [test "x$java_agent_jul" = "xyes"])
+AM_CONDITIONAL([ENABLE_JAVA_AGENT_WITH_LOG4J], [test "x$java_agent_log4j" = "xyes"])
+
+AM_CONDITIONAL([HAVE_JAVAH], [test "x$JAVAH" != "x"])
+
+AM_CONDITIONAL([ENABLE_PYTHON_AGENT], [test "x$python_agent" = "xyes"])
+
AC_DEFINE_UNQUOTED([LTTNG_SYSTEM_RUNDIR], ["$lttng_system_rundir"],
[LTTng system runtime directory])
AM_CONDITIONAL([ENABLE_GEN_TP_EXAMPLES], [test "x$PYTHON" != "x"])
-# Enable building examples
-AC_ARG_ENABLE(
- examples,
- AS_HELP_STRING(
- [--disable-examples],
- [Do not build and install examples]
- ),
- [enable_examples=$enableval],
- [enable_examples=yes]
-)
AM_CONDITIONAL([ENABLE_EXAMPLES], [test "x$enable_examples" != "xno"])
-# Enable building man pages (user's intention).
-AC_ARG_ENABLE(
- man-pages,
- AS_HELP_STRING(
- [--disable-man-pages],
- [Do not build and install man pages (already built in a distributed tarball)]
- ),
- [man_pages_opt=$enableval],
- [man_pages_opt=yes]
-)
-
-# Check for asciidoc and xmlto if we enabled building the man pages.
-have_asciidoc_xmlto=no
-warn_prebuilt_man_pages=no
-
-AS_IF([test "x$man_pages_opt" = "xyes"], [
- AS_IF([test "x$ASCIIDOC" = "x" || test "x$XMLTO" = "x"], [
- AE_IF_IN_GIT_REPO([
- # This is an error because we're in the Git repo, which
- # means the man pages are not already generated for us,
- # thus asciidoc/xmlto are required because we were asked
- # to build the man pages.
- AC_MSG_ERROR([
-Both asciidoc and xmlto are needed to build the LTTng-UST man pages. Use
---disable-man-pages to disable building the man pages, in which case
-they will not be installed.
- ])
- ], [
- # Only warn here: since we're in the tarball, the man
- # pages should already be generated at this point, thus
- # asciidoc/xmlto are not strictly required.
- warn_prebuilt_man_pages=yes
- ])
- ], [
- have_asciidoc_xmlto=yes
- ])
-])
-
# Export man page build condition: build the man pages if the user
# asked for it, and if the tools are available.
AM_CONDITIONAL([ENABLE_MAN_PAGES], [test "x$man_pages_opt" != "xno"])
test "x$with_sdt" = "xyes" && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([sdt.h integration], $value, [use --with-sdt])
-test "x$java_agent_jul" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([java-agent-jul]) && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([Java agent (JUL support)], $value, [use --enable-java-agent-jul])
-test "x$java_agent_log4j" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([java-agent-log4j]) && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([Java agent (Log4j support)], $value, [use --enable-java-agent-log4j])
-test "x$jni_interface" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([jni-interface]) && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([JNI interface (JNI)], $value, [use --enable-jni-interface])
-test "x$python_agent" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([python-agent]) && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([Python agent], $value, [use --enable-python-agent])
test "x$ac_cv_header_linux_perf_event_h" = "xyes" && value=1 || value=0
PPRINT_PROP_BOOL_CUSTOM([Perf event integration], $value)
-test "x$enable_numa" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([numa]) && value=1 || value=0
PPRINT_PROP_BOOL([NUMA], $value)
AS_ECHO
PPRINT_SET_INDENT(0)
-test "x$enable_examples" = xyes && value=1 || value=0
+AE_IS_FEATURE_ENABLED([examples]) && value=1 || value=0
PPRINT_PROP_BOOL([Build and install examples], $value, $PPRINT_COLOR_SUBTITLE)
# man pages build enabled/disabled
m4_pushdef([build_man_pages_msg], [Build and install man pages])
-AS_IF([test "x$man_pages_opt" != "xno"], [
- AE_IF_IN_GIT_REPO([
- PPRINT_PROP_BOOL([build_man_pages_msg], 1, $PPRINT_COLOR_SUBTITLE)
- ], [
- AS_IF([test "x$have_asciidoc_xmlto" = "xyes"], [
- PPRINT_PROP_BOOL([build_man_pages_msg], 1, $PPRINT_COLOR_SUBTITLE)
- ], [
- PPRINT_PROP_STRING([build_man_pages_msg],
- [${PPRINT_COLOR_BLDGRN}yes (already built)],
- $PPRINT_COLOR_SUBTITLE)
- ])
- ])
+AE_IF_FEATURE_ENABLED([man-pages], [
+ AE_IF_IN_GIT_REPO([
+ PPRINT_PROP_BOOL([build_man_pages_msg], 1, $PPRINT_COLOR_SUBTITLE)
+ ], [
+ AS_IF([test "x$have_asciidoc_xmlto" = "xyes"], [
+ PPRINT_PROP_BOOL([build_man_pages_msg], 1, $PPRINT_COLOR_SUBTITLE)
+ ], [
+ PPRINT_PROP_STRING([build_man_pages_msg],
+ [${PPRINT_COLOR_BLDGRN}yes (already built)],
+ $PPRINT_COLOR_SUBTITLE)
+ ])
+ ])
], [
- PPRINT_PROP_BOOL([build_man_pages_msg], 0, $PPRINT_COLOR_SUBTITLE)
+ PPRINT_PROP_BOOL([build_man_pages_msg], 0, $PPRINT_COLOR_SUBTITLE)
])
m4_popdef([build_man_pages_msg])
PPRINT_SET_INDENT(0)
AS_IF([test "x$warn_prebuilt_man_pages" = "xyes" ], [
- AS_ECHO
- PPRINT_WARN([Both asciidoc and xmlto are needed to build the LTTng-UST man pages.
+ AS_ECHO
+ PPRINT_WARN([dnl
+Both asciidoc and xmlto are needed to build the LTTng-UST man pages.
Note that the man pages are already built in this distribution tarball,
therefore asciidoc and xmlto are only needed if you intend to modify
--- /dev/null
+#
+# SYNOPSIS
+#
+# AE_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+# ACTION-IF-GIVEN?, ACTION-IF-NOT-GIVEN?,
+# ACTION-IF-ENABLED?, ACTION-IF-NOT-ENABLED?)
+#
+# DESCRIPTION
+#
+# AE_FEATURE is a simple wrapper for AC_ARG_ENABLE.
+#
+# FEATURE-NAME should consist only of alphanumeric characters, dashes,
+# plus signs, and dots.
+#
+# FEATURE-DESCRIPTION will be formatted with AS_HELP_STRING.
+#
+# If the user gave configure the option --enable-FEATURE or --disable-FEATURE,
+# run shell commands ACTION-IF-GIVEN. If neither option was given, run shell
+# commands ACTION-IF-NOT-GIVEN. The name feature indicates an optional
+#
+# If the feature is enabled, run shell commands ACTION-IF-ENABLED, if it is
+# disabled, run shell commands ACTION-IF-NOT-ENABLED.
+#
+# A FEATURE has 3 different states, enabled, disabled and undefined. The first
+# two are self explanatory, the third state means it's disabled by default
+# and it was not explicitly enabled or disabled by the user or by the
+# AE_FEATURE_ENABLE and AE_FEATURE_DISABLE macros.
+#
+# A feature is disabled by default, in order to change this behaviour use the
+# AE_FEATURE_DEFAULT_ENABLE and AE_FEATURE_DEFAULT_DISABLE
+# macros.
+#
+# A simple example:
+#
+# AE_FEATURE_DEFAULT_ENABLE
+# AE_FEATURE(feature_xxxxx, [turns on/off XXXXX support])
+#
+# ...
+#
+# AE_FEATURE_DEFAULT_DISABLE
+# AE_FEATURE(feature_yyyyy, [turns on/off YYYYY support])
+# AM_CONDITIONAL(YYYYY, AE_IS_FEATURE_ENABLED([feature_yyyyy]))
+#
+# AE_FEATURE_DEFAULT_ENABLE
+# AE_FEATURE(...)
+#
+# ...
+#
+# Use AE_FEATURE_ENABLE or AE_FEATURE_DISABLE in order to
+# enable or disable a specific feature.
+#
+# Another simple example:
+#
+# AS_IF([some_test_here],[AE_FEATURE_ENABLE(feature_xxxxx)],[])
+#
+# AE_FEATURE(feature_xxxxx, [turns on/off XXXXX support],
+# HAVE_XXXXX, [Define if you want XXXXX support])
+# AE_FEATURE(feature_yyyyy, [turns on/off YYYYY support],
+# HAVE_YYYYY, [Define if you want YYYYY support])
+#
+# ...
+#
+# NOTE: AE_FEATURE_ENABLE/DISABLE() must be placed first of the relative
+# AE_FEATURE() macro if you want the the proper ACTION-IF-ENABLED and
+# ACTION-IF-NOT-ENABLED to run.
+#
+# LICENSE
+#
+# Copyright (c) 2020 Michael Jeanson <mjeanson@efficios.com>
+# Copyright (c) 2008 Francesco Salvestrini <salvestrini@users.sourceforge.net>
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+# As a special exception, the respective Autoconf Macro's copyright owner
+# gives unlimited permission to copy, distribute and modify the configure
+# scripts that are the output of Autoconf when processing the Macro. You
+# need not follow the terms of the GNU General Public License when using
+# or distributing such scripts, even though portions of the text of the
+# Macro appear in them. The GNU General Public License (GPL) does govern
+# all other use of the material that constitutes the Autoconf Macro.
+#
+# This special exception to the GPL applies to versions of the Autoconf
+# Macro released by the Autoconf Archive. When you make and distribute a
+# modified version of the Autoconf Macro, you may extend this special
+# exception to the GPL to apply to your modified version as well.
+
+#serial 1
+
+
+# AE_FEATURE_DEFAULT_ENABLE: The next feature defined with AE_FEATURE will
+# default to enable.
+AC_DEFUN([AE_FEATURE_DEFAULT_ENABLE], [
+ m4_define([ae_feature_default_arg], [yes])
+ m4_define([ae_feature_default_switch], [disable])
+])
+
+
+# AE_FEATURE_DEFAULT_DISABLE: The next feature defined with AE_FEATURE will
+# default to disable.
+#
+AC_DEFUN([AE_FEATURE_DEFAULT_DISABLE], [
+ m4_define([ae_feature_default_arg], [no])
+ m4_define([ae_feature_default_switch], [enable])
+])
+
+
+# AE_FEATURE_ENABLE(FEATURE-NAME): Enable the FEATURE, this will override the
+# user's choice if it was made.
+#
+AC_DEFUN([AE_FEATURE_ENABLE],[ dnl
+ enable_[]patsubst([$1], -, _)[]=yes
+])
+
+
+# AE_FEATURE_DISABLE(FEATURE-NAME): Disable the FEATURE, this will override the
+# user's choice if it was made.
+#
+AC_DEFUN([AE_FEATURE_DISABLE],[ dnl
+ enable_[]patsubst([$1], -, _)[]=no
+])
+
+
+# AE_IF_FEATURE_ENABLED(FEATURE-NAME, ACTION-IF-ENABLED, ACTION-IF-NOT-ENABLED?):
+# Run shell code ACTION-IF-ENABLED if the FEATURE is enabled, otherwise run
+# shell code ACTION-IF-NOT-ENABLED.
+#
+AC_DEFUN([AE_IF_FEATURE_ENABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+ AS_IF([test "$enable_[]FEATURE[]" = yes],[ dnl
+ $2
+ ],[: dnl
+ $3
+ ])
+])
+
+
+# AE_IF_FEATURE_NOT_ENABLED(FEATURE-NAME, ACTION-IF-NOT-ENABLED,
+# ACTION-IF-NOT-NOT-ENABLED?):
+# Run shell code ACTION-IF-NOT-ENABLED if the FEATURE is not explicitly
+# enabled, otherwise run shell code ACTION-IF-NOT-NOT-DISABLED.
+#
+# The distinction with AE_IF_FEATURE_DISABLED is that this will also
+# match a feature that is undefined.
+#
+# A feature is undefined when it's disabled by default and was not explicitly
+# enabled or disabled by the user or by AE_FEATURE_ENABLE/DISABLE.
+#
+AC_DEFUN([AE_IF_FEATURE_NOT_ENABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+ AS_IF([test "$enable_[]FEATURE[]" != yes],[ dnl
+ $2
+ ],[: dnl
+ $3
+ ])
+])
+
+
+# AE_IF_FEATURE_DISABLED(FEATURE-NAME, ACTION-IF-DISABLED, ACTION-IF-NOT-DISABLED?):
+# Run shell code ACTION-IF-DISABLED if the FEATURE is disabled, otherwise run
+# shell code ACTION-IF-NOT-DISABLED.
+#
+AC_DEFUN([AE_IF_FEATURE_DISABLED],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+ AS_IF([test "$enable_[]FEATURE[]" = no],[ dnl
+ $2
+ ],[: dnl
+ $3
+ ])
+])
+
+
+# AE_IF_FEATURE_UNDEF(FEATURE-NAME, ACTION-IF-UNDEF, ACTION-IF-NOT-UNDEF?):
+# Run shell code ACTION-IF-UNDEF if the FEATURE is undefined, otherwise run
+# shell code ACTION-IF-NOT-UNDEF.
+#
+# A feature is undefined when it's disabled by default and was not explicitly
+# enabled or disabled by the user or by AE_FEATURE_ENABLE/DISABLE.
+#
+AC_DEFUN([AE_IF_FEATURE_UNDEF],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+ AS_IF([test "x$enable_[]FEATURE[]" = x],[ dnl
+ $2
+ ],[: dnl
+ $3
+ ])
+])
+
+
+# AE_IS_FEATURE_ENABLED(FEATURE-NAME): outputs a shell condition (suitable
+# for use in a shell if statement) that will return true if the FEATURE is
+# enabled.
+#
+AC_DEFUN([AE_IS_FEATURE_ENABLED],[dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+ test "x$enable_[]FEATURE[]" = xyes dnl
+])
+
+
+dnl Disabled by default, unless already overriden
+m4_ifndef([ae_feature_default_arg],[AE_FEATURE_DEFAULT_DISABLE])
+
+
+# AE_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
+# ACTION-IF-GIVEN?, ACTION-IF-NOT-GIVEN?,
+# ACTION-IF-ENABLED?, ACTION-IF-NOT-ENABLED?):
+#
+#
+AC_DEFUN([AE_FEATURE],[ dnl
+m4_pushdef([FEATURE], patsubst([$1], -, _))dnl
+
+dnl If the option wasn't specified and the default is enabled, set enable_FEATURE to yes
+AS_IF([test "x$enable_[]FEATURE[]" = x && test "ae_feature_default_arg" = yes],[ dnl
+ enable_[]FEATURE[]="ae_feature_default_arg"
+])
+
+AC_ARG_ENABLE([$1],
+ AS_HELP_STRING([--ae_feature_default_switch-$1],dnl
+ [$2 [default=ae_feature_default_arg]]),[
+case "${enableval}" in
+ yes)
+ enable_[]FEATURE[]=yes
+ ;;
+ no)
+ enable_[]FEATURE[]=no
+ ;;
+ *)
+ AC_MSG_ERROR([bad value ${enableval} for feature --$1])
+ ;;
+esac
+
+$3
+],[: dnl
+$4
+])
+
+AS_IF([test "$enable_[]FEATURE[]" = yes],[: dnl
+ $5
+],[: dnl
+ $6
+])
+
+m4_popdef([FEATURE])dnl
+])