diff options
author | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2017-05-25 08:22:58 -0400 |
---|---|---|
committer | Max Hirschhorn <max.hirschhorn@mongodb.com> | 2017-05-25 08:22:58 -0400 |
commit | b4e14a64d7f51846e7c7ed94047ac545e26dce25 (patch) | |
tree | 24dc95258ee3087c4a3ba2bbdd5a7d37f7cf0ef8 /site_scons | |
parent | 3e1461b80c42deda1f6b9478e2e574c6d88052f2 (diff) | |
download | mongo-b4e14a64d7f51846e7c7ed94047ac545e26dce25.tar.gz |
Revert "SERVER-27380 Re-enable the thin archive tool"
This reverts commit 3e1461b80c42deda1f6b9478e2e574c6d88052f2.
Diffstat (limited to 'site_scons')
-rw-r--r-- | site_scons/site_tools/abilink.py | 84 | ||||
-rw-r--r-- | site_scons/site_tools/thin_archive.py | 50 |
2 files changed, 60 insertions, 74 deletions
diff --git a/site_scons/site_tools/abilink.py b/site_scons/site_tools/abilink.py index 4e4fdcd6310..6ca2c7dc6b8 100644 --- a/site_scons/site_tools/abilink.py +++ b/site_scons/site_tools/abilink.py @@ -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()) -def exists(env): - result = _detect(env) != None - return result + env['ABIDW'] = _detect(env) -def generate(env): + def ShlibNode(env, name, directory = None, create = 1): + return env.fs._lookup(env.subst(name), directory, AbilinkNode, create) - if not exists(env): - return + env.AddMethod(ShlibNode, 'ShlibNode') - builder = env['BUILDERS']['SharedLibrary'] - _add_emitter(builder) - _add_action(builder) - _add_scanner(builder) - _add_scanner(env['BUILDERS']['Program']) - _add_scanner(env['BUILDERS']['LoadableModule']) + 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 diff --git a/site_scons/site_tools/thin_archive.py b/site_scons/site_tools/thin_archive.py index 511c0ef6e54..b4bc5f97d6f 100644 --- a/site_scons/site_tools/thin_archive.py +++ b/site_scons/site_tools/thin_archive.py @@ -45,35 +45,32 @@ 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) +def generate(env): + if not exists(env): + return - new_emitter = SCons.Builder.ListEmitter([base_emitter, new_emitter]) - builder.emitter = new_emitter + class ThinArchiveNode(SCons.Node.FS.File): + def __init__(self, name, directory, fs): + SCons.Node.FS.File.__init__(self, name, directory, fs) -def _add_scanner(builder): - old_scanner = builder.target_scanner - path_function = old_scanner.path_function + def get_contents(self): + child_sigs = sorted([child.get_csig() for child in self.children()]) + return ''.join(child_sigs) - 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 + def get_content_hash(self): + return SCons.Util.MD5signature(self.get_contents()) - builder.target_scanner = SCons.Scanner.Scanner(function=new_scanner, path_function=path_function) -def generate(env): - if not exists(env): - return + 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']]) @@ -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']) |