diff options
author | Andrew Morrow <acm@mongodb.com> | 2015-07-24 15:37:27 -0400 |
---|---|---|
committer | Andrew Morrow <acm@mongodb.com> | 2015-07-24 23:06:56 -0400 |
commit | e9fc3c3ae2b83539d36856d2f1b5794019b6b41b (patch) | |
tree | 209c687652caa1fd6a51136617c0406440d19c52 /site_scons | |
parent | 7d9c2e603212d3012b6f4c726f566abd812f35ea (diff) | |
download | mongo-e9fc3c3ae2b83539d36856d2f1b5794019b6b41b.tar.gz |
SERVER-9564 When libabigail utils are present, minimize relinking
Diffstat (limited to 'site_scons')
-rw-r--r-- | site_scons/libdeps.py | 8 | ||||
-rw-r--r-- | site_scons/site_tools/abilink.py | 66 |
2 files changed, 72 insertions, 2 deletions
diff --git a/site_scons/libdeps.py b/site_scons/libdeps.py index 4c8dbf1b24f..87d96606cef 100644 --- a/site_scons/libdeps.py +++ b/site_scons/libdeps.py @@ -235,7 +235,9 @@ def libdeps_emitter(target, source, env): file_name = '${LIBPREFIX}' + file_name if not file_name.endswith(lib_suffix): file_name += '${LIBSUFFIX}' - libdep_files.append(env.File(os.path.join(dir_name, file_name))) + + node_factory = env['BUILDERS']['StaticLibrary'].target_factory or env.File + libdep_files.append(node_factory(os.path.join(dir_name, file_name))) for t in target: # target[0] must be a Node and not a string, or else libdeps will fail to @@ -276,7 +278,9 @@ def shlibdeps_emitter(target, source, env): file_name = '${SHLIBPREFIX}' + file_name if not file_name.endswith(lib_suffix): file_name += '${SHLIBSUFFIX}' - libdep_files.append(env.File(os.path.join(dir_name, file_name))) + + node_factory = env['BUILDERS']['SharedLibrary'].target_factory or env.File + libdep_files.append(node_factory(os.path.join(dir_name, file_name))) for t in target: # target[0] must be a Node and not a string, or else libdeps will fail to diff --git a/site_scons/site_tools/abilink.py b/site_scons/site_tools/abilink.py new file mode 100644 index 00000000000..9f7bad3dce5 --- /dev/null +++ b/site_scons/site_tools/abilink.py @@ -0,0 +1,66 @@ +# Copyright (C) 2015 MongoDB Inc. +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License, version 3, +# as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +import SCons +import subprocess + +def _detect(env): + try: + abidw = env['ABIDW'] + if not abidw: + return None + except KeyError: + pass + + return env.WhereIs('abidw') + +def generate(env): + + class AbilinkNode(SCons.Node.FS.File): + def __init__(self, name, directory, fs): + SCons.Node.FS.File.__init__(self, name, directory, fs) + + def get_contents(self): + if not self.rexists(): + return '' + fname = self.rfile().abspath + 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 EnvironmentError, e: + if not e.filename: + e.filename = fname + raise + return contents + + 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 + +def exists(env): + result = _detect(env) != None + return result |