xref: /aosp_15_r20/external/toolchain-utils/compiler_wrapper/ccache_flag.go (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li// Copyright 2019 The ChromiumOS Authors
2*760c253cSXin Li// Use of this source code is governed by a BSD-style license that can be
3*760c253cSXin Li// found in the LICENSE file.
4*760c253cSXin Li
5*760c253cSXin Lipackage main
6*760c253cSXin Li
7*760c253cSXin Lifunc isInConfigureStage(env env) bool {
8*760c253cSXin Li	val, present := env.getenv("EBUILD_PHASE")
9*760c253cSXin Li	return present && val == "configure"
10*760c253cSXin Li}
11*760c253cSXin Li
12*760c253cSXin Lifunc processCCacheFlag(builder *commandBuilder) {
13*760c253cSXin Li	// We should be able to share the objects across compilers as
14*760c253cSXin Li	// the pre-processed output will differ.  This allows boards
15*760c253cSXin Li	// that share compiler flags (like x86 boards) to share caches.
16*760c253cSXin Li	const ccacheDir = "/var/cache/distfiles/ccache"
17*760c253cSXin Li
18*760c253cSXin Li	useCCache := builder.cfg.useCCache
19*760c253cSXin Li	builder.transformArgs(func(arg builderArg) string {
20*760c253cSXin Li		if arg.value == "-noccache" {
21*760c253cSXin Li			useCCache = false
22*760c253cSXin Li			return ""
23*760c253cSXin Li		}
24*760c253cSXin Li		return arg.value
25*760c253cSXin Li	})
26*760c253cSXin Li
27*760c253cSXin Li	if force, present := builder.env.getenv("COMPILER_WRAPPER_FORCE_CCACHE"); present {
28*760c253cSXin Li		switch force {
29*760c253cSXin Li		case "0":
30*760c253cSXin Li			useCCache = false
31*760c253cSXin Li		case "1":
32*760c253cSXin Li			useCCache = true
33*760c253cSXin Li		}
34*760c253cSXin Li	}
35*760c253cSXin Li
36*760c253cSXin Li	// Disable ccache during portage's src_configure phase. Using ccache here is generally a
37*760c253cSXin Li	// waste of time, since these files are very small. Experimentally, this speeds up
38*760c253cSXin Li	// configuring by ~13%.
39*760c253cSXin Li	if isInConfigureStage(builder.env) {
40*760c253cSXin Li		useCCache = false
41*760c253cSXin Li	}
42*760c253cSXin Li
43*760c253cSXin Li	if useCCache {
44*760c253cSXin Li		// Note: we used to also set CCACHE_BASEDIR but don't do it
45*760c253cSXin Li		// anymore for reasons outlined in crrev.com/c/2103170.
46*760c253cSXin Li		if _, present := builder.env.getenv("CCACHE_DISABLE"); present {
47*760c253cSXin Li			// Portage likes to set this for us when it has FEATURES=-ccache.
48*760c253cSXin Li			// The other vars we need to setup manually because of tools like
49*760c253cSXin Li			// scons that scrubs the env before we get executed.
50*760c253cSXin Li			builder.updateEnv("CCACHE_DISABLE=")
51*760c253cSXin Li		}
52*760c253cSXin Li		// If RESTRICT=sandbox is enabled, then sandbox won't be setup,
53*760c253cSXin Li		// and the env vars won't be available for appending.
54*760c253cSXin Li		if sandboxRewrite, present := builder.env.getenv("SANDBOX_WRITE"); present {
55*760c253cSXin Li			builder.updateEnv("SANDBOX_WRITE=" + sandboxRewrite + ":" + ccacheDir)
56*760c253cSXin Li		}
57*760c253cSXin Li
58*760c253cSXin Li		// Make sure we keep the cached files group writable.
59*760c253cSXin Li		builder.updateEnv("CCACHE_DIR="+ccacheDir, "CCACHE_UMASK=002")
60*760c253cSXin Li
61*760c253cSXin Li		// ccache may generate false positive warnings.
62*760c253cSXin Li		// Workaround bug https://crbug.com/649740
63*760c253cSXin Li		if builder.target.compilerType == clangType {
64*760c253cSXin Li			builder.updateEnv("CCACHE_CPP2=yes")
65*760c253cSXin Li		}
66*760c253cSXin Li
67*760c253cSXin Li		builder.wrapPath("/usr/bin/ccache")
68*760c253cSXin Li	}
69*760c253cSXin Li}
70