From cda22c9bb92a5fc4fa5063103afde34805161c7a Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Mon, 23 Nov 2020 00:22:30 -0500 Subject: [PATCH] Refactor 'in_make' to mean Kati is not skipped. In Nougat and before, Make wrote a marker file to indicate that soong_build was invoked from Make to change certain behaviors of Soong at build time. https://cs.android.com/android/platform/superproject/+/android-7.1.2_r36:build/core/soong.mk;l=70-73;drc=ae18638b0406ad107b0882a02a13cdd8b92f2a4e Things have changed, and now soong_build is invoked from soong_ui, which supports a --skip-make configuration flag: https://cs.android.com/android/platform/superproject/+/master:build/soong/ui/build/build.go;l=31-33;drc=680387bf1d3ce7cbc77f535be7c42cec411b1687 Thus, the various remnants of 'EmbeddedInMake' and 'inMake' configuration are misleading, since soong_build is no longer invoked from Make. This CL refactors all instances to actually mean that Kati is enabled (not skipped with --skip-make), and will run after soong_build finishes, so Kati-specific behavior like the AndroidMk singleton should run. Test: TH presubmit Change-Id: I576ab8e54f99f5c8ddf9feaf9a828019b279e266 --- android/androidmk.go | 2 +- android/androidmk_test.go | 4 ++-- android/config.go | 14 ++++++++------ android/makevars.go | 2 +- android/module.go | 14 +++++++------- android/paths.go | 2 +- android/phony.go | 2 +- android/testing.go | 4 ++-- cc/prebuilt_test.go | 2 +- cc/strip.go | 4 ++-- java/lint.go | 2 +- scripts/build-aml-prebuilts.sh | 6 +++--- sdk/testing.go | 2 +- ui/build/build.go | 13 ++++++++++--- 14 files changed, 41 insertions(+), 32 deletions(-) diff --git a/android/androidmk.go b/android/androidmk.go index cfd7c91de..4adbb22d5 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -417,7 +417,7 @@ func AndroidMkSingleton() Singleton { type androidMkSingleton struct{} func (c *androidMkSingleton) GenerateBuildActions(ctx SingletonContext) { - if !ctx.Config().EmbeddedInMake() { + if !ctx.Config().KatiEnabled() { return } diff --git a/android/androidmk_test.go b/android/androidmk_test.go index 10527b911..bb0337849 100644 --- a/android/androidmk_test.go +++ b/android/androidmk_test.go @@ -78,7 +78,7 @@ func TestAndroidMkSingleton_PassesUpdatedAndroidMkDataToCustomCallback(t *testin ` config := TestConfig(buildDir, nil, bp, nil) - config.inMake = true // Enable androidmk Singleton + config.katiEnabled = true // Enable androidmk Singleton ctx := NewTestContext(config) ctx.RegisterSingletonType("androidmk", AndroidMkSingleton) @@ -250,7 +250,7 @@ func TestGetDistForGoals(t *testing.T) { for _, testCase := range testCases { config := TestConfig(buildDir, nil, testCase.bp, nil) - config.inMake = true // Enable androidmk Singleton + config.katiEnabled = true // Enable androidmk Singleton ctx := NewTestContext(config) ctx.RegisterSingletonType("androidmk", AndroidMkSingleton) diff --git a/android/config.go b/android/config.go index d833c5c4d..e5c88247d 100644 --- a/android/config.go +++ b/android/config.go @@ -112,7 +112,9 @@ type config struct { envDeps map[string]string envFrozen bool - inMake bool + // Changes behavior based on whether Kati runs after soong_build, or if soong_build + // runs standalone. + katiEnabled bool captureBuild bool // true for tests, saves build parameters for each module ignoreEnvironment bool // true for tests, returns empty from all Getenv calls @@ -390,9 +392,9 @@ func NewConfig(srcDir, buildDir string, moduleListFile string) (Config, error) { return Config{}, err } - inMakeFile := filepath.Join(buildDir, ".soong.in_make") - if _, err := os.Stat(absolutePath(inMakeFile)); err == nil { - config.inMake = true + KatiEnabledMarkerFile := filepath.Join(buildDir, ".soong.kati_enabled") + if _, err := os.Stat(absolutePath(KatiEnabledMarkerFile)); err == nil { + config.katiEnabled = true } targets, err := decodeTargetProductVariables(config) @@ -619,8 +621,8 @@ func (c *config) EnvDeps() map[string]string { return c.envDeps } -func (c *config) EmbeddedInMake() bool { - return c.inMake +func (c *config) KatiEnabled() bool { + return c.katiEnabled } func (c *config) BuildId() string { diff --git a/android/makevars.go b/android/makevars.go index f78439596..5101436db 100644 --- a/android/makevars.go +++ b/android/makevars.go @@ -213,7 +213,7 @@ type dist struct { } func (s *makeVarsSingleton) GenerateBuildActions(ctx SingletonContext) { - if !ctx.Config().EmbeddedInMake() { + if !ctx.Config().KatiEnabled() { return } diff --git a/android/module.go b/android/module.go index 6b659d2cd..70c649787 100644 --- a/android/module.go +++ b/android/module.go @@ -1440,7 +1440,7 @@ func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) { if len(deps) > 0 { suffix := "" - if ctx.Config().EmbeddedInMake() { + if ctx.Config().KatiEnabled() { suffix = "-soong" } @@ -2320,7 +2320,7 @@ func (m *moduleContext) skipInstall(fullInstallPath InstallPath) bool { } if m.Device() { - if m.Config().EmbeddedInMake() && !m.InstallBypassMake() { + if m.Config().KatiEnabled() && !m.InstallBypassMake() { return true } @@ -2373,7 +2373,7 @@ func (m *moduleContext) installFile(installPath InstallPath, name string, srcPat Input: srcPath, Implicits: implicitDeps, OrderOnly: orderOnlyDeps, - Default: !m.Config().EmbeddedInMake(), + Default: !m.Config().KatiEnabled(), }) m.installFiles = append(m.installFiles, fullInstallPath) @@ -2405,7 +2405,7 @@ func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, src Description: "install symlink " + fullInstallPath.Base(), Output: fullInstallPath, Input: srcPath, - Default: !m.Config().EmbeddedInMake(), + Default: !m.Config().KatiEnabled(), Args: map[string]string{ "fromPath": relPath, }, @@ -2436,7 +2436,7 @@ func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name str Rule: Symlink, Description: "install symlink " + fullInstallPath.Base() + " -> " + absPath, Output: fullInstallPath, - Default: !m.Config().EmbeddedInMake(), + Default: !m.Config().KatiEnabled(), Args: map[string]string{ "fromPath": absPath, }, @@ -2665,7 +2665,7 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) { }) suffix := "" - if ctx.Config().EmbeddedInMake() { + if ctx.Config().KatiEnabled() { suffix = "-soong" } @@ -2673,7 +2673,7 @@ func (c *buildTargetSingleton) GenerateBuildActions(ctx SingletonContext) { ctx.Phony("checkbuild"+suffix, checkbuildDeps...) // Make will generate the MODULES-IN-* targets - if ctx.Config().EmbeddedInMake() { + if ctx.Config().KatiEnabled() { return } diff --git a/android/paths.go b/android/paths.go index b13979dae..a62c9e387 100644 --- a/android/paths.go +++ b/android/paths.go @@ -1312,7 +1312,7 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string ret := pathForInstall(ctx, os, arch, partition, ctx.Debug(), pathComponents...) - if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() { + if ctx.InstallBypassMake() && ctx.Config().KatiEnabled() { ret = ret.ToMakePath() } diff --git a/android/phony.go b/android/phony.go index f8e5a4401..0adbb55b5 100644 --- a/android/phony.go +++ b/android/phony.go @@ -53,7 +53,7 @@ func (p *phonySingleton) GenerateBuildActions(ctx SingletonContext) { p.phonyMap[phony] = SortedUniquePaths(p.phonyMap[phony]) } - if !ctx.Config().EmbeddedInMake() { + if !ctx.Config().KatiEnabled() { for _, phony := range p.phonyList { ctx.Build(pctx, BuildParams{ Rule: blueprint.Phony, diff --git a/android/testing.go b/android/testing.go index 1e2ae130a..6539063bc 100644 --- a/android/testing.go +++ b/android/testing.go @@ -424,8 +424,8 @@ func CheckErrorsAgainstExpectations(t *testing.T, errs []error, expectedErrorPat } -func SetInMakeForTests(config Config) { - config.inMake = true +func SetKatiEnabledForTests(config Config) { + config.katiEnabled = true } func AndroidMkEntriesForTest(t *testing.T, config Config, bpPath string, mod blueprint.Module) []AndroidMkEntries { diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index 5bf334e3e..ee4de6ee8 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -32,7 +32,7 @@ func testPrebuilt(t *testing.T, bp string, fs map[string][]byte, handlers ...con // * Configure that we are inside make // * Add CommonOS to ensure that androidmk processing works. android.RegisterAndroidMkBuildComponents(ctx) - android.SetInMakeForTests(config) + android.SetKatiEnabledForTests(config) for _, handler := range handlers { handler(config) diff --git a/cc/strip.go b/cc/strip.go index 18150dc8d..f8814ea01 100644 --- a/cc/strip.go +++ b/cc/strip.go @@ -35,8 +35,8 @@ type Stripper struct { } func (stripper *Stripper) NeedsStrip(actx android.ModuleContext) bool { - // TODO(ccross): enable host stripping when embedded in make? Make never had support for stripping host binaries. - return (!actx.Config().EmbeddedInMake() || actx.Device()) && !Bool(stripper.StripProperties.Strip.None) + // TODO(ccross): enable host stripping when Kati is enabled? Make never had support for stripping host binaries. + return (!actx.Config().KatiEnabled() || actx.Device()) && !Bool(stripper.StripProperties.Strip.None) } func (stripper *Stripper) strip(actx android.ModuleContext, in android.Path, out android.ModuleOutPath, diff --git a/java/lint.go b/java/lint.go index 3df582f6e..11f92e502 100644 --- a/java/lint.go +++ b/java/lint.go @@ -447,7 +447,7 @@ func (l *lintSingleton) generateLintReportZips(ctx android.SingletonContext) { var outputs []*lintOutputs var dirs []string ctx.VisitAllModules(func(m android.Module) { - if ctx.Config().EmbeddedInMake() && !m.ExportedToMake() { + if ctx.Config().KatiEnabled() && !m.ExportedToMake() { return } diff --git a/scripts/build-aml-prebuilts.sh b/scripts/build-aml-prebuilts.sh index 89fb1a569..0c868ea11 100755 --- a/scripts/build-aml-prebuilts.sh +++ b/scripts/build-aml-prebuilts.sh @@ -12,7 +12,7 @@ export OUT_DIR=${OUT_DIR:-out} -if [ -e ${OUT_DIR}/soong/.soong.in_make ]; then +if [ -e ${OUT_DIR}/soong/.soong.kati_enabled ]; then # If ${OUT_DIR} has been created without --skip-make, Soong will create an # ${OUT_DIR}/soong/build.ninja that leaves out many targets which are # expected to be supplied by the .mk files, and that might cause errors in @@ -32,8 +32,8 @@ source build/envsetup.sh my_get_build_var() { # get_build_var will run Soong in normal in-make mode where it creates - # .soong.in_make. That would clobber our real out directory, so we need to - # run it in a different one. + # .soong.kati_enabled. That would clobber our real out directory, so we need + # to run it in a different one. OUT_DIR=${OUT_DIR}/get_build_var get_build_var "$@" } diff --git a/sdk/testing.go b/sdk/testing.go index 5f520e5b0..91aa879d0 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -87,7 +87,7 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy // * Configure that we are inside make // * Add CommonOS to ensure that androidmk processing works. android.RegisterAndroidMkBuildComponents(ctx) - android.SetInMakeForTests(config) + android.SetKatiEnabledForTests(config) config.Targets[android.CommonOS] = []android.Target{ {android.CommonOS, android.Arch{ArchType: android.Common}, android.NativeBridgeDisabled, "", "", true}, } diff --git a/ui/build/build.go b/ui/build/build.go index 1cf202353..e9196a9f6 100644 --- a/ui/build/build.go +++ b/ui/build/build.go @@ -23,13 +23,20 @@ import ( "android/soong/ui/metrics" ) -// Ensures the out directory exists, and has the proper files to prevent kati -// from recursing into it. +// SetupOutDir ensures the out directory exists, and has the proper files to +// prevent kati from recursing into it. func SetupOutDir(ctx Context, config Config) { ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), "Android.mk")) ensureEmptyFileExists(ctx, filepath.Join(config.OutDir(), "CleanSpec.mk")) if !config.SkipMake() { - ensureEmptyFileExists(ctx, filepath.Join(config.SoongOutDir(), ".soong.in_make")) + // Run soong_build with Kati for a hybrid build, e.g. running the + // AndroidMk singleton and postinstall commands. Communicate this to + // soong_build by writing an empty .soong.kati_enabled marker file in the + // soong_build output directory for the soong_build primary builder to + // know if the user wants to run Kati after. + // + // This does not preclude running Kati for *product configuration purposes*. + ensureEmptyFileExists(ctx, filepath.Join(config.SoongOutDir(), ".soong.kati_enabled")) } // The ninja_build file is used by our buildbots to understand that the output // can be parsed as ninja output.