Merge "Use WriteFileRule instead of custom echo commands"

This commit is contained in:
Cole Faust 2023-01-04 19:40:26 +00:00 committed by Gerrit Code Review
commit da5e739628
4 changed files with 17 additions and 46 deletions

View file

@ -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

View file

@ -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()

View file

@ -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) {

View file

@ -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.