summaryrefslogtreecommitdiff
path: root/site_scons
diff options
context:
space:
mode:
authorMax Hirschhorn <max.hirschhorn@mongodb.com>2017-05-25 08:22:58 -0400
committerMax Hirschhorn <max.hirschhorn@mongodb.com>2017-05-25 08:22:58 -0400
commitb4e14a64d7f51846e7c7ed94047ac545e26dce25 (patch)
tree24dc95258ee3087c4a3ba2bbdd5a7d37f7cf0ef8 /site_scons
parent3e1461b80c42deda1f6b9478e2e574c6d88052f2 (diff)
downloadmongo-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.py84
-rw-r--r--site_scons/site_tools/thin_archive.py50
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'])