[Scons-dev] Plans for 2013
William Deegan
bill at baddogconsulting.com
Mon Feb 4 15:02:33 EST 2013
Eric,
InstallVersionedLib() and other logic, which implement the versioned shared library has been pulled into the trunk of SCons hg repository.
Gary Oberbrunner mentioned he was going to ask you to take a look at the implementation and ask for feedback on 12/21/2012.
Perhaps he didn't get around to pinging you?
Looks like it's probably time to do another release to get this out into the wild soon..
Are you setup to pull and try scons from bitbucket's hg?
-Bill
On Feb 4, 2013, at 11:47 AM, Eric S. Raymond <esr at thyrsus.com> wrote:
> While you're making plans for 2013, would somebody please pay
> attention to the continuing lack of out-of-the-box support for
> versioned shared libraries?
>
> I know of at least two projects that have rejected moving to SCons for this
> reason. It is quite a bit more important in the real world than
> (for example) D support.
>
> Here, once again, is my custom builder code solving this problem. If
> someone on the core teanm is willing to integrate this properly, I'll write the
> documentation for it.
>
> # Cope with scons's failure to set SONAME in its builtins.
> # Inspired by Richard Levitte's (slightly buggy) code at
> # http://markmail.org/message/spttz3o4xrsftofr
>
> def VersionedSharedLibrary(env, libname, version, lib_objs=[], parse_flags=[]):
> platform = env.subst('$PLATFORM')
> shlib_pre_action = None
> shlib_suffix = env.subst('$SHLIBSUFFIX')
> shlib_post_action = None
> shlink_flags = SCons.Util.CLVar(env.subst('$SHLINKFLAGS'))
>
> if platform == 'posix':
> ilib_suffix = shlib_suffix + '.' + version
> (major, age, revision) = version.split(".")
> soname = "lib" + libname + shlib_suffix + "." + major
> shlink_flags += [ '-Wl,-Bsymbolic', '-Wl,-soname=%s' % soname ]
> elif platform == 'cygwin':
> ilib_suffix = shlib_suffix
> shlink_flags += [ '-Wl,-Bsymbolic',
> '-Wl,--out-implib,${TARGET.base}.a' ]
> elif platform == 'darwin':
> ilib_suffix = '.' + version + shlib_suffix
> shlink_flags += [ '-current_version', '%s' % version,
> '-compatibility_version', '%s' % version,
> '-undefined', 'dynamic_lookup' ]
>
> ilib = env.SharedLibrary(libname,lib_objs,
> SHLIBSUFFIX=ilib_suffix,
> SHLINKFLAGS=shlink_flags, parse_flags=parse_flags)
>
> if platform == 'darwin':
> if version.count(".") != 2:
> # We need a library name in libfoo.x.y.z.dylib form to proceed
> raise ValueError
> lib = 'lib' + libname + '.' + version + '.dylib'
> lib_no_ver = 'lib' + libname + '.dylib'
> # Link libfoo.x.y.z.dylib to libfoo.dylib
> env.AddPostAction(ilib, 'rm -f %s; ln -s %s %s' % (
> lib_no_ver, lib, lib_no_ver))
> env.Clean(lib, lib_no_ver)
> elif platform == 'posix':
> if version.count(".") != 2:
> # We need a library name in libfoo.so.x.y.z form to proceed
> raise ValueError
> lib = "lib" + libname + ".so." + version
> suffix_re = '%s\\.[0-9\\.]*$' % re.escape(shlib_suffix)
> # For libfoo.so.x.y.z, links libfoo.so libfoo.so.x.y libfoo.so.x
> major_name = shlib_suffix + "." + lib.split(".")[2]
> minor_name = major_name + "." + lib.split(".")[3]
> for linksuffix in [shlib_suffix, major_name, minor_name]:
> linkname = re.sub(suffix_re, linksuffix, lib)
> env.AddPostAction(ilib, 'rm -f %s; ln -s %s %s' % (
> linkname, lib, linkname))
> env.Clean(lib, linkname)
>
> return ilib
>
> def VersionedSharedLibraryInstall(env, destination, libs):
> platform = env.subst('$PLATFORM')
> shlib_suffix = env.subst('$SHLIBSUFFIX')
> ilibs = env.Install(destination, libs)
> if platform == 'posix':
> suffix_re = '%s\\.[0-9\\.]*$' % re.escape(shlib_suffix)
> for lib in map(str, libs):
> if lib.count(".") != 4:
> # We need a library name in libfoo.so.x.y.z form to proceed
> raise ValueError
> # For libfoo.so.x.y.z, links libfoo.so libfoo.so.x.y libfoo.so.x
> major_name = shlib_suffix + "." + lib.split(".")[2]
> minor_name = major_name + "." + lib.split(".")[3]
> for linksuffix in [shlib_suffix, major_name, minor_name]:
> linkname = re.sub(suffix_re, linksuffix, lib)
> env.AddPostAction(ilibs, 'cd %s; rm -f %s; ln -s %s %s' % (destination, linkname, lib, linkname))
> env.Clean(lib, linkname)
> return ilibs
>
> if not env["shared"]:
> def Library(env, target, sources, version, parse_flags=[]):
> return env.StaticLibrary(target, sources, parse_flags=parse_flags)
> LibraryInstall = lambda env, libdir, sources: env.Install(libdir, sources)
> else:
> def Library(env, target, sources, version, parse_flags=[]):
> return VersionedSharedLibrary(env=env,
> libname=target,
> version=version,
> lib_objs=sources,
> parse_flags=parse_flags)
> LibraryInstall = lambda env, libdir, sources: \
> VersionedSharedLibraryInstall(env, libdir, sources)
>
> # Klugery to handle sonames ends
>
>
> --
> <a href="http://www.catb.org/~esr/">Eric S. Raymond</a>
> _______________________________________________
> Scons-dev mailing list
> Scons-dev at scons.org
> http://two.pairlist.net/mailman/listinfo/scons-dev
More information about the Scons-dev
mailing list