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