From b14c7bf11ddef302870c4d1abf86d3a98f74cb08 Mon Sep 17 00:00:00 2001 From: Michael Jeanson Date: Wed, 10 Jul 2019 11:57:36 -0400 Subject: [PATCH] Make the Python plugin provider a libtool module The Python plugin provider is currently built as a library with an ABI number and installed in the libdir. It is however not a library, it does not provide a public API, no program should link to it and we load it with g_module which is basically a wrapper over dlopen. As such, build it as libtool "module" installed in the "plugin-providers" subdirectory which is not part of the library search path. Add an env variable 'LIBBABELTRACE2_PLUGIN_PROVIDER_DIR' that if is set will override the builtin path to load the provider. Change-Id: If475a89733c21f87d6a647e281326c13532a3d3d Signed-off-by: Michael Jeanson Reviewed-on: https://review.lttng.org/c/babeltrace/+/1682 Reviewed-by: Philippe Proulx Tested-by: jenkins --- configure.ac | 6 +++++ src/lib/Makefile.am | 2 +- src/lib/plugin/Makefile.am | 2 ++ src/lib/plugin/plugin.c | 31 +++++++++++++++++++++----- src/python-plugin-provider/Makefile.am | 13 ++++++----- tests/utils/utils.sh | 12 ++++++---- 6 files changed, 50 insertions(+), 16 deletions(-) diff --git a/configure.ac b/configure.ac index f745ef23..74993c1d 100644 --- a/configure.ac +++ b/configure.ac @@ -340,6 +340,10 @@ AC_ARG_VAR([PYTHON_CONFIG], [Path to python-config]) 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']) +# 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']) + # 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"]) @@ -840,6 +844,7 @@ 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 @@ -847,4 +852,5 @@ PPRINT_SUBTITLE([Install directories]) PPRINT_PROP_STRING([Binaries], [$report_bindir]) PPRINT_PROP_STRING([Libraries], [$report_libdir]) PPRINT_PROP_STRING([Plugins], [$report_pluginsdir]) +PPRINT_PROP_STRING([Plugin providers], [$report_pluginprovidersdir]) PPRINT_PROP_STRING([Configuration], [$report_sysconfdif]) diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 319f0fcc..bebdb297 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -34,5 +34,5 @@ libbabeltrace2_la_LIBADD = \ $(top_builddir)/src/compat/libcompat.la if ENABLE_BUILT_IN_PYTHON_PLUGIN_SUPPORT -libbabeltrace2_la_LIBADD += $(top_builddir)/src/python-plugin-provider/libbabeltrace2-python-plugin-provider.la +libbabeltrace2_la_LIBADD += $(top_builddir)/src/python-plugin-provider/babeltrace2-python-plugin-provider.la endif diff --git a/src/lib/plugin/Makefile.am b/src/lib/plugin/Makefile.am index d3133dd8..5b9aed45 100644 --- a/src/lib/plugin/Makefile.am +++ b/src/lib/plugin/Makefile.am @@ -1,3 +1,5 @@ +AM_CPPFLAGS += '-DBABELTRACE_PLUGIN_PROVIDERS_DIR="$(BABELTRACE_PLUGIN_PROVIDERS_DIR)"' + noinst_LTLIBRARIES = libplugin.la # Plug-in system library diff --git a/src/lib/plugin/plugin.c b/src/lib/plugin/plugin.c index 911f7bcf..8f2f6da3 100644 --- a/src/lib/plugin/plugin.c +++ b/src/lib/plugin/plugin.c @@ -49,7 +49,8 @@ #include "plugin-so.h" #include "lib/func-status.h" -#define PYTHON_PLUGIN_PROVIDER_FILENAME "libbabeltrace2-python-plugin-provider." G_MODULE_SUFFIX +#define PYTHON_PLUGIN_PROVIDER_FILENAME "babeltrace2-python-plugin-provider." G_MODULE_SUFFIX +#define PYTHON_PLUGIN_PROVIDER_DIR BABELTRACE_PLUGIN_PROVIDERS_DIR #define PYTHON_PLUGIN_PROVIDER_SYM_NAME bt_plugin_python_create_all_from_file #define PYTHON_PLUGIN_PROVIDER_SYM_NAME_STR G_STRINGIFY(PYTHON_PLUGIN_PROVIDER_SYM_NAME) @@ -79,14 +80,32 @@ int (*bt_plugin_python_create_all_from_file_sym)( static int init_python_plugin_provider(void) { int status = BT_FUNC_STATUS_OK; + const char *provider_dir_envvar; + static const char * const provider_dir_envvar_name = "LIBBABELTRACE2_PLUGIN_PROVIDER_DIR"; + char *provider_path = NULL; if (bt_plugin_python_create_all_from_file_sym != NULL) { goto end; } BT_LOGI_STR("Loading Python plugin provider module."); - python_plugin_provider_module = - g_module_open(PYTHON_PLUGIN_PROVIDER_FILENAME, 0); + + provider_dir_envvar = getenv(provider_dir_envvar_name); + if (provider_dir_envvar) { + provider_path = g_build_filename(provider_dir_envvar, + PYTHON_PLUGIN_PROVIDER_FILENAME, NULL); + BT_LOGI("Using `%s` environment variable to find the Python " + "plugin provider: path=\"%s\"", provider_dir_envvar_name, + provider_path); + } else { + provider_path = g_build_filename(PYTHON_PLUGIN_PROVIDER_DIR, + PYTHON_PLUGIN_PROVIDER_FILENAME, NULL); + BT_LOGI("Using default path (`%s` environment variable is not " + "set) to find the Python plugin provider: path=\"%s\"", + provider_dir_envvar_name, provider_path); + } + + python_plugin_provider_module = g_module_open(provider_path, 0); if (!python_plugin_provider_module) { /* * This is not an error. The whole point of having an @@ -94,7 +113,7 @@ int init_python_plugin_provider(void) { * missing and the Babeltrace library still works. */ BT_LOGI("Cannot open `%s`: %s: continuing without Python plugin support.", - PYTHON_PLUGIN_PROVIDER_FILENAME, g_module_error()); + provider_path, g_module_error()); goto end; } @@ -111,7 +130,7 @@ int init_python_plugin_provider(void) { "%s: continuing without Python plugin support: " "file=\"%s\", symbol=\"%s\"", g_module_error(), - PYTHON_PLUGIN_PROVIDER_FILENAME, + provider_path, PYTHON_PLUGIN_PROVIDER_SYM_NAME_STR); status = BT_FUNC_STATUS_ERROR; goto end; @@ -121,6 +140,8 @@ int init_python_plugin_provider(void) { python_plugin_provider_module); end: + g_free(provider_path); + return status; } diff --git a/src/python-plugin-provider/Makefile.am b/src/python-plugin-provider/Makefile.am index bc3f37d5..dfd489ed 100644 --- a/src/python-plugin-provider/Makefile.am +++ b/src/python-plugin-provider/Makefile.am @@ -1,23 +1,24 @@ if ENABLE_PYTHON_PLUGINS AM_CPPFLAGS += $(PYTHON_INCLUDE) -lib_LTLIBRARIES = libbabeltrace2-python-plugin-provider.la +pluginproviderdir = "$(BABELTRACE_PLUGIN_PROVIDERS_DIR)" +pluginprovider_LTLIBRARIES = babeltrace2-python-plugin-provider.la -libbabeltrace2_python_plugin_provider_la_SOURCES = \ +babeltrace2_python_plugin_provider_la_SOURCES = \ python-plugin-provider.c \ python-plugin-provider.h -libbabeltrace2_python_plugin_provider_la_LDFLAGS = \ +babeltrace2_python_plugin_provider_la_LDFLAGS = \ $(LT_NO_UNDEFINED) \ - -version-info $(BABELTRACE_LIBRARY_VERSION) \ + -avoid-version -module \ $(PYTHON_LDFLAGS) -libbabeltrace2_python_plugin_provider_la_LIBADD = +babeltrace2_python_plugin_provider_la_LIBADD = # Link the Python plugin provider library with libbabeltrace2 # when it's not built-in the babeltrace2 executable. if !ENABLE_BUILT_IN_PLUGINS -libbabeltrace2_python_plugin_provider_la_LIBADD += \ +babeltrace2_python_plugin_provider_la_LIBADD += \ $(top_builddir)/src/logging/libbabeltrace2-logging.la \ $(top_builddir)/src/common/libbabeltrace2-common.la \ $(top_builddir)/src/py-common/libbabeltrace2-py-common.la \ diff --git a/tests/utils/utils.sh b/tests/utils/utils.sh index f7384c25..487d7e7e 100644 --- a/tests/utils/utils.sh +++ b/tests/utils/utils.sh @@ -91,6 +91,10 @@ if [ "x${BT_TESTS_BABELTRACE_PLUGIN_PATH:-}" = "x" ]; then BT_TESTS_BABELTRACE_PLUGIN_PATH="${BT_PLUGINS_PATH}/ctf:${BT_PLUGINS_PATH}/utils:${BT_PLUGINS_PATH}/text" fi +if [ "x${BT_TESTS_PROVIDER_DIR:-}" = "x" ]; then + BT_TESTS_PROVIDER_DIR="${BT_TESTS_BUILDDIR}/../src/python-plugin-provider/.libs" +fi + # Allow overriding the babeltrace2 executables if [ "x${BT_TESTS_PYTHONPATH:-}" = "x" ]; then BT_TESTS_PYTHONPATH="${BT_TESTS_BUILDDIR}/../src/bindings/python/bt2/build/build_lib" @@ -221,24 +225,24 @@ run_python_bt2() { local lib_search_var local lib_search_path - local python_provider_path="${BT_TESTS_BUILDDIR}/../src/python-plugin-provider/.libs" local main_lib_path="${BT_TESTS_BUILDDIR}/../src/lib/.libs" # Set the library search path so the python interpreter can load libbabeltrace2 if [ "$BT_OS_TYPE" = "mingw" ]; then lib_search_var="PATH" - lib_search_path="${python_provider_path}:${main_lib_path}:${PATH:-}" + lib_search_path="${main_lib_path}:${PATH:-}" elif [ "$BT_OS_TYPE" = "darwin" ]; then lib_search_var="DYLD_LIBRARY_PATH" - lib_search_path="${python_provider_path}:${main_lib_path}:${DYLD_LIBRARY_PATH:-}" + lib_search_path="${main_lib_path}:${DYLD_LIBRARY_PATH:-}" else lib_search_var="LD_LIBRARY_PATH" - lib_search_path="${python_provider_path}:${main_lib_path}:${LD_LIBRARY_PATH:-}" + lib_search_path="${main_lib_path}:${LD_LIBRARY_PATH:-}" fi env \ BABELTRACE_PYTHON_BT2_NO_TRACEBACK=1 \ BABELTRACE_PLUGIN_PATH="${BT_TESTS_BABELTRACE_PLUGIN_PATH}" \ + LIBBABELTRACE2_PLUGIN_PROVIDER_DIR=${BT_TESTS_PROVIDER_DIR} \ BT_CTF_TRACES_PATH="${BT_CTF_TRACES_PATH}" \ BT_PLUGINS_PATH="${BT_PLUGINS_PATH}" \ PYTHONPATH="${BT_TESTS_PYTHONPATH}:${BT_TESTS_SRCDIR}/utils/python" \ -- 2.34.1