X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=configure.ac;h=ca24ee79f7e25bb4c7ebb592236ac3b4691b0661;hb=HEAD;hp=e8966b8a747b3bc28907c936902d6d7b018a2c33;hpb=e5a54f3fe218c929804475e6257da0e17b4c226a;p=babeltrace.git diff --git a/configure.ac b/configure.ac index e8966b8a..799df2f7 100644 --- a/configure.ac +++ b/configure.ac @@ -1,562 +1,847 @@ -AC_PREREQ([2.50]) +dnl SPDX-License-Identifier: MIT +dnl +dnl Copyright (C) 2017 EfficiOS, Inc. +dnl +dnl Process this file with autoconf to produce a configure script. + +# Project version information m4_define([bt_version_major], [2]) -m4_define([bt_version_minor], [0]) +m4_define([bt_version_minor], [1]) m4_define([bt_version_patch], [0]) -m4_define([bt_version_extra], [-pre1]) -m4_define([bt_version], bt_version_major[.]bt_version_minor[.]bt_version_patch[]bt_version_extra) -AC_INIT([babeltrace],bt_version,[jeremie dot galarneau at efficios dot com]) +m4_define([bt_version_dev_stage], [-rc1]) +m4_define([bt_version], bt_version_major[.]bt_version_minor[.]bt_version_patch[]bt_version_dev_stage) +m4_define([bt_version_name], [[Codename TBD]]) +m4_define([bt_version_description], [[Description TBD]]) +# Library version information of "libbabeltrace2" # Following the numbering scheme proposed by libtool for the library version # http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html -AC_SUBST([BABELTRACE_LIBRARY_VERSION], bt_version_major[:]bt_version_minor[:]bt_version_patch) +m4_define([bt_lib_version_current], [0]) +m4_define([bt_lib_version_revision], [0]) +m4_define([bt_lib_version_age], [0]) +m4_define([bt_lib_version], bt_lib_version_current[:]bt_lib_version_revision[:]bt_lib_version_age) + + +## ## +## Autoconf base setup ## +## ## + +AC_PREREQ([2.69]) +AC_INIT([babeltrace2],[bt_version],[jeremie dot galarneau at efficios dot com],[],[https://efficios.com/babeltrace/]) -AC_CONFIG_HEADERS([config.h]) +AC_SUBST([BABELTRACE_LIBRARY_VERSION], bt_lib_version) + +AC_CONFIG_HEADERS([src/common/config.h]) AC_CONFIG_AUX_DIR([config]) AC_CONFIG_MACRO_DIR([m4]) -AC_DEFINE([BT_VERSION_MAJOR], bt_version_major, [Babeltrace library major version]) -AC_DEFINE([BT_VERSION_MINOR], bt_version_minor, [Babeltrace library minor version]) -AC_DEFINE([BT_VERSION_PATCH], bt_version_patch, [Babeltrace library patch version]) -AC_DEFINE([BT_VERSION_EXTRA], ["]bt_version_extra["], [Babeltrace library extra version]) +AC_DEFINE([BT_VERSION_MAJOR], bt_version_major, [Babeltrace major version]) +AC_DEFINE([BT_VERSION_MINOR], bt_version_minor, [Babeltrace minor version]) +AC_DEFINE([BT_VERSION_PATCH], bt_version_patch, [Babeltrace patch version]) +AC_DEFINE([BT_VERSION_DEV_STAGE], ["]bt_version_dev_stage["], [Babeltrace version development stage (can be empty)]) +AC_DEFINE([BT_VERSION_NAME], ["]bt_version_name["], [Babeltrace version name]) +AC_DEFINE([BT_VERSION_DESCRIPTION], ["]AS_ESCAPE(bt_version_description)["], [Babeltrace version description]) AC_CANONICAL_TARGET AC_CANONICAL_HOST -AM_INIT_AUTOMAKE([foreign dist-bzip2 no-dist-gzip tar-ustar]) + +## ## +## Automake base setup ## +## ## + +AM_INIT_AUTOMAKE([1.13 foreign dist-bzip2 no-dist-gzip tar-ustar nostdinc subdir-objects -Wall -Wno-portability -Werror]) AM_MAINTAINER_MODE([enable]) -# Enable silent rules if available (Introduced in AM 1.11) -m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) +# Enable silent rules by default +AM_SILENT_RULES([yes]) -AC_REQUIRE_AUX_FILE([tap-driver.sh]) -# Checks for C compiler -AC_USE_SYSTEM_EXTENSIONS -AC_SYS_LARGEFILE -AC_PROG_CC -AC_PROG_CC_STDC +## ## +## OS specific defaults ## +## ## -# Checks for programs. -AC_PROG_MAKE_SET -LT_INIT(win32-dll) -AC_PROG_YACC -AC_PROG_LEX -AC_PROG_MKDIR_P -AC_PROG_LN_S +MINGW32=no +LT_NO_UNDEFINED="" +AS_CASE([$host_os], + [solaris*|darwin*], + [ + AE_FEATURE_DISABLE([debug-info]) + ], + [freebsd*], + [ + AE_FEATURE_DISABLE([debug-info]) + ], + [cygwin*], + [ + AE_FEATURE_DISABLE([debug-info]) + LT_NO_UNDEFINED="-no-undefined" + ], + [mingw*], + [ + MINGW32=yes + AE_FEATURE_DISABLE([debug-info]) + LT_NO_UNDEFINED="-no-undefined" + ] +) -AX_C___ATTRIBUTE__ -AS_IF([test "x$ax_cv___attribute__" = "xyes"], - [:], - [AC_MSG_ERROR([The compiler does not support __attribute__ extensions])]) +AM_CONDITIONAL([BABELTRACE_BUILD_WITH_MINGW], [test "x$MINGW32" = "xyes"]) +AC_SUBST(LT_NO_UNDEFINED) -AX_PTHREAD(,[AC_MSG_ERROR([Could not configure pthreads support])]) -LIBS="$PTHREAD_LIBS $LIBS" -CFLAGS="$CFLAGS $PTHREAD_CFLAGS" -CC="$PTHREAD_CC" -# Check linker option -AX_APPEND_LINK_FLAGS([-Wl,--no-as-needed], [LD_NO_AS_NEEDED]) -AC_SUBST([LD_NO_AS_NEEDED]) +## ## +## C compiler checks ## +## ## -AC_HEADER_STDBOOL -AC_CHECK_HEADERS([ \ - fcntl.h \ - float.h \ - libintl.h \ - limits.h \ - malloc.h \ - netdb.h \ - netinet/in.h \ - stddef.h \ - sys/socket.h \ -]) +# Choose the C compiler +AC_PROG_CC +# AC_PROG_CC_STDC was merged in AC_PROG_CC in autoconf 2.70 +m4_version_prereq([2.70], [], [AC_PROG_CC_STDC]) -if test ! -f "$srcdir/plugins/ctf/common/metadata/parser.h"; then - if test x"$(basename "$YACC")" != "xbison -y"; then - AC_MSG_ERROR([[bison not found and is required when building from git. - Please install bison]]) - fi - AC_PATH_PROG([BISON],[bison]) - AX_PROG_BISON_VERSION([2.4], [],[ - AC_MSG_ERROR([[Bison >= 2.4 is required when building from git]]) - ]) -fi - -if test ! -f "$srcdir/plugins/ctf/common/metadata/lexer.c"; then - if test x"$LEX" != "xflex"; then - AC_MSG_ERROR([[flex not found and is required when building from git. - Please install flex]]) - fi - AC_PATH_PROG([FLEX],[flex]) - AX_PROG_FLEX_VERSION([2.5.35], [],[ - AC_MSG_ERROR([[Flex >= 2.5.35 is required when building from git]]) - ]) -fi - - -AM_PATH_GLIB_2_0(2.22.0, ,AC_MSG_ERROR([glib is required in order to compile BabelTrace - download it from ftp://ftp.gtk.org/pub/gtk]) , gmodule) +# Make sure the C compiler supports C99 +AS_IF([test "$ac_cv_prog_cc_c99" = "no"], [AC_MSG_ERROR([The compiler does not support C99])]) -# Check what libraries are required on this platform to link sockets programs. -AX_LIB_SOCKET_NSL +# Enable available system extensions and LFS support +AC_USE_SYSTEM_EXTENSIONS +AC_SYS_LARGEFILE + +# Make sure the C compiler supports __attributes__ +AX_C___ATTRIBUTE__ +AS_IF([test "x$ax_cv___attribute__" != "xyes"], + [AC_MSG_ERROR([The compiler does not support __attribute__ extensions])]) + +# Make sure we have pthread support +AX_PTHREAD([], [AC_MSG_ERROR([Could not configure pthread support])]) # Checks for typedefs, structures, and compiler characteristics. AC_C_INLINE -AC_TYPE_PID_T -AC_TYPE_SIZE_T +AC_C_TYPEOF AC_TYPE_INT16_T AC_TYPE_INT32_T AC_TYPE_INT64_T AC_TYPE_INT8_T AC_TYPE_OFF_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T AC_TYPE_SSIZE_T AC_TYPE_UINT16_T AC_TYPE_UINT32_T AC_TYPE_UINT64_T AC_TYPE_UINT8_T +AC_CHECK_TYPES([ptrdiff_t]) -# Checks for library functions. -AC_FUNC_ALLOCA -AC_FUNC_FORK -AC_FUNC_MALLOC -AC_FUNC_MKTIME -AC_FUNC_MMAP -AC_FUNC_REALLOC -AC_FUNC_STRERROR_R -AC_CHECK_FUNCS([ \ - atexit \ - dirfd \ - dup2 \ - ftruncate \ - gethostbyname \ - gethostname \ - gettimeofday \ - localtime_r \ - memchr \ - memset \ - mkdir \ - mkdtemp \ - munmap \ - rmdir \ - setenv \ - socket \ - strchr \ - strdup \ - strerror \ - strndup \ - strnlen \ - strrchr \ - strtoul \ - strtoull \ - tzset \ - uname \ + +## ## +## C++ compiler checks ## +## ## + +# Require a C++11 compiler without GNU extensions (-std=c++11) +AX_CXX_COMPILE_STDCXX([11], [noext], [mandatory]) + + +## ## +## Header checks ## +## ## + +AC_HEADER_STDBOOL +AC_CHECK_HEADERS([ \ + fcntl.h \ + float.h \ + ftw.h \ + libintl.h \ + limits.h \ + malloc.h \ + netdb.h \ + netinet/in.h \ + stddef.h \ + sys/socket.h \ + sys/time.h ]) -MINGW32=no -DEFAULT_ENABLE_DEBUG_INFO=yes -LT_NO_UNDEFINED="" -AS_CASE([$host_os], - [solaris*|darwin*], - [ - DEFAULT_ENABLE_DEBUG_INFO=no - ], - [mingw*], - [ - MINGW32=yes - DEFAULT_ENABLE_DEBUG_INFO=no - LT_NO_UNDEFINED="-no-undefined" - ] -) -AM_CONDITIONAL([BABELTRACE_BUILD_WITH_MINGW], [test "x$MINGW32" = "xyes"]) -AC_SUBST(LT_NO_UNDEFINED) +## ## +## Linker checks ## +## ## -# Check for uuid in system libs -AC_CHECK_FUNCS([uuid_generate], -[ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_LIBUUID], 1, [Has libuuid support.]) - link_with_libuuid=no -], -[ - # First, check the pkg-config module is available, otherwise explicitly check - # for libuuid, or uuid support in the C-library. - PKG_CHECK_MODULES([UUID], [uuid], - [ - LIBS="${UUID_LIBS} ${LIBS}" - CFLAGS="${CFLAGS} ${UUID_CFLAGS}" - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_LIBUUID], 1, [Has libuuid support.]) - link_with_libuuid=yes - ], +# Check if the linker supports no-as-needed +AX_APPEND_LINK_FLAGS([-Wl,--no-as-needed], [LD_NO_AS_NEEDED]) +AC_SUBST([LD_NO_AS_NEEDED]) + +# Check if the linker supports whole-archive +AX_CHECK_LINK_FLAG([-Wl,--whole-archive,--no-whole-archive], [ - # Check for libuuid - AC_CHECK_LIB([uuid], [uuid_generate], - [ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_LIBUUID], 1, [Has libuuid support.]) - link_with_libuuid=yes - ], - [ - # libuuid not found, check for uuid_create in libc. - AC_CHECK_LIB([c], [uuid_create], - [ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_LIBC_UUID], 1, [Has libc uuid support.]) - link_with_libc_uuid=yes - ], + AC_SUBST([LD_WHOLE_ARCHIVE], [-Wl,--whole-archive,]) + AC_SUBST([LD_NO_WHOLE_ARCHIVE], [,--no-whole-archive]) + ],[ + # Fallback to force_load for the macOS linker + AX_CHECK_LINK_FLAG([-Wl,-force_load], [ - # for MinGW32 we have our own internal implementation of uuid using Windows functions. - if test "x$MINGW32" = xno; then - AC_MSG_ERROR([Cannot find libuuid uuid_generate nor libc uuid_create. Use [LDFLAGS]=-Ldir to specify their location.]) - fi + AC_SUBST([LD_WHOLE_ARCHIVE], [-Wl,-force_load,]) + AC_SUBST([LD_NO_WHOLE_ARCHIVE], []) + ],[ + AC_MSG_WARN([Can't find a linker option to force the inclusion of the static plugin archive objects.]) + ] + ) + ] +) + +# Check if the linker supports the "notext" keyword +AX_CHECK_LINK_FLAG([-Wl,-z,notext],[ + AC_SUBST([LD_NOTEXT], [-Wl,-z,notext]) +]) + + +## ## +## Programs checks ## +## ## + +AM_PROG_AR +AC_PROG_MAKE_SET +AC_PROG_MKDIR_P +AC_PROG_LN_S +AC_PROG_SED +AC_CHECK_PROGS([FOLD], [fold]) +AC_CHECK_PROGS([ASCIIDOC], [asciidoc]) +AC_CHECK_PROGS([XMLTO], [xmlto]) + +# check for bison +AC_PROG_YACC +AX_PROG_BISON_VERSION([2.5], [have_bison=yes]) + +AS_IF([test "x$have_bison" != "xyes"], [ + AE_IF_IN_GIT_REPO([ + AC_MSG_FAILURE([dnl +Bison >= 2.5 is required when building from the Git repository. You can +set the YACC variable to override automatic detection. + ]) + ], [ + AC_MSG_WARN([dnl +Missing Bison >= 2.5. Note that the parser files are already built in +this distribution tarball, so Bison is only needed if you intend to +modify their sources. You can set the YACC variable to override automatic +detection. + ]) + ]) +]) +AM_CONDITIONAL([HAVE_BISON], [test "x$have_bison" = "xyes"]) + +# check for flex +# Prior to autoconf 2.70, AC_PROG_FLEX did not take an argument. This is not a +# problem since the argument is silently ignored by older versions. +AC_PROG_LEX([noyywrap]) +AX_PROG_FLEX_VERSION([2.5.35], [have_flex=yes]) + +AS_IF([test "x$have_flex" != "xyes"], [ + AE_IF_IN_GIT_REPO([ + AC_MSG_FAILURE([dnl +Flex >= 2.5.35 is required when building from the Git repository. You can +set the LEX variable to override automatic detection. + ]) + ], [ + AC_MSG_WARN([dnl +Missing Flex >= 2.5.35. Note that the lexer files are already built in +this distribution tarball, so Flex is only needed if you intend to +modify their sources. You can set the LEX variable to override automatic +detection. + ]) + ]) +]) +AM_CONDITIONAL([HAVE_FLEX], [test "x$have_flex" = "xyes"]) + +# Always check for python, we will fail later if some features require it and +# it's unavailable. +AM_PATH_PYTHON([3.4], [ + AE_PATH_PYTHON_MODULES([PYTHON]) + + # pythondir is the path where extra modules are to be installed + pythondir=$PYTHON_PREFIX/$PYTHON_MODULES_PATH + + # pyexecdir is the path that contains shared objects used by the extra modules + pyexecdir=$PYTHON_EXEC_PREFIX/$PYTHON_MODULES_PATH + + # If no PYTHON_CONFIG was specified by the user, try to find it, starting + # with the one specific to the configured python version. + AS_IF([test "x$PYTHON_CONFIG" = "x"], [ + AC_CHECK_PROGS([PYTHON_CONFIG], [python$PYTHON_VERSION-config python-config]) + ]) + + # If PYTHON_CONFIG is set use it to get the includes and ld flags, unless + # they were specified by the user. + AS_IF([test "x$PYTHON_CONFIG" != "x" ], [ + AS_IF([test "x$PYTHON_INCLUDE" = "x"], [ + AC_MSG_CHECKING([Python include flags]) + PYTHON_INCLUDE=`$PYTHON_CONFIG --includes` + AC_MSG_RESULT([$PYTHON_INCLUDE]) + ]) + + AS_IF([test "x$PYTHON_LDFLAGS" = "x"], [ + AC_MSG_CHECKING([Python library flags]) + # Python 3.8+ requires that we pass --embed to get the -lpython3.x flag. + AS_IF([! PYTHON_LDFLAGS=`$PYTHON_CONFIG --ldflags --embed`], [ + PYTHON_LDFLAGS=`$PYTHON_CONFIG --ldflags` ]) + AC_MSG_RESULT([$PYTHON_LDFLAGS]) ]) ]) +], [:]) + +# Initialize and configure libtool +LT_INIT([win32-dll]) + + +## ## +## Library checks ## +## ## + +# Check what libraries are required on this platform to link sockets programs. +AX_LIB_SOCKET_NSL + +# Check for glib >= 2.28 with gmodule support +AM_PATH_GLIB_2_0([2.28.0], [], + AC_MSG_ERROR([glib >= 2.28 is required - download it from ftp://ftp.gtk.org/pub/gtk]), + [gmodule-no-export] +) + +# Checks for library functions. +AC_FUNC_ALLOCA +AC_FUNC_FORK +AC_FUNC_MKTIME +AC_FUNC_MMAP +AC_FUNC_STRERROR_R +AC_FUNC_STRNLEN +AC_CHECK_FUNCS([ \ + atexit \ + dup2 \ + ftruncate \ + gethostbyname \ + gettimeofday \ + localtime_r \ + memchr \ + memset \ + mkdir \ + mkdtemp \ + munmap \ + rmdir \ + setenv \ + socket \ + strchr \ + strdup \ + strerror \ + strndup \ + strnlen \ + strrchr \ + strstr \ + strtoul \ + strtoull \ + tzset \ ]) -AM_CONDITIONAL([BABELTRACE_BUILD_WITH_LIBUUID], [test "x$link_with_libuuid" = "xyes"]) -AM_CONDITIONAL([BABELTRACE_BUILD_WITH_LIBC_UUID], [test "x$link_with_libc_uuid" = "xyes"]) +# AC_FUNC_MALLOC causes problems when cross-compiling. +#AC_FUNC_MALLOC +#AC_FUNC_REALLOC # Check for fmemopen AC_CHECK_LIB([c], [fmemopen], -[ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_FMEMOPEN], 1, [Has fmemopen support.]) -] + [AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_FMEMOPEN], 1, [Has fmemopen support.])] ) # Check for open_memstream AC_CHECK_LIB([c], [open_memstream], -[ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_OPEN_MEMSTREAM], 1, [Has open_memstream support.]) -] + [AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_OPEN_MEMSTREAM], 1, [Has open_memstream support.])] ) # Check for posix_fallocate AC_CHECK_LIB([c], [posix_fallocate], -[ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_POSIX_FALLOCATE], 1, [Has posix_fallocate support.]) -] + [AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_POSIX_FALLOCATE], 1, [Has posix_fallocate support.])] ) -# Check for faccessat -AC_CHECK_LIB([c], [faccessat], -[ - AC_DEFINE_UNQUOTED([BABELTRACE_HAVE_FACCESSAT], 1, [Has faccessat support.]) -] -) -AC_CHECK_LIB([popt], [poptGetContext], [], - [AC_MSG_ERROR([Cannot find popt.])] -) +## ## +## User variables ## +## ## -# Plugins -AC_ARG_VAR([PLUGINSDIR], [built-in plugins install directory [LIBDIR/babeltrace/plugins]]) -AS_IF([test "x$PLUGINSDIR" = x], [PLUGINSDIR='$(libdir)/babeltrace/plugins']) - -# For Python -# SWIG version needed or newer: -swig_version=2.0.0 - -AC_ARG_ENABLE([python-bindings], - [AC_HELP_STRING([--enable-python-bindings], - [generate Python bindings])], - [enable_python_bindings=$enableval], [enable_python_bindings=no]) - -AM_CONDITIONAL([USE_PYTHON], [test "x${enable_python_bindings:-yes}" = xyes]) - -AC_ARG_ENABLE( - [python-plugins], - [AC_HELP_STRING( - [--enable-python-plugins], - [add support for the Babeltrace library and converter to load Python plugins]) - ], - [enable_python_plugins=$enableval], - [enable_python_plugins=no] -) +AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for Python, bypassing python-config]) +AC_ARG_VAR([PYTHON_LDFLAGS], [Linker flags for Python, bypassing python-config]) +AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config]) -if test "x${enable_python_bindings:-yes}" = xyes; then - AX_PKG_SWIG($swig_version, [], [ AC_MSG_ERROR([SWIG $swig_version or newer is needed]) ]) -else - AC_MSG_NOTICE([You may configure with --enable-python-bindings ]dnl -[if you want Python bindings.]) -fi +# BABELTRACE_PLUGINS_DIR: Plugins directory +AC_ARG_VAR([BABELTRACE_PLUGINS_DIR], [built-in plugins install directory [LIBDIR/babeltrace2/plugins]]) +AS_IF([test "x$BABELTRACE_PLUGINS_DIR" = x], [BABELTRACE_PLUGINS_DIR='${libdir}/babeltrace2/plugins']) -if test "x$enable_python_bindings" != xno || test "x$enable_python_plugins" != xno; then - AM_PATH_PYTHON([3.0], , [AC_MSG_ERROR(Python 3 is not available or is not the default Python interpreter on your system. See the README file to learn how to override your distribution's default Python interpreter.)]) +# BABELTRACE_PLUGIN_PROVIDERS_DIR: Plugin providers directory +AC_ARG_VAR([BABELTRACE_PLUGIN_PROVIDERS_DIR], [built-in plugin providers install directory [LIBDIR/babeltrace2/plugin-providers]]) +AS_IF([test "x$BABELTRACE_PLUGIN_PROVIDERS_DIR" = x], [BABELTRACE_PLUGIN_PROVIDERS_DIR='${libdir}/babeltrace2/plugin-providers']) - AM_PATH_PYTHON_MODULES([PYTHON]) - # pythondir is the path where extra modules are to be installed - pythondir=$PYTHON_PREFIX/$PYTHON_MODULES_PATH - # pyexecdir is the path that contains shared objects used by the extra modules - pyexecdir=$PYTHON_EXEC_PREFIX/$PYTHON_MODULES_PATH - AC_ARG_VAR([PYTHON_INCLUDE], [Include flags for Python, bypassing python-config]) - AC_ARG_VAR([PYTHON_LIBS], [Library flags for Python, bypassing python-config]) - AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config]) - AS_IF([test -z "$PYTHON_INCLUDE"], [ - AS_IF([test -z "$PYTHON_CONFIG"], [ - AC_PATH_PROGS([PYTHON_CONFIG], - [python$PYTHON_VERSION-config python-config], - [no], - [`dirname $PYTHON`]) - AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON. Do you have python-dev installed?])]) - ]) - AC_MSG_CHECKING([Python include flags]) - PYTHON_INCLUDE=`$PYTHON_CONFIG --includes` - AC_MSG_RESULT([$PYTHON_INCLUDE]) - ]) - AS_IF([test -z "$PYTHON_LIBS"], [ - AS_IF([test -z "$PYTHON_CONFIG"], [ - AC_PATH_PROGS([PYTHON_CONFIG], - [python$PYTHON_VERSION-config python-config], - [no], - [`dirname $PYTHON`]) - AS_IF([test "$PYTHON_CONFIG" = no], [AC_MSG_ERROR([cannot find python-config for $PYTHON. Do you have python-dev installed?])]) +# BABELTRACE_MINIMAL_LOG_LEVEL: +AC_ARG_VAR([BABELTRACE_MINIMAL_LOG_LEVEL], [Minimal log level for Babeltrace program, library, and plugins (TRACE, DEBUG (default), or INFO)]) +AS_IF([test "x$BABELTRACE_MINIMAL_LOG_LEVEL" = x], [BABELTRACE_MINIMAL_LOG_LEVEL="DEBUG"]) +AS_IF([test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "TRACE" && \ + test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "DEBUG" && \ + test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "INFO"], + [AC_MSG_ERROR([Invalid BABELTRACE_MINIMAL_LOG_LEVEL value ($BABELTRACE_MINIMAL_LOG_LEVEL): use TRACE, DEBUG, or INFO.])] +) +AC_DEFINE_UNQUOTED([BT_LOG_MINIMAL_LEVEL], [__BT_LOGGING_LEVEL_$BABELTRACE_MINIMAL_LOG_LEVEL], [Minimal log level]) + +# BABELTRACE_DEV_MODE: +AC_ARG_VAR([BABELTRACE_DEV_MODE], [Set to 1 to enable the Babeltrace developer mode (enables run-time checks for plugin developers)]) +AS_IF([test "x$BABELTRACE_DEV_MODE" = x1], [ + AC_DEFINE([BT_DEV_MODE], 1, [Babeltrace developer mode]) +], [BABELTRACE_DEV_MODE=0]) +AM_CONDITIONAL([DEV_MODE], [test "x$BABELTRACE_DEV_MODE" = x1]) + +# BABELTRACE_DEBUG_MODE: +AC_ARG_VAR([BABELTRACE_DEBUG_MODE], [Set to 1 to enable the Babeltrace debug mode (enables internal assertions for Babeltrace maintainers)]) +AS_IF([test "x$BABELTRACE_DEBUG_MODE" = x1], [ + AC_DEFINE([BT_DEBUG_MODE], 1, [Babeltrace debug mode]) +], [BABELTRACE_DEBUG_MODE=0]) + + +## ## +## Optional features selection ## +## ## + +# Python bindings +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([python-bindings],[build the Python bindings]) + +# Python bindings documentation +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([python-bindings-doc],[build the Python bindings documentation]) + +# Python plugins +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([python-plugins],[enable the Python plugins support for the library and converter]) + +# Debug info +# Enabled by default, except on some platforms +AE_FEATURE_DEFAULT_ENABLE +AE_FEATURE([debug-info],[disable the debug info support (default on macOS, Solaris and Windows)]) + +# API documentation +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([api-doc],[build the HTML API documentation]) + +# Built-in plugins +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([built-in-plugins],[Statically-link in-tree plug-ins into the babeltrace2 executable]) + +# Built-in python plugin support +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([built-in-python-plugin-support],[Statically-link Python plugin support into the babeltrace library]) + +# 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]) + +# When given, add -Werror to WARN_CFLAGS and WARN_CXXFLAGS. +# Disabled by default +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([Werror],[Treat compiler warnings as errors.]) + +# When given, build with AddressSanitizer. +AE_FEATURE_DEFAULT_DISABLE +AE_FEATURE([asan],[Build with AddressSanitizer.]) +AE_FEATURE([ubsan],[Build with UndefinedBehaviorSanitizer.]) + +## ## +## Check for conflicting features selection ## +## ## + +# Check for conflicting Python related features user choices. +AE_IF_FEATURE_ENABLED([python-plugins], [ + AE_IF_FEATURE_UNDEF([python-bindings], [ + # --enable-python-plugins was provided but --enable-python-bindings was + # omitted. Turn the Python bindings ON anyway because it's needed to + # use the Python plugins. + AE_FEATURE_ENABLE([python-bindings]) + ], [ + AE_IF_FEATURE_DISABLED([python-bindings], [ + # --enable-python-plugins _and_ --disable-python-bindings were + # used. This is invalid because Python plugins need the Python + # bindings to be useful. + AC_MSG_ERROR(--enable-python-bindings must be used to support Python plugins) ]) - AC_MSG_CHECKING([Python library flags]) - PYTHON_LIBS=`$PYTHON_CONFIG --libs` - AC_MSG_RESULT([$PYTHON_LIBS]) ]) -fi +]) + +# Check for conflicting optional features user choices +AE_IF_FEATURE_ENABLED([built-in-plugins], [ + # Built-in plug-ins are only available when the --disable-shared --enable-static options are used. + AE_IF_FEATURE_NOT_ENABLED([static], [AC_MSG_ERROR(--enable-static must be used to bundle plug-ins in the babeltrace2 executable)]) + AE_IF_FEATURE_ENABLED([shared], [AC_MSG_ERROR(--disable-shared must be used to bundle plug-ins in the babeltrace2 executable)]) +]) -AS_IF([test "x$BUILT_IN_PLUGINS" = ""]) +AE_IF_FEATURE_ENABLED([built-in-python-plugin-support], [ + AE_IF_FEATURE_NOT_ENABLED([python-plugins], [AC_MSG_ERROR([--enable-python-plugins must be used to bundle Python plugin support in the babeltrace2 executable])]) + # Built-in plug-ins are only available when the --disable-shared --enable-static options are used. + AE_IF_FEATURE_NOT_ENABLED([static], [AC_MSG_ERROR(--enable-static must be used to bundle Python plugin support in the babeltrace2 executable)]) + AE_IF_FEATURE_ENABLED([shared], [AC_MSG_ERROR(--disable-shared must be used to bundle Python plugin support in the babeltrace2 executable)]) +]) + + +## ## +## Set automake variables for optional feature conditionnals in Makefile.am ## +## ## + +AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS], AE_IS_FEATURE_ENABLED([python-bindings])) +AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS_DOC], AE_IS_FEATURE_ENABLED([python-bindings-doc])) +AM_CONDITIONAL([ENABLE_PYTHON_PLUGINS], AE_IS_FEATURE_ENABLED([python-plugins])) +AM_CONDITIONAL([ENABLE_DEBUG_INFO], AE_IS_FEATURE_ENABLED([debug-info])) +AM_CONDITIONAL([ENABLE_API_DOC], AE_IS_FEATURE_ENABLED([api-doc])) +AM_CONDITIONAL([ENABLE_BUILT_IN_PLUGINS], AE_IS_FEATURE_ENABLED([built-in-plugins])) +AM_CONDITIONAL([ENABLE_BUILT_IN_PYTHON_PLUGIN_SUPPORT], AE_IS_FEATURE_ENABLED([built-in-python-plugin-support])) +AM_CONDITIONAL([ENABLE_MAN_PAGES], AE_IS_FEATURE_ENABLED([man-pages])) +AM_CONDITIONAL([ENABLE_PYTHON_COMMON_DEPS], AE_IS_FEATURE_ENABLED([python-bindings]) || AE_IS_FEATURE_ENABLED([python-plugins])) +AM_CONDITIONAL([ENABLE_ASAN], AE_IS_FEATURE_ENABLED([asan])) + + +## ## +## Set defines for optional features conditionnals in the source code ## +## ## + +AE_IF_FEATURE_ENABLED([built-in-plugins], + [AC_DEFINE([BT_BUILT_IN_PLUGINS], [1], [Define to 1 to register plug-in attributes in static executable sections])] +) -AM_CONDITIONAL([WITH_PYTHON_PLUGINS], [test "x$enable_python_plugins" != xno]) -AS_IF( - [test "x$enable_python_plugins" != xno], - AC_DEFINE_UNQUOTED([WITH_PYTHON_PLUGINS], [1], [Python plugin support.]) +AE_IF_FEATURE_ENABLED([built-in-python-plugin-support], + [AC_DEFINE([BT_BUILT_IN_PYTHON_PLUGIN_SUPPORT], [1], [Define to 1 to register plug-in attributes in static executable sections])] ) -AC_ARG_ENABLE([python-bindings-doc], - [AC_HELP_STRING([--enable-python-bindings-doc], - [generate Python bindings documentation])], - [enable_python_bindings_doc=$enableval], [enable_python_bindings_doc=no]) +AE_IF_FEATURE_ENABLED([python-plugins], [ENABLE_PYTHON_PLUGINS=1], [ENABLE_PYTHON_PLUGINS=0]) +AC_SUBST([ENABLE_PYTHON_PLUGINS]) -AM_CONDITIONAL([BUILD_PYTHON_BINDINGS_DOC], [test "x${enable_python_bindings_doc:-yes}" = xyes]) +AE_IF_FEATURE_ENABLED([debug-info], [ENABLE_DEBUG_INFO_VAL=1], [ENABLE_DEBUG_INFO_VAL=0]) +AC_SUBST([ENABLE_DEBUG_INFO_VAL]) -AC_ARG_ENABLE([python-bindings-tests], - [AC_HELP_STRING([--enable-python-bindings-tests], - [test Python bindings])], - [enable_python_bindings_tests=$enableval], [enable_python_bindings_tests=no]) +AE_IF_FEATURE_ENABLED([asan], [ENABLE_ASAN=1], [ENABLE_ASAN=0]) +AC_SUBST([ENABLE_ASAN]) -AM_CONDITIONAL([ENABLE_PYTHON_BINDINGS_TESTS], [test "x${enable_python_bindings_tests:-yes}" = xyes]) +## ## +## Check for optional features dependencies ## +## ## -if test "x${enable_python_bindings:-no}" = xno; then - if test "x${enable_python_bindings_doc:-yes}" = xyes; then - AC_MSG_ERROR([--enable-python-bindings-doc was specified without --enable-python-bindings]) - fi +# The Python bindings require SWIG +AE_IF_FEATURE_ENABLED([python-bindings], + [AX_PKG_SWIG(2.0.0, [], [AC_MSG_ERROR([SWIG 2.0.0 or newer is required to build the python bindings])])] +) - if test "x${enable_python_bindings_tests:-yes}" = xyes; then - AC_MSG_ERROR([--enable-python-bindings-tests was specified without --enable-python-bindings]) - fi -fi +AS_IF([test "$PYTHON" != :], [have_python=yes], [have_python=no]) +AS_IF([test -n "$PYTHON_CONFIG"], [have_python_dev=yes], [have_python_dev=no]) -if test "x${enable_python_bindings_doc:-yes}" = xyes; then - AM_CHECK_PYTHON_SPHINX([PYTHON]) - AS_IF([test "x$PYTHON_SPHINX_EXISTS" = xno], - AC_MSG_ERROR([The Sphinx package for Python 3 is required to build Python bindings documentation]) - ) -fi +AM_CONDITIONAL([HAVE_PYTHON], [test "x$have_python" = xyes]) +AM_CONDITIONAL([HAVE_PYTHON_DEV], [test "x$have_python_dev" = xyes]) -if test "x${enable_python_bindings_tests:-yes}" = xyes; then - AM_CHECK_PYTHON_TAPPY([PYTHON]) - AS_IF([test "x$PYTHON_TAPPY_EXISTS" = xno], - AC_MSG_ERROR([You need the tappy Python project to test the Python bindings (see )]) - ) -fi - -# Set default enable state for debug info. -# The _enable_debug_info variable is prepended with an underscore to -# avoid clashing with the one generated by AC_ARG_ENABLE. -AS_IF([test "x$DEFAULT_ENABLE_DEBUG_INFO" = xyes], [_enable_debug_info=yes], [_enable_debug_info=no]) - -# Optional debug info feature -# Do _not_ indent the help string below (appears in the configure --help -# output). -AC_ARG_ENABLE([debug-info], -[AC_HELP_STRING([--enable-debug-info], [enable the debug info feature (default on Linux)])] -[AC_HELP_STRING([--disable-debug-info], [disable the debug info feature (default on OS X and Solaris)])], - [AS_IF([test "x$enableval" = xyes], [_enable_debug_info=yes], [_enable_debug_info=no])], []) - -AM_CONDITIONAL([ENABLE_DEBUG_INFO], [test "x$_enable_debug_info" = xyes]) - -AS_IF([test "x$_enable_debug_info" = xyes], [ - # Check if libelf and libdw are present - AC_CHECK_LIB([elf], [elf_version], [], [AC_MSG_ERROR(Missing libelf (from elfutils >= 0.154) which is required by debug info. You can disable this feature using --disable-debug-info.)]) - AC_CHECK_LIB([dw], [dwarf_begin], [], [AC_MSG_ERROR(Missing libdw (from elfutils >= 0.154) which is required by debug info. You can disable this feature using --disable-debug-info.)]) - BT_LIB_ELFUTILS([0], [154], [:], [AC_MSG_ERROR(elfutils >= 0.154 is required to use the debug info feature. You can disable this feature using --disable-debug-info.)]) - AC_DEFINE([ENABLE_DEBUG_INFO], [1], [Define to 1 if you enable the 'debug info' feature]) -], []) - -AC_ARG_VAR([BUILT_IN_PLUGINS], [Statically-link in-tree plug-ins into the babeltrace binary]) -AS_IF([test "x$BUILT_IN_PLUGINS" != x], [ -# Built-in plug-ins are only available when the --disable-shared --enable-static options are used. - AS_IF([test "x$enable_static" != "xyes"], [AC_MSG_ERROR(--enable-static must be used to bundle plug-ins in the babeltrace executable)]) - AS_IF([test "x$enable_shared" = "xyes"], [AC_MSG_ERROR(--disable-shared must be used to bundle plug-ins in the babeltrace executable)]) - built_in_plugins=yes - AC_DEFINE([BT_BUILT_IN_PLUGINS], [1], [Define to 1 to register plug-in attributes in static executable sections]) -]) -AM_CONDITIONAL([BUILT_IN_PLUGINS], [test "x$built_in_plugins" = "xyes"]) - -AC_ARG_VAR([BUILT_IN_PYTHON_PLUGIN_SUPPORT], [Statically-link Python plugin support into the babeltrace library]) -AS_IF([test "x$BUILT_IN_PYTHON_PLUGIN_SUPPORT" != x], [ -# Built-in plug-ins are only available when the --disable-shared --enable-static options are used. - AS_IF([test "x$enable_static" != "xyes"], [AC_MSG_ERROR(--enable-static must be used to bundle Python plugin support in the babeltrace executable)]) - AS_IF([test "x$enable_shared" = "xyes"], [AC_MSG_ERROR(--disable-shared must be used to bundle Python plugin support in the babeltrace executable)]) - AS_IF([test "x$enable_python_plugins" = "xno"], [ - AC_MSG_ERROR([You can't use BUILT_IN_PYTHON_PLUGIN_SUPPORT=1 without --enable-python-plugins.]) +AS_IF([test "x$have_python" = xyes], [ + AX_COMPARE_VERSION(["$PYTHON_VERSION"], [ge], ["3.12"], [ + have_python_312_or_greater=yes ]) - built_in_python_plugin_support=yes - AC_DEFINE([BT_BUILT_IN_PYTHON_PLUGIN_SUPPORT], [1], [Define to 1 to register plug-in attributes in static executable sections]) ]) -AM_CONDITIONAL([BUILT_IN_PYTHON_PLUGIN_SUPPORT], [test "x$built_in_python_plugin_support" = "xyes"]) -PKG_CHECK_MODULES(GMODULE, [gmodule-2.0 >= 2.0.0]) +AM_CONDITIONAL([HAVE_PYTHON_312_OR_GREATER], [test "x$have_python_312_or_greater" = xyes]) -# Logging -AC_ARG_VAR([BABELTRACE_MINIMAL_LOG_LEVEL], [Minimal log level for Babeltrace program, library, and plugins (VERBOSE, DEBUG, INFO, WARN, ERROR (default), FATAL, or NONE)]) -AS_IF([test "x$BABELTRACE_MINIMAL_LOG_LEVEL" = "x"], [BABELTRACE_MINIMAL_LOG_LEVEL=VERBOSE]) -AS_IF([test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "VERBOSE" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "DEBUG" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "INFO" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "WARN" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "ERROR" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "FATAL" && test "$BABELTRACE_MINIMAL_LOG_LEVEL" != "NONE"], [ - AC_MSG_ERROR([Invalid BABELTRACE_MINIMAL_LOG_LEVEL value ($BABELTRACE_MINIMAL_LOG_LEVEL): use VERBOSE, DEBUG, INFO, WARN, ERROR, FATAL, or NONE.]) +AS_IF([AE_IS_FEATURE_ENABLED([python-bindings]) || AE_IS_FEATURE_ENABLED([python-plugins])], [ + AS_IF([test "x$have_python_dev" = xno], [ + AC_MSG_ERROR([Cannot find a suitable python-config. You can override the python-config path with the PYTHON_CONFIG environment variable.]) + ]) + + AX_COMPARE_VERSION(["$PYTHON_VERSION"], [ge], ["3.12"], [ + AC_MSG_CHECKING([for python setuptools]) + AS_IF(["$PYTHON" -c "import setuptools" 2>/dev/null], [ + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Python >= 3.12 removed 'distutils', the 'setuptools' module needs to be installed for the selected interpreter.]) + ]) + ]) ]) -AC_DEFINE_UNQUOTED([BT_LOG_LEVEL], [BT_LOG_$BABELTRACE_MINIMAL_LOG_LEVEL], [Minimal log level]) -LIBS="$LIBS $GMODULE_LIBS" -PACKAGE_CFLAGS="$GMODULE_CFLAGS -Wall -Wformat" -AC_SUBST(PACKAGE_CFLAGS) +AE_IF_FEATURE_ENABLED([python-bindings-doc], + [ + AE_CHECK_PYTHON_SPHINX([PYTHON]) + AS_IF([test "x$PYTHON_SPHINX_EXISTS" = xno], [ + AC_MSG_ERROR([The Sphinx package for Python 3 is required to build the Python bindings documentation]) + ]) -DEFAULT_INCLUDES="-I\$(top_srcdir) -I\$(top_builddir) -I\$(top_builddir)/include -include config.h" -AC_SUBST(DEFAULT_INCLUDES) + AE_IF_FEATURE_NOT_ENABLED([python-bindings], [ + AC_MSG_ERROR([The Python bindings are required to build their documentation]) + ]) + ] +) -babeltraceincludedir="${includedir}/babeltrace" -AC_SUBST(babeltraceincludedir) +AE_IF_FEATURE_ENABLED([debug-info], [ + # Check if libelf and libdw are present + PKG_CHECK_MODULES([ELFUTILS], [libelf >= 0.154 libdw >= 0.154], + [ + dnl PKG_CHECK_MODULES defines ELFUTILS_LIBS + ], + [ + AC_MSG_WARN([pkg-config was unable to find a valid .pc for libelf/libdw. Set PKG_CONFIG_PATH to specify the pkg-config configuration file location.]) + + # Turns out SLES12 doesn't bother shipping .pc file for libelf + AC_MSG_WARN([Finding libelf without pkg-config.]) + AC_CHECK_LIB([elf], [elf_version], [:], [AC_MSG_ERROR(Missing libelf (from elfutils >= 0.154) which is required by debug info. You can disable this feature using --disable-debug-info.)]) + AC_CHECK_LIB([dw], [dwarf_begin], [:], [AC_MSG_ERROR(Missing libdw (from elfutils >= 0.154) which is required by debug info. You can disable this feature using --disable-debug-info.)]) + AE_LIB_ELFUTILS([0], [154], [], [AC_MSG_ERROR(elfutils >= 0.154 is required to use the debug info feature. You can disable this feature using --disable-debug-info.)]) + ELFUTILS_LIBS="-lelf -ldw" + ]) +]) +AC_SUBST([ELFUTILS_LIBS]) -babeltracectfwriterincludedir="${includedir}/babeltrace/ctf-writer" -AC_SUBST(babeltracectfwriterincludedir) +AE_IF_FEATURE_ENABLED([api-doc], + [ + DX_DOXYGEN_FEATURE(ON) + DX_DOT_FEATURE(OFF) + DX_HTML_FEATURE(ON) + DX_CHM_FEATURE(OFF) + DX_CHI_FEATURE(OFF) + DX_MAN_FEATURE(OFF) + DX_RTF_FEATURE(OFF) + DX_XML_FEATURE(OFF) + DX_PDF_FEATURE(OFF) + DX_PS_FEATURE(OFF) + DX_INIT_DOXYGEN([babeltrace2], [$(builddir)/Doxyfile], [output]) + AS_IF([test -z "$DX_DOXYGEN"], + [AC_MSG_ERROR([You need doxygen to enable the API documentation])] + ) + ] +) -babeltracectfincludedir="${includedir}/babeltrace/ctf" -AC_SUBST(babeltracectfincludedir) +have_asciidoc_xmlto=no +warn_prebuilt_man_pages=no + +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 asciixmlto are required because we were asked + # to build the man pages + AC_MSG_ERROR([ +You need asciidoc and xmlto to build the Babeltrace 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 + ]) +]) -babeltracectfirincludedir="${includedir}/babeltrace/ctf-ir" -AC_SUBST(babeltracectfirincludedir) +# export AsciiDoc and xmlto existence +AM_CONDITIONAL([HAVE_ASCIIDOC_XMLTO], [test "x$have_asciidoc_xmlto" = "xyes"]) + +# a wonderful hack that seems necessary because $libdir is +# literally `${exec_prefix}/lib`, and $exec_prefix is set to `NONE` +# by autoconf when it's not specified by the user +AS_IF([test "x$exec_prefix" = xNONE], [ + AS_IF([test "x$prefix" = xNONE], [ + PREFIX="$ac_default_prefix" + ], [ + PREFIX="$prefix" + ]) -babeltracepluginincludedir="${includedir}/babeltrace/plugin" -AC_SUBST(babeltracepluginincludedir) + LIBDIR="$PREFIX/lib" +], [ + LIBDIR="$libdir" +]) -babeltracegraphincludedir="${includedir}/babeltrace/graph" -AC_SUBST(babeltracegraphincludedir) +AC_SUBST(LIBDIR) -program_transform_name="s&babeltrace\.bin&babeltrace&;$program_transform_name" -AC_SUBST(program_transform_name) +# If --enable-asan is used... +AE_IF_FEATURE_ENABLED([asan], [ + # ... add -fsanitize=address to the *FLAGS variables. + ASAN_CFLAGS="-fsanitize=address" + ASAN_CXXFLAGS="-fsanitize=address" + ASAN_LDFLAGS="-fsanitize=address" +]) -# check for Doxygen -AC_ARG_ENABLE( - [api-doc], - [AC_HELP_STRING( - [--enable-api-doc], - [generate and install HTML API documentation] - )], - [enable_api_doc=$enableval], - [enable_api_doc=no] -) -AM_CONDITIONAL([ENABLE_API_DOC], [test "x$enable_api_doc" = "xyes"]) - -AS_IF([test "x$enable_api_doc" = "xyes"], [ - DX_DOXYGEN_FEATURE(ON) - DX_DOT_FEATURE(OFF) - DX_HTML_FEATURE(ON) - DX_CHM_FEATURE(OFF) - DX_CHI_FEATURE(OFF) - DX_MAN_FEATURE(OFF) - DX_RTF_FEATURE(OFF) - DX_XML_FEATURE(OFF) - DX_PDF_FEATURE(OFF) - DX_PS_FEATURE(OFF) - DX_INIT_DOXYGEN([Babeltrace], [$(srcdir)/Doxyfile], [output]) +# If --enable-ubsan is used... +AE_IF_FEATURE_ENABLED([ubsan], [ + # ... add -fsanitize=undefined to the *FLAGS variables. + UBSAN_CFLAGS="-fsanitize=undefined" + UBSAN_CXXFLAGS="-fsanitize=undefined" + UBSAN_LDFLAGS="-fsanitize=undefined" ]) - #TODO: removed, work in progress - #bindings/python/Makefile - #bindings/python/babeltrace/Makefile - #bindings/python/bt2/Makefile - #bindings/python/bt2/__init__.py -AC_CONFIG_FILES([ - Makefile - common/Makefile - compat/Makefile - cli/Makefile - doc/Makefile - doc/api/Makefile - doc/api/Doxyfile - doc/bindings/Makefile - doc/bindings/python/Makefile - doc/images/Makefile - lib/Makefile - lib/prio_heap/Makefile - lib/plugin/Makefile - lib/graph/Makefile - lib/graph/notification/Makefile - lib/ctf-ir/Makefile - lib/ctf-writer/Makefile - include/Makefile - logging/Makefile - bindings/Makefile - tests/Makefile - tests/cli/Makefile - tests/cli/intersection/Makefile - tests/lib/Makefile - tests/lib/writer/Makefile - tests/lib/test-plugin-plugins/Makefile - tests/utils/Makefile - tests/utils/tap/Makefile - tests/bindings/Makefile - tests/bindings/python/Makefile - tests/bindings/python/bt2/Makefile - tests/plugins/Makefile - extras/Makefile - extras/valgrind/Makefile - plugins/Makefile - plugins/ctf/Makefile - plugins/ctf/common/Makefile - plugins/ctf/common/btr/Makefile - plugins/ctf/common/metadata/Makefile - plugins/ctf/common/notif-iter/Makefile - plugins/ctf/fs-src/Makefile - plugins/ctf/fs-sink/Makefile - plugins/ctf/lttng-live/Makefile - plugins/text/Makefile - plugins/text/pretty/Makefile - plugins/utils/Makefile - plugins/utils/dummy/Makefile - plugins/utils/trimmer/Makefile - plugins/utils/muxer/Makefile - python-plugin-provider/Makefile - plugins/libctfcopytrace/Makefile - plugins/lttng-utils/Makefile - babeltrace.pc - babeltrace-ctf.pc +# CFLAGS from libraries (the glib ones are needed for the following sizeof +# test). +AM_CFLAGS="-fvisibility=hidden ${PTHREAD_CFLAGS} ${GLIB_CFLAGS} ${ASAN_CFLAGS} ${UBSAN_CFLAGS}" +AM_CXXFLAGS="-fvisibility=hidden -fvisibility-inlines-hidden ${PTHREAD_CFLAGS} ${GLIB_CFLAGS} ${ASAN_CXXFLAGS} ${UBSAN_CFLAGS}" +AM_LDFLAGS="${ASAN_LDFLAGS} ${UBSAN_CFLAGS}" + +# Check that the current size_t matches the size that glib thinks it should +# be. This catches problems on multi-arch where people try to do a 32-bit +# build while pointing at 64-bit glib headers. This is a common error because +# glib.h is not platform specific but it includes glibconfig.h which is and +# is usually installed in a non-standard path. + +# Do this before enabling all the warning flags, as the +# AC_LANG_PROGRAM-generated program may generate some warning, which makes this +# test fail unnecessarily. + +# Older versions of the pkg-config macros disallows PKG_* in the autoconf +# output. Specifically allow pkg_config_libdir to be able to print the +# error message. +m4_pattern_allow([PKG_CONFIG_LIBDIR]) + +save_CFLAGS=${CFLAGS} +CFLAGS="${CFLAGS} ${AM_CFLAGS}" +AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM([dnl +#include +#include + ], [dnl +G_STATIC_ASSERT(sizeof(size_t) == GLIB_SIZEOF_SIZE_T); + ]) +],[:],[ + AC_MSG_ERROR([dnl +sizeof(size_t) doesn't match GLIB_SIZEOF_SIZE_T. You probably need to set +PKG_CONFIG_LIBDIR to point to the right pkg-config files for your build +target. + ]) ]) +CFLAGS=${save_CFLAGS} -#AC_CONFIG_FILES([converter/babeltrace], [chmod +x converter/babeltrace]) -AC_CONFIG_FILES([tests/lib/test_ctf_writer_complete], [chmod +x tests/lib/test_ctf_writer_complete]) -AC_CONFIG_FILES([tests/lib/test_plugin_complete], [chmod +x tests/lib/test_plugin_complete]) -AC_CONFIG_FILES([tests/lib/test_dwarf_complete], [chmod +x tests/lib/test_dwarf_complete]) -AC_CONFIG_FILES([tests/lib/test_bin_info_complete], [chmod +x tests/lib/test_bin_info_complete]) - -AC_CONFIG_FILES([tests/plugins/test-utils-muxer-complete], [chmod +x tests/plugins/test-utils-muxer-complete]) - -AC_CONFIG_FILES([tests/cli/test_trace_read], [chmod +x tests/cli/test_trace_read]) -AC_CONFIG_FILES([tests/cli/test_trace_copy], [chmod +x tests/cli/test_trace_copy]) -AC_CONFIG_FILES([tests/cli/test_debug_info], [chmod +x tests/cli/test_debug_info]) -AC_CONFIG_FILES([tests/cli/test_trimmer], [chmod +x tests/cli/test_trimmer]) -AC_CONFIG_FILES([tests/cli/intersection/test_intersection], [chmod +x tests/cli/intersection/test_intersection]) -AC_CONFIG_FILES([tests/cli/test_convert_args], [chmod +x tests/cli/test_convert_args]) -AC_CONFIG_FILES([tests/cli/intersection/bt_python_helper.py]) -AC_CONFIG_FILES([tests/lib/writer/bt_python_helper.py]) -AC_CONFIG_FILES([tests/lib/writer/test_ctf_writer_empty_packet.py]) -AC_CONFIG_FILES([tests/lib/writer/test_ctf_writer_no_packet_context.py]) -AC_CONFIG_FILES([tests/cli/test_packet_seq_num], [chmod +x tests/cli/test_packet_seq_num]) - -AS_IF([test "x$enable_python" = "xyes"], [ - AC_CONFIG_FILES( - [tests/bindings/python/bt2/testall.sh], - [chmod +x tests/bindings/python/bt2/testall.sh] - ) +# Detect C and LD warning flags supported by the compiler. + +# Detect warning flags supported by the C and C++ compilers and append them to +# WARN_CFLAGS and WARN_CXXFLAGS. +# +m4_define([WARN_FLAGS_LIST], [ dnl + -Wall dnl + -Wextra dnl + -Wmissing-prototypes dnl + -Wmissing-declarations dnl + -Wnull-dereference dnl + -Wundef dnl + -Wredundant-decls dnl + -Wshadow dnl + dnl GCC's -Wshadow warns about constructor parameters shadowing fields, but + dnl Clang's does not. Enable Clang's `-Wshadow-field-in-constructor`, to make + dnl Clang warn about that. + -Wshadow-field-in-constructor dnl + -Wshadow-field dnl + -Wjump-misses-init dnl + -Wsuggest-attribute=format dnl + -Wtautological-constant-out-of-range-compare dnl + -Wnested-externs dnl + -Wwrite-strings dnl + -Wformat=2 dnl + -Wstrict-aliasing dnl + -Wmissing-noreturn dnl + -Winit-self dnl + -Wduplicated-cond dnl + -Wduplicated-branches dnl + -Wlogical-op dnl + -Wsuggest-override dnl + -Wno-sign-compare dnl + dnl + dnl Some versions of SWIG (like 3.0.12) generate code that produces + dnl -Wcast-function-type warnings. This warning is present in gcc >= 8. This + dnl combo happens on RHEL/Centos 8, for example. Later versions of SWIG (like + dnl 4.0.1) have the correct function signatures to not produce this warning. + dnl It's simpler to just disable the warning globally. + dnl + dnl Note that the Debian/Ubuntu SWIG package 3.0.12-2 contains a local patch to + dnl fix this (python-fix-function-cast-warnings.patch), so you won't be able to + dnl reproduce the warning using that package. + dnl + dnl Ref: https://github.com/swig/swig/issues/1259 + -Wno-cast-function-type dnl + -Wno-maybe-uninitialized dnl +]) + +# Pass -Werror as an extra flag during the test: this is needed to make the +# -Wunknown-warning-option diagnostic fatal with clang. +AC_LANG([C++]) +AX_APPEND_COMPILE_FLAGS([WARN_FLAGS_LIST], [WARN_CXXFLAGS], [-Werror]) +AC_LANG([C]) +AX_APPEND_COMPILE_FLAGS([WARN_FLAGS_LIST], [WARN_CFLAGS], [-Werror]) + +AE_IF_FEATURE_ENABLED([Werror], [WARN_CXXFLAGS="${WARN_CXXFLAGS} -Werror"]) +AE_IF_FEATURE_ENABLED([Werror], [WARN_CFLAGS="${WARN_CFLAGS} -Werror"]) + +# The test used in AX_APPEND_COMPILE_FLAGS, generated using AC_LANG_PROGRAM, is +# written in such a way that it triggers warnings with the following warning +# flags. So they would always end up disabled if we put them there, because +# the test program would not build. +# +# Enable them here unconditionally. They are supported by GCC >= 4.8 and by +# Clang >= 3.3 (required by the project) and are only valid for C code. +WARN_CFLAGS="${WARN_CFLAGS} -Wold-style-definition -Wstrict-prototypes" + +# CFLAGS from AX_APPEND_COMPILE_FLAGS. +AM_CXXFLAGS="${AM_CXXFLAGS} ${WARN_CXXFLAGS}" +AM_CFLAGS="${AM_CFLAGS} ${WARN_CFLAGS}" + +# Done for AM_CXXFLAGS, AM_CFLAGS and AM_LDFLAGS. +AC_SUBST(AM_CXXFLAGS) +AC_SUBST(AM_CFLAGS) +AC_SUBST(AM_LDFLAGS) + +# Set global CPPFLAGS in AM_CPPFLAGS +AM_CPPFLAGS="-I\$(top_srcdir)/include -I\$(top_builddir)/src -I\$(top_srcdir)/src -include common/config.h" +AC_SUBST(AM_CPPFLAGS) + +# Add glib to global link libs +LIBS="$LIBS $GLIB_LIBS" + +# Disable exceptions for the {fmt} library. This means, for example, that a +# format error will result in an assertion failure (instead of throwing an +# `fmt::format_error` exception). +AC_DEFINE_UNQUOTED([FMT_EXCEPTIONS], 0, [Disable {fmt} exceptions.]) + +# Abuse autoconf's AC_ARG_PROGRAM output variable 'program_transform_name' +# to rename babeltrace2.bin to babeltrace2 at install time. +program_transform_name="s&babeltrace2\.bin&babeltrace2&;$program_transform_name" +AC_SUBST(program_transform_name) + +AC_CONFIG_FILES([ + doc/api/libbabeltrace2/Doxyfile + doc/api/libbabeltrace2/Makefile + doc/bindings/python/Makefile + doc/Makefile + doc/man/asciidoc-attrs.conf + doc/man/Makefile + include/Makefile + Makefile + src/babeltrace2-ctf-writer.pc + src/babeltrace2.pc + src/bindings/python/bt2/bt2/version.py + src/bindings/python/bt2/Makefile + src/bindings/python/bt2/setup.py + src/cli/Makefile + src/Makefile + tests/bitfield/Makefile + tests/ctf-writer/Makefile + tests/lib/Makefile + tests/Makefile + tests/param-validation/Makefile + tests/plugins/Makefile + tests/plugins/src.ctf.fs/Makefile + tests/plugins/src.ctf.fs/succeed/Makefile + tests/plugins/sink.ctf.fs/Makefile + tests/plugins/sink.ctf.fs/succeed/Makefile + tests/plugins/flt.lttng-utils.debug-info/Makefile + tests/plugins/flt.utils.muxer/Makefile + tests/plugins/flt.utils.muxer/succeed/Makefile + tests/plugins/flt.utils.trimmer/Makefile + tests/plugins/sink.text.pretty/Makefile + tests/utils/env.sh + tests/utils/Makefile + tests/utils/tap/Makefile ]) AC_OUTPUT @@ -570,20 +855,36 @@ PPRINT_SET_INDENT(1) PPRINT_SET_TS(38) AS_ECHO -AS_ECHO("${PPRINT_COLOR_BLDBLU}Babeltrace $PACKAGE_VERSION$PPRINT_COLOR_RST") + +AS_IF([test -n "bt_version_name"], [ + AS_ECHO("${PPRINT_COLOR_BLDBLU}Babeltrace $PACKAGE_VERSION \"bt_version_name\"$PPRINT_COLOR_RST") +], [ + AS_ECHO("${PPRINT_COLOR_BLDBLU}Babeltrace $PACKAGE_VERSION") +]) + AS_ECHO +AS_IF([test -n "bt_version_description"], [ + AS_IF([test -n "$FOLD"], [ + AS_ECHO("`AS_ECHO("bt_version_description") | $FOLD -s`") + ], [ + AS_ECHO("bt_version_description") + ]) + + AS_ECHO +]) + PPRINT_SUBTITLE([System]) # Target architecture we're building for. target_arch=$host_cpu [ for f in $CFLAGS; do - if test $f = "-m32"; then - target_arch="32-bit" - elif test $f = "-m64"; then - target_arch="64-bit" - fi + if test $f = "-m32"; then + target_arch="32-bit" + elif test $f = "-m64"; then + target_arch="64-bit" + fi done ] @@ -591,54 +892,93 @@ PPRINT_PROP_STRING([Target architecture], $target_arch) AS_ECHO PPRINT_SUBTITLE([Python 3 language support]) +test "x$have_python" = "xyes" && value=1 || value=0 +PPRINT_PROP_BOOL([Have Python interpreter], $value) +test "x$have_python_dev" = "xyes" && value=1 || value=0 +PPRINT_PROP_BOOL([Have Python development libraries], $value) test "x$enable_python_bindings" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Python bindings], $value) +PPRINT_PROP_BOOL_CUSTOM([Python bindings], $value, [To enable, use --enable-python-bindings]) test "x$enable_python_plugins" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Python plugin support], $value) -AS_IF([test "x$enable_python_bindings" = "xyes" || test "x$enable_python_plugins" = "xyes"], [ +PPRINT_PROP_BOOL_CUSTOM([Python plugin support], $value, [To enable, use --enable-python-plugins]) +AS_IF([test "x$have_python" = "xyes"], [ + PPRINT_PROP_STRING([Python interpreter path], [$PYTHON]) +]) +AS_IF([test "x$have_python_dev" = "xyes"], [ + PPRINT_PROP_STRING([python-config path], [$PYTHON_CONFIG]) PPRINT_PROP_STRING([Python include paths], [$PYTHON_INCLUDE]) - PPRINT_PROP_STRING([Python libraries], [$PYTHON_LIBS]) + PPRINT_PROP_STRING([Python linker flags], [$PYTHON_LDFLAGS]) +]) +AE_IF_FEATURE_ENABLED([python-bindings], [ + PPRINT_PROP_STRING([SWIG executable], [$SWIG]) + PPRINT_PROP_STRING([SWIG library], [$SWIG_LIB]) ]) AS_ECHO PPRINT_SUBTITLE([Plugins]) PPRINT_PROP_BOOL(['ctf' plugin], 1) -test "x$_enable_debug_info" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL(['lttng-utils' plugin], $value) +test "x$enable_debug_info" = "xyes" && value=1 || value=0 +PPRINT_PROP_BOOL_CUSTOM(['lttng-utils' plugin], $value, [To enable, use --enable-debug-info]) PPRINT_PROP_BOOL(['text' plugin], 1) PPRINT_PROP_BOOL(['utils' plugin], 1) AS_ECHO PPRINT_SUBTITLE([Built-in features]) -test "x$built_in_plugins" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Built-in plugins], $value) -test "x$built_in_python_plugin_support" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Built-in Python plugin support], $value) +test "x$enable_built_in_plugins" = "xyes" && value=1 || value=0 +PPRINT_PROP_BOOL_CUSTOM([Built-in plugins], $value, [To enable, use --enable-built-in-plugins]) +test "x$enable_built_in_python_plugin_support" = "xyes" && value=1 || value=0 +PPRINT_PROP_BOOL_CUSTOM([Built-in Python plugin support], $value, [To enable, use --enable-built-in-python-plugin-support]) AS_ECHO PPRINT_SUBTITLE([Documentation]) + +# man pages build enabled/disabled +m4_pushdef([build_man_pages_msg], [Build and install man pages]) + +AE_IF_FEATURE_ENABLED([man-pages], [ + AE_IF_IN_GIT_REPO([ + PPRINT_PROP_BOOL([build_man_pages_msg], 1) + ], [ + AS_IF([test "x$have_asciidoc_xmlto" = "xyes"], [ + PPRINT_PROP_BOOL([build_man_pages_msg], 1) + ], [ + PPRINT_PROP_STRING([build_man_pages_msg], + [${PPRINT_COLOR_BLDGRN}yes (already built)], + $PPRINT_COLOR_SUBTITLE) + ]) + ]) +], [ + PPRINT_PROP_BOOL_CUSTOM([build_man_pages_msg], 0, [To build man pages, use --enable-man-pages]) +]) + +m4_popdef([build_man_pages_msg]) + test "x$enable_api_doc" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([HTML API documentation], $value) +PPRINT_PROP_BOOL_CUSTOM([HTML API documentation], $value, [To build documentation, use --enable-api-doc]) test "x$enable_python_bindings_doc" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Python bindings documentation], $value) +PPRINT_PROP_BOOL_CUSTOM([Python bindings documentation], $value, [To build the Python bindings documentation, use --enable-python-bindings-doc]) AS_ECHO PPRINT_SUBTITLE([Logging]) PPRINT_PROP_STRING([Minimal log level], $BABELTRACE_MINIMAL_LOG_LEVEL) AS_ECHO -PPRINT_SUBTITLE([Testing]) -test "x$enable_python_bindings_tests" = "xyes" && value=1 || value=0 -PPRINT_PROP_BOOL([Python bindings tests], $value) +PPRINT_SUBTITLE([Special build modes]) +PPRINT_PROP_BOOL_CUSTOM([Debug mode], $BABELTRACE_DEBUG_MODE, [To enable, set the BABELTRACE_DEBUG_MODE environment variable to 1]) +PPRINT_PROP_BOOL_CUSTOM([Developer mode], $BABELTRACE_DEV_MODE, [To enable, set the BABELTRACE_DEV_MODE environment variable to 1]) report_bindir="`eval eval echo $bindir`" report_libdir="`eval eval echo $libdir`" report_sysconfdif="`eval eval echo $sysconfdir`" +report_pluginsdir="`eval eval eval echo $BABELTRACE_PLUGINS_DIR`" +report_pluginprovidersdir="`eval eval eval echo $BABELTRACE_PLUGIN_PROVIDERS_DIR`" # Print the bindir and libdir this `make install' will install into. AS_ECHO PPRINT_SUBTITLE([Install directories]) PPRINT_PROP_STRING([Binaries], [$report_bindir]) PPRINT_PROP_STRING([Libraries], [$report_libdir]) -PPRINT_PROP_STRING([Plugins], [$report_libdir/babeltrace/plugins]) +PPRINT_PROP_STRING([Plugins], [$report_pluginsdir]) +PPRINT_PROP_STRING([Plugin providers], [$report_pluginprovidersdir]) PPRINT_PROP_STRING([Configuration], [$report_sysconfdif]) + +# vim: shiftwidth=2 softtabstop=2 expandtab