From 25c535f2e5997defdca96a6e0c35a0143e824982 Mon Sep 17 00:00:00 2001 From: Dirk Baechle Date: Wed, 11 Sep 2013 22:44:33 +0200 Subject: - fix for #2916, "Issues with versioned SharedLibrary under OpenBSD" --- src/CHANGES.txt | 4 ++++ src/engine/SCons/Tool/__init__.py | 22 +++++++++++++++------- test/Libs/SharedLibrary.py | 13 +++++++++++++ 3 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index e80a161..1afe71a 100644 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -6,6 +6,10 @@ RELEASE 2.3.1.alpha.yyyymmdd - NEW DATE WILL BE INSERTED HERE + From Stefan Sperling: + - Fixed the setup of linker flags for a versioned SharedLibrary + under OpenBSD (#2916). + From David Rothenberger: - Added cyglink linker that uses Cygwin naming conventions for shared libraries and automatically generates import libraries. diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index b80d6e4..00413e5 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -257,6 +257,10 @@ def VersionShLibLinkNames(version, libname, env): print "VersionShLibLinkNames: linkname = ",linkname linknames.append(linkname) elif platform == 'posix': + if sys.platform.startswith('openbsd'): + # OpenBSD uses x.y shared library versioning numbering convention + # and doesn't use symlinks to backwards-compatible libraries + return [] # For libfoo.so.x.y.z, linknames libfoo.so libfoo.so.x.y libfoo.so.x suffix_re = re.escape(shlib_suffix + '.' + version) # First linkname has no version number @@ -302,13 +306,17 @@ symlinks for the platform we are on""" if version: # set the shared library link flags if platform == 'posix': - suffix_re = re.escape(shlib_suffix + '.' + version) - (major, age, revision) = version.split(".") - # soname will have only the major version number in it - soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major - shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ] - if Verbose: - print " soname ",soname,", shlink_flags ",shlink_flags + shlink_flags += [ '-Wl,-Bsymbolic' ] + # OpenBSD doesn't usually use SONAME for libraries + if not sys.platform.startswith('openbsd'): + # continue setup of shlink flags for all other POSIX systems + suffix_re = re.escape(shlib_suffix + '.' + version) + (major, age, revision) = version.split(".") + # soname will have only the major version number in it + soname = re.sub(suffix_re, shlib_suffix, libname) + '.' + major + shlink_flags += [ '-Wl,-soname=%s' % soname ] + if Verbose: + print " soname ",soname,", shlink_flags ",shlink_flags elif platform == 'cygwin': shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,--out-implib,${TARGET.base}.a' ] diff --git a/test/Libs/SharedLibrary.py b/test/Libs/SharedLibrary.py index b7d1374..eac575c 100644 --- a/test/Libs/SharedLibrary.py +++ b/test/Libs/SharedLibrary.py @@ -60,6 +60,13 @@ obj = env.SharedObject('bar', 'foo.c') Default(env.Library(target = 'foo', source = obj)) """) +test.write('SConstructBaz', """ +env=Environment() +env['SHLIBVERSION'] = '1.0.0' +obj = env.SharedObject('baz', 'foo.c') +Default(env.SharedLibrary(target = 'baz', source = obj)) +""") + test.write('foo.c', r""" #include @@ -287,6 +294,12 @@ main(int argc, char *argv[]) test.run(program = test.workpath('progbar'), stdout = "f4.c\nprogbar.c\n") +if sys.platform.startswith('openbsd'): + # Make sure we don't link libraries with -Wl,-soname on OpenBSD. + test.run(arguments = '-f SConstructBaz') + for line in test.stdout().split('\n'): + test.fail_test(line.find('-Wl,-soname=libbaz.so') != -1) + test.pass_test() # Local Variables: -- cgit v0.12