Index: configure.in =================================================================== --- configure.in (revision 72185) +++ configure.in (working copy) @@ -647,6 +647,25 @@ fi AC_MSG_RESULT($LINKCC) +# GNULD is set to "yes" if the GNU linker is used. If this goes wrong +# make sure we default having it set to "no": this is used by +# distutils.unixccompiler to know if it should add --enable-new-dtags +# to linker command lines, and failing to detect GNU ld simply results +# in the same bahaviour as before. +AC_SUBST(GNULD) +AC_MSG_CHECKING(for GNU ld) +ac_prog=ld +if test "$GCC" = yes; then + ac_prog=`$CC -print-prog-name=ld` +fi +case `"$ac_prog" -V 2>&1 < /dev/null` in + *GNU*) + GNULD=yes;; + *) + GNULD=no;; +esac +AC_MSG_RESULT($GNULD) + AC_MSG_CHECKING(for --enable-shared) AC_ARG_ENABLE(shared, AC_HELP_STRING(--enable-shared, disable/enable building shared python library)) Index: Lib/distutils/tests/test_build_ext.py =================================================================== --- Lib/distutils/tests/test_build_ext.py (revision 72185) +++ Lib/distutils/tests/test_build_ext.py (working copy) @@ -125,7 +125,7 @@ dist = Distribution({'name': 'xx'}) cmd = build_ext(dist) - # making sure the suer option is there + # making sure the user option is there options = [name for name, short, lable in cmd.user_options] self.assert_('user' in options) @@ -145,6 +145,7 @@ # see if include_dirs and library_dirs # were set self.assert_(lib in cmd.library_dirs) + self.assert_(lib in cmd.rpath) self.assert_(incl in cmd.include_dirs) def test_optional_extension(self): Index: Lib/distutils/tests/test_unixccompiler.py =================================================================== --- Lib/distutils/tests/test_unixccompiler.py (revision 0) +++ Lib/distutils/tests/test_unixccompiler.py (revision 0) @@ -0,0 +1,84 @@ +import sys +import test.test_support +import unittest +from distutils import sysconfig + +from distutils.unixccompiler import UnixCCompiler + + +class TestRuntimeLibraryDirOption(unittest.TestCase): + def setUp(self): + self._backup_platform = sys.platform + self._backup_get_config_var = sysconfig.get_config_var + class CompilerWrapper(UnixCCompiler): + def rpath_foo(self): + return self.runtime_library_dir_option('/foo') + self.cc = CompilerWrapper() + + def tearDown(self): + sys.platform = self._backup_platform + sysconfig.get_config_var = self._backup_get_config_var + + def test_darwin(self): + sys.platform = 'darwin' + self.assertEqual(self.cc.rpath_foo(), '-L/foo') + + def test_hpux(self): + sys.platform = 'hp-ux' + self.assertEqual(self.cc.rpath_foo(), '+s -L/foo') + + def test_irix646(self): + sys.platform = 'irix646' + self.assertEqual(self.cc.rpath_foo(), ['-rpath', '/foo']) + + def test_osf1V5(self): + sys.platform = 'osf1V5' + self.assertEqual(self.cc.rpath_foo(), ['-rpath', '/foo']) + + def test_gcc_gnuld(self): + sys.platform = 'bar' + def gcv(v): + if v == 'CC': + return 'gcc' + elif v == 'GNULD': + return 'yes' + sysconfig.get_config_var = gcv + self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo') + + def test_gcc_nongnuld(self): + sys.platform = 'bar' + def gcv(v): + if v == 'CC': + return 'gcc' + elif v == 'GNULD': + return 'no' + sysconfig.get_config_var = gcv + self.assertEqual(self.cc.rpath_foo(), '-Wl,-R/foo') + + def test_nongcc_gnuld(self): + sys.platform = 'bar' + def gcv(v): + if v == 'CC': + return 'cc' + elif v == 'GNULD': + return 'yes' + sysconfig.get_config_var = gcv + self.assertEqual(self.cc.rpath_foo(), '-R/foo') + + def test_nongcc_nongnuld(self): + sys.platform = 'bar' + def gcv(v): + if v == 'CC': + return 'cc' + elif v == 'GNULD': + return 'no' + sysconfig.get_config_var = gcv + self.assertEqual(self.cc.rpath_foo(), '-R/foo') + + +def test_suite(): + return unittest.makeSuite(TestRuntimeLibraryDirOption) + + +if __name__ == '__main__': + test.test_support.run_unittest(test_suite()) Property changes on: Lib/distutils/tests/test_unixccompiler.py ___________________________________________________________________ Added: svn:eol-style + LF Index: Lib/distutils/unixccompiler.py =================================================================== --- Lib/distutils/unixccompiler.py (revision 72185) +++ Lib/distutils/unixccompiler.py (working copy) @@ -273,8 +273,9 @@ # Linkers on different platforms need different options to # specify that directories need to be added to the list of # directories searched for dependencies when a dynamic library - # is sought. GCC has to be told to pass the -R option through - # to the linker, whereas other compilers just know this. + # is sought. GCC on GNU systems (Linux, FreeBSD, ...) has to + # be told to pass the -R option through to the linker, whereas + # other compilers and gcc on other systems just know this. # Other compilers may need something slightly different. At # this time, there's no way to determine this information from # the configuration data stored in the Python installation, so @@ -287,10 +288,23 @@ return "+s -L" + dir elif sys.platform[:7] == "irix646" or sys.platform[:6] == "osf1V5": return ["-rpath", dir] - elif compiler[:3] == "gcc" or compiler[:3] == "g++": - return "-Wl,-R" + dir else: - return "-R" + dir + if compiler[:3] == "gcc" or compiler[:3] == "g++": + # gcc on non-GNU systems does not need -Wl, but can + # use it anyway. Since distutils has always passed in + # -Wl whenever gcc was used in the past it is probably + # safest to keep doing so. + if sysconfig.get_config_var("GNULD") == "yes": + # GNU ld needs an extra option to get a RUNPATH + # instead of just an RPATH. + return "-Wl,--enable-new-dtags,-R" + dir + else: + return "-Wl,-R" + dir + else: + # No idea how --enable-new-dtags would be passed on to + # ld if this system was using GNU ld. Don't know if a + # system like this even exists. + return "-R" + dir def library_option(self, lib): return "-l" + lib Index: Makefile.pre.in =================================================================== --- Makefile.pre.in (revision 72185) +++ Makefile.pre.in (working copy) @@ -36,6 +36,8 @@ RANLIB= @RANLIB@ SVNVERSION= @SVNVERSION@ +GNULD= @GNULD@ + # Shell used by make (some versions default to the login shell, which is bad) SHELL= /bin/sh