From 5b14b6d1f7de9a471f9b1f8d77f2fa835be35e4f Mon Sep 17 00:00:00 2001 From: Daniel Moody Date: Fri, 1 May 2020 12:33:40 -0400 Subject: resolve github Issue #3246 added check for SONAME and generate soname from that in link tools added test update CHANGES.txt --- src/CHANGES.txt | 3 +++ src/engine/SCons/Tool/applelink.py | 8 +++++++- src/engine/SCons/Tool/link.py | 10 +++++++++- test/LINK/SHLIBVERSIONFLAGS.py | 18 +++++++++++++++++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/src/CHANGES.txt b/src/CHANGES.txt index 7712902..39fd5ad 100755 --- a/src/CHANGES.txt +++ b/src/CHANGES.txt @@ -10,6 +10,9 @@ NOTE: Please include a reference to any Issues resolved by your changes in the b RELEASE VERSION/DATE TO BE FILLED IN LATER + From Daniel Moody: + - Added check for SONAME in environment to setup symlinks correctly (Github Issue #3246) + From James Benton: - Improve Visual Studio solution/project generation code to add support for a per-variant cppflags. Intellisense can be affected by cppflags, diff --git a/src/engine/SCons/Tool/applelink.py b/src/engine/SCons/Tool/applelink.py index efa7ee1..8c081a2 100644 --- a/src/engine/SCons/Tool/applelink.py +++ b/src/engine/SCons/Tool/applelink.py @@ -39,6 +39,7 @@ import SCons.Util # the -rpath option, so we use the "link" tool instead of "gnulink". from . import link +from SCons.Tool import ShLibSonameGenerator class AppleLinkInvalidCurrentVersionException(Exception): pass @@ -70,7 +71,12 @@ def _applelib_versioned_lib_soname(env, libnode, version, prefix, suffix, name_f print("_applelib_versioned_lib_soname: name={!r}".format(name)) major = version.split('.')[0] (libname,_suffix) = name.split('.') - soname = '.'.join([libname, major, _suffix]) + # if a desired SONAME was supplied, use that, otherwise create + # a default from the major version + if env.get('SONAME'): + soname = ShLibSonameGenerator(env, libnode) + else: + soname = '.'.join([libname, major, _suffix]) if Verbose: print("_applelib_versioned_lib_soname: soname={!r}".format(soname)) return soname diff --git a/src/engine/SCons/Tool/link.py b/src/engine/SCons/Tool/link.py index d52c90d..a3567aa 100644 --- a/src/engine/SCons/Tool/link.py +++ b/src/engine/SCons/Tool/link.py @@ -46,6 +46,8 @@ from SCons.Tool.DCommon import isD from SCons.Tool.cxx import iscplusplus +from SCons.Tool import ShLibSonameGenerator + issued_mixed_link_warning = False @@ -173,7 +175,13 @@ def _versioned_lib_soname(env, libnode, version, prefix, suffix, name_func): if Verbose: print("_versioned_lib_soname: name={!r}".format(name)) major = version.split('.')[0] - soname = name + '.' + major + + # if a desired SONAME was supplied, use that, otherwise create + # a default from the major version + if env.get('SONAME'): + soname = ShLibSonameGenerator(env, libnode) + else: + soname = name + '.' + major if Verbose: print("_versioned_lib_soname: soname={!r}".format(soname)) return soname diff --git a/test/LINK/SHLIBVERSIONFLAGS.py b/test/LINK/SHLIBVERSIONFLAGS.py index bec9a82..6cf7290 100644 --- a/test/LINK/SHLIBVERSIONFLAGS.py +++ b/test/LINK/SHLIBVERSIONFLAGS.py @@ -40,10 +40,17 @@ tool_list = SCons.Platform.DefaultToolList(platform, env) test = TestSCons.TestSCons() if 'gnulink' in tool_list: versionflags = r".+ -Wl,-soname=libfoo.so.1( .+)+" + soname='libfoo.so.4' + sonameVersionFlags=r".+ -Wl,-soname=%s( .+)+" % soname + elif 'sunlink' in tool_list: versionflags = r".+ -h libfoo.so.1( .+)+" + soname='libfoo.so.4' + sonameVersionFlags=r".+ -h %s( .+)+" % soname elif 'applelink' in tool_list: - versionflags = r".+ -dynamiclib -Wl,-current_version,1.2.3 -Wl,-compatibility_version,1.2.0( .+)+" + versionflags = r".+ 'libfoo.1.dylib'->'libfoo.1.2.3.dylib'(.+)+" + soname='libfoo.4.dylib' + sonameVersionFlags=r".+ '%s'->'libfoo.1.2.3.dylib'(.+)+" % soname else: test.skip_test('No testable linkers found, skipping the test\n') @@ -62,6 +69,15 @@ test.write('SConstruct', "SharedLibrary('foo','foo.c',SHLIBVERSION='1.2.3')\n") test.run(stdout = versionflags, match = TestSCons.match_re_dotall) test.run(arguments = ['-c']) +# stdout must contain SHLIBVERSIONFLAGS if there is SHLIBVERSION provided +test = TestSCons.TestSCons() +test.write('foo.c', foo_c_src) +test.write('SConstruct', """ +SharedLibrary('foo','foo.c',SHLIBVERSION='1.2.3',SONAME='%s') +""" % soname) +test.run(stdout = sonameVersionFlags, match = TestSCons.match_re_dotall) +test.run(arguments = ['-c']) + test.pass_test() # Local Variables: -- cgit v0.12