Hi --

   I've encountered some issues with the apr-util build/configure
system that I thought I might pass on for wiser minds than mine
to review.

   The crux of the problem seems to be twofold.  First, it's
unclear to me what provision the apr-util build system has for
libraries (such as commercial binary-only libraries) that lack
.la libtool archive files.  My current solution to that problem
is to add -R/path/to/lib alongside the -L/path/to/lib in the
apr-util buildconf process.  (Bear with me if it seems dumb to
be fiddling with the buildconf process.)

   Second, because the httpd build process depends on the output
from apu-1-config, and specifically the output of
apu-1-config --ldflags and --libs, certain types of library
dependency problems get passed along to it, and I'm not sure
that's really necessary.

   My ultimate question, for the impatient, is whether adding
-R to APRUTIL_LDFLAGS is an appropriate solution when using
libraries that one expects not to have accompanying .la files.


   Here's a second level of detail.  So long as the libraries
that are detected by the autoconf process have .la libtool
archive files as well as the .so files, all is well.

   If one has a library that lacks a .la file, though, trouble
creeps in.  (If you're thinking, "Don't do that!", do bear with me.)
You can simulate this problem by, for example, hiding your
normal iconv libraries, installing new ones in a private location,
and then removing the .la files.

   The libaprutil-1.so library still builds and installs "OK",
but contains a problem that crops up when you run "make check":
it has unresolved paths to its dependent libraries.  Probing with
ldd will show, for example:

libiconv.so.2 => not found

   If you then compile httpd with this libaprutil-1.so, it'll
do so but fail to run with the obvious error, "libiconv.so.2:
cannot open shared object file: No such file or directory".

   So that's the first problem, in essence -- lack of .la files
causes the libaprutil-1.so library to have undefined paths to
its dependent libraries, even though it compiled "OK".


   The next problem -- if indeed it is one -- turned up as I
began to investigate ways to solve the first one.  My initial
attempt was to hack into apr-util's build/rules.mk file and
add something like:

NOTEST_LDFLAGS=-R/path/to/lib

   The purpose here is to ensure that the -R option gets added
to the libtool command link created by $LINK in rules.mk, and
specifically somewhere after $COMPILE, i.e., like this:

.../libtool ... --mode=link ... gcc ... \
        -version-info 2:1:2 ... -R/path/to/lib ...

This corresponds to the advice I could find in the libtool
info pages; see, for example, libtool --mode=link --help.

   Now I didn't have a working solution yet, because this was
just a post-buildconf, post-configure hack.  But, OTOH, the
libaprutil-1.so was OK, with no undefined dependencies listed
by ldd.

   OK, so now I went over and compiled and installed my httpd.
But it didn't run, with the same old error: "libiconv.so.2:
cannot open shared object file...."  Checking the httpd
binary with ldd, I see that it has, weirdly:

libiconv.so.2 => not found
...
libiconv.so.2 => /path/to/lib/libiconv.so.2

   Huh?  This appears to be the consequence of building httpd
with the output of apu-1-config --libs and --ldflags.  The final
step of the httpd make process is, roughly:

.../libtool --mode=link ... $EXTRA_LDFLAGS ... $EXTRA_LIBS ...

where EXTRA_LDFLAGS contains the output of apu-1-config --ldflags
and EXTRA_LIBS contains the output of apu-1-config --libs.
And EXTRA_LDFLAGS doesn't contain my -R/path/to/lib hack because
I slipped it into apr-util's build/rules.mk by hand, after
running configure, so it's not in apr-1-config.

   So the second problem -- if it is one -- is that because
httpd's configure process imports the list of -L and -l (and -I)
options from apr-util (and apr too, of course), it re-links
the httpd binary against libraries that perhaps it does not
need to.  In the contrived instance above, I'm not sure if there's
any reason for httpd to link against -liconv: after all, that's
a dependency of libaprutil-1.so, not httpd.

   My understanding from the libtool documentation is that certain
older Unix-like systems, such as perhaps AIX, don't allow inter-
library dependencies.  So that may be the reason for importing
the whole list of -L and -l options from apr and apr-util, even
on a system like Linux or Solaris, where inter-library dependencies
are resolved by ld.

   Still, I thought I'd point it out, because it only turned up
as a result of an unusual hack, but then it did occur to me to
wonder why httpd needed to link against libraries that apr-util
abstracts and "hides".


   So that's a summary, now some rationale.  The use of libiconv
in the examples above was just for demonstration (but it is
reproducible, if you remove the .la file).  My real problem is
with certain commercial libraries that are distributed as
binaries, and without .la files, specifically Oracle's
libclntsh.so.  I've been working with Nick Kew to complete
a first pass at the code for an apr_dbd_oracle.c driver and
accompanying autoconf magic.  So far, my best solution to the
problems described above is what I initially stated: add -R to
APRUTIL_LDFLAGS alongside the -L for Oracle's library.

   This -R solves the first problem by ensuring that
libaprutil-1.so has no dependency problems itself.

   Next, because it gets output by apu-1-config --ldflags, it's
used during httpd's compilation as well, so the fact that
httpd re-links against Oracle's library (because of the -l output
by apu-1-config --libs) doesn't cause dependency problems
either; probing the resultant httpd with ldd reveals that
it lists libclntsh.so twice, both with full paths and no
"not found" problems.

   Still, as I said, it seems odd for httpd to need to link
against Oracle's library when it's fully abstracted behind
apr-util, at least on an OS that supports inter-library
dependencies.

   Thus, back to my original question: is -R appropriate?
Is there a better way of linking against non-libtool-generated
libraries?


   I should say, this is all on Linux, specifically RedHat;
libtool 1.5.6, autoconf 2.59, ld 2.15.92.0.2, gcc 3.4.3,
apr 1.2.1, apr-util 1.2.1, and httpd 2.1.8-beta.

Chris.

-- 
GPG Key ID: 366A375B
GPG Key Fingerprint: 485E 5041 17E1 E2BB C263  E4DE C8E3 FA36 366A 375B

Reply via email to