Add RPATH support. (Chad Austin)
authorstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 3 Apr 2004 07:16:45 +0000 (07:16 +0000)
committerstevenknight <stevenknight@fdb21ef1-2011-0410-befe-b5e4ea1792b1>
Sat, 3 Apr 2004 07:16:45 +0000 (07:16 +0000)
git-svn-id: http://scons.tigris.org/svn/scons/trunk@944 fdb21ef1-2011-0410-befe-b5e4ea1792b1

doc/man/scons.1
src/CHANGES.txt
src/engine/SCons/Platform/posix.py
src/engine/SCons/Tool/gnulink.py
test/RPATH.py [new file with mode: 0644]

index dfeb3df1269dbd6d43c67e517c829a932e819f03..0c4674720f11bcf71b8b8b8c949db22ce7a705f2 100644 (file)
@@ -5113,6 +5113,15 @@ are included on this command line.
 .IP RMICFLAGS
 General options passed to the Java RMI stub compiler.
 
+.IP RPATH
+A list of paths to search for shared libraries when running programs.
+Currently only used in the GNU linker.  Ignored on platforms and
+toolchains that don't support it.  Note that the paths added to RPATH
+are not transformed by
+.B scons
+in any way:  if you want an absolute
+path, you must make it absolute yourself.
+
 .IP SCANNERS
 A list of the available implicit dependency scanners. [CScan] by default.
 
index 0501093a1e14b665eb1cb82ffb126b8232fa12d6..49584a19dca48bec07553508e724e677d108d6a8 100644 (file)
@@ -19,6 +19,11 @@ RELEASE 0.96 - XXX
   - Add a $QT_AUTOBUILD_MOC_SOURCES construction variable that controls
     whether moc-generated .cpp files get compiled.
 
+  From Chad Austin and Christoph Wiedemann:
+
+  - Add support for a $RPATH variable to supply a list of directories
+    to search for shared libraries when linking a program.
+
   From Charles Crain:
 
   - Restore the ability to do construction variable substitutions in all
index bc121e6c885bb638eda9f75144e4188ec4f841d4..f64d272e2db38e41d9e6d41444c4964b34eab852 100644 (file)
@@ -229,3 +229,6 @@ def generate(env):
     env['SPAWN']          = spawn
     env['SHELL']          = 'sh'
     env['ESCAPE']         = escape
+
+    # This platform supports RPATH specifications.
+    env['__RPATH'] = '$_RPATH'
index 0e7530473b82ae3bd3001af98e727c7e54f295cf..b900202fe50861bc667f1b9afe9786eb4d735e0a 100644 (file)
@@ -45,6 +45,13 @@ def generate(env):
 
     if env['PLATFORM'] == 'hpux':
         env['SHLINKFLAGS'] = SCons.Util.CLVar('$LINKFLAGS -shared -fPIC')
+
+    # __RPATH is set to $_RPATH in the platform specification if that
+    # platform supports it.
+    env.Append(LINKFLAGS=['$__RPATH'])
+    env['RPATHPREFIX'] = '-Wl,--rpath='
+    env['RPATHSUFFIX'] = ''
+    env['_RPATH'] = '${_concat(RPATHPREFIX, RPATH, RPATHSUFFIX, __env__)}'
     
 def exists(env):
     return env.Detect(linkers)
diff --git a/test/RPATH.py b/test/RPATH.py
new file mode 100644 (file)
index 0000000..844e407
--- /dev/null
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+#
+# __COPYRIGHT__
+#
+# Permission is hereby granted, free of charge, to any person obtaining
+# a copy of this software and associated documentation files (the
+# "Software"), to deal in the Software without restriction, including
+# without limitation the rights to use, copy, modify, merge, publish,
+# distribute, sublicense, and/or sell copies of the Software, and to
+# permit persons to whom the Software is furnished to do so, subject to
+# the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+
+__revision__ = "__FILE__ __REVISION__ __DATE__ __DEVELOPER__"
+
+import sys
+import TestSCons
+
+_exe = TestSCons._exe
+
+test = TestSCons.TestSCons()
+
+if sys.platform == 'cygwin':
+    test.no_result(1)
+elif sys.platform == 'win32':
+    test.no_result(1)
+
+foo = test.workpath('foo' + _exe)
+
+test.subdir('bar')
+
+test.write('SConstruct', """\
+SConscript('bar/SConscript')
+Program('foo', 'foo.c', LIBS='bar', LIBPATH='bar', RPATH='bar')
+""")
+
+test.write('foo.c', """\
+int main() {
+    void bar();
+    bar();
+    exit (0);
+}
+""")
+
+test.write(['bar', 'SConscript'], """\
+SharedLibrary('bar', 'bar.c')
+""")
+
+test.write(['bar', 'bar.c'], """\
+#include <stdio.h>
+void bar() {
+    puts("bar");
+}
+""")
+
+test.run(arguments='.')
+
+test.run(program=foo, chdir=test.workpath('.'), stdout='bar\n')
+
+test.pass_test()