[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: [PATCH] Better fix for convoluted installations.(where 3rd party libs collocated in old version of svn)

From: Hyrum K. Wright <hyrum_wright_at_mail.utexas.edu>
Date: 2006-10-07 19:19:48 CEST

Hyrum K. Wright wrote:
> Ping...
>
> Could a committer take a look at this patch? If nothing happens with in
> the next few days, I'll file an issue.

Filed as issue 2625.

-Hyrum

> Kamesh Jayachandran wrote:
>> Hi All,
>> I use libtool 1.5.6
>>
>> I have /home/kamesh/work/install-1.3.1/bin/ is ahead of everything else
>> in PATH.
>>
>> I have neon, apr, apr-util, subversion-1.3.1 installed under
>> /home/kamesh/work/install-1.3.1/
>>
>> So when I build svn-1.5.0(trunk) I get neon from
>> /home/kamesh/work/install-1.3.1/lib, which has '1.3.1 svn' libs too.
>>
>> With current build.conf having 'neon' added explicitly to end of 'libs'
>> list of each binary makes sure that built 'lt-svn' always has
>> $BUILDDIR/subversion/libname/.libs ahead of
>> '/home/kamesh/work/install-1.3.1/lib' and hence no issue.
>>
>> When I removed 'neon' from the libs list of executables I could
>> reproduce the error('version mismatch in linking different versions of
>> the libs(1.3.1 and trunk(1.5.1)')
>>
>> I suggest the following fix rather than specifying each external library
>> explicitly for each executable.
>>
>> Move our library(which has direct dependency to third party libs) to end
>> of 'libs' line.
>> i.e
>> -libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_diff
>> libsvn_subr
>> - apriconv apr neon
>> +libs = libsvn_client libsvn_wc libsvn_delta libsvn_diff libsvn_subr
>> libsvn_ra
>> + apr apriconv
>>
>> This works.
>>
>>
>> I had a concern about "what would be the effect if libsvn_subr is ahead
>> of other libs"(libsvn_subr depends on xml, expat in this case is located
>> under /home/kamesh/work/install-1.3.1/lib)?
>>
>> To my surprise I did not get any error.
>>
>> I wanted to do one more research i.e place apr ahead of everything
>> else(I have apr at /home/kamesh/work/install-1.3.1/lib).
>> i.e
>> -libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_diff
>> libsvn_subr
>> - apriconv apr neon
>> +libs = apr libsvn_client libsvn_wc libsvn_delta libsvn_diff libsvn_subr
>> libsvn_ra
>> + apr
>>
>> Hoping that, it would place /home/kamesh/work/install-1.3.1/lib ahead of
>> everything else(our trunk builddir '.libs') and hence might reproduce
>> the error.
>>
>> To my surprise again I did not get any error.
>> This observation is justified by(readelf -a /path/to/lt-svn),
>>
>> RPATH inside the 'lt-svn'(In both of the above experiments) binary is
>> 0x0000000f (RPATH) Library rpath:
>> [/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_client/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_wc/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_ra/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_diff/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_delta/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_subr/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_ra_local/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_repos/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_fs/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_fs_fs/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_ra_svn/.libs:/home/kamesh/work/svn/pure_trunk/vpath/subversion/libsvn_ra_dav/.libs:/home/kamesh/work/install-1.3.1/lib:/home/kamesh/pure_trunk/lib]
>>
>>
>>
>> Answer to above surprise results:
>> The problem is if the external lib is used by only one shared lib then
>> the 'external lib location' is placed in the same position in RPATH as
>> the 'libs' line in the build.conf.
>> E.g 'neon' being consumed directly by 'libsvn_ra_dav' only.
>> This causes the confusion of loading few libs from '1.3.1' and few from
>> 'trunk'.
>>
>> In case of 'xml' and 'apr' both libs are consumed by many other shared
>> libs and hence the libtool intellignetly adds their location at the
>> end(Refer the above RPATH, /home/kamesh/work/install-1.3.1/lib is behind
>> the build dirs).
>>
>> So the proper fix is to move any library having the third party
>> dependency and that third party dependency is solely needed by this
>> library alone to the end of 'libs' specification of an executable in
>> build.conf.
>> E.g 'libsvn_ra_dav' needs 'neon' and noother lib constituting 'svn' has
>> direct dependency with 'neon'.
>>
>> We have similar issue with sqlite too in merge-tracking branch. Attached
>> patch works for similar issue with 'sqlite' in merge-tracking branch.
>> Moving the libsvn_ra to end of 'libs' line of 'svn' binary fixes that too.
>> The same problem should definitely be there for 'serf' and 'bdb' too,
>> though I did not try.
>>
>> I am attaching the patch against the trunk.
>>
>> Currently I would like to limit myself to do this change for 'exe'
>> programs and 'libsvnjavahl'(which seem to explicitly refer neon) alone,
>> if need arise might do it for applicable libs like libsvn_client too.
>>
>> With regards
>> Kamesh Jayachandran
>>
>>
>> ------------------------------------------------------------------------
>>
>> Index: build.conf
>> ===================================================================
>> --- build.conf (revision 21604)
>> +++ build.conf (working copy)
>> @@ -112,32 +112,13 @@
>> # BUILD TARGETS
>> #
>>
>> -# Explanation for the seemingly-spurious mention of 'neon' in the libs lines
>> -# for svn, svnsync, ra-local-test, svn-push and mucc:
>> -# This is a workaround for a libtool bug, which manifests on Linux and similar
>> -# ELF platforms, when linking to an installed Neon, and there are old
>> -# Subversion libraries in the same directory as the installed Neon. In such
>> -# cases, the run-before-installing version of the executables (.libs/lt-foo),
>> -# gets given an ELF RPATH which includes the install directory *before* all the
>> -# uninstalled libsvn_foo/.libs directories have been mentioned. This occurs
>> -# because when libtool is at the point of handling Neon, it adds an RPATH entry
>> -# pointing to its directory, but fails to correctly consider that it should
>> -# prioritize all the RPATH entries for *un*installed libraries before all those
>> -# for installed libraries, to avoid this bug. As a kludgy workaround, we add
>> -# a mention of 'neon' to the end of the libs lines for executables which
>> -# indirectly link to libsvn_ra_dav, which has the effect of 'pulling' the
>> -# harmful RPATH entry toward the end of RPATH, enabling the executables to run
>> -# correctly before installation, even when old versions of the Subversion
>> -# libraries are present.
>> -# This bug was last confirmed to be present in libtool 1.5.22.
>> -
>> # The subversion command-line client
>> [svn]
>> description = Subversion Client
>> type = exe
>> path = subversion/svn
>> -libs = libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_diff libsvn_subr
>> - apriconv apr neon
>> +libs = libsvn_client libsvn_wc libsvn_delta libsvn_diff libsvn_subr libsvn_ra
>> + apriconv apr
>> manpages = subversion/svn/svn.1
>> install = bin
>>
>> @@ -182,7 +163,7 @@
>> description = Subversion repository replicator
>> type = exe
>> path = subversion/svnsync
>> -libs = libsvn_ra libsvn_delta libsvn_subr apr neon
>> +libs = libsvn_delta libsvn_subr libsvn_ra apr
>> install = bin
>> manpages = subversion/svnsync/svnsync.1
>>
>> @@ -486,8 +467,8 @@
>> description = Subversion Java HighLevel binding
>> type = lib
>> path = subversion/bindings/java/javahl/native
>> -libs = libsvn_repos libsvn_client libsvn_wc libsvn_ra libsvn_delta libsvn_subr
>> - aprutil apriconv apr neon
>> +libs = libsvn_repos libsvn_client libsvn_wc libsvn_delta libsvn_subr libsvn_ra
>> + aprutil apriconv apr
>> sources = *.cpp *.c
>> add-deps = $(javahl_javah_DEPS) $(javahl_java_DEPS)
>> install = javahl-lib
>> @@ -710,8 +691,8 @@
>> path = subversion/tests/libsvn_ra_local
>> sources = ra-local-test.c
>> install = test
>> -libs = libsvn_test libsvn_ra_local libsvn_ra libsvn_fs libsvn_delta libsvn_subr
>> - apriconv apr neon
>> +libs = libsvn_test libsvn_ra_local libsvn_fs libsvn_delta libsvn_subr libsvn_ra
>> + apriconv apr
>>
>> # ----------------------------------------------------------------------------
>> # These are not unit tests at all, they are small programs that exercise
>> @@ -891,14 +872,14 @@
>> path = contrib/client-side/svn-push
>> sources = svn-push.c
>> install = contrib
>> -libs = libsvn_ra libsvn_delta libsvn_subr apriconv apr neon
>> +libs = libsvn_delta libsvn_subr libsvn_ra apriconv apr
>>
>> [mucc]
>> type = exe
>> path = contrib/client-side
>> sources = mucc.c
>> install = contrib
>> -libs = libsvn_client libsvn_ra libsvn_subr apriconv apr neon
>> +libs = libsvn_client libsvn_subr libsvn_ra apriconv apr
>>
>> [diff]
>> type = exe
>>
>>
>> ------------------------------------------------------------------------
>>
>> [[[
>> Patch by: Kamesh Jayachandran <kamesh@collab.net>
>>
>> To fix the RPATH pollution if 'neon is located in the same directory as the
>> old svn libs', the right approach would be to move libsvn_ra to the end of
>> 'libs' list of exe's getting built and remove 'neon' from explicitly mentioned.
>>
>> * build.conf
>> (global): Removing the 'comment on reasoning for spurious mention of neon'.
>> (svn): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> (svnsync): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> (libsvnjavahl): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> (ra-local-test): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> (svn-push): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> (mucc): Remove 'neon' from 'libs'.
>> Move 'libsvn_ra' to end.
>> ]]]
>

Received on Sat Oct 7 19:20:12 2006

This is an archived mail posted to the Subversion Dev mailing list.