On Thu, 2007-02-15 at 09:45 +0000, Joe Orton wrote: > Yes, soon (or if you could do it please go ahead!).
This builds on FC6, but I haven't actually tested the functionality. Anyhow, it may be some kind of start... -- Bojan
Index: build/gen-build.py =================================================================== --- build/gen-build.py (revision 512074) +++ build/gen-build.py (working copy) @@ -95,6 +95,23 @@ f.write('HEADERS = $(top_srcdir)/%s\n\n' % string.join(headers, ' $(top_srcdir)/')) f.write('SOURCE_DIRS = %s $(EXTRA_SOURCE_DIRS)\n\n' % string.join(dirs.keys())) + if parser.has_option('options', 'modules'): + modules = parser.get('options', 'modules') + + for mod in string.split(modules): + files = get_files(parser.get(mod, 'paths')) + objects, _unused = write_objects(f, legal_deps, h_deps, files) + flat_objects = string.join(objects) + f.write('OBJECTS_%s = %s\n' % (mod, flat_objects)) + + if parser.has_option(mod, 'target'): + target = parser.get(mod, 'target') + f.write('MODULE_%s = %s\n' % (mod, target)) + f.write('%s: %s\n' % (target, flat_objects)) + f.write('\t$(LINK_MODULE) -o $@ %s $(LDADD_%s)\n' % (flat_objects, mod)) + + f.write('\n') + # Build a list of all necessary directories in build tree alldirs = { } for dir in dirs.keys():
Index: Makefile.in =================================================================== --- Makefile.in (revision 512074) +++ Makefile.in (working copy) @@ -22,8 +22,19 @@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -TARGETS = $(TARGET_LIB) aprutil.exp +APU_MODULES = @APU_MODULES@ +LINK_MODULE = $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) $(LT_LDFLAGS) $(ALL_CFLAGS) $(ALL_LDFLAGS) $(APRUTIL_LDFLAGS) -release $(APRUTIL_MAJOR_VERSION) -module -rpath $(APU_DSO_LIBDIR) +APU_DSO_LIBDIR = @APU_DSO_LIBDIR@ +EXTRA_OBJECTS = @EXTRA_OBJECTS@ + +LDADD_dbd_pgsql = @LDADD_dbd_pgsql@ +LDADD_dbd_sqlite2 = @LDADD_dbd_sqlite2@ +LDADD_dbd_sqlite3 = @LDADD_dbd_sqlite3@ +LDADD_dbd_mysql = @LDADD_dbd_mysql@ + +TARGETS = $(TARGET_LIB) aprutil.exp apu-config.out $(APU_MODULES) + # bring in rules.mk for standard functionality @INCLUDE_RULES@ @INCLUDE_OUTPUTS@ @@ -53,7 +64,7 @@ apu-config.out: $(APU_CONFIG) sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@ -install: $(TARGET_LIB) apu-config.out +install: $(TARGETS) install-modules $(APR_MKDIR) $(DESTDIR)$(includedir) $(DESTDIR)$(libdir)/pkgconfig \ $(DESTDIR)$(libdir) $(DESTDIR)$(bindir) for f in $(top_srcdir)/include/*.h $(top_blddir)/include/*.h; do \ @@ -67,9 +78,17 @@ $(INSTALL_DATA) aprutil.exp $(DESTDIR)$(libdir) $(INSTALL) -m 755 apu-config.out $(DESTDIR)$(bindir)/$(APU_CONFIG) -$(TARGET_LIB): $(OBJECTS) - $(LINK) @lib_target@ $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS) +$(TARGET_LIB): $(OBJECTS) $(EXTRA_OBJECTS) + $(LINK) @lib_target@ $(EXTRA_OBJECTS) $(ALL_LIBS) $(APRUTIL_LDFLAGS) $(APRUTIL_LIBS) +install-modules: [EMAIL PROTECTED]@ + +install-modules-no: + +install-modules-yes: $(APU_MODULES) + $(APR_MKDIR) $(DESTDIR)$(APU_DSO_LIBDIR) + @for m in $(APU_MODULES); do $(LIBTOOL) $(LT_LTFLAGS) $(LTFLAGS) --mode=install $(INSTALL) -m 755 $$m $(DESTDIR)$(APU_DSO_LIBDIR); done + exports.c: $(HEADERS) $(APR_MKEXPORT) $(HEADERS) > $@ @@ -89,3 +108,5 @@ test: check check: $(TARGET_LIB) cd test && $(MAKE) check + +.PHONY: install-modules install-modules-yes install-modules-no dox test check Index: CHANGES =================================================================== --- CHANGES (revision 512074) +++ CHANGES (working copy) @@ -1,7 +1,8 @@ Changes with APR-util 1.2.9 + *) Backport loading DBD drivers as DSOs + [Originally by Joe Orton, backport Bojan Smojver] - Changes with APR-util 1.2.8 *) Add support for Berkeley DB 4.5 to the configure scripts. Index: build.conf =================================================================== --- build.conf (revision 512074) +++ build.conf (working copy) @@ -18,15 +18,33 @@ xml/*.c strmatch/*.c xlate/*.c - dbd/*.c + dbd/apr_dbd.c # we have no platform-specific subdirs platform_dirs = # the public headers -headers = include/*.h +headers = include/*.h include/private/*.h +modules = dbd_pgsql dbd_sqlite2 dbd_sqlite3 dbd_mysql + # gen_uri_delim.c # we have a recursive makefile for the test files (for now) # test/*.c + +[dbd_pgsql] +paths = dbd/apr_dbd_pgsql.c +target = dbd/apr_dbd_pgsql.la + +[dbd_sqlite2] +paths = dbd/apr_dbd_sqlite2.c +target = dbd/apr_dbd_sqlite2.la + +[dbd_sqlite3] +paths = dbd/apr_dbd_sqlite3.c +target = dbd/apr_dbd_sqlite3.la + +[dbd_mysql] +paths = dbd/apr_dbd_mysql.c +target = dbd/apr_dbd_mysql.la Index: configure.in =================================================================== --- configure.in (revision 512074) +++ configure.in (working copy) @@ -122,6 +122,8 @@ APU_CHECK_DBD_MYSQL APU_CHECK_DBD_SQLITE3 APU_CHECK_DBD_SQLITE2 +dnl Enable DSO build; must be last: +APU_CHECK_DBD_DSO APU_FIND_EXPAT APU_FIND_ICONV @@ -148,6 +150,23 @@ APRUTIL_LIBNAME="aprutil${libsuffix}" AC_SUBST(APRUTIL_LIBNAME) +# Set up destination directory for DSOs. +APU_DSO_LIBDIR="\${libdir}/apr-util-${APRUTIL_MAJOR_VERSION}" +# Set APU_HAVE_MODULES appropriately for the Makefile +if test -n "$APU_MODULES"; then + APU_HAVE_MODULES=yes +else + APU_HAVE_MODULES=no +fi +# Define expanded libdir for apu_config.h +APR_EXPAND_VAR(abs_dso_libdir, $APU_DSO_LIBDIR) +AC_DEFINE_UNQUOTED([APU_DSO_LIBDIR], ["$abs_dso_libdir"], + [Define to be absolute path to DSO directory]) +AC_SUBST(APU_HAVE_MODULES) +AC_SUBST(APU_DSO_LIBDIR) +AC_SUBST(APU_MODULES) +AC_SUBST(EXTRA_OBJECTS) + dnl dnl Prep all the flags and stuff for compilation and export to other builds dnl Index: dbd/apr_dbd.c =================================================================== --- dbd/apr_dbd.c (revision 512074) +++ dbd/apr_dbd.c (working copy) @@ -16,28 +16,28 @@ #include <stdio.h> +#include "apu_config.h" #include "apu.h" + #include "apr_pools.h" -#include "apr_dbd_internal.h" -#include "apr_dbd.h" +#include "apr_dso.h" +#include "apr_strings.h" #include "apr_hash.h" #include "apr_thread_mutex.h" -#include "apr_dso.h" -#include "apr_strings.h" +#include "apr_dbd_internal.h" +#include "apr_dbd.h" +#include "apu_version.h" + static apr_hash_t *drivers = NULL; #define CLEANUP_CAST (apr_status_t (*)(void*)) -/* Once the autofoo supports building it for dynamic load, we can use - * #define APR_DSO_BUILD APR_HAS_DSO - */ - -#if APR_DSO_BUILD #if APR_HAS_THREADS static apr_thread_mutex_t* mutex = NULL; #endif -#else + +#ifndef APU_DSO_BUILD #define DRIVER_LOAD(name,driver,pool) \ { \ extern const apr_dbd_driver_t driver; \ @@ -70,15 +70,13 @@ apr_pool_cleanup_register(pool, NULL, apr_dbd_term, apr_pool_cleanup_null); -#if APR_DSO_BUILD - #if APR_HAS_THREADS ret = apr_thread_mutex_create(&mutex, APR_THREAD_MUTEX_DEFAULT, pool); /* This already registers a pool cleanup */ #endif -#else - +#ifndef APU_DSO_BUILD + /* Load statically-linked drivers: */ #if APU_HAVE_MYSQL DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool); #endif @@ -94,62 +92,67 @@ #if APU_HAVE_SOME_OTHER_BACKEND DRIVER_LOAD("firebird", apr_dbd_other_driver, pool); #endif -#endif +#endif /* APU_DSO_BUILD */ + return ret; } + +#if defined(APU_DSO_BUILD) && APR_HAS_THREADS +#define dbd_drivers_lock(m) apr_thread_mutex_lock(m) +#define dbd_drivers_unlock(m) apr_thread_mutex_unlock(m) +#else +#define dbd_drivers_lock(m) APR_SUCCESS +#define dbd_drivers_unlock(m) +#endif + APU_DECLARE(apr_status_t) apr_dbd_get_driver(apr_pool_t *pool, const char *name, const apr_dbd_driver_t **driver) { -#if APR_DSO_BUILD +#ifdef APU_DSO_BUILD char path[80]; apr_dso_handle_t *dlhandle = NULL; + apr_dso_handle_sym_t symbol; #endif apr_status_t rv; + rv = dbd_drivers_lock(mutex); + if (rv) { + return APR_SUCCESS; + } + *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING); if (*driver) { + dbd_drivers_unlock(mutex); return APR_SUCCESS; } -#if APR_DSO_BUILD +#ifdef APU_DSO_BUILD -#if APR_HAS_THREADS - rv = apr_thread_mutex_lock(mutex); - if (rv != APR_SUCCESS) { - goto unlock; - } - *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING); - if (*driver) { - goto unlock; - } -#endif - #ifdef WIN32 sprintf(path, "apr_dbd_%s.dll", name); #else - sprintf(path, "apr_dbd_%s.so", name); + apr_snprintf(path, sizeof path, APU_DSO_LIBDIR "/apr_dbd_%s.so", name); #endif rv = apr_dso_load(&dlhandle, path, pool); if (rv != APR_SUCCESS) { /* APR_EDSOOPEN */ goto unlock; } sprintf(path, "apr_dbd_%s_driver", name); - rv = apr_dso_sym((void*)driver, dlhandle, path); + rv = apr_dso_sym(&symbol, dlhandle, path); if (rv != APR_SUCCESS) { /* APR_ESYMNOTFOUND */ apr_dso_unload(dlhandle); goto unlock; } + *driver = symbol; if ((*driver)->init) { (*driver)->init(pool); } apr_hash_set(drivers, name, APR_HASH_KEY_STRING, *driver); unlock: -#if APR_HAS_THREADS - apr_thread_mutex_unlock(mutex); -#endif + dbd_drivers_unlock(mutex); -#else /* APR_DSO_BUILD - so if it wasn't already loaded, it's NOTIMPL */ +#else /* not builtin and !APR_HAS_DSO => not implemented */ rv = APR_ENOTIMPL; #endif Index: build/dbd.m4 =================================================================== --- build/dbd.m4 (revision 512074) +++ build/dbd.m4 (working copy) @@ -70,9 +70,9 @@ dnl Since we have already done the AC_CHECK_LIB tests, if we have it, dnl we know the library is there. if test "$apu_have_pgsql" = "1"; then - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lpq]) - APR_ADDTO(APRUTIL_LIBS,[-lpq]) + LDADD_dbd_pgsql=-lpq fi + AC_SUBST(LDADD_dbd_pgsql) ]) dnl AC_DEFUN([APU_CHECK_DBD_MYSQL], [ @@ -102,7 +102,6 @@ else if test "x$MYSQL_CONFIG" != 'x'; then APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS]) - APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS]) fi fi @@ -130,14 +129,12 @@ AC_CHECK_HEADERS(mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1])) if test "$apu_have_mysql" != "0"; then APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS]) - APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS]) fi if test "$apu_have_mysql" != "1"; then AC_CHECK_HEADERS(mysql/mysql.h, AC_CHECK_LIB(mysqlclient_r, mysql_init, [apu_have_mysql=1])) if test "$apu_have_mysql" != "0"; then APR_ADDTO(APRUTIL_INCLUDES, [-I$withval/include/mysql]) - APR_ADDTO(APRUTIL_LDFLAGS, [-L$withval/lib]) fi fi @@ -164,7 +161,6 @@ if test "$apu_have_mysql" != "0"; then if test "x$MYSQL_CONFIG" != 'x'; then APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS]) - APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS]) fi fi @@ -178,9 +174,9 @@ dnl Since we have already done the AC_CHECK_LIB tests, if we have it, dnl we know the library is there. if test "$apu_have_mysql" = "1"; then - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lmysqlclient_r]) - APR_ADDTO(APRUTIL_LIBS,[-lmysqlclient_r]) + LDADD_dbd_mysql=$mysql_LDFLAGS fi + AC_SUBST(LDADD_dbd_mysql) ]) dnl AC_DEFUN([APU_CHECK_DBD_SQLITE3], [ @@ -224,9 +220,9 @@ dnl Since we have already done the AC_CHECK_LIB tests, if we have it, dnl we know the library is there. if test "$apu_have_sqlite3" = "1"; then - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite3]) - APR_ADDTO(APRUTIL_LIBS,[-lsqlite3]) + LDADD_dbd_sqlite3="-lsqlite3" fi + AC_SUBST(LDADD_dbd_sqlite3) ]) dnl AC_DEFUN([APU_CHECK_DBD_SQLITE2], [ @@ -270,9 +266,38 @@ dnl Since we have already done the AC_CHECK_LIB tests, if we have it, dnl we know the library is there. if test "$apu_have_sqlite2" = "1"; then - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lsqlite]) - APR_ADDTO(APRUTIL_LIBS,[-lsqlite]) + LDADD_dbd_sqlite2="-lsqlite" fi + AC_SUBST(LDADD_dbd_sqlite2) ]) dnl +AC_DEFUN([APU_CHECK_DBD_DSO], [ + + AC_ARG_ENABLE([dbd-dso], + APR_HELP_STRING([--enable-dbd-dso], [build DBD drivers as DSOs])) + + if test "$enable_dbd_dso" = "yes"; then + AC_DEFINE([APU_DSO_BUILD], 1, [Define if DBD drivers are built as DSOs]) + + dsos= + test $apu_have_pgsql = 1 && dsos="$dsos dbd/apr_dbd_pgsql.la" + test $apu_have_mysql = 1 && dsos="$dsos dbd/apr_dbd_mysql.la" + test $apu_have_sqlite2 = 1 && dsos="$dsos dbd/apr_dbd_sqlite2.la" + test $apu_have_sqlite3 = 1 && dsos="$dsos dbd/apr_dbd_sqlite3.la" + + APU_MODULES="$APU_MODULES $dsos" + else + # Statically link the DBD drivers: + + objs= + test $apu_have_pgsql = 1 && objs="$objs dbd/apr_dbd_pgsql.lo" + test $apu_have_mysql = 1 && objs="$objs dbd/apr_dbd_mysql.lo" + test $apu_have_sqlite2 = 1 && objs="$objs dbd/apr_dbd_sqlite2.lo" + test $apu_have_sqlite3 = 1 && objs="$objs dbd/apr_dbd_sqlite3.lo" + EXTRA_OBJECTS="$EXTRA_OBJECTS $objs" + + APRUTIL_LIBS="$APRUTIL_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_mysql" + APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS $LDADD_dbd_pgsql $LDADD_dbd_sqlite2 $LDADD_dbd_sqlite3 $LDADD_dbd_mysql" + fi +])