summaryrefslogtreecommitdiff
path: root/site_scons/site_tools/next/ccache.py
diff options
context:
space:
mode:
Diffstat (limited to 'site_scons/site_tools/next/ccache.py')
-rw-r--r--site_scons/site_tools/next/ccache.py172
1 files changed, 0 insertions, 172 deletions
diff --git a/site_scons/site_tools/next/ccache.py b/site_scons/site_tools/next/ccache.py
deleted file mode 100644
index de7d03e5472..00000000000
--- a/site_scons/site_tools/next/ccache.py
+++ /dev/null
@@ -1,172 +0,0 @@
-# Copyright 2020 MongoDB Inc.
-#
-# Permission is hereby granted, free of charge, to any person obtaining
-# a copy of this software and associated documentation files (the
-# "Software"), to deal in the Software without restriction, including
-# without limitation the rights to use, copy, modify, merge, publish,
-# distribute, sublicense, and/or sell copies of the Software, and to
-# permit persons to whom the Software is furnished to do so, subject to
-# the following conditions:
-#
-# The above copyright notice and this permission notice shall be included
-# in all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
-# KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
-# WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-
-import math
-import os
-import re
-import subprocess
-
-import SCons
-from pkg_resources import parse_version
-
-# This is the oldest version of ccache that offers support for -gsplit-dwarf
-_ccache_version_min = parse_version("3.2.3")
-
-
-def exists(env):
- """Look for a viable ccache implementation that meets our version requirements."""
- if not env.subst("$CCACHE"):
- return False
-
- ccache = env.WhereIs("$CCACHE")
- if not ccache:
- print(f"Error: ccache not found at {env['CCACHE']}")
- return False
-
- if 'CCACHE_VERSION' in env and env['CCACHE_VERSION'] >= _ccache_version_min:
- return True
-
- pipe = SCons.Action._subproc(
- env,
- SCons.Util.CLVar(ccache) + ["--version"],
- stdin="devnull",
- stderr="devnull",
- stdout=subprocess.PIPE,
- )
-
- if pipe.wait() != 0:
- print(f"Error: failed to execute '{env['CCACHE']}'")
- return False
-
- validated = False
- for line in pipe.stdout:
- line = line.decode("utf-8")
- if validated:
- continue # consume all data
- version_banner = re.search(r"^ccache version", line)
- if not version_banner:
- continue
- ccache_version = re.split("ccache version (.+)", line)
- if len(ccache_version) < 2:
- continue
- ccache_version = parse_version(ccache_version[1])
- if ccache_version >= _ccache_version_min:
- validated = True
-
- if validated:
- env['CCACHE_VERSION'] = ccache_version
- else:
- print(f"Error: failed to verify ccache version >= {_ccache_version_min}, found {ccache_version}")
-
- return validated
-
-
-def generate(env):
- """Add ccache support."""
-
- # Absoluteify
- env["CCACHE"] = env.WhereIs("$CCACHE")
-
- # Propagate CCACHE related variables into the command environment
- for var, host_value in os.environ.items():
- if var.startswith("CCACHE_"):
- env["ENV"][var] = host_value
-
- # SERVER-48289: Adding roll-your-own CFLAGS and CXXFLAGS can cause some very "weird" issues
- # with using icecc and ccache if they turn out not to be supported by the compiler. Rather
- # than try to filter each and every flag someone might try for the ones we know don't
- # work, we'll just let the compiler ignore them. A better approach might be to pre-filter
- # flags coming in from the environment by passing them through the appropriate *IfSupported
- # method, but that's a much larger effort.
- if env.ToolchainIs("clang"):
- env.AppendUnique(CCFLAGS=["-Qunused-arguments"])
-
- # Check whether icecream is requested and is a valid tool.
- if "ICECC" in env:
- icecream = SCons.Tool.Tool('icecream')
- icecream_enabled = bool(icecream) and icecream.exists(env)
- else:
- icecream_enabled = False
-
- # Set up a performant ccache configuration. Here, we don't use a second preprocessor and
- # pass preprocessor arguments that deterministically expand source files so a stable
- # hash can be calculated on them. This both reduces the amount of work ccache needs to
- # do and increases the likelihood of a cache hit.
- if env.ToolchainIs("clang"):
- env["ENV"].pop("CCACHE_CPP2", None)
- env["ENV"]["CCACHE_NOCPP2"] = "1"
- env.AppendUnique(CCFLAGS=["-frewrite-includes"])
- elif env.ToolchainIs("gcc"):
- if icecream_enabled:
- # Newer versions of Icecream will drop -fdirectives-only from
- # preprocessor and compiler flags if it does not find a remote
- # build host to build on. ccache, on the other hand, will not
- # pass the flag to the compiler if CCACHE_NOCPP2=1, but it will
- # pass it to the preprocessor. The combination of setting
- # CCACHE_NOCPP2=1 and passing the flag can lead to build
- # failures.
-
- # See: https://jira.mongodb.org/browse/SERVER-48443
- # We have an open issue with Icecream and ccache to resolve the
- # cause of these build failures. Once the bug is resolved and
- # the fix is deployed, we can remove this entire conditional
- # branch and make it like the one for clang.
- # TODO: https://github.com/icecc/icecream/issues/550
- env["ENV"].pop("CCACHE_CPP2", None)
- env["ENV"]["CCACHE_NOCPP2"] = "1"
- else:
- env["ENV"].pop("CCACHE_NOCPP2", None)
- env["ENV"]["CCACHE_CPP2"] = "1"
- env.AppendUnique(CCFLAGS=["-fdirectives-only"])
-
- # Ensure ccache accounts for any extra files in use that affects the generated object
- # file. This can be used for situations where a file is passed as an argument to a
- # compiler parameter and differences in the file need to be accounted for in the
- # hash result to prevent erroneous cache hits.
- if "CCACHE_EXTRAFILES" in env and env["CCACHE_EXTRAFILES"]:
- env["ENV"]["CCACHE_EXTRAFILES"] = ":".join([
- denyfile.path
- for denyfile in env["CCACHE_EXTRAFILES"]
- ])
-
- # Make a generator to expand to CCACHE in the case where we are
- # not a conftest. We don't want to use ccache for configure tests
- # because we don't want to use icecream for configure tests, but
- # when icecream and ccache are combined we can't easily filter out
- # configure tests for icecream since in that combination we use
- # CCACHE_PREFIX to express the icecc tool, and at that point it is
- # too late for us to meaningfully filter out conftests. So we just
- # disable ccache for conftests entirely. Which feels safer
- # somehow anyway.
- def ccache_generator(target, source, env, for_signature):
- if "conftest" not in str(target[0]):
- return '$CCACHE'
- return ''
- env['CCACHE_GENERATOR'] = ccache_generator
-
- # Add ccache to the relevant command lines. Wrap the reference to
- # ccache in the $( $) pattern so that turning ccache on or off
- # doesn't invalidate your build.
- env["CCCOM"] = "$( $CCACHE_GENERATOR $)" + env["CCCOM"]
- env["CXXCOM"] = "$( $CCACHE_GENERATOR $)" + env["CXXCOM"]
- env["SHCCCOM"] = "$( $CCACHE_GENERATOR $)" + env["SHCCCOM"]
- env["SHCXXCOM"] = "$( $CCACHE_GENERATOR $)" + env["SHCXXCOM"]