diff options
author | Andrew Morrow <acm@mongodb.com> | 2016-05-12 14:36:01 -0400 |
---|---|---|
committer | Andrew Morrow <acm@mongodb.com> | 2017-04-09 15:04:16 -0400 |
commit | 51a9e2738ad3f91c94e203c7e9b8872de90c6d4c (patch) | |
tree | 3782f1685cad30641db87d8c0918c44eb07e78ec | |
parent | 3554f3ed2972cb2b1cf9db1e9947e56864b554a9 (diff) | |
download | mongo-51a9e2738ad3f91c94e203c7e9b8872de90c6d4c.tar.gz |
SERVER-28390 Mark targets as Precious during incremental links
(cherry picked from commit 21628d6b2311eb726c01244f6c5dba1edb1f6256)
-rw-r--r-- | SConstruct | 4 | ||||
-rw-r--r-- | etc/scons/gold_incremental_link.vars | 1 | ||||
-rw-r--r-- | site_scons/site_tools/incremental_link.py | 45 |
3 files changed, 50 insertions, 0 deletions
diff --git a/SConstruct b/SConstruct index 19e0e671c4b..bb23b1287cb 100644 --- a/SConstruct +++ b/SConstruct @@ -2902,6 +2902,10 @@ if split_dwarf.exists(env): # compilation database entries for the configure tests, which is weird. env.Tool("compilation_db") +incremental_link = Tool('incremental_link') +if incremental_link.exists(env): + incremental_link(env) + def checkErrorCodes(): import buildscripts.errorcodes as x if x.checkErrorCodes() == False: diff --git a/etc/scons/gold_incremental_link.vars b/etc/scons/gold_incremental_link.vars new file mode 100644 index 00000000000..e298392f506 --- /dev/null +++ b/etc/scons/gold_incremental_link.vars @@ -0,0 +1 @@ +LINKFLAGS="-fuse-ld=gold -fno-use-linker-plugin -Wl,-z,norelro -Wl,--incremental" diff --git a/site_scons/site_tools/incremental_link.py b/site_scons/site_tools/incremental_link.py new file mode 100644 index 00000000000..cf74ef9674c --- /dev/null +++ b/site_scons/site_tools/incremental_link.py @@ -0,0 +1,45 @@ +# Copyright 2017 MongoDB Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import SCons + +def _tag_as_precious(target, source, env): + env.Precious(target) + return target, source + +def generate(env): + builders = env['BUILDERS'] + for builder in ('Program', 'SharedLibrary', 'LoadableModule'): + emitter = builders[builder].emitter + builders[builder].emitter = SCons.Builder.ListEmitter([ + emitter, + _tag_as_precious, + ]) + +def exists(env): + # By default, the windows linker is incremental, so unless + # overridden in the environment with /INCREMENTAL:NO, the tool is + # in play. + if env.TargetOSIs('windows') and not "/INCREMENTAL:NO" in env['LINKFLAGS']: + return True + + # On posix platforms, excluding darwin, we may have enabled + # incremental linking. Check for the relevant flags. + if env.TargetOSIs('posix') and \ + not env.TargetOSIs('darwin') and \ + "-fuse-ld=gold" in env['LINKFLAGS'] and \ + "-Wl,--incremental" in env['LINKFLAGS']: + return True + + return False |