Browse Source

* Added a --enable-plugins configure flag that builds the GL and X11 drivers

as plugins. This way, libcaca does not directly depend on those libraries.
tags/v0.99.beta14
Sam Hocevar sam 18 years ago
parent
commit
d1bccd4fba
4 changed files with 98 additions and 9 deletions
  1. +18
    -3
      caca/Makefile.am
  2. +58
    -1
      caca/caca.c
  3. +4
    -0
      caca/caca_internals.h
  4. +18
    -5
      configure.ac

+ 18
- 3
caca/Makefile.am View File

@@ -3,6 +3,8 @@
EXTRA_DIST = caca.pc.in
DISTCLEANFILES = caca.pc

AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/cucul -DPLUGINDIR=\"$(plugindir)\"

pkgconfig_DATA = caca.pc
pkgconfigdir = $(libdir)/pkgconfig

@@ -20,15 +22,28 @@ libcaca_la_SOURCES = \
event.c \
time.c \
driver_conio.c \
driver_gl.c \
driver_ncurses.c \
driver_raw.c \
driver_slang.c \
driver_vga.c \
driver_win32.c \
driver_x11.c \
$(extra_drivers) \
$(NULL)
AM_CPPFLAGS = -I$(top_srcdir) -I$(top_srcdir)/cucul
libcaca_la_LDFLAGS = -no-undefined -version-info @LT_VERSION@
libcaca_la_LIBADD = ../cucul/libcucul.la @CACA_LIBS@

if USE_PLUGINS
plugin_LTLIBRARIES = libx11_plugin.la libgl_plugin.la
plugindir = $(libdir)/caca

libx11_plugin_la_SOURCES = driver_x11.c
libx11_plugin_la_LDFLAGS = -no-undefined -module -no-version
libx11_plugin_la_LIBADD = libcaca.la ../cucul/libcucul.la @X11_LIBS@

libgl_plugin_la_SOURCES = driver_gl.c
libgl_plugin_la_LDFLAGS = -no-undefined -module -no-version
libgl_plugin_la_LIBADD = libcaca.la ../cucul/libcucul.la @GL_LIBS@
else
extra_drivers = driver_x11.c driver_gl.c
endif


+ 58
- 1
caca/caca.c View File

@@ -23,9 +23,15 @@
#if !defined(__KERNEL__)
# include <stdlib.h>
# include <string.h>
# include <stdio.h>
# if defined(HAVE_ERRNO_H)
# include <errno.h>
# endif
# if defined(USE_PLUGINS)
# if defined(HAVE_DLFCN_H)
# include <dlfcn.h>
# endif
# endif
#endif

#include "cucul.h"
@@ -33,7 +39,15 @@
#include "caca.h"
#include "caca_internals.h"

static int caca_select_driver(caca_display_t *dp);
#if defined(USE_PLUGINS)
# define gl_install(p) caca_plugin_install("gl", p)
# define x11_install(p) caca_plugin_install("x11", p)
#endif

static int caca_select_driver(caca_display_t *);
#if defined(USE_PLUGINS)
static int caca_plugin_install(char const *, caca_display_t *);
#endif

/** \brief Attach a caca graphical context to a cucul canvas.
*
@@ -62,9 +76,16 @@ caca_display_t * caca_create_display(cucul_canvas_t * cv)
}

dp->cv = cv;
#if defined(USE_PLUGINS)
dp->plugin = NULL;
#endif

if(caca_select_driver(dp))
{
#if defined(USE_PLUGINS)
if(dp->plugin)
dlclose(dp->plugin);
#endif
free(dp);
#if defined(HAVE_ERRNO_H)
errno = ENODEV;
@@ -74,6 +95,10 @@ caca_display_t * caca_create_display(cucul_canvas_t * cv)

if(dp->drv.init_graphics(dp))
{
#if defined(USE_PLUGINS)
if(dp->plugin)
dlclose(dp->plugin);
#endif
free(dp);
#if defined(HAVE_ERRNO_H)
errno = ENODEV;
@@ -128,6 +153,10 @@ caca_display_t * caca_create_display(cucul_canvas_t * cv)
int caca_free_display(caca_display_t *dp)
{
dp->drv.end_graphics(dp);
#if defined(USE_PLUGINS)
if(dp->plugin)
dlclose(dp->plugin);
#endif
dp->cv->refcount--;
free(dp);

@@ -201,3 +230,31 @@ static int caca_select_driver(caca_display_t *dp)
return -1;
}

#if defined(USE_PLUGINS)
static int caca_plugin_install(char const *name, caca_display_t *dp)
{
char buf[512];
int (*sym) (caca_display_t *);

sprintf(buf, "%s/lib%s_plugin.so", PLUGINDIR, name);
dp->plugin = dlopen(buf, RTLD_NOW);
if(!dp->plugin)
{
sprintf(buf, "lib%s_plugin.so", name);
dp->plugin = dlopen(buf, RTLD_NOW);
if(!dp->plugin)
return -1;
}

sprintf(buf, "%s_install", name);
sym = dlsym(dp->plugin, buf);
if(!sym)
{
dlclose(dp->plugin);
return -1;
}

return sym(dp);
}
#endif


+ 4
- 0
caca/caca_internals.h View File

@@ -88,6 +88,10 @@ struct caca_display
/* A link to our cucul canvas */
cucul_canvas_t *cv;

