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 From cbb97df8659b76d0227c27d0aed622e3086ce7b3 Mon Sep 17 00:00:00 2001 From: Daniel Moody Date: Sat, 2 May 2020 00:31:23 -0400 Subject: add test for soname for applelink on linux --- test/LINK/applelink.py | 4 ++-- test/LINK/applelink_image/SConstruct_CurVers_CompatVers | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/LINK/applelink.py b/test/LINK/applelink.py index d43e332..906c929 100644 --- a/test/LINK/applelink.py +++ b/test/LINK/applelink.py @@ -122,7 +122,7 @@ for SHLIBVERSION, \ else: # Should contain -Wl,-current_version,{APPLELINK_CURRENT_VERSION} test.must_contain_all_lines(test.stdout(), - ['-Wl,-current_version,{APPLELINK_CURRENT_VERSION}'.format(**locals())]) + ['-Wl,-current_version,{APPLELINK_CURRENT_VERSION}'.format(**locals()), 'libfoo.4.dynlib']) if APPLELINK_NO_COMPATIBILITY_VERSION: # Should not contain -Wl,-compatibility_version @@ -131,7 +131,7 @@ for SHLIBVERSION, \ else: # Should contain -Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION} test.must_contain_all_lines(test.stdout(), - ['-Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION}'.format(**locals())]) + ['-Wl,-compatibility_version,{APPLELINK_COMPATIBILITY_VERSION}'.format(**locals()), 'libfoo.4.dynlib']) if not extra_flags: # Now run otool -L to get the compat and current version info and verify it's correct in the library. diff --git a/test/LINK/applelink_image/SConstruct_CurVers_CompatVers b/test/LINK/applelink_image/SConstruct_CurVers_CompatVers index fba953d..4a824d3 100644 --- a/test/LINK/applelink_image/SConstruct_CurVers_CompatVers +++ b/test/LINK/applelink_image/SConstruct_CurVers_CompatVers @@ -23,8 +23,8 @@ print("APPLELINK_NO_CURRENT_VERSION =[%s]"%env.get('APPLELINK_NO_CURRENT_VE print("APPLELINK_NO_COMPATIBILITY_VERSION=[%s]"%env.get('APPLELINK_NO_COMPATIBILITY_VERSION', False)) obj = env.SharedObject('foo.c') - sl = env.SharedLibrary('foo', obj) +sl2 = env.SharedLibrary('foo2', obj, SONAME='libfoo.4.dynlib') lm = env.LoadableModule('fool', obj) env.InstallVersionedLib(target='#/install', -- cgit v0.12