0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00

Revert "SERVER-27380 Re-enable the thin archive tool"

This reverts commit 3e1461b80c.
This commit is contained in:
Max Hirschhorn 2017-05-25 08:22:58 -04:00
parent 3e1461b80c
commit b4e14a64d7
3 changed files with 69 additions and 90 deletions

View File

@ -1189,6 +1189,13 @@ env['BUILDERS']['LibraryObject'] = env['BUILDERS']['StaticObject']
if link_model.startswith("dynamic"):
# Add in the abi linking tool if the user requested and it is
# supported on this platform.
if env.get('ABIDW'):
abilink = Tool('abilink')
if abilink.exists(env):
abilink(env)
# Redirect the 'Library' target, which we always use instead of 'StaticLibrary' for things
# that can be built in either mode, to point to SharedLibrary.
env['BUILDERS']['Library'] = env['BUILDERS']['SharedLibrary']
@ -1352,20 +1359,6 @@ if env['_LIBDEPS'] == '$_LIBDEPS_OBJS':
libdeps.setup_environment(env, emitting_shared=(link_model.startswith("dynamic")))
# Both the abidw tool and the thin archive tool must be loaded after
# libdeps, so that the scanners they inject can see the library
# dependencies added by libdeps.
if link_model.startswith("dynamic"):
# Add in the abi linking tool if the user requested and it is
# supported on this platform.
if env.get('ABIDW'):
abilink = Tool('abilink')
if abilink.exists(env):
abilink(env)
if env['_LIBDEPS'] == '$_LIBDEPS_LIBS':
env.Tool('thin_archive')
if env.TargetOSIs('linux', 'freebsd', 'openbsd'):
env['LINK_LIBGROUP_START'] = '-Wl,--start-group'
env['LINK_LIBGROUP_END'] = '-Wl,--end-group'

View File

@ -15,11 +15,6 @@
import SCons
import subprocess
# TODO: Make a SUFF variable for the suffix to write to
# TODO: Prevent using abilink when -gsplit-dwarf is in play, since it doesn't work
# TODO: Make a variable for the md5sum utility (allow any hasher)
# TODO: Add an ABILINKCOM variable to the Action, so it can be silenced.
def _detect(env):
try:
abidw = env['ABIDW']
@ -31,52 +26,53 @@ def _detect(env):
return env.WhereIs('abidw')
def _add_emitter(builder):
base_emitter = builder.emitter
def generate(env):
def new_emitter(target, source, env):
new_targets = []
for t in target:
abidw = str(t) + ".abidw"
abidw = (t.builder.target_factory or env.File)(abidw)
new_targets.append(abidw)
setattr(t.attributes, "abidw", abidw)
targets = target + new_targets
return (targets, source)
class AbilinkNode(SCons.Node.FS.File):
def __init__(self, name, directory, fs):
SCons.Node.FS.File.__init__(self, name, directory, fs)
new_emitter = SCons.Builder.ListEmitter([base_emitter, new_emitter])
builder.emitter = new_emitter
def get_contents(self):
if not self.rexists():
return ''
def _add_scanner(builder):
old_scanner = builder.target_scanner
path_function = old_scanner.path_function
fname = self.rfile().abspath
contents = None
def new_scanner(node, env, path):
old_results = old_scanner(node, env, path)
new_results = []
for base in old_results:
abidw = getattr(env.Entry(base).attributes, "abidw", None)
new_results.append(abidw if abidw else base)
return new_results
try:
# TODO: If there were python bindings for libabigail, we
# could avoid the shell out (and probably be faster, as we
# could get exactly the information we want).
contents = subprocess.check_output([env.subst('$ABIDW'), fname])
except subprocess.CalledProcessError, e:
# ABIDW sometimes fails. In that case, log an error
# and fall back to the normal contents
print "WARNING: ABIDW failed for target %s, please file a bug report" % fname
try:
contents = open(fname, "rb").read()
except EnvironmentError, e:
if not e.filename:
e.filename = fname
raise
builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, path_function=path_function)
return contents
def _add_action(builder):
actions = builder.action
builder.action = actions + SCons.Action.Action("$ABIDW $TARGET | md5sum > ${TARGET}.abidw")
def get_content_hash(self):
return SCons.Util.MD5signature(self.get_contents())
env['ABIDW'] = _detect(env)
def ShlibNode(env, name, directory = None, create = 1):
return env.fs._lookup(env.subst(name), directory, AbilinkNode, create)
env.AddMethod(ShlibNode, 'ShlibNode')
def shlib_target_factory(arg):
return env.ShlibNode(arg)
env['BUILDERS']['SharedLibrary'].target_factory = shlib_target_factory
env['BUILDERS']['LoadableModule'].target_factory = shlib_target_factory
def exists(env):
result = _detect(env) != None
return result
def generate(env):
if not exists(env):
return
builder = env['BUILDERS']['SharedLibrary']
_add_emitter(builder)
_add_action(builder)
_add_scanner(builder)
_add_scanner(env['BUILDERS']['Program'])
_add_scanner(env['BUILDERS']['LoadableModule'])

View File

@ -45,36 +45,33 @@ def exists(env):
return bool(isgnu)
def _add_emitter(builder):
base_emitter = builder.emitter
def new_emitter(target, source, env):
for t in target:
setattr(t.attributes, "thin_archive", True)
return (target, source)
new_emitter = SCons.Builder.ListEmitter([base_emitter, new_emitter])
builder.emitter = new_emitter
def _add_scanner(builder):
old_scanner = builder.target_scanner
path_function = old_scanner.path_function
def new_scanner(node, env, path):
old_results = old_scanner(node, env, path)
new_results = []
for base in old_results:
new_results.append(base)
if getattr(env.Entry(base).attributes, "thin_archive", None):
new_results.extend(base.children())
return new_results
builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, path_function=path_function)
def generate(env):
if not exists(env):
return
class ThinArchiveNode(SCons.Node.FS.File):
def __init__(self, name, directory, fs):
SCons.Node.FS.File.__init__(self, name, directory, fs)
def get_contents(self):
child_sigs = sorted([child.get_csig() for child in self.children()])
return ''.join(child_sigs)
def get_content_hash(self):
return SCons.Util.MD5signature(self.get_contents())
def _ThinArchiveNode(env, name, directory = None, create = 1):
return env.fs._lookup(env.subst(name), directory, ThinArchiveNode, create)
env.AddMethod(_ThinArchiveNode, 'ThinArchiveNode')
def archive_target_factory(arg):
return env.ThinArchiveNode(arg)
env['BUILDERS']['StaticLibrary'].target_factory = archive_target_factory
env['ARFLAGS'] = SCons.Util.CLVar([arflag if arflag != "rc" else "rcsTD" for arflag in env['ARFLAGS']])
def noop_action(env, target, source):
@ -83,10 +80,3 @@ def generate(env):
# Disable running ranlib, since we added 's' above
env['RANLIBCOM'] = noop_action
env['RANLIBCOMSTR'] = 'Skipping ranlib for thin archive $TARGET'
builder = env['BUILDERS']['StaticLibrary']
_add_emitter(builder)
_add_scanner(env['BUILDERS']['SharedLibrary'])
_add_scanner(env['BUILDERS']['LoadableModule'])
_add_scanner(env['BUILDERS']['Program'])