as plugins. This way, libcaca does not directly depend on those libraries.tags/v0.99.beta14
| @@ -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 | |||
| @@ -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 | |||
| @@ -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 | |||
| { | |||
| @@ -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? | |||