The backends are now installed in lib/libweston-0, and the include files that will be used by libweston in include/libweston-0. The other modules and weston-specific include files are kept in the old paths. A new load_weston_module() is added to load plugins in the old path, which is not part of libweston, but weston only and defined in main.c. To allow that to be used by out of tree weston plugins, the function is declared in a new weston.h, installed in include/weston.
The -0 in the paths is the abi version of libweston, and it will be used by the libweston .so too. When the abi change the number will be increased. Signed-off-by: Giulio Camuffo <giuliocamu...@gmail.com> --- v2: - don't remove MODULEDIR - keep systemd-notify with the main.c side - rename the new load function to load_weston_plugin Makefile.am | 24 +++++++++++++++--------- configure.ac | 2 ++ ivi-shell/ivi-layout.c | 3 ++- src/compositor.c | 2 +- src/main.c | 47 ++++++++++++++++++++++++++++++++++++++++++++++- src/weston.h | 3 +++ src/weston.pc.in | 2 +- 7 files changed, 70 insertions(+), 13 deletions(-) diff --git a/Makefile.am b/Makefile.am index 2f81ec0..e90b3ba 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5,6 +5,8 @@ noinst_PROGRAMS = libexec_PROGRAMS = moduledir = $(libdir)/weston module_LTLIBRARIES = +libweston_moduledir = $(libdir)/libweston-${LIBWESTON_ABI_VERSION} +libweston_module_LTLIBRARIES = noinst_LTLIBRARIES = BUILT_SOURCES = @@ -50,6 +52,7 @@ AM_CPPFLAGS = \ -I$(top_builddir)/protocol \ -DDATADIR='"$(datadir)"' \ -DMODULEDIR='"$(moduledir)"' \ + -DLIBWESTON_MODULEDIR='"$(libweston_moduledir)"' \ -DLIBEXECDIR='"$(libexecdir)"' \ -DBINDIR='"$(bindir)"' @@ -213,8 +216,8 @@ pkgconfig_DATA = src/weston.pc wayland_sessiondir = $(datadir)/wayland-sessions dist_wayland_session_DATA = src/weston.desktop -westonincludedir = $(includedir)/weston -westoninclude_HEADERS = \ +libwestonincludedir = $(includedir)/libweston-${LIBWESTON_ABI_VERSION} +libwestoninclude_HEADERS = \ src/version.h \ src/compositor.h \ src/compositor-drm.h \ @@ -229,13 +232,16 @@ westoninclude_HEADERS = \ shared/zalloc.h \ shared/platform.h +westonincludedir = $(includedir)/weston +westoninclude_HEADERS = src/weston.h + if ENABLE_IVI_SHELL westoninclude_HEADERS += \ ivi-shell/ivi-layout-export.h endif if ENABLE_EGL -module_LTLIBRARIES += gl-renderer.la +libweston_module_LTLIBRARIES += gl-renderer.la gl_renderer_la_LDFLAGS = -module -avoid-version gl_renderer_la_LIBADD = $(COMPOSITOR_LIBS) $(EGL_LIBS) gl_renderer_la_CFLAGS = \ @@ -252,7 +258,7 @@ gl_renderer_la_SOURCES = \ endif if ENABLE_X11_COMPOSITOR -module_LTLIBRARIES += x11-backend.la +libweston_module_LTLIBRARIES += x11-backend.la x11_backend_la_LDFLAGS = -module -avoid-version x11_backend_la_LIBADD = $(COMPOSITOR_LIBS) $(X11_COMPOSITOR_LIBS) \ libshared-cairo.la @@ -278,7 +284,7 @@ INPUT_BACKEND_SOURCES = \ shared/helpers.h if ENABLE_DRM_COMPOSITOR -module_LTLIBRARIES += drm-backend.la +libweston_module_LTLIBRARIES += drm-backend.la drm_backend_la_LDFLAGS = -module -avoid-version drm_backend_la_LIBADD = \ $(COMPOSITOR_LIBS) \ @@ -309,7 +315,7 @@ endif endif if ENABLE_WAYLAND_COMPOSITOR -module_LTLIBRARIES += wayland-backend.la +libweston_module_LTLIBRARIES += wayland-backend.la wayland_backend_la_LDFLAGS = -module -avoid-version wayland_backend_la_LIBADD = \ $(COMPOSITOR_LIBS) \ @@ -366,7 +372,7 @@ endif endif if ENABLE_HEADLESS_COMPOSITOR -module_LTLIBRARIES += headless-backend.la +libweston_module_LTLIBRARIES += headless-backend.la headless_backend_la_LDFLAGS = -module -avoid-version headless_backend_la_LIBADD = $(COMPOSITOR_LIBS) libshared.la headless_backend_la_CFLAGS = $(COMPOSITOR_CFLAGS) $(AM_CFLAGS) @@ -377,7 +383,7 @@ headless_backend_la_SOURCES = \ endif if ENABLE_FBDEV_COMPOSITOR -module_LTLIBRARIES += fbdev-backend.la +libweston_module_LTLIBRARIES += fbdev-backend.la fbdev_backend_la_LDFLAGS = -module -avoid-version fbdev_backend_la_LIBADD = \ $(COMPOSITOR_LIBS) \ @@ -399,7 +405,7 @@ fbdev_backend_la_SOURCES = \ endif if ENABLE_RDP_COMPOSITOR -module_LTLIBRARIES += rdp-backend.la +libweston_module_LTLIBRARIES += rdp-backend.la rdp_backend_la_LDFLAGS = -module -avoid-version rdp_backend_la_LIBADD = $(COMPOSITOR_LIBS) \ $(RDP_COMPOSITOR_LIBS) \ diff --git a/configure.ac b/configure.ac index 87e67fe..1ee3265 100644 --- a/configure.ac +++ b/configure.ac @@ -3,6 +3,7 @@ m4_define([weston_minor_version], [11]) m4_define([weston_micro_version], [90]) m4_define([weston_version], [weston_major_version.weston_minor_version.weston_micro_version]) +m4_define([libweston_abi_version], [0]) AC_PREREQ([2.64]) AC_INIT([weston], @@ -17,6 +18,7 @@ AC_SUBST([WESTON_VERSION_MAJOR], [weston_major_version]) AC_SUBST([WESTON_VERSION_MINOR], [weston_minor_version]) AC_SUBST([WESTON_VERSION_MICRO], [weston_micro_version]) AC_SUBST([WESTON_VERSION], [weston_version]) +AC_SUBST([LIBWESTON_ABI_VERSION], [libweston_abi_version]) AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_HEADERS([config.h]) diff --git a/ivi-shell/ivi-layout.c b/ivi-shell/ivi-layout.c index 9661378..445322b 100644 --- a/ivi-shell/ivi-layout.c +++ b/ivi-shell/ivi-layout.c @@ -60,6 +60,7 @@ #include <string.h> #include <assert.h> +#include "weston.h" #include "compositor.h" #include "ivi-shell.h" #include "ivi-layout-export.h" @@ -2071,7 +2072,7 @@ load_controller_modules(struct weston_compositor *compositor, const char *module end = strchrnul(p, ','); snprintf(buffer, sizeof buffer, "%.*s", (int)(end - p), p); - controller_module_init = weston_load_module(buffer, "controller_module_init"); + controller_module_init = load_weston_plugin(buffer, "controller_module_init"); if (!controller_module_init) return -1; diff --git a/src/compositor.c b/src/compositor.c index 2ec2f18..3904ef0 100644 --- a/src/compositor.c +++ b/src/compositor.c @@ -4791,7 +4791,7 @@ weston_load_module(const char *name, const char *entrypoint) if (builddir) snprintf(path, sizeof path, "%s/.libs/%s", builddir, name); else - snprintf(path, sizeof path, "%s/%s", MODULEDIR, name); + snprintf(path, sizeof path, "%s/%s", LIBWESTON_MODULEDIR, name); } else { snprintf(path, sizeof path, "%s", name); } diff --git a/src/main.c b/src/main.c index 2ecb4d9..e6776c6 100644 --- a/src/main.c +++ b/src/main.c @@ -40,12 +40,14 @@ #include <sys/socket.h> #include <libinput.h> #include <sys/time.h> +#include <linux/limits.h> #ifdef HAVE_LIBUNWIND #define UNW_LOCAL_ONLY #include <libunwind.h> #endif +#include "weston.h" #include "compositor.h" #include "../shared/os-compatibility.h" #include "../shared/helpers.h" @@ -705,6 +707,49 @@ weston_create_listening_socket(struct wl_display *display, const char *socket_na return 0; } +WL_EXPORT void * +load_weston_plugin(const char *name, const char *entrypoint) +{ + const char *builddir = getenv("WESTON_BUILD_DIR"); + char path[PATH_MAX]; + void *module, *init; + + if (name == NULL) + return NULL; + + if (name[0] != '/') { + if (builddir) + snprintf(path, sizeof path, "%s/.libs/%s", builddir, name); + else + snprintf(path, sizeof path, "%s/%s", MODULEDIR, name); + } else { + snprintf(path, sizeof path, "%s", name); + } + + module = dlopen(path, RTLD_NOW | RTLD_NOLOAD); + if (module) { + weston_log("Module '%s' already loaded\n", path); + dlclose(module); + return NULL; + } + + weston_log("Loading module '%s'\n", path); + module = dlopen(path, RTLD_NOW); + if (!module) { + weston_log("Failed to load module: %s\n", dlerror()); + return NULL; + } + + init = dlsym(module, entrypoint); + if (!init) { + weston_log("Failed to lookup init function: %s\n", dlerror()); + dlclose(module); + return NULL; + } + + return init; +} + static int load_modules(struct weston_compositor *ec, const char *modules, int *argc, char *argv[]) @@ -721,7 +766,7 @@ load_modules(struct weston_compositor *ec, const char *modules, while (*p) { end = strchrnul(p, ','); snprintf(buffer, sizeof buffer, "%.*s", (int) (end - p), p); - module_init = weston_load_module(buffer, "module_init"); + module_init = load_weston_plugin(buffer, "module_init"); if (!module_init) return -1; if (module_init(ec, argc, argv) < 0) diff --git a/src/weston.h b/src/weston.h index cd58020..080253f 100644 --- a/src/weston.h +++ b/src/weston.h @@ -60,6 +60,9 @@ weston_watch_process(struct weston_process *process); struct weston_config * weston_get_config(struct weston_compositor *compositor); +void * +load_weston_plugin(const char *name, const char *entrypoint); + #ifdef __cplusplus } #endif diff --git a/src/weston.pc.in b/src/weston.pc.in index c560eb3..f2ffc9e 100644 --- a/src/weston.pc.in +++ b/src/weston.pc.in @@ -9,4 +9,4 @@ Name: Weston Plugin API Description: Header files for Weston plugin development Version: @WESTON_VERSION@ Requires.private: wayland-server pixman-1 xkbcommon -Cflags: -I${includedir} +Cflags: -I${includedir}/weston -I{includedir}/libweston-@LIBWESTON_ABI_VERSION@ -- 2.8.3 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/wayland-devel