From 053fca10c935b50cf803abdcff991ea574f2a2fc Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Wed, 19 Aug 2020 13:51:47 -0700 Subject: [PATCH] Support ninja rsp files in soong_zip Add a -r argument to soong_zip that reads a list of files from a file like the -l argument but treats it as a Ninja rsp file with escaping. Replace the -l arguments in Soong that are using rsp files with -r. Fixes: 162435077 Test: TestReadRespFile, TestZip Change-Id: I4605312e99406ab1bd0c37af9c5ad212393f0403 --- android/test_suites.go | 2 +- cc/builder.go | 8 ++++---- cc/fuzz.go | 2 +- java/lint.go | 2 +- sdk/update.go | 2 +- zip/cmd/main.go | 12 +++++++++++- zip/zip.go | 24 ++++++++++++++++++++++++ zip/zip_test.go | 21 +++++++++++++++++++++ 8 files changed, 64 insertions(+), 9 deletions(-) diff --git a/android/test_suites.go b/android/test_suites.go index 7b2d7dcd1..79d0fbc60 100644 --- a/android/test_suites.go +++ b/android/test_suites.go @@ -68,7 +68,7 @@ func robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) W FlagWithOutput("-o ", outputFile). FlagWithArg("-P ", "host/testcases"). FlagWithArg("-C ", testCasesDir.String()). - FlagWithRspFileInputList("-l ", installedPaths.Paths()) + FlagWithRspFileInputList("-r ", installedPaths.Paths()) rule.Build(pctx, ctx, "robolectric_tests_zip", "robolectric-tests.zip") return outputFile diff --git a/cc/builder.go b/cc/builder.go index 28a573f23..f2bab8cb4 100644 --- a/cc/builder.go +++ b/cc/builder.go @@ -186,8 +186,8 @@ var ( // OutputFile here is $in for remote-execution since its possible that // clang-tidy modifies the given input file itself and $out refers to the // ".tidy" file generated for ninja-dependency reasons. - OutputFiles: []string{"$in"}, - Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"}, + OutputFiles: []string{"$in"}, + Platform: map[string]string{remoteexec.PoolKey: "${config.REClangTidyPool}"}, }, []string{"cFlags", "tidyFlags"}, []string{}) _ = pctx.SourcePathVariable("yasmCmd", "prebuilts/misc/${config.HostPrebuiltTag}/yasm/yasm") @@ -265,9 +265,9 @@ var ( zip = pctx.AndroidStaticRule("zip", blueprint.RuleParams{ - Command: "cat $out.rsp | tr ' ' '\\n' | tr -d \\' | sort -u > ${out}.tmp && ${SoongZipCmd} -o ${out} -C $$OUT_DIR -l ${out}.tmp", + Command: "${SoongZipCmd} -o ${out} -C $$OUT_DIR -r ${out}.rsp", CommandDeps: []string{"${SoongZipCmd}"}, - Rspfile: "$out.rsp", + Rspfile: "${out}.rsp", RspfileContent: "$in", }) diff --git a/cc/fuzz.go b/cc/fuzz.go index 58c1888ad..529541859 100644 --- a/cc/fuzz.go +++ b/cc/fuzz.go @@ -402,7 +402,7 @@ func (s *fuzzPackager) GenerateBuildActions(ctx android.SingletonContext) { command := builder.Command().BuiltTool(ctx, "soong_zip"). Flag("-j"). FlagWithOutput("-o ", corpusZip) - command.FlagWithRspFileInputList("-l ", fuzzModule.corpus) + command.FlagWithRspFileInputList("-r ", fuzzModule.corpus) files = append(files, fileToZip{corpusZip, ""}) } diff --git a/java/lint.go b/java/lint.go index b37f69265..3a210cc0b 100644 --- a/java/lint.go +++ b/java/lint.go @@ -513,7 +513,7 @@ func lintZip(ctx android.BuilderContext, paths android.Paths, outputPath android rule.Command().BuiltTool(ctx, "soong_zip"). FlagWithOutput("-o ", outputPath). FlagWithArg("-C ", android.PathForIntermediates(ctx).String()). - FlagWithRspFileInputList("-l ", paths) + FlagWithRspFileInputList("-r ", paths) rule.Build(pctx, ctx, outputPath.Base(), outputPath.Base()) } diff --git a/sdk/update.go b/sdk/update.go index 936696a01..537ab13cb 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -43,7 +43,7 @@ var ( zipFiles = pctx.AndroidStaticRule("SnapshotZipFiles", blueprint.RuleParams{ - Command: `${config.SoongZipCmd} -C $basedir -l $out.rsp -o $out`, + Command: `${config.SoongZipCmd} -C $basedir -r $out.rsp -o $out`, CommandDeps: []string{ "${config.SoongZipCmd}", }, diff --git a/zip/cmd/main.go b/zip/cmd/main.go index fba2e4b1e..d603586e6 100644 --- a/zip/cmd/main.go +++ b/zip/cmd/main.go @@ -62,6 +62,15 @@ func (listFiles) Set(s string) error { return nil } +type rspFiles struct{} + +func (rspFiles) String() string { return `""` } + +func (rspFiles) Set(s string) error { + fileArgsBuilder.RspFile(s) + return nil +} + type dir struct{} func (dir) String() string { return `""` } @@ -143,7 +152,8 @@ func main() { traceFile := flags.String("trace", "", "write trace to file") flags.Var(&rootPrefix{}, "P", "path prefix within the zip at which to place files") - flags.Var(&listFiles{}, "l", "file containing list of .class files") + flags.Var(&listFiles{}, "l", "file containing list of files to zip") + flags.Var(&rspFiles{}, "r", "file containing list of files to zip with Ninja rsp file escaping") flags.Var(&dir{}, "D", "directory to include in zip") flags.Var(&file{}, "f", "file to include in zip") flags.Var(&nonDeflatedFiles, "s", "file path to be stored within the zip without compression") diff --git a/zip/zip.go b/zip/zip.go index 3c710a782..e27432cbb 100644 --- a/zip/zip.go +++ b/zip/zip.go @@ -150,6 +150,30 @@ func (b *FileArgsBuilder) List(name string) *FileArgsBuilder { return b } +func (b *FileArgsBuilder) RspFile(name string) *FileArgsBuilder { + if b.err != nil { + return b + } + + f, err := b.fs.Open(name) + if err != nil { + b.err = err + return b + } + defer f.Close() + + list, err := ioutil.ReadAll(f) + if err != nil { + b.err = err + return b + } + + arg := b.state + arg.SourceFiles = ReadRespFile(list) + b.fileArgs = append(b.fileArgs, arg) + return b +} + func (b *FileArgsBuilder) Error() error { if b == nil { return nil diff --git a/zip/zip_test.go b/zip/zip_test.go index 9705d6c49..302a749a3 100644 --- a/zip/zip_test.go +++ b/zip/zip_test.go @@ -49,6 +49,9 @@ var mockFs = pathtools.MockFs(map[string][]byte{ "l_nl": []byte("a/a/a\na/a/b\nc\n"), "l_sp": []byte("a/a/a a/a/b c"), "l2": []byte("missing\n"), + "rsp": []byte("'a/a/a'\na/a/b\n'@'\n'foo'\\''bar'"), + "@ -> c": nil, + "foo'bar -> c": nil, "manifest.txt": fileCustomManifest, }) @@ -246,6 +249,19 @@ func TestZip(t *testing.T) { fh("c", fileC, zip.Deflate), }, }, + { + name: "rsp", + args: fileArgsBuilder(). + RspFile("rsp"), + compressionLevel: 9, + + files: []zip.FileHeader{ + fh("a/a/a", fileA, zip.Deflate), + fh("a/a/b", fileB, zip.Deflate), + fh("@", fileC, zip.Deflate), + fh("foo'bar", fileC, zip.Deflate), + }, + }, { name: "prefix in zip", args: fileArgsBuilder(). @@ -568,6 +584,11 @@ func TestReadRespFile(t *testing.T) { in: `./cmd "\""-C`, out: []string{"./cmd", `"-C`}, }, + { + name: "ninja rsp file", + in: "'a'\nb\n'@'\n'foo'\\''bar'\n'foo\"bar'", + out: []string{"a", "b", "@", "foo'bar", `foo"bar`}, + }, } for _, testCase := range testCases {