[Xorp-cvs] SF.net SVN: xorp:[11643] trunk/xorp

bms_fbsd at users.sourceforge.net bms_fbsd at users.sourceforge.net
Wed Dec 2 03:30:16 PST 2009


Revision: 11643
          http://xorp.svn.sourceforge.net/xorp/?rev=11643&view=rev
Author:   bms_fbsd
Date:     2009-12-02 11:30:15 +0000 (Wed, 02 Dec 2009)

Log Message:
-----------
Expand the use of $ORIGIN in the runtime ELF linker. Do not enable
it by default yet.

The trick here is to always use a relative RPATH of $ORIGIN/../lib,
and to mimic the installed layout in $BUILDDIR using symlinks.

NOTE WELL: This change is not complete; some binaries are installed
further down in the target tree, so using a globally relative path
will break. This change should, however, allow you to run most
binaries from within BUILDDIR without installing during development.

The conditional spamming in each SConscript can be toned down if we
override the behaviour of the existing SharedLibrary builder in
our SConsEnvironment to use our PostActions.
For now, we make the creation of the symlink explicit where needed.

Modified Paths:
--------------
    trunk/xorp/SConstruct
    trunk/xorp/fea/SConscript
    trunk/xorp/fib2mrib/SConscript
    trunk/xorp/libcomm/SConscript
    trunk/xorp/libfeaclient/SConscript
    trunk/xorp/libproto/SConscript
    trunk/xorp/libxipc/SConscript
    trunk/xorp/libxipc/xrl_std_router.cc
    trunk/xorp/libxipc/xrl_std_router.hh
    trunk/xorp/libxorp/SConscript
    trunk/xorp/mrt/SConscript
    trunk/xorp/ospf/SConscript
    trunk/xorp/pim/SConscript
    trunk/xorp/policy/SConscript
    trunk/xorp/policy/backend/SConscript
    trunk/xorp/policy/common/SConscript
    trunk/xorp/rib/SConscript
    trunk/xorp/rip/SConscript
    trunk/xorp/static_routes/SConscript
    trunk/xorp/vrrp/SConscript
    trunk/xorp/xrl/interfaces/SConscript
    trunk/xorp/xrl/targets/SConscript

Modified: trunk/xorp/SConstruct
===================================================================
--- trunk/xorp/SConstruct	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/SConstruct	2009-12-02 11:30:15 UTC (rev 11643)
@@ -203,6 +203,15 @@
 SConsEnvironment.Chmod = SCons.Action.ActionFactory(os.chmod,
     lambda dest, mode: 'Chmod("%s", 0%o)' % (dest, mode))
 
+def Symlink(src, link_name):
+    try:
+        os.unlink(link_name)
+    except OSError:
+        pass
+    os.symlink(src, link_name)
+SConsEnvironment.Symlink = SCons.Action.ActionFactory(Symlink,
+    lambda src, link_name: 'Symlink("%s", "%s")' % (src, link_name))
+
 def InstallProgram(env, dest, files, perm = 0755):
     if env.has_key('DESTDIR'):
     	# NB: use simple concatenation
@@ -507,26 +516,38 @@
         '-DDEBUG_CALLBACKS',
     ])
 
+#
+# Fixup shared library paths.
 # Shared libraries are installed in $exec_prefix/lib by default.
 #
-# Experimental feature: if rtld_origin is True, the linker will
-# be passed a relative RPATH. The ORIGIN flag will be enabled for all
-# dynamically linked binaries, instead of hardcoding an absolute RPATH.
+# If rtld_origin is True, the linker will be passed a relative RPATH.
+# This allows the package itself to be relocated in the filesystem
+# as a whole.
 #
-# XXX This may not be correct for all binaries. Some binaries still
-# get installed in locations other than $bindir.
 if env.has_key('SHAREDLIBS'):
     if env['rtld_origin']:
