configure.ac: Make libdrm optional in weston-launch

If libdrm is available, weston-launch and launcer-util.c will support
getting the drm device and setting and dropping drm master, otherwise
we'll only support getting input devices.
dev
Kristian Høgsberg 11 years ago
parent 89eebb7ceb
commit d2c9d8af50
  1. 10
      configure.ac
  2. 15
      src/Makefile.am
  3. 76
      src/launcher-util.c
  4. 22
      src/weston-launch.c
  5. 1
      tests/Makefile.am

@ -102,6 +102,8 @@ if test x$enable_xwayland = xyes; then
fi
fi
PKG_CHECK_MODULES(LIBDRM, [libdrm],
[AC_DEFINE(HAVE_LIBDRM, 1, [Define if libdrm is available]) have_libdrm=yes], have_libdrm=no)
AC_ARG_ENABLE(x11-compositor, [ --enable-x11-compositor],,
enable_x11_compositor=yes)
@ -145,9 +147,6 @@ AM_CONDITIONAL(ENABLE_DRM_COMPOSITOR, test x$enable_drm_compositor = xyes -a x$e
if test x$enable_drm_compositor = xyes -a x$enable_egl = xyes; then
AC_DEFINE([BUILD_DRM_COMPOSITOR], [1], [Build the DRM compositor])
PKG_CHECK_MODULES(DRM_COMPOSITOR, [libudev >= 136 libdrm >= 2.4.30 gbm mtdev >= 1.1.0])
# For libdrm usage in launcher-util.c
COMPOSITOR_MODULES="$COMPOSITOR_MODULES libdrm"
fi
PKG_CHECK_MODULES(COMPOSITOR, [$COMPOSITOR_MODULES])
@ -332,13 +331,12 @@ AS_IF([test "x$have_systemd_login_209" = "xyes"],
AC_ARG_ENABLE(weston-launch, [ --enable-weston-launch],, enable_weston_launch=yes)
AM_CONDITIONAL(BUILD_WESTON_LAUNCH, test x$enable_weston_launch == xyes)
if test x$enable_weston_launch == xyes; then
PKG_CHECK_MODULES(WESTON_LAUNCH, [libdrm])
AC_CHECK_LIB([pam], [pam_open_session], [have_pam=yes], [have_pam=no])
if test x$have_pam == xno; then
AC_ERROR([weston-launch requires pam])
fi
WESTON_LAUNCH_LIBS="$WESTON_LAUNCH_LIBS -lpam"
PAM_LIBS=-lpam
AC_SUBST(PAM_LIBS)
fi
if test x$enable_egl = xyes; then

@ -80,10 +80,13 @@ DIST_SUBDIRS = xwayland
if BUILD_WESTON_LAUNCH
weston_launch = weston-launch
weston_launch_SOURCES = weston-launch.c weston-launch.h
weston_launch_CFLAGS= $(GCC_CFLAGS)
weston_launch_CPPFLAGS = $(WESTON_LAUNCH_CFLAGS) $(SYSTEMD_LOGIN_CFLAGS) \
-DBINDIR='"$(bindir)"'
weston_launch_LDADD = $(WESTON_LAUNCH_LIBS) $(SYSTEMD_LOGIN_LIBS)
weston_launch_CPPFLAGS = -DBINDIR='"$(bindir)"'
weston_launch_CFLAGS= \
$(GCC_CFLAGS) \
$(PAM_CFLAGS) \
$(SYSTEMD_LOGIN_CFLAGS) \
$(LIBDRM_CFLAGS)
weston_launch_LDADD = $(PAM_LIBS) $(SYSTEMD_LOGIN_LIBS) $(LIBDRM_LIBS)
if ENABLE_SETUID_INSTALL
install-exec-hook:
@ -206,11 +209,13 @@ rpi_backend_la_LDFLAGS = -module -avoid-version
rpi_backend_la_LIBADD = $(COMPOSITOR_LIBS) \
$(RPI_COMPOSITOR_LIBS) \
$(RPI_BCM_HOST_LIBS) \
$(LIBDRM_LIBS) \
../shared/libshared.la
rpi_backend_la_CFLAGS = \
$(GCC_CFLAGS) \
$(COMPOSITOR_CFLAGS) \
$(RPI_COMPOSITOR_CFLAGS) \
$(LIBDRM_CFLAGS) \
$(RPI_BCM_HOST_CFLAGS)
rpi_backend_la_SOURCES = \
compositor-rpi.c \
@ -247,11 +252,13 @@ fbdev_backend_la_LDFLAGS = -module -avoid-version
fbdev_backend_la_LIBADD = \
$(COMPOSITOR_LIBS) \
$(FBDEV_COMPOSITOR_LIBS) \
$(LIBDRM_LIBS) \
../shared/libshared.la
fbdev_backend_la_CFLAGS = \
$(COMPOSITOR_CFLAGS) \
$(EGL_CFLAGS) \
$(FBDEV_COMPOSITOR_CFLAGS) \
$(LIBDRM_CFLAGS) \
$(PIXMAN_CFLAGS) \
$(GCC_CFLAGS)
fbdev_backend_la_SOURCES = \

@ -40,10 +40,6 @@
#include <linux/kd.h>
#include <linux/major.h>
#ifdef BUILD_DRM_COMPOSITOR
#include <xf86drm.h>
#endif
#include "compositor.h"
#include "launcher-util.h"
#include "logind-util.h"
@ -55,43 +51,55 @@
#define KDSKBMUTE 0x4B51
#endif
union cmsg_data { unsigned char b[4]; int fd; };
#ifdef HAVE_LIBDRM
struct weston_launcher {
struct weston_logind *logind;
struct weston_compositor *compositor;
int fd;
struct wl_event_source *source;
int kb_mode, tty, drm_fd;
struct wl_event_source *vt_source;
};
#include <xf86drm.h>
#ifdef BUILD_DRM_COMPOSITOR
static int
drm_drop_master(int drm_fd)
{
return drmDropMaster(drm_fd);
}
static int
drm_set_master(int drm_fd)
{
return drmSetMaster(drm_fd);
}
static int
drm_is_master(int drm_fd)
static inline int
is_drm_master(int drm_fd)
{
drm_magic_t magic;
return drmGetMagic(drm_fd, &magic) == 0 &&
drmAuthMagic(drm_fd, magic) == 0;
}
#else
static int drm_drop_master(int drm_fd) {return 0;}
static int drm_set_master(int drm_fd) {return 0;}
static int drm_is_master(int drm_fd) {return 1;}
static inline int
drmDropMaster(int drm_fd)
{
return 0;
}
static inline int
drmSetMaster(int drm_fd)
{
return 0;
}
static inline int
is_drm_master(int drm_fd)
{
return 0;
}
#endif
union cmsg_data { unsigned char b[4]; int fd; };
struct weston_launcher {
struct weston_compositor *compositor;
struct weston_logind *logind;
struct wl_event_loop *loop;
int fd;
struct wl_event_source *source;
int kb_mode, tty, drm_fd;
struct wl_event_source *vt_source;
};
int
weston_launcher_open(struct weston_launcher *launcher,
const char *path, int flags)
@ -121,7 +129,7 @@ weston_launcher_open(struct weston_launcher *launcher,
if (major(s.st_rdev) == DRM_MAJOR) {
launcher->drm_fd = fd;
if (!drm_is_master(fd)) {
if (!is_drm_master(fd)) {
weston_log("drm fd not master\n");
close(fd);
return -1;
@ -205,7 +213,7 @@ weston_launcher_restore(struct weston_launcher *launcher)
/* We have to drop master before we switch the VT back in
* VT_AUTO, so we don't risk switching to a VT with another
* display server, that will then fail to set drm master. */
drm_drop_master(launcher->drm_fd);
drmDropMaster(launcher->drm_fd);
mode.mode = VT_AUTO;
if (ioctl(launcher->tty, VT_SETMODE, &mode) < 0)
@ -259,11 +267,11 @@ vt_handler(int signal_number, void *data)
if (compositor->session_active) {
compositor->session_active = 0;
wl_signal_emit(&compositor->session_signal, compositor);
drm_drop_master(launcher->drm_fd);
drmDropMaster(launcher->drm_fd);
ioctl(launcher->tty, VT_RELDISP, 1);
} else {
ioctl(launcher->tty, VT_RELDISP, VT_ACKACQ);
drm_set_master(launcher->drm_fd);
drmSetMaster(launcher->drm_fd);
compositor->session_active = 1;
wl_signal_emit(&compositor->session_signal, compositor);
}

@ -50,8 +50,6 @@
#include <grp.h>
#include <security/pam_appl.h>
#include <xf86drm.h>
#ifdef HAVE_SYSTEMD_LOGIN
#include <systemd/sd-login.h>
#endif
@ -70,6 +68,26 @@
#define MAX_ARGV_SIZE 256
#ifdef HAVE_LIBDRM
#include <xf86drm.h>
#else
static inline int
drmDropMaster(int drm_fd)
{
return 0;
}
static inline int
drmSetMaster(int drm_fd)
{
return 0;
}
#endif
struct weston_launch {
struct pam_conv pc;
pam_handle_t *ph;

@ -112,6 +112,7 @@ subsurface_weston_SOURCES = subsurface-test.c
subsurface_weston_LDADD = libtest-client.la
xwayland_weston_SOURCES = xwayland-test.c
xwayland_weston_CFLAGS = $(GCC_CFLAGS) $(XWAYLAND_TEST_CFLAGS)
xwayland_weston_LDADD = libtest-client.la $(XWAYLAND_TEST_LIBS)
if ENABLE_XWAYLAND_TEST

Loading…
Cancel
Save