build-goo: make udev support build time optional

Some set ups just use /dev/fb0 and don't need udev.

https://bugs.freedesktop.org/show_bug.cgi?id=99104
This commit is contained in:
Ray Strode 2016-12-08 15:37:50 -05:00
parent e4b7e4955c
commit 0503571895
2 changed files with 80 additions and 55 deletions

View file

@ -38,10 +38,19 @@ PKG_CHECK_MODULES(IMAGE, [libpng >= 1.2.16 ])
AC_SUBST(IMAGE_CFLAGS)
AC_SUBST(IMAGE_LIBS)
PKG_CHECK_MODULES(UDEV, [libudev]);
AC_ARG_WITH(udev, AS_HELP_STRING([--with-udev], [Add udev support]),, with_udev=yes)
PKG_CHECK_MODULES(UDEV, [libudev], have_udev=yes, have_udev=no)
AC_SUBST(UDEV_CFLAGS)
AC_SUBST(UDEV_LIBS)
if test "x$with_udev" != "xno" ; then
if test "x$have_udev" = "xyes"; then
AC_DEFINE(HAVE_UDEV, 1, [Define if have udev support])
else
AC_MSG_ERROR([libudev is required unless --without-udev is passed])
fi
fi
PLYMOUTH_CFLAGS=""
PLYMOUTH_LIBS="-lm -lrt -ldl"

View file

@ -30,7 +30,9 @@
#include <sys/stat.h>
#include <sys/types.h>
#ifdef HAVE_UDEV
#include <libudev.h>
#endif
#include "ply-logger.h"
#include "ply-event-loop.h"
@ -41,7 +43,9 @@
#define SUBSYSTEM_DRM "drm"
#define SUBSYSTEM_FRAME_BUFFER "graphics"
#ifdef HAVE_UDEV
static void create_devices_from_udev (ply_device_manager_t *manager);
#endif
static void create_devices_for_terminal_and_renderer_type (ply_device_manager_t *manager,
const char *device_path,
@ -98,6 +102,57 @@ attach_to_event_loop (ply_device_manager_t *manager,
manager);
}
static void
free_displays_for_renderer (ply_device_manager_t *manager,
ply_renderer_t *renderer)
{
ply_list_node_t *node;
node = ply_list_get_first_node (manager->pixel_displays);
while (node != NULL) {
ply_list_node_t *next_node;
ply_pixel_display_t *display;
ply_renderer_t *display_renderer;
display = ply_list_node_get_data (node);
next_node = ply_list_get_next_node (manager->pixel_displays, node);
display_renderer = ply_pixel_display_get_renderer (display);
if (display_renderer == renderer) {
if (manager->pixel_display_removed_handler != NULL)
manager->pixel_display_removed_handler (manager->event_handler_data, display);
ply_pixel_display_free (display);
ply_list_remove_node (manager->pixel_displays, node);
}
node = next_node;
}
}
static void
free_devices_from_device_path (ply_device_manager_t *manager,
const char *device_path)
{
char *key = NULL;
ply_renderer_t *renderer = NULL;
ply_hashtable_lookup_full (manager->renderers,
(void *) device_path,
(void **) &key,
(void **) &renderer);
if (renderer == NULL)
return;
free_displays_for_renderer (manager, renderer);
ply_hashtable_remove (manager->renderers, (void *) device_path);
free (key);
ply_renderer_free (renderer);
}
#ifdef HAVE_UDEV
static bool
drm_device_in_use (ply_device_manager_t *manager,
const char *device_path)
@ -198,56 +253,6 @@ create_devices_for_udev_device (ply_device_manager_t *manager,
}
}
static void
free_displays_for_renderer (ply_device_manager_t *manager,
ply_renderer_t *renderer)
{
ply_list_node_t *node;
node = ply_list_get_first_node (manager->pixel_displays);
while (node != NULL) {
ply_list_node_t *next_node;
ply_pixel_display_t *display;
ply_renderer_t *display_renderer;
display = ply_list_node_get_data (node);
next_node = ply_list_get_next_node (manager->pixel_displays, node);
display_renderer = ply_pixel_display_get_renderer (display);
if (display_renderer == renderer) {
if (manager->pixel_display_removed_handler != NULL)
manager->pixel_display_removed_handler (manager->event_handler_data, display);
ply_pixel_display_free (display);
ply_list_remove_node (manager->pixel_displays, node);
}
node = next_node;
}
}
static void
free_devices_from_device_path (ply_device_manager_t *manager,
const char *device_path)
{
char *key = NULL;
ply_renderer_t *renderer = NULL;
ply_hashtable_lookup_full (manager->renderers,
(void *) device_path,
(void **) &key,
(void **) &renderer);
if (renderer == NULL)
return;
free_displays_for_renderer (manager, renderer);
ply_hashtable_remove (manager->renderers, (void *) device_path);
free (key);
ply_renderer_free (renderer);
}
static void
free_devices_for_udev_device (ply_device_manager_t *manager,
struct udev_device *device)
@ -386,6 +391,7 @@ watch_for_udev_events (ply_device_manager_t *manager)
NULL,
manager);
}
#endif
static void
free_terminal (char *device,
@ -477,8 +483,12 @@ ply_device_manager_new (const char *default_tty,
manager->pixel_displays = ply_list_new ();
manager->flags = flags;
#ifdef HAVE_UDEV
if (!(flags & PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV))
manager->udev_context = udev_new ();
#else
manager->flags |= PLY_DEVICE_MANAGER_FLAGS_IGNORE_UDEV;
#endif
attach_to_event_loop (manager, ply_event_loop_get_default ());
@ -493,10 +503,6 @@ ply_device_manager_free (ply_device_manager_t *manager)
if (manager == NULL)
return;
ply_event_loop_stop_watching_for_timeout (manager->loop,
(ply_event_loop_timeout_handler_t)
create_devices_from_udev, manager);
ply_event_loop_stop_watching_for_exit (manager->loop,
(ply_event_loop_exit_handler_t)
detach_from_event_loop,
@ -508,11 +514,17 @@ ply_device_manager_free (ply_device_manager_t *manager)
free_renderers (manager);
ply_hashtable_free (manager->renderers);
#ifdef HAVE_UDEV
ply_event_loop_stop_watching_for_timeout (manager->loop,
(ply_event_loop_timeout_handler_t)
create_devices_from_udev, manager);
if (manager->udev_monitor != NULL)
udev_monitor_unref (manager->udev_monitor);
if (manager->udev_context != NULL)
udev_unref (manager->udev_context);
#endif
free (manager);
}
@ -755,6 +767,7 @@ create_devices_from_terminals (ply_device_manager_t *manager)
return false;
}
#ifdef HAVE_UDEV
static void
create_devices_from_udev (ply_device_manager_t *manager)
{
@ -774,6 +787,7 @@ create_devices_from_udev (ply_device_manager_t *manager)
manager->local_console_terminal,
PLY_RENDERER_TYPE_NONE);
}
#endif
static void
create_fallback_devices (ply_device_manager_t *manager)
@ -818,12 +832,14 @@ ply_device_manager_watch_devices (ply_device_manager_t *manager,
return;
}
#ifdef HAVE_UDEV
watch_for_udev_events (manager);
create_devices_for_subsystem (manager, SUBSYSTEM_DRM);
ply_event_loop_watch_for_timeout (manager->loop,
device_timeout,
(ply_event_loop_timeout_handler_t)
create_devices_from_udev, manager);
#endif
}
bool