-	# XXX Will this pass it to the linker correctly?
-	# In most cases the C++ compiler is used as the link tool.
-	#env.PrependUnique( LINKFLAGS = [ '-Wl,-z,origin' ] )
-	env.PrependUnique( LINKFLAGS = Split('-z origin') )
-	rellibdir = os.path.relpath(env.Dir('$libdir').abspath,
-				    env.Dir('$bindir').abspath)
+	# Build a subdirectory for holding symlinks to libraries upfront, so
+	# that binaries about to be built can be run from inside the BUILDDIR.
+	Execute(Mkdir(builddir + '/lib'))
+	# Tell rtld to turn on $ORIGIN processing by default.
+	# NOTE: GNU ld specific flag.
+	env.PrependUnique( LINKFLAGS = [ '-Wl,-z,origin' ] )
+	#
+	# Now fixup the RPATH.
+	# FIXME This is not correct for all binaries. Some
+	# get installed in locations other than $bindir.
+	# The RPATH actually needs to get re-evaluated on each
+	# binary target, depending on how far down they get installed.
+	#
+	#rellibdir = os.path.relpath(env.Dir('$libdir').abspath,
+	#			    env.Dir('$bindir').abspath)
+	rellibdir = '../lib'
 	env.AppendUnique(RPATH = [
 	    env.Literal(os.path.join('\\$$ORIGIN', rellibdir))
 	])
     else:
+	# Hardcode the RPATH to our final destination.
+	# Developers will need to set LD_LIBRARY_PATH until they install.
 	env.AppendUnique(RPATH = [
 	    '$libdir',
 	])

Modified: trunk/xorp/fea/SConscript
===================================================================
--- trunk/xorp/fea/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/fea/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -151,6 +151,10 @@
     libxorp_fea_srcs += libxfdp_srcs
     libxorp_fea = env.SharedLibrary(target = 'libxorp_fea',
 			       source = libxorp_fea_srcs)
+    if env['rtld_origin']:
+        for obj in libxorp_fea:
+            env.AddPostAction(libxorp_fea,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install',
               env.InstallLibrary('$libdir', libxorp_fea))
 else:

Modified: trunk/xorp/fib2mrib/SConscript
===================================================================
--- trunk/xorp/fib2mrib/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/fib2mrib/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -72,6 +72,10 @@
 	target = 'libxorp_fib2mrib',
 	source = libxorp_fib2mrib_srcs,
 	LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_fib2mrib:
