diff options
-rw-r--r-- | CHANGES | 3 | ||||
-rw-r--r-- | Makefile.in | 30 | ||||
-rw-r--r-- | build.conf | 24 | ||||
-rw-r--r-- | build/dbd.m4 | 66 | ||||
-rw-r--r-- | configure.in | 19 | ||||
-rw-r--r-- | dbd/apr_dbd.c | 67 |
6 files changed, 152 insertions, 57 deletions
@@ -1,5 +1,8 @@ Changes with APR-util 1.3.0 + *) Support building DBD drivers as DSOs; use --enable-dbd-dso flag + to configure. [Joe Orton, Bojan Smojver] + *) Rewrite detection of expat in configure to fix build on e.g. biarch Linux platforms. PR 28205. [Joe Orton] diff --git a/Makefile.in b/Makefile.in index b59be98c..c7f1b7ef 100644 --- a/Makefile.in +++ b/Makefile.in @@ -22,7 +22,19 @@ APU_CONFIG = apu-$(APRUTIL_MAJOR_VERSION)-config INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ -TARGETS = $(TARGET_LIB) aprutil.exp apu-config.out +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_oracle = @LDADD_dbd_oracle@ +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@ @@ -53,7 +65,7 @@ top_blddir=@abs_builddir@ apu-config.out: $(APU_CONFIG) sed 's,^\(location=\).*$$,\1installed,' < $(APU_CONFIG) > $@ -install: $(TARGETS) +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,8 +79,16 @@ install: $(TARGETS) $(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: install-modules-@APU_HAVE_MODULES@ + +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 +109,5 @@ dox: test: check check: $(TARGET_LIB) cd test && $(MAKE) check + +.PHONY: install-modules install-modules-yes install-modules-no dox test check @@ -19,7 +19,7 @@ paths = xml/*.c strmatch/*.c xlate/*.c - dbd/*.c + dbd/apr_dbd.c ssl/*.c # we have no platform-specific subdirs @@ -28,7 +28,29 @@ platform_dirs = # the public headers headers = include/*.h include/private/*.h +modules = dbd_pgsql dbd_sqlite2 dbd_sqlite3 dbd_oracle 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_oracle] +paths = dbd/apr_dbd_oracle.c +target = dbd/apr_dbd_oracle.la + +[dbd_mysql] +paths = dbd/apr_dbd_mysql.c +target = dbd/apr_dbd_mysql.la diff --git a/build/dbd.m4 b/build/dbd.m4 index 65639a86..d489a64f 100644 --- a/build/dbd.m4 +++ b/build/dbd.m4 @@ -69,9 +69,9 @@ AC_DEFUN([APU_CHECK_DBD], [ 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], [ @@ -100,7 +100,6 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ else if test "x$MYSQL_CONFIG" != 'x'; then APR_ADDTO(APRUTIL_INCLUDES, [$mysql_CPPFLAGS]) - APR_ADDTO(APRUTIL_LDFLAGS, [$mysql_LDFLAGS]) fi fi @@ -128,14 +127,12 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ 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 @@ -162,7 +159,6 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ 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 @@ -176,9 +172,9 @@ AC_DEFUN([APU_CHECK_DBD_MYSQL], [ 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], [ @@ -221,9 +217,9 @@ AC_DEFUN([APU_CHECK_DBD_SQLITE3], [ 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], [ @@ -266,9 +262,9 @@ AC_DEFUN([APU_CHECK_DBD_SQLITE2], [ 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_ORACLE], [ @@ -294,8 +290,7 @@ AC_DEFUN([APU_CHECK_DBD_ORACLE], [ unset ac_cv_lib_clntsh_OCIEnvCreate AC_CHECK_LIB(clntsh, OCIEnvCreate, [ apu_have_oracle=1 - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lnnz10]) - APR_ADDTO(APRUTIL_LIBS,[-lnnz10]) + LDADD_dbd_oracle="-lnnz10" ],,[-lnnz10]) ])) @@ -322,8 +317,7 @@ AC_DEFUN([APU_CHECK_DBD_ORACLE], [ unset ac_cv_lib_clntsh_OCIEnvCreate AC_CHECK_LIB(clntsh, OCIEnvCreate, [ apu_have_oracle=1 - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lnnz10]) - APR_ADDTO(APRUTIL_LIBS,[-lnnz10]) + LDADD_dbd_oracle="-lnnz10" ],,[-lnnz10]) ])) if test "$apu_have_oracle" != "0"; then @@ -354,8 +348,7 @@ AC_DEFUN([APU_CHECK_DBD_ORACLE], [ unset ac_cv_lib_clntsh_OCIEnvCreate AC_CHECK_LIB(clntsh, OCIEnvCreate, [ apu_have_oracle=1 - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lnnz10]) - APR_ADDTO(APRUTIL_LIBS,[-lnnz10]) + LDADD_dbd_oracle=-lnnz10 ],,[-lnnz10]) ])) @@ -367,8 +360,39 @@ AC_DEFUN([APU_CHECK_DBD_ORACLE], [ 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_oracle" = "1"; then - APR_ADDTO(APRUTIL_EXPORT_LIBS,[-lclntsh]) - APR_ADDTO(APRUTIL_LIBS,[-lclntsh]) + LDADD_dbd_oracle="$LDADD_dbd_oracle -lclntsh" + fi + AC_SUBST(LDADD_dbd_oracle) +]) + +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_oracle = 1 && dsos="$dsos dbd/apr_dbd_oracle.la" + 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_oracle = 1 && objs="$objs dbd/apr_dbd_oracle.lo" + 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_oracle) $(LDADD_dbd_mysql)'" + APRUTIL_EXPORT_LIBS="$APRUTIL_EXPORT_LIBS '$(LDADD_dbd_pgsql) $(LDADD_dbd_sqlite2) $(LDADD_dbd_sqlite3) $(LDADD_dbd_oracle) $(LDADD_dbd_mysql)'" fi ]) -dnl diff --git a/configure.in b/configure.in index abc13a61..bb9a26a1 100644 --- a/configure.in +++ b/configure.in @@ -141,6 +141,8 @@ APU_CHECK_DBD_MYSQL APU_CHECK_DBD_SQLITE3 APU_CHECK_DBD_SQLITE2 APU_CHECK_DBD_ORACLE +dnl Enable DSO build; must be last: +APU_CHECK_DBD_DSO APU_FIND_EXPAT APU_FIND_ICONV @@ -169,6 +171,23 @@ AC_SUBST(lib_target) 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 diff --git a/dbd/apr_dbd.c b/dbd/apr_dbd.c index d95eb69b..c7b60ce3 100644 --- a/dbd/apr_dbd.c +++ b/dbd/apr_dbd.c @@ -16,23 +16,23 @@ #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_hash.h" -#include "apr_thread_mutex.h" #include "apr_dso.h" #include "apr_strings.h" +#include "apr_hash.h" +#include "apr_thread_mutex.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_HAS_THREADS static apr_thread_mutex_t* mutex = NULL; apr_status_t apr_dbd_mutex_lock() @@ -52,7 +52,7 @@ apr_status_t apr_dbd_mutex_unlock() { } #endif -#ifndef APR_DSO_BUILD +#ifndef APU_DSO_BUILD #define DRIVER_LOAD(name,driver,pool) \ { \ extern const apr_dbd_driver_t driver; \ @@ -91,8 +91,8 @@ APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool) /* This already registers a pool cleanup */ #endif -#ifndef APR_DSO_BUILD - +#ifndef APU_DSO_BUILD + /* Load statically-linked drivers: */ #if APU_HAVE_MYSQL DRIVER_LOAD("mysql", apr_dbd_mysql_driver, pool); #endif @@ -111,62 +111,67 @@ APU_DECLARE(apr_status_t) apr_dbd_init(apr_pool_t *pool) #if APU_HAVE_SOME_OTHER_BACKEND DRIVER_LOAD("firebird", apr_dbd_other_driver, pool); #endif -#endif /* APR_DSO_BUILD */ +#endif /* APU_DSO_BUILD */ + return ret; } + +#if defined(APR_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) APR_SUCCESS +#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 APR_DSO_BUILD char path[80]; apr_dso_handle_t *dlhandle = NULL; + apr_dso_handle_sym_t symbol; #endif apr_status_t rv; - *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING); - if (*driver) { + rv = dbd_drivers_lock(mutex); + if (rv) { return APR_SUCCESS; } -#if APR_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); + *driver = apr_hash_get(drivers, name, APR_HASH_KEY_STRING); if (*driver) { - goto unlock; + dbd_drivers_unlock(mutex); + return APR_SUCCESS; } -#endif + +#ifdef APR_DSO_BUILD #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 |