#if defined(USE_PLUGINS)
void *plugin;
#endif

/* Device-specific functions */
struct drv
{


+ 18
- 5
configure.ac View File

@@ -62,10 +62,12 @@ AC_ARG_ENABLE(imlib2,
[ --enable-imlib2 Imlib2 graphics support (default enabled)])

dnl conditional builds
AC_ARG_ENABLE(plugins,
[ --enable-plugins build X11 and GL drivers as plugins])
AC_ARG_ENABLE(doc,
[ --enable-doc build documentation (needs doxygen and LaTeX)])

AC_CHECK_HEADERS(stdio.h stdarg.h signal.h sys/ioctl.h sys/time.h inttypes.h endian.h unistd.h arpa/inet.h netinet/in.h winsock2.h errno.h locale.h getopt.h)
AC_CHECK_HEADERS(stdio.h stdarg.h signal.h sys/ioctl.h sys/time.h inttypes.h endian.h unistd.h arpa/inet.h netinet/in.h winsock2.h errno.h locale.h getopt.h dlfcn.h)
AC_CHECK_FUNCS(signal ioctl vsnprintf getenv putenv strcasecmp htons)
AC_CHECK_FUNCS(usleep gettimeofday)

@@ -156,7 +158,7 @@ if test "${enable_x11}" != "no"; then
if test -n "${x_libraries}"; then X_LIBS="-L${x_libraries}"; fi
AC_DEFINE(USE_X11, 1, Define to 1 to activate the X11 backend driver)
CPPFLAGS="${CPPFLAGS} ${X_CFLAGS}"
CACA_LIBS="${CACA_LIBS} -lX11 ${X_LIBS}"
X11_LIBS="${X11_LIBS} -lX11 ${X_LIBS}"
CACA_DRIVERS="${CACA_DRIVERS} x11"],
[ac_cv_my_have_x11="no"],
[[`if test -n "${x_libraries}"; then echo -L${x_libraries}; fi`]])
@@ -180,7 +182,7 @@ if test "${enable_gl}" != "no"; then
break])
if test "${ac_cv_my_have_gl}" = "yes"; then
AC_DEFINE(USE_GL, 1, Define to 1 to activate the OpenGL backend driver)
CACA_LIBS="${CACA_LIBS} -lGL -lglut"
GL_LIBS="${GL_LIBS} -lGL -lglut"
CACA_DRIVERS="${CACA_DRIVERS} gl"
elif test "${enable_gl}" = "yes"; then
AC_MSG_ERROR([cannot find OpenGL+FreeGLUT development files])
@@ -224,6 +226,15 @@ if test "${enable_vga}" = "yes"; then
fi
AM_CONDITIONAL(USE_KERNEL, test "${ac_cv_my_have_vga}" = "yes")

if test "${enable_plugins}" = "yes"; then
ac_cv_my_have_plugins="yes"
AC_DEFINE(USE_PLUGINS, 1, Define to 1 to activate plugins)
CACA_LIBS="${CACA_LIBS} -ldl"
else
CACA_LIBS="${CACA_LIBS} ${X11_LIBS} ${GL_LIBS}"
fi
AM_CONDITIONAL(USE_PLUGINS, test "${ac_cv_my_have_plugins}" = "yes")

AC_MSG_CHECKING(valid output drivers)
if test -z "${CACA_DRIVERS}"; then
AC_MSG_RESULT(no)
@@ -237,6 +248,8 @@ fi
AC_SUBST(MATH_LIBS)
AC_SUBST(GETOPT_LIBS)
AC_SUBST(CACA_LIBS)
AC_SUBST(X11_LIBS)
AC_SUBST(GL_LIBS)

# Optimizations
CFLAGS="${CFLAGS} -g -O2 -fno-strength-reduce -fomit-frame-pointer"
@@ -261,7 +274,7 @@ AM_CONDITIONAL(USE_NETWORK, test "${ac_cv_my_have_network}" = "yes")
# Use Imlib2?
if test "${enable_imlib2}" != "no"; then
IMLIB2="no"
PKG_CHECK_MODULES(imlib2, imlib2, [IMLIB2="yes"], [AC_MSG_RESULT(no)])
PKG_CHECK_MODULES(IMLIB2, imlib2, [IMLIB2="yes"], [AC_MSG_RESULT(no)])
if test "${IMLIB2}" = no; then
AC_MSG_ERROR([[cannot find Imlib2 development files. Without Imlib2, cacaview will only open BMP files; if this is really what you want, re-run configure with '--disable-imlib2'.]])
fi
@@ -269,7 +282,7 @@ fi

# Build development tools?
PANGOFT2="no"
PKG_CHECK_MODULES(pangoft2, pangoft2, [PANGOFT2="yes"], [AC_MSG_RESULT(no)])
PKG_CHECK_MODULES(PANGOFT2, pangoft2, [PANGOFT2="yes"], [AC_MSG_RESULT(no)])
AM_CONDITIONAL(USE_PANGO, test "${PANGOFT2}" != "no")

# Build documentation?


Loading…
Cancel
Save