From a7347491489a8e6b039cf9d74efe407064c8db8f Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Fri, 16 Dec 2022 10:56:24 -0800 Subject: [PATCH] Use WriteFileRule instead of custom echo commands These instances could use WriteFileRule instead of making their own shell code to write a file. Test: Presubmits Change-Id: I9c809b2164a68b4ce1c22fbbd0d7497240110b39 --- android/bazel_handler.go | 20 ++------------------ android/buildinfo_prop.go | 8 +++----- android/defs.go | 7 ++++++- apex/builder.go | 28 ++++++---------------------- 4 files changed, 17 insertions(+), 46 deletions(-) diff --git a/android/bazel_handler.go b/android/bazel_handler.go index e9c97d0ce..fc63c3b69 100644 --- a/android/bazel_handler.go +++ b/android/bazel_handler.go @@ -36,11 +36,6 @@ import ( ) var ( - writeBazelFile = pctx.AndroidStaticRule("bazelWriteFileRule", blueprint.RuleParams{ - Command: `sed "s/\\\\n/\n/g" ${out}.rsp >${out}`, - Rspfile: "${out}.rsp", - RspfileContent: "${content}", - }, "content") _ = pctx.HostBinToolVariable("bazelBuildRunfilesTool", "build-runfiles") buildRunfilesRule = pctx.AndroidStaticRule("bazelBuildRunfiles", blueprint.RuleParams{ Command: "${bazelBuildRunfilesTool} ${in} ${outDir}", @@ -1089,19 +1084,8 @@ func (c *bazelSingleton) GenerateBuildActions(ctx SingletonContext) { // because this would cause circular dependency. So, until we move aquery processing // to the 'android' package, we need to handle special cases here. if buildStatement.Mnemonic == "FileWrite" || buildStatement.Mnemonic == "SourceSymlinkManifest" { - // Pass file contents as the value of the rule's "content" argument. - // Escape newlines and $ in the contents (the action "writeBazelFile" restores "\\n" - // back to the newline, and Ninja reads $$ as $. - escaped := strings.ReplaceAll(strings.ReplaceAll(buildStatement.FileContents, "\n", "\\n"), - "$", "$$") - ctx.Build(pctx, BuildParams{ - Rule: writeBazelFile, - Output: PathForBazelOut(ctx, buildStatement.OutputPaths[0]), - Description: fmt.Sprintf("%s %s", buildStatement.Mnemonic, buildStatement.OutputPaths[0]), - Args: map[string]string{ - "content": escaped, - }, - }) + out := PathForBazelOut(ctx, buildStatement.OutputPaths[0]) + WriteFileRuleVerbatim(ctx, out, buildStatement.FileContents) } else if buildStatement.Mnemonic == "SymlinkTree" { // build-runfiles arguments are the manifest file and the target directory // where it creates the symlink tree according to this manifest (and then diff --git a/android/buildinfo_prop.go b/android/buildinfo_prop.go index acebdbbff..46f648802 100644 --- a/android/buildinfo_prop.go +++ b/android/buildinfo_prop.go @@ -61,11 +61,10 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { return } - rule := NewRuleBuilder(pctx, ctx) - cmd := rule.Command().Text("(") + lines := make([]string, 0) writeString := func(str string) { - cmd.Text(`echo "` + str + `" && `) + lines = append(lines, str) } writeString("# begin build properties") @@ -142,8 +141,7 @@ func (p *buildinfoPropModule) GenerateAndroidBuildActions(ctx ModuleContext) { writeString("# end build properties") - cmd.Text("true) > ").Output(p.outputFilePath) - rule.Build("build.prop", "generating build.prop") + WriteFileRule(ctx, p.outputFilePath, strings.Join(lines, "\n")) if !p.installable() { p.SkipInstall() diff --git a/android/defs.go b/android/defs.go index 9ae360e36..6e5bb053f 100644 --- a/android/defs.go +++ b/android/defs.go @@ -174,10 +174,15 @@ func buildWriteFileRule(ctx BuilderContext, outputFile WritablePath, content str // WriteFileRule creates a ninja rule to write contents to a file. The contents will be escaped // so that the file contains exactly the contents passed to the function, plus a trailing newline. func WriteFileRule(ctx BuilderContext, outputFile WritablePath, content string) { + WriteFileRuleVerbatim(ctx, outputFile, content+"\n") +} + +// WriteFileRuleVerbatim creates a ninja rule to write contents to a file. The contents will be +// escaped so that the file contains exactly the contents passed to the function. +func WriteFileRuleVerbatim(ctx BuilderContext, outputFile WritablePath, content string) { // This is MAX_ARG_STRLEN subtracted with some safety to account for shell escapes const SHARD_SIZE = 131072 - 10000 - content += "\n" if len(content) > SHARD_SIZE { var chunks WritablePaths for i, c := range ShardString(content, SHARD_SIZE) { diff --git a/apex/builder.go b/apex/builder.go index 82a523c78..3b9cac069 100644 --- a/apex/builder.go +++ b/apex/builder.go @@ -179,13 +179,6 @@ var ( Description: "app bundle", }, "abi", "config") - emitApexContentRule = pctx.StaticRule("emitApexContentRule", blueprint.RuleParams{ - Command: `rm -f ${out} && touch ${out} && (. ${out}.emit_commands)`, - Rspfile: "${out}.emit_commands", - RspfileContent: "${emit_commands}", - Description: "Emit APEX image content", - }, "emit_commands") - diffApexContentRule = pctx.StaticRule("diffApexContentRule", blueprint.RuleParams{ Command: `diff --unchanged-group-format='' \` + `--changed-group-format='%<' \` + @@ -546,29 +539,20 @@ func (a *apexBundle) buildUnflattenedApex(ctx android.ModuleContext) { // to be using this at this moment. Furthermore, this looks very similar to what // buildInstalledFilesFile does. At least, move this to somewhere else so that this doesn't // hurt readability. - // TODO(jiyong): use RuleBuilder if a.overridableProperties.Allowed_files != nil { // Build content.txt - var emitCommands []string + var contentLines []string imageContentFile := android.PathForModuleOut(ctx, "content.txt") - emitCommands = append(emitCommands, "echo ./apex_manifest.pb >> "+imageContentFile.String()) + contentLines = append(contentLines, "./apex_manifest.pb") minSdkVersion := a.minSdkVersion(ctx) if minSdkVersion.EqualTo(android.SdkVersion_Android10) { - emitCommands = append(emitCommands, "echo ./apex_manifest.json >> "+imageContentFile.String()) + contentLines = append(contentLines, "./apex_manifest.json") } for _, fi := range a.filesInfo { - emitCommands = append(emitCommands, "echo './"+fi.path()+"' >> "+imageContentFile.String()) + contentLines = append(contentLines, "./"+fi.path()) } - emitCommands = append(emitCommands, "sort -o "+imageContentFile.String()+" "+imageContentFile.String()) - ctx.Build(pctx, android.BuildParams{ - Rule: emitApexContentRule, - Implicits: implicitInputs, - Output: imageContentFile, - Description: "emit apex image content", - Args: map[string]string{ - "emit_commands": strings.Join(emitCommands, " && "), - }, - }) + sort.Strings(contentLines) + android.WriteFileRule(ctx, imageContentFile, strings.Join(contentLines, "\n")) implicitInputs = append(implicitInputs, imageContentFile) // Compare content.txt against allowed_files.