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
+])

Reply via email to