Make the Python plugin provider a libtool module
authorMichael Jeanson <mjeanson@efficios.com>
Wed, 10 Jul 2019 15:57:36 +0000 (11:57 -0400)
committerPhilippe Proulx <eeppeliteloop@gmail.com>
Thu, 11 Jul 2019 18:48:30 +0000 (14:48 -0400)
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 <mjeanson@efficios.com>
Reviewed-on: https://review.lttng.org/c/babeltrace/+/1682
Reviewed-by: Philippe Proulx <eeppeliteloop@gmail.com>
Tested-by: jenkins <jenkins@lttng.org>
configure.ac
src/lib/Makefile.am
src/lib/plugin/Makefile.am
src/lib/plugin/plugin.c
src/python-plugin-provider/Makefile.am
tests/utils/utils.sh

index f745ef2341d9e10669eaf06227151b962d6fd450..74993c1d42456d7930fd53407344e0ca883c2981 100644 (file)
@@ -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])
index 319f0fccf506d329523955eee8af44ae05805f44..bebdb2977dbb35e23217ed06c588558b4500ecaa 100644 (file)
@@ -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
index d3133dd8d38f55e052f6af9957902a064db42732..5b9aed453d8d3e472cde650e99873a3dc8fb89b8 100644 (file)
@@ -1,3 +1,5 @@
+AM_CPPFLAGS += '-DBABELTRACE_PLUGIN_PROVIDERS_DIR="$(BABELTRACE_PLUGIN_PROVIDERS_DIR)"'
+
 noinst_LTLIBRARIES = libplugin.la
 
 # Plug-in system library
index 911f7bcf9a67d11b790826ffa44d4db05798d469..8f2f6da347cb38792b108ed1c8ee3d6cb8c75dbf 100644 (file)
@@ -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;
 }
 
index bc3f37d58eddb32ecc999a09194a115ccf33816b..dfd489ed083fe1ffe31404b7bbe86f56d8b11d8f 100644 (file)
@@ -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 \
index f7384c2562595e41eb68b62caf7645e4741faf38..487d7e7e09a92929e746cfeec53734ca7c67091c 100644 (file)
@@ -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" \
This page took 0.029382 seconds and 4 git commands to generate.