From a37d9baa966bca57aef28c40cb7b02557122e175 Mon Sep 17 00:00:00 2001 From: Kiyoung Kim Date: Wed, 19 Apr 2023 13:13:45 +0900 Subject: [PATCH] Rename build.ninja with product name Current build.ninja does not contain any product name, while other ninja files (such as combined ninja) do. This change adds product name to the build.ninja so it can be separated over multiple lunch targets Bug: 277029044 Test: build succeeded and checked if out/soong/build.ninja has been renamed Change-Id: I16dc71f829fd76f01b98da0d509a8e0ef6f62fa9 --- android/config.go | 9 +++--- cmd/soong_build/main.go | 26 +++++++++++++++ ui/build/config.go | 21 +++++++++++-- ui/build/soong.go | 70 ++++++++++++++++++++++++----------------- 4 files changed, 91 insertions(+), 35 deletions(-) diff --git a/android/config.go b/android/config.go index 4f0a64dfe..ddf2d746c 100644 --- a/android/config.go +++ b/android/config.go @@ -80,9 +80,10 @@ type SoongBuildMode int type CmdArgs struct { bootstrap.Args - RunGoTests bool - OutDir string - SoongOutDir string + RunGoTests bool + OutDir string + SoongOutDir string + SoongVariables string SymlinkForestMarker string Bp2buildMarker string @@ -491,7 +492,7 @@ func NullConfig(outDir, soongOutDir string) Config { func NewConfig(cmdArgs CmdArgs, availableEnv map[string]string) (Config, error) { // Make a config with default options. config := &config{ - ProductVariablesFileName: filepath.Join(cmdArgs.SoongOutDir, productVariablesFileName), + ProductVariablesFileName: cmdArgs.SoongVariables, env: availableEnv, diff --git a/cmd/soong_build/main.go b/cmd/soong_build/main.go index cf6c1c7b8..e006c9d7e 100644 --- a/cmd/soong_build/main.go +++ b/cmd/soong_build/main.go @@ -78,6 +78,7 @@ func init() { flag.StringVar(&cmdlineArgs.Bp2buildMarker, "bp2build_marker", "", "If set, run bp2build, touch the specified marker file then exit") flag.StringVar(&cmdlineArgs.SymlinkForestMarker, "symlink_forest_marker", "", "If set, create the bp2build symlink forest, touch the specified marker file, then exit") flag.StringVar(&cmdlineArgs.OutFile, "o", "build.ninja", "the Ninja file to output") + flag.StringVar(&cmdlineArgs.SoongVariables, "soong_variables", "soong.variables", "the file contains all build variables") flag.StringVar(&cmdlineArgs.BazelForceEnabledModules, "bazel-force-enabled-modules", "", "additional modules to build with Bazel. Comma-delimited") flag.BoolVar(&cmdlineArgs.EmptyNinjaFile, "empty-ninja-file", false, "write out a 0-byte ninja file") flag.BoolVar(&cmdlineArgs.MultitreeBuild, "multitree-build", false, "this is a multitree build") @@ -517,6 +518,8 @@ func main() { var finalOutputFile string + writeSymlink := false + // Run Soong for a specific activity, like bp2build, queryview // or the actual Soong build for the build.ninja file. switch configuration.BuildMode { @@ -539,8 +542,13 @@ func main() { maybeQuit(err, "") } } + writeSymlink = true } else { finalOutputFile = runSoongOnlyBuild(ctx, extraNinjaDeps) + + if configuration.BuildMode == android.AnalysisNoBazel { + writeSymlink = true + } } writeMetrics(configuration, ctx.EventHandler, metricsDir) } @@ -551,6 +559,24 @@ func main() { // are ninja inputs to the main output file, then ninja would superfluously // rebuild this output file on the next build invocation. touch(shared.JoinPath(topDir, finalOutputFile)) + + // TODO(b/277029044): Remove this function once build..ninja lands + if writeSymlink { + writeBuildNinjaSymlink(configuration, finalOutputFile) + } +} + +// TODO(b/277029044): Remove this function once build..ninja lands +func writeBuildNinjaSymlink(config android.Config, source string) { + targetPath := shared.JoinPath(topDir, config.SoongOutDir(), "build.ninja") + sourcePath := shared.JoinPath(topDir, source) + + if targetPath == sourcePath { + return + } + + os.Remove(targetPath) + os.Symlink(sourcePath, targetPath) } func writeUsedEnvironmentFile(configuration android.Config) { diff --git a/ui/build/config.go b/ui/build/config.go index 8ec96800f..89de01acd 100644 --- a/ui/build/config.go +++ b/ui/build/config.go @@ -1229,6 +1229,13 @@ func (c *configImpl) TargetProduct() string { panic("TARGET_PRODUCT is not defined") } +func (c *configImpl) TargetProductOrErr() (string, error) { + if v, ok := c.environ.Get("TARGET_PRODUCT"); ok { + return v, nil + } + return "", fmt.Errorf("TARGET_PRODUCT is not defined") +} + func (c *configImpl) TargetDevice() string { return c.targetDevice } @@ -1554,11 +1561,21 @@ func (c *configImpl) KatiPackageNinjaFile() string { } func (c *configImpl) SoongVarsFile() string { - return filepath.Join(c.SoongOutDir(), "soong.variables") + targetProduct, err := c.TargetProductOrErr() + if err != nil { + return filepath.Join(c.SoongOutDir(), "soong.variables") + } else { + return filepath.Join(c.SoongOutDir(), "soong."+targetProduct+".variables") + } } func (c *configImpl) SoongNinjaFile() string { - return filepath.Join(c.SoongOutDir(), "build.ninja") + targetProduct, err := c.TargetProductOrErr() + if err != nil { + return filepath.Join(c.SoongOutDir(), "build.ninja") + } else { + return filepath.Join(c.SoongOutDir(), "build."+targetProduct+".ninja") + } } func (c *configImpl) CombinedNinjaFile() string { diff --git a/ui/build/soong.go b/ui/build/soong.go index 18bf3b912..6de8d6f98 100644 --- a/ui/build/soong.go +++ b/ui/build/soong.go @@ -235,7 +235,7 @@ func bootstrapEpochCleanup(ctx Context, config Config) { } else if !exists { // The tree is out of date for the current epoch, delete files used by bootstrap // and force the primary builder to rerun. - os.Remove(filepath.Join(config.SoongOutDir(), "build.ninja")) + os.Remove(config.SoongNinjaFile()) for _, globFile := range bootstrapGlobFileList(config) { os.Remove(globFile) } @@ -263,7 +263,9 @@ func bootstrapBlueprint(ctx Context, config Config) { // Clean up some files for incremental builds across incompatible changes. bootstrapEpochCleanup(ctx, config) - mainSoongBuildExtraArgs := []string{"-o", config.SoongNinjaFile()} + baseArgs := []string{"--soong_variables", config.SoongVarsFile()} + + mainSoongBuildExtraArgs := append(baseArgs, "-o", config.SoongNinjaFile()) if config.EmptyNinjaFile() { mainSoongBuildExtraArgs = append(mainSoongBuildExtraArgs, "--empty-ninja-file") } @@ -306,49 +308,59 @@ func bootstrapBlueprint(ctx Context, config Config) { specificArgs: mainSoongBuildExtraArgs, }, { - name: bp2buildFilesTag, - description: fmt.Sprintf("converting Android.bp files to BUILD files at %s/bp2build", config.SoongOutDir()), - config: config, - output: config.Bp2BuildFilesMarkerFile(), - specificArgs: []string{"--bp2build_marker", config.Bp2BuildFilesMarkerFile()}, + name: bp2buildFilesTag, + description: fmt.Sprintf("converting Android.bp files to BUILD files at %s/bp2build", config.SoongOutDir()), + config: config, + output: config.Bp2BuildFilesMarkerFile(), + specificArgs: append(baseArgs, + "--bp2build_marker", config.Bp2BuildFilesMarkerFile(), + ), }, { - name: bp2buildWorkspaceTag, - description: "Creating Bazel symlink forest", - config: config, - output: config.Bp2BuildWorkspaceMarkerFile(), - specificArgs: []string{"--symlink_forest_marker", config.Bp2BuildWorkspaceMarkerFile()}, + name: bp2buildWorkspaceTag, + description: "Creating Bazel symlink forest", + config: config, + output: config.Bp2BuildWorkspaceMarkerFile(), + specificArgs: append(baseArgs, + "--symlink_forest_marker", config.Bp2BuildWorkspaceMarkerFile(), + ), }, { name: jsonModuleGraphTag, description: fmt.Sprintf("generating the Soong module graph at %s", config.ModuleGraphFile()), config: config, output: config.ModuleGraphFile(), - specificArgs: []string{ + specificArgs: append(baseArgs, "--module_graph_file", config.ModuleGraphFile(), "--module_actions_file", config.ModuleActionsFile(), - }, + ), }, { - name: queryviewTag, - description: fmt.Sprintf("generating the Soong module graph as a Bazel workspace at %s", queryviewDir), - config: config, - output: config.QueryviewMarkerFile(), - specificArgs: []string{"--bazel_queryview_dir", queryviewDir}, + name: queryviewTag, + description: fmt.Sprintf("generating the Soong module graph as a Bazel workspace at %s", queryviewDir), + config: config, + output: config.QueryviewMarkerFile(), + specificArgs: append(baseArgs, + "--bazel_queryview_dir", queryviewDir, + ), }, { - name: apiBp2buildTag, - description: fmt.Sprintf("generating BUILD files for API contributions at %s", apiBp2buildDir), - config: config, - output: config.ApiBp2buildMarkerFile(), - specificArgs: []string{"--bazel_api_bp2build_dir", apiBp2buildDir}, + name: apiBp2buildTag, + description: fmt.Sprintf("generating BUILD files for API contributions at %s", apiBp2buildDir), + config: config, + output: config.ApiBp2buildMarkerFile(), + specificArgs: append(baseArgs, + "--bazel_api_bp2build_dir", apiBp2buildDir, + ), }, { - name: soongDocsTag, - description: fmt.Sprintf("generating Soong docs at %s", config.SoongDocsHtml()), - config: config, - output: config.SoongDocsHtml(), - specificArgs: []string{"--soong_docs", config.SoongDocsHtml()}, + name: soongDocsTag, + description: fmt.Sprintf("generating Soong docs at %s", config.SoongDocsHtml()), + config: config, + output: config.SoongDocsHtml(), + specificArgs: append(baseArgs, + "--soong_docs", config.SoongDocsHtml(), + ), }, }