From 27dbb3fd0e9f416217b76412a5adf36547e7137d Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Sat, 30 Jun 2012 19:52:20 +0200 Subject: [PATCH] build: rewrite configure.ac Remove all obsolete code and make it more readable. Nearly all features can now be configured. However, the code doesn't work correctly if udev or systemd is removed. That will be fixed soon, though. Signed-off-by: David Herrmann --- Makefile.am | 47 ++++--- autogen.sh | 2 +- configure.ac | 360 ++++++++++++++++++++++++++++++++++++++++++--------- src/uterm_internal.h | 1 - 4 files changed, 322 insertions(+), 88 deletions(-) diff --git a/Makefile.am b/Makefile.am index c32378a..8509b47 100644 --- a/Makefile.am +++ b/Makefile.am @@ -121,22 +121,14 @@ libkmscon_core_la_SOURCES = \ src/gl_shader.c \ src/font_pango.c -if USE_PANGO -libkmscon_core_la_SOURCES += \ - src/font_pango.c src/font.h -else -libkmscon_core_la_SOURCES += \ - src/font_freetype.c src/font.h -endif - libkmscon_core_la_CPPFLAGS = \ $(AM_CPPFLAGS) \ - $(OPENGL_CFLAGS) \ + $(OPENGLES2_CFLAGS) \ $(PANGO_CFLAGS) \ $(FREETYPE2_CFLAGS) \ $(GLIB_CFLAGS) libkmscon_core_la_LIBADD = \ - $(OPENGL_LIBS) \ + $(OPENGLES2_LIBS) \ $(PANGO_LIBS) \ $(FREETYPE2_LIBS) \ $(GLIB_LIBS) \ @@ -156,12 +148,11 @@ libuterm_la_SOURCES = \ src/uterm.h \ src/uterm_internal.h \ src/uterm_video.c \ - src/uterm_video_drm.c \ - src/uterm_video_fbdev.c \ src/uterm_monitor.c \ src/uterm_input.c \ src/uterm_vt.c \ - src/vt.c src/vt.h + src/vt.h \ + src/vt.c libuterm_la_CPPFLAGS = \ $(AM_CPPFLAGS) \ @@ -170,31 +161,41 @@ libuterm_la_CPPFLAGS = \ $(EGL_CFLAGS) \ $(GBM_CFLAGS) \ $(OPENGL_CFLAGS) \ - $(UDEV_CFLAGS) + $(OPENGLES2_CFLAGS) \ + $(UDEV_CFLAGS) \ + $(XKBCOMMON_CFLAGS) libuterm_la_LIBADD = \ $(SYSTEMD_LIBS) \ $(DRM_LIBS) \ $(EGL_LIBS) \ $(GBM_LIBS) \ $(OPENGL_LIBS) \ + $(OPENGLES2_LIBS) \ $(UDEV_LIBS) \ + $(XKBCOMMON_LIBS) \ libkmscon-static.la \ libeloop.la libuterm_la_LDFLAGS = \ -version-info 1:0:0 -if USE_XKBCOMMON +if UTERM_HAVE_FBDEV +libuterm_la_SOURCES += \ + src/uterm_video_fbdev.c +endif + +if UTERM_HAVE_DRM +libuterm_la_SOURCES += \ + src/uterm_video_drm.c +endif + +if UTERM_HAVE_XKBCOMMON libuterm_la_SOURCES += \ src/uterm_input_xkb.c -libuterm_la_CPPFLAGS += \ - $(XKBCOMMON_CFLAGS) \ - $(XPROTO_CFLAGS) -libuterm_la_LIBADD += \ - $(XPROTO_LIBS) \ - $(XKBCOMMON_LIBS) else libuterm_la_SOURCES += \ - src/uterm_input_dumb.c + src/uterm_input_dumb.c \ + external/imKStoUCS.h \ + external/imKStoUCS.c endif include_HEADERS += \ @@ -229,8 +230,6 @@ include_HEADERS += \ # libkmscon_static_la_SOURCES = \ - external/imKStoUCS.h \ - external/imKStoUCS.c \ src/static_llog.h \ src/static_misc.h \ src/static_misc.c diff --git a/autogen.sh b/autogen.sh index f07c694..a72e08c 100755 --- a/autogen.sh +++ b/autogen.sh @@ -1,5 +1,5 @@ #!/bin/sh -mkdir -p m4/ +mkdir -p m4/ || exit 1 gtkdocize || exit 1 autoreconf -i || exit 1 ./configure --enable-debug $* || exit 1 diff --git a/configure.ac b/configure.ac index d1593a6..dd74e34 100644 --- a/configure.ac +++ b/configure.ac @@ -1,3 +1,8 @@ +# +# Kmscon - build configuration script +# Copyright (c) 2012 David Herrmann +# + AC_PREREQ(2.68) AC_INIT([kmscon], [1]) @@ -10,7 +15,12 @@ AC_CONFIG_HEADER(config.h) AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects dist-bzip2 no-dist-gzip tar-pax -Wall -Werror]) AM_SILENT_RULES([yes]) -# Don't add a default "-g -O2" if CFLAGS wasn't specified +# +# Don't add a default "-g -O2" if CFLAGS wasn't specified. For debugging it is +# often more convenient to have "-g -O0". You can still override it by +# explicitely setting it on the command line. +# + : ${CFLAGS=""} AC_USE_SYSTEM_EXTENSIONS @@ -26,101 +36,327 @@ LT_INIT # check for gtk-doc # Use weird syntax to make "gtkdocize" happy. # + m4_ifdef([GTK_DOC_CHECK],[ GTK_DOC_CHECK([1.14],[--flavour no-tmpl]) ], [AM_CONDITIONAL([ENABLE_GTK_DOC], false)]) -PKG_CHECK_MODULES([SYSTEMD], [libsystemd-login]) -AC_SUBST(SYSTEMD_CFLAGS) -AC_SUBST(SYSTEMD_LIBS) +# +# pkg-config dependencies +# This unconditionally checks for all dependencies even if they are disabled. We +# later look whether all required depedencies are met and finish the +# configuration. We group similar packages into one logical group here to avoid +# having variables for each single library. +# This, however, makes ./configure output very unintuitive error messages if a +# package is not found so we must make sure we print more verbose messages +# ourself. +# -PKG_CHECK_MODULES([DRM], [libdrm]) -AC_SUBST(DRM_CFLAGS) -AC_SUBST(DRM_LIBS) +PKG_CHECK_MODULES([GLIB], [glib-2.0], + [have_glib=yes], [have_glib=no]) -PKG_CHECK_MODULES([EGL], [egl]) -AC_SUBST(EGL_CFLAGS) -AC_SUBST(EGL_LIBS) +PKG_CHECK_MODULES([SYSTEMD], [libsystemd-login], + [have_systemd=yes], [have_systemd=no]) -PKG_CHECK_MODULES([GBM], [gbm]) -AC_SUBST(GBM_CFLAGS) -AC_SUBST(GBM_LIBS) +PKG_CHECK_MODULES([UDEV], [libudev], + [have_udev=yes], [have_udev=no]) -PKG_CHECK_MODULES([OPENGL], [glesv2]) -AC_SUBST(OPENGL_CFLAGS) -AC_SUBST(OPENGL_LIBS) +PKG_CHECK_MODULES([DRM], [libdrm], + [have_drm=yes], [have_drm=no]) -AC_DEFINE([UTERM_HAVE_DRM], [1], [Use DRM uterm backend]) +PKG_CHECK_MODULES([GBM], [gbm], + [have_gbm=yes], [have_gbm=no]) -PKG_CHECK_MODULES([UDEV], [libudev]) -AC_SUBST(UDEV_CFLAGS) -AC_SUBST(UDEV_LIBS) +PKG_CHECK_MODULES([EGL], [egl], + [have_egl=yes], [have_egl=no]) + +PKG_CHECK_MODULES([OPENGL], [gl], + [have_gl=yes], [have_gl=no]) -PKG_CHECK_MODULES([XPROTO], [xproto]) -AC_SUBST(XPROTO_CFLAGS) -AC_SUBST(XPROTO_LIBS) +PKG_CHECK_MODULES([OPENGLES2], [glesv2], + [have_gles2=yes], [have_gles2=no]) PKG_CHECK_MODULES([XKBCOMMON], [xkbcommon], [have_xkbcommon=yes], [have_xkbcommon=no]) -AC_SUBST(XKBCOMMON_CFLAGS) -AC_SUBST(XKBCOMMON_LIBS) + +PKG_CHECK_MODULES([PANGO], [pango pangocairo cairo], + [have_pango=yes], [have_pango=no]) + +PKG_CHECK_MODULES([FREETYPE2], [freetype2], + [have_freetype2=yes], [have_freetype2=no]) + +# +# Parse arguments +# Parse all command line arguments and save the values so we can check them +# later when configuring kmscon. +# + +AC_MSG_CHECKING([whether to use systemd for multi-seat support]) +AC_ARG_ENABLE([systemd], + [AS_HELP_STRING([--enable-systemd], + [enable multi-seat support with systemd])]) +AC_MSG_RESULT([ok]) + +AC_MSG_CHECKING([whether to use udev for device hotplug support]) +AC_ARG_ENABLE([udev], + [AS_HELP_STRING([--enable-udev], + [enable device hotplug support with udev])]) +AC_MSG_RESULT([ok]) + +AC_MSG_CHECKING([whether to use uterm fbdev video backend]) +AC_ARG_ENABLE([fbdev], + [AS_HELP_STRING([--enable-fbdev], + [enable uterm fbdev video backend])]) +AC_MSG_RESULT([ok]) + +AC_MSG_CHECKING([whether to use uterm drm video backend]) +AC_ARG_ENABLE([drm], + [AS_HELP_STRING([--enable-drm], + [enable uterm drm video backend])]) +AC_MSG_RESULT([ok]) AC_MSG_CHECKING([whether to use xkbcommon keyboard backend]) AC_ARG_ENABLE([xkbcommon], [AS_HELP_STRING([--disable-xkbcommon], [disable xkbcommon keyboard backend])]) +AC_MSG_RESULT([ok]) -if test ! x$enable_xkbcommon = xno ; then - if test x$enable_xkbcommon = xyes -a x$have_xkbcommon = xno ; then - AC_ERROR([--enable-xkbcommon given but library not found]) +AC_MSG_CHECKING([whether to build with debugging on]) +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [whether to build with debugging on])]) +AC_MSG_RESULT([ok]) + +# +# Debug mode +# In debug mode we use -g -O0 for compilation and set several flags so verbose +# logging is possible. +# + +debug_enabled=no +if test x$enable_debug = xyes ; then + debug_enabled=yes +fi + +if test x$debug_enabled = xyes ; then + AC_DEFINE([KMSCON_ENABLE_DEBUG], [1], + [Enable debug for kmscon]) + AC_DEFINE([LOG_ENABLE_DEBUG], [1], + [Enable debug for log subsystem]) + AC_DEFINE([LLOG_ENABLE_DEBUG], [1], + [Enable debug for llog subsystem]) +else + AC_DEFINE([NDEBUG], [1], [No Debug]) +fi + +AM_CONDITIONAL([DEBUG], [test x$debug_enabled = xyes]) + +# +# Main dependencies +# This checks for all dependencies that are not optional. +# TODO: remove glib dependency +# + +if test ! x$have_glib = xyes ; then + AC_ERROR([glib-2.0 no found but is required by kmscon]) +fi + +# +# Systemd dependency +# We can optionally use systemd for multi-seat support. If systemd is not +# available or the system was not started with systemd, we simply fall back to +# single-seat mode. +# + +systemd_enabled=no +if test ! x$enable_systemd = xno ; then + if test x$have_systemd = xyes ; then + systemd_enabled=yes + elif test x$enable_systemd = xyes ; then + AC_ERROR([systemd libraries not found for multi-seat support]) fi - enable_xkbcommon=$have_xkbcommon fi -AM_CONDITIONAL([USE_XKBCOMMON], [test x$enable_xkbcommon = xyes]) -AC_MSG_RESULT([$enable_xkbcommon]) +if test x$systemd_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_SYSTEMD], [1], + [Use systemd for multi-seat support]) +else + SYSTEMD_CFLAGS="" + SYSTEMD_LIBS="" +fi -PKG_CHECK_MODULES([GLIB], [glib-2.0 cairo pango pangocairo]) -AC_SUBST(GLIB_CFLAGS) -AC_SUBST(GLIB_LIBS) +# +# Udev dependency +# For hotplugging support we need udev to notify us about system events. If udev +# is not available, we simply fall back to static mode. Periodic scanning is +# also supported. +# -PKG_CHECK_MODULES([FREETYPE2], [freetype2]) -AC_SUBST(FREETYPE2_CFLAGS) -AC_SUBST(FREETYPE2_LIBS) +udev_enabled=no +if test ! x$enable_udev = xno ; then + if test x$have_udev = xyes ; then + udev_enabled=yes + elif test x$enable_udev = xyes ; then + AC_ERROR([udev libraries not found for device hotplug support]) + fi +fi -PKG_CHECK_MODULES([PANGO], [pango pangocairo cairo], - [have_pango=yes], [have_pango=no]) -AC_SUBST(PANGO_CFLAGS) -AC_SUBST(PANGO_LIBS) +if test x$udev_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_UDEV], [1], + [Use udev for device hotplug support]) +else + UDEV_CFLAGS="" + UDEV_LIBS="" +fi -AC_MSG_CHECKING([whether to use pango font backend]) -AC_ARG_ENABLE([pango], - [AS_HELP_STRING([--enable-pango], [whether to use pango font backend])], - [force_pango="$enableval"; - AC_DEFINE([USE_PANGO], [1], [Define if pango should be used])], - [force_pango=no]) -AC_MSG_RESULT([$force_pango]) +# +# Uterm fbdev backend +# This checks whether the fbdev backend was requested and enables it then. There +# are no special dependencies for it except the kernel headers. +# TODO: check for kernel headers here +# -if test x$force_pango = xyes -a $have_pango = xno ; then - AC_ERROR([Pango library not found]) +fbdev_enabled=no +if test ! x$enable_fbdev = xno ; then + fbdev_enabled=yes fi -AM_CONDITIONAL([USE_PANGO], [test x$force_pango = xyes]) +if test x$fbdev_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_FBDEV], [1], + [Use uterm fbdev video backend]) +fi -AC_MSG_CHECKING([whether to build with debugging on]) -AC_ARG_ENABLE([debug], - [AS_HELP_STRING([--enable-debug], [whether to build with debugging on])], - [debug="$enableval"], [debug=no]) -AM_CONDITIONAL([DEBUG], [test x$debug = xyes]) -AC_MSG_RESULT([$debug]) +AM_CONDITIONAL([UTERM_HAVE_FBDEV], [test x$fbdev_enabled = xyes]) -if test ! x$debug = xyes ; then - AC_DEFINE([NDEBUG], [1], [No Debug]) +# +# Uterm drm backend +# This checks whether libdrm is available and some combination of libgbm, egl +# and gl or glesv2. If it is not available, then the drm backend is simply not +# built. +# + +drm_enabled=no +gl_enabled=no +gles2_enabled=no +if test ! x$enable_drm = xno ; then + if test x$have_drm = xyes -a x$have_gbm = xyes -a x$have_egl = xyes ; then + if test x$have_gl = xyes -o x$have_gles2 = xyes ; then + drm_enabled=yes + if test x$have_gl = xyes ; then + gl_enabled=yes + fi + if test x$have_gles2 = xyes ; then + gles2_enabled=yes + fi + fi + fi + + if test x$enable_drm = xyes -a x$drm_enabled = xno ; then + AC_ERROR([drm, gbm, egl, gl or gles2 libraries not found for uterm drm backend]) + fi +fi + +if test x$drm_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_DRM], [1], + [Use uterm DRM video backend]) +else + DRM_CFLAGS="" + DRM_LIBS="" + GBM_CFLAGS="" + GBM_LIBS="" + EGL_CFLAGS="" + EGL_LIBS="" +fi + +AM_CONDITIONAL([UTERM_HAVE_DRM], [test x$drm_enabled = xyes]) + +if test x$gl_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_GL], [1], + [Use OpenGL as drawing backend]) +else + OPENGL_CFLAGS="" + OPENGL_LIBS="" +fi + +if test x$gles2_enabled = xyes ; then + AC_DEFINE([UTERM_HAVE_GLES2], [1], + [Use OpenGLESv2 as drawing backend]) else - AC_DEFINE([KMSCON_ENABLE_DEBUG], [1], [Enable debug for kmscon]) - AC_DEFINE([LOG_ENABLE_DEBUG], [1], [Enable debug for log subsystem]) - AC_DEFINE([LLOG_ENABLE_DEBUG], [1], [Enable debug for llog subsystem]) + OPENGLES2_CFLAGS="" + OPENGLES2_LIBS="" fi +# +# xkbcommon keyboard backend +# This checks for the xkbcommon library for keyboard handling in uterm. If it is +# not available, we use a dumb-keyboard backend as fall-back. +# + +xkbcommon_enabled=no +if test ! x$enable_xkbcommon = xno ; then + if test x$have_xkbcommon = xyes ; then + xkbcommon_enabled=yes + elif test x$enable_xkbcommon = xyes ; then + AC_ERROR([xkbcommon not found for keyboard backend]) + fi +fi + +if test x$xkbcommon_enabled = xyes ; then + test # dummy +else + XKBCOMMON_CFLAGS="" + XKBCOMMON_LIBS="" +fi + +AM_CONDITIONAL([UTERM_HAVE_XKBCOMMON], [test x$xkbcommon_enabled = xyes]) + +# +# Makefile vars +# After everything is configured, we correctly substitute the values for the +# makefiles. +# + +AC_SUBST(SYSTEMD_CFLAGS) +AC_SUBST(SYSTEMD_LIBS) +AC_SUBST(DRM_CFLAGS) +AC_SUBST(DRM_LIBS) +AC_SUBST(EGL_CFLAGS) +AC_SUBST(EGL_LIBS) +AC_SUBST(GBM_CFLAGS) +AC_SUBST(GBM_LIBS) +AC_SUBST(OPENGLES2_CFLAGS) +AC_SUBST(OPENGLES2_LIBS) +AC_SUBST(OPENGL_CFLAGS) +AC_SUBST(OPENGL_LIBS) +AC_SUBST(UDEV_CFLAGS) +AC_SUBST(UDEV_LIBS) +AC_SUBST(XKBCOMMON_CFLAGS) +AC_SUBST(XKBCOMMON_LIBS) +AC_SUBST(GLIB_CFLAGS) +AC_SUBST(GLIB_LIBS) +AC_SUBST(FREETYPE2_CFLAGS) +AC_SUBST(FREETYPE2_LIBS) +AC_SUBST(PANGO_CFLAGS) +AC_SUBST(PANGO_LIBS) + AC_CONFIG_FILES([Makefile docs/reference/Makefile docs/reference/version.xml]) AC_OUTPUT([src/genshader.c]) + +# +# Configuration output +# Show configuration to the user so they can check whether everything was +# configured as expected. +# + +AC_MSG_NOTICE([Build configuration: + + systemd: $systemd_enabled + udev: $udev_enabled + fbdev: $fbdev_enabled + drm: $drm_enabled + opengl: $gl_enabled + opengles2: $gles2_enabled + xkbcommon: $xkbcommon_enabled + debug: $debug_enabled + + Run "make" to start compilation process]) diff --git a/src/uterm_internal.h b/src/uterm_internal.h index db614b2..1c99c62 100644 --- a/src/uterm_internal.h +++ b/src/uterm_internal.h @@ -142,7 +142,6 @@ static const struct video_ops drm_video_ops; /* fbdev */ -#define UTERM_HAVE_FBDEV /* TODO: move to autoconf */ #ifdef UTERM_HAVE_FBDEV #include -- 2.7.4