From 64277cb37bfe6430a4b13bf78c42678e795210aa Mon Sep 17 00:00:00 2001 From: Rob Managan Date: Thu, 30 May 2013 11:04:35 -0700 Subject: Add code to delete any current symlink before trying to crete them. Before the step of creating the symlink would fail. Also update the code in install.py to create the same chain of links as __init__.py did. The installed links to the shared library all pointed at the shared library instead of to the next one in the chain with more version numbers --- src/engine/SCons/Tool/__init__.py | 18 +++++++++++++----- src/engine/SCons/Tool/install.py | 36 ++++++++++++++++++++++++++++++++---- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/engine/SCons/Tool/__init__.py b/src/engine/SCons/Tool/__init__.py index 89aabb5..d76b721 100644 --- a/src/engine/SCons/Tool/__init__.py +++ b/src/engine/SCons/Tool/__init__.py @@ -337,15 +337,23 @@ symlinks for the platform we are on""" for count in range(len(linknames)): linkname = linknames[count] if count > 0: - os.symlink(os.path.basename(linkname),lastname) + try: + os.remove(lastlinkname) + except: + pass + os.symlink(os.path.basename(linkname),lastlinkname) if Verbose: - print "VerShLib: made sym link of %s -> %s" % (lastname,linkname) - lastname = linkname + print "VerShLib: made sym link of %s -> %s" % (lastlinkname,linkname) + lastlinkname = linkname # finish chain of sym links with link to the actual library if len(linknames)>0: - os.symlink(lib_ver,lastname) + try: + os.remove(lastlinkname) + except: + pass + os.symlink(lib_ver,lastlinkname) if Verbose: - print "VerShLib: made sym link of %s -> %s" % (lib_ver,linkname) + print "VerShLib: made sym link of %s -> %s" % (linkname, lib_ver) return result ShLibAction = SCons.Action.Action(VersionedSharedLibrary, None) diff --git a/src/engine/SCons/Tool/install.py b/src/engine/SCons/Tool/install.py index 9aa9d46..100743a 100644 --- a/src/engine/SCons/Tool/install.py +++ b/src/engine/SCons/Tool/install.py @@ -133,6 +133,11 @@ def copyFuncVersionedLib(dest, source, env): if os.path.isdir(source): raise SCons.Errors.UserError("cannot install directory `%s' as a version library" % str(source) ) else: + # remove the link if it is already there + try: + os.remove(dest) + except: + pass shutil.copy2(source, dest) st = os.stat(source) os.chmod(dest, stat.S_IMODE(st[stat.ST_MODE]) | stat.S_IWRITE) @@ -196,11 +201,34 @@ def versionedLibLinks(dest, source, env): if version != None: # libname includes the version number if one was given linknames = SCons.Tool.VersionShLibLinkNames(version,libname,env) - for linkname in linknames: - if Verbose: - print "make link of %s to %s" %(libname, os.path.join(install_dir, linkname)) + if Verbose: + print "versionedLibLinks: linknames ",linknames + # Here we just need the file name w/o path as the target of the link + lib_ver = libname + # make symlink of adjacent names in linknames + for count in range(len(linknames)): + linkname = linknames[count] fulllinkname = os.path.join(install_dir, linkname) - os.symlink(libname,fulllinkname) + if Verbose: + print "full link name ",fulllinkname + if count > 0: + try: + os.remove(lastlinkname) + except: + pass + os.symlink(os.path.basename(fulllinkname),lastlinkname) + if Verbose: + print "versionedLibLinks: made sym link of %s -> %s" % (lastlinkname,os.path.basename(fulllinkname)) + lastlinkname = fulllinkname + # finish chain of sym links with link to the actual library + if len(linknames)>0: + try: + os.remove(lastlinkname) + except: + pass + os.symlink(lib_ver,lastlinkname) + if Verbose: + print "versionedLibLinks: made sym link of %s -> %s" % (lib_ver,lastlinkname) return def installFunc(target, source, env): -- cgit v0.12 From cd6781b13ad9e019257569c8d18c392347c912fd Mon Sep 17 00:00:00 2001 From: Robert Managan Date: Mon, 17 Jun 2013 08:00:33 -0700 Subject: Add a test to show that we can build when the link already exist --- test/LINK/VersionedLib.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/test/LINK/VersionedLib.py b/test/LINK/VersionedLib.py index 0d45789..df194d8 100644 --- a/test/LINK/VersionedLib.py +++ b/test/LINK/VersionedLib.py @@ -123,6 +123,19 @@ for f in files: for f in instfiles: test.must_exist(['installtest', f]) +# modify test.c and make sure it can recompile when links already exist +test.write('test.c', """\ +#if _WIN32 +__declspec(dllexport) +#endif +int testlib(int n) +{ +return n+11 ; +} +""") + +print test.run() + test.run(arguments = '-c') for f in files: -- cgit v0.12 From 83bbc93ceaf49a6aafe31db3a1e364a0ec902e15 Mon Sep 17 00:00:00 2001 From: Robert Managan Date: Tue, 18 Jun 2013 08:49:11 -0700 Subject: remove print from test and attempt to get FindInstalledFiles working --- src/engine/SCons/Tool/install.py | 1 + test/LINK/VersionedLib.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/engine/SCons/Tool/install.py b/src/engine/SCons/Tool/install.py index 100743a..089c6f8 100644 --- a/src/engine/SCons/Tool/install.py +++ b/src/engine/SCons/Tool/install.py @@ -309,6 +309,7 @@ def add_versioned_targets_to_INSTALLED_FILES(target, source, env): fulllinkname = os.path.join(install_dir, linkname) env.SideEffect(fulllinkname,target[0]) env.Clean(target[0],fulllinkname) + _INSTALLED_FILES.extend(fulllinkname) _UNIQUE_INSTALLED_FILES = None return (target, source) diff --git a/test/LINK/VersionedLib.py b/test/LINK/VersionedLib.py index df194d8..d3f1141 100644 --- a/test/LINK/VersionedLib.py +++ b/test/LINK/VersionedLib.py @@ -134,7 +134,7 @@ return n+11 ; } """) -print test.run() +test.run() test.run(arguments = '-c') -- cgit v0.12 From 0711c543b3dde6c07fd02daba70ac3f21fea0fa6 Mon Sep 17 00:00:00 2001 From: Robert Managan Date: Fri, 28 Jun 2013 21:32:13 -0700 Subject: when adding links to list of installed files we have strings so use append() on each instead of extend() --- src/engine/SCons/Tool/install.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/engine/SCons/Tool/install.py b/src/engine/SCons/Tool/install.py index 089c6f8..0c81d05 100644 --- a/src/engine/SCons/Tool/install.py +++ b/src/engine/SCons/Tool/install.py @@ -297,6 +297,8 @@ def add_versioned_targets_to_INSTALLED_FILES(target, source, env): global _INSTALLED_FILES, _UNIQUE_INSTALLED_FILES Verbose = False _INSTALLED_FILES.extend(target) + if Verbose: + print "ver lib emitter ",repr(target) # see if we have a versioned shared library, if so generate side effects version, libname, install_dir = versionedLibVersion(target[0].path, env) @@ -309,7 +311,9 @@ def add_versioned_targets_to_INSTALLED_FILES(target, source, env): fulllinkname = os.path.join(install_dir, linkname) env.SideEffect(fulllinkname,target[0]) env.Clean(target[0],fulllinkname) - _INSTALLED_FILES.extend(fulllinkname) + _INSTALLED_FILES.append(fulllinkname) + if Verbose: + print "installed list ", _INSTALLED_FILES _UNIQUE_INSTALLED_FILES = None return (target, source) -- cgit v0.12 From 0e60308e51dbb9f285737c3375dfd24260babb06 Mon Sep 17 00:00:00 2001 From: Robert Managan Date: Sat, 29 Jun 2013 22:58:37 -0700 Subject: Fix description of symlinks made when creating a shared library --- src/engine/SCons/Tool/__init__.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/engine/SCons/Tool/__init__.xml b/src/engine/SCons/Tool/__init__.xml index 18bfd3e..de4f59b 100644 --- a/src/engine/SCons/Tool/__init__.xml +++ b/src/engine/SCons/Tool/__init__.xml @@ -197,7 +197,7 @@ alpha, beta, or release candidate patch levels. This builder may create multiple links to the library. On a POSIX system, for the shared library libbar.so.2.3.1, the links created would be -libbar.so, libbar.so.2, and libbar.so.2.3; on a Darwin (OSX) system +libbar.so and libbar.so.2; on a Darwin (OSX) system the library would be libbar.2.3.1.dylib and the link would be libbar.dylib. -- cgit v0.12