+            env.AddPostAction(libxorp_fib2mrib,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_fib2mrib = env.StaticLibrary(
 	target = 'libxorp_fib2mrib',

Modified: trunk/xorp/libcomm/SConscript
===================================================================
--- trunk/xorp/libcomm/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libcomm/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -38,6 +38,11 @@
 
 if is_shared:
     libxorp_comm = env.SharedLibrary(target = 'libxorp_comm', source = sources)
+    # build symlink for resolving links whilst in BUILDDIR
+    if env['rtld_origin']:
+        for obj in libxorp_comm:
+            env.AddPostAction(libxorp_comm,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_comm = env.StaticLibrary(target = 'libxorp_comm', source = sources)
 

Modified: trunk/xorp/libfeaclient/SConscript
===================================================================
--- trunk/xorp/libfeaclient/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libfeaclient/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -44,6 +44,10 @@
 if is_shared:
     libxorp_fea_client = env.SharedLibrary(target = 'libxorp_fea_client',
 					   source = libxorp_fea_client_srcs)
+    if env['rtld_origin']:
+        for obj in libxorp_fea_client:
+            env.AddPostAction(libxorp_fea_client,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_fea_client = env.StaticLibrary(target = 'libxorp_fea_client',
 					   source = libxorp_fea_client_srcs)

Modified: trunk/xorp/libproto/SConscript
===================================================================
--- trunk/xorp/libproto/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libproto/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -43,6 +43,10 @@
 if is_shared:
     libxorp_proto = env.SharedLibrary(target = 'libxorp_proto',
 				      source = sources)
+    if env['rtld_origin']:
+        for obj in libxorp_proto:
+            env.AddPostAction(libxorp_proto,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_proto = env.StaticLibrary(target = 'libxorp_proto',
 				      source = sources)

Modified: trunk/xorp/libxipc/SConscript
===================================================================
--- trunk/xorp/libxipc/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libxipc/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -106,6 +106,11 @@
 if is_shared:
     libxipc = libxipc_env.SharedLibrary(target = 'libxorp_ipc',
                                         source = libxipc_sources)
+    # build symlink for resolving links whilst in BUILDDIR
+    if env['rtld_origin']:
+        for obj in libxipc:
+            env.AddPostAction(libxipc,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install',
               env.InstallLibrary('$libdir', libxipc))
 else:
@@ -164,6 +169,11 @@
 if is_shared:
     libfinder = libfinder_env.SharedLibrary(target = 'libxorp_finder',
                                             source = libfinder_sources)
+    # build symlink for resolving links whilst in BUILDDIR
+    if env['rtld_origin']:
+        for obj in libfinder:
+            env.AddPostAction(libfinder,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install',
               env.InstallLibrary('$libdir', libfinder))
 else:

Modified: trunk/xorp/libxipc/xrl_std_router.cc
===================================================================
--- trunk/xorp/libxipc/xrl_std_router.cc	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libxipc/xrl_std_router.cc	2009-12-02 11:30:15 UTC (rev 11643)
@@ -23,42 +23,55 @@
 
 #include "xrl_module.h"
 #include "xrl_std_router.hh"
-//#include "xrl_pf_inproc.hh"
+//#include "xrl_pf_inproc.hh"	// Inproc is deprecated.
 #include "xrl_pf_stcp.hh"
-//#include "xrl_pf_sudp.hh"
+//#include "xrl_pf_sudp.hh"	// UDP is deprecated.
 #include "xrl_pf_unix.hh"
 #include "libxorp/xlog.h"
 
+
 // ----------------------------------------------------------------------------
 // Helper methods
 
+#if !defined(XRL_PF)
+#error "A default transport for XRL must be defined using the preprocessor."
+#endif
+
+static const char default_pf[] = { XRL_PF, '\0' };
+
 XrlPFListener*
 XrlStdRouter::create_listener()
 {
     const char* pf = getenv("XORP_PF");
+    if (pf == NULL)
+	pf = default_pf;
 
-    if (pf != NULL) {
-	switch (pf[0]) {
-#if 0
+    switch (pf[0]) {
+#if 0	// Inproc is deprecated.
 	case 'i':
 	    return new XrlPFInProcListener(_e, this);
-
+#endif
+	// For the benefit of bench_ipc.sh.
+	case 't':
+	    return new XrlPFSTCPListener(_e, this);
+	    break;
+#if 0	// UDP is deprecated.
 	case 'u':
 	    return new XrlPFSUDPListener(_e, this);
 #endif
-
 	case 'x':
+#if XRL_PF != 'x'
 	    XLOG_ASSERT(_unix == NULL);
+#endif
 	    return new XrlPFUNIXListener(_e, this);
-
 	default:
 	    XLOG_ERROR("Unknown PF %s\n", pf);
 	    XLOG_ASSERT(false);
 	    break;
-	}
     }
 
-    return new XrlPFSTCPListener(_e, this);
+    XLOG_UNREACHABLE();
+    return 0;
 }
 
 static void
@@ -125,6 +138,14 @@
 {
     _unix = _l = NULL;
 
+    // We need to check the environment otherwise
+    // we get the compiled-in default.
+    const char* pf = getenv("XORP_PF");
+    if (pf == NULL)
+	pf = default_pf;
+    if (pf[0] != 'x')
+	unix_socket = false;
+
     if (unix_socket)
 	create_unix_listener();
 

Modified: trunk/xorp/libxipc/xrl_std_router.hh
===================================================================
--- trunk/xorp/libxipc/xrl_std_router.hh	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libxipc/xrl_std_router.hh	2009-12-02 11:30:15 UTC (rev 11643)
@@ -27,7 +27,11 @@
 #include "xrl_router.hh"
 #include "xrl_pf.hh"
 
+#if !defined(XRL_PF) || (XRL_PF == 'x')
+#define UNIX_SOCKET_DEFAULT true
+#else
 #define UNIX_SOCKET_DEFAULT false
+#endif
 
 /**
  * @short Standard XRL transmission and reception point.

Modified: trunk/xorp/libxorp/SConscript
===================================================================
--- trunk/xorp/libxorp/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/libxorp/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -81,6 +81,17 @@
 if is_shared:
     libxorp_core = env.SharedLibrary(target = 'libxorp_core',
 				     source = libxorp_core_srcs)
+    # Symlink the library into builddir's copy of lib, so that
+    # rtld $ORIGIN references will pick it up automatically without
+    # relinking. This syntax looks a little weird, as it makes the
+    # action of building the symlink a 'PostAction' in the SCons
+    # dependency graph.
+    # We basically do this for every SharedLibrary we potentially
+    # need to see for binaries not yet installed from the BUILDDIR.
+    if env['rtld_origin']:
+        for obj in libxorp_core:
+            env.AddPostAction(libxorp_core,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_core = env.StaticLibrary(target = 'libxorp_core',
 				     source = libxorp_core_srcs)

Modified: trunk/xorp/mrt/SConscript
===================================================================
--- trunk/xorp/mrt/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/mrt/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -36,6 +36,10 @@
 
 if is_shared:
     libxorp_mrt = env.SharedLibrary(target = 'libxorp_mrt', source = sources)
+    if env['rtld_origin']:
+        for obj in libxorp_mrt:
+            env.AddPostAction(libxorp_mrt,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_mrt = env.StaticLibrary(target = 'libxorp_mrt', source = sources)
 

Modified: trunk/xorp/ospf/SConscript
===================================================================
--- trunk/xorp/ospf/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/ospf/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -91,6 +91,10 @@
     libxorp_ospf = env.SharedLibrary(target = 'libxorp_ospf',
 				     source = libxorp_ospf_srcs,
 				     LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_ospf:
+            env.AddPostAction(libxorp_ospf,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_ospf = env.StaticLibrary(target = 'libxorp_ospf',
 				     source = libxorp_ospf_srcs,

Modified: trunk/xorp/pim/SConscript
===================================================================
--- trunk/xorp/pim/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/pim/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -102,6 +102,10 @@
 if is_shared:
     libxorp_pim = env.SharedLibrary(target = 'libxorp_pim',
 				    source = libxorp_pim_srcs, LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_pim:
+            env.AddPostAction(libxorp_pim,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install',
               env.InstallLibrary('$libdir', libxorp_pim))
 else:

Modified: trunk/xorp/policy/SConscript
===================================================================
--- trunk/xorp/policy/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/policy/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -97,6 +97,10 @@
     libxorp_policy = env.SharedLibrary(target = 'libxorp_policy',
 				       source = libxorp_policy_srcs,
 				       LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_policy:
+            env.AddPostAction(libxorp_policy,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install', env.InstallLibrary('$libdir', libxorp_policy))
 else:
     libxorp_policy = env.StaticLibrary(target = 'libxorp_policy',

Modified: trunk/xorp/policy/backend/SConscript
===================================================================
--- trunk/xorp/policy/backend/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/policy/backend/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -44,6 +44,10 @@
 if is_shared:
     libpbe = env.SharedLibrary(target = 'libxorp_policy_backend',
 			       source = libpbesrcs)
+    if env['rtld_origin']:
+        for obj in libpbe:
+            env.AddPostAction(libpbe,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install',
         env.InstallLibrary('$libdir', libpbe))
 else:

Modified: trunk/xorp/policy/common/SConscript
===================================================================
--- trunk/xorp/policy/common/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/policy/common/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -45,6 +45,10 @@
     libpcmsrcs += [ '../../bgp/aspath.cc' ]
     libpcm = env.SharedLibrary(target = 'libxorp_policy_common',
 			       source = libpcmsrcs)
+    if env['rtld_origin']:
+        for obj in libpcm:
+            env.AddPostAction(libpcm,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     env.Alias('install', env.InstallLibrary('$libdir', libpcm))
 else:
     obj_aspath = env.StaticObject(target = 'aspath',

Modified: trunk/xorp/rib/SConscript
===================================================================
--- trunk/xorp/rib/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/rib/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -102,6 +102,10 @@
     libxorp_rib = env.SharedLibrary(target = 'libxorp_rib',
 				    source = libxorp_rib_srcs,
 				    LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_rib:
+            env.AddPostAction(libxorp_rib,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_rib = env.StaticLibrary(target = 'libxorp_rib',
 				    source = libxorp_rib_srcs,

Modified: trunk/xorp/rip/SConscript
===================================================================
--- trunk/xorp/rip/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/rip/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -131,9 +131,17 @@
     libxorp_rip = e.SharedLibrary(target = 'libxorp_rip',
 				  source = libxorp_rip_srcs,
 				  LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_rip:
+            env.AddPostAction(libxorp_rip,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     libxorp_rip_xrl = e.SharedLibrary(target = 'libxorp_rip_xrl',
 				      source = libxorp_rip_xrl_srcs,
 				      LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_rip_xrl:
+            env.AddPostAction(libxorp_rip_xrl,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     e.Alias('install',
                 [ e.InstallLibrary('$libdir', libxorp_rip),
                   e.InstallLibrary('$libdir', libxorp_rip_xrl) ])
@@ -201,9 +209,17 @@
     libxorp_ripng = e.SharedLibrary(target = 'libxorp_ripng',
 				    source = libxorp_rip_srcs,
 				    LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_ripng:
+            env.AddPostAction(libxorp_ripng,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     libxorp_ripngxrl = e.SharedLibrary(target = 'libxorp_ripng_xrl',
 				       source = libxorp_rip_xrl_srcs,
 				       LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_ripngxrl:
+            env.AddPostAction(libxorp_ripngxrl,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
     e.Alias('install',
                 [ e.InstallLibrary('$libdir', libxorp_ripng),
                   e.InstallLibrary('$libdir', libxorp_ripngxrl) ])

Modified: trunk/xorp/static_routes/SConscript
===================================================================
--- trunk/xorp/static_routes/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/static_routes/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -75,6 +75,10 @@
 	target = 'libxorp_static_routes',
 	source = libxorp_static_routes_srcs,
 	LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_static_routes:
+            env.AddPostAction(libxorp_static_routes,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_static_routes = env.StaticLibrary(
 	target = 'libxorp_static_routes',

Modified: trunk/xorp/vrrp/SConscript
===================================================================
--- trunk/xorp/vrrp/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/vrrp/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -72,6 +72,10 @@
     libxorp_vrrp = env.SharedLibrary(target = 'libxorp_vrrp',
 				     source = libxorp_vrrp_srcs,
 				     LIBS = '')
+    if env['rtld_origin']:
+        for obj in libxorp_vrrp:
+            env.AddPostAction(libxorp_vrrp,
+                env.Symlink(obj.abspath, env['BUILDDIR'] + '/lib/' + str(obj)))
 else:
     libxorp_vrrp = env.StaticLibrary(target = 'libxorp_vrrp',
 				     source = libxorp_vrrp_srcs,

Modified: trunk/xorp/xrl/interfaces/SConscript
===================================================================
--- trunk/xorp/xrl/interfaces/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/xrl/interfaces/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -105,6 +105,12 @@
 
     if is_shared:
         lib = env.SharedLibrary(tgt, src)
+        # symlink an alias for each library when $ORIGIN is in use.
+        if env['rtld_origin']:
+            for obj in lib:
+                env.AddPostAction(lib,
+                    env.Symlink(obj.abspath,
+                                env['BUILDDIR'] + '/lib/' + str(obj)))
     else:
         lib = env.StaticLibrary(tgt, src)
 

Modified: trunk/xorp/xrl/targets/SConscript
===================================================================
--- trunk/xorp/xrl/targets/SConscript	2009-12-02 11:11:00 UTC (rev 11642)
+++ trunk/xorp/xrl/targets/SConscript	2009-12-02 11:30:15 UTC (rev 11643)
@@ -91,6 +91,12 @@
 
     if is_shared:
         lib = env.SharedLibrary(target, source)
+        # symlink an alias for each library when $ORIGIN is in use.
+        if env['rtld_origin']:
+            for obj in lib:
+                env.AddPostAction(lib,
+                    env.Symlink(obj.abspath,
+                                env['BUILDDIR'] + '/lib/' + str(obj)))
     else:
         lib = env.StaticLibrary(target, source)
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.



More information about the Xorp-cvs mailing list