Add Respfile support for soong_zip.
Sometime the size of our command line passed to soong_zip go program
exceeds the cmdline size limit. So add an RespFile support with "@" special
character prefix.
The args in the cmdline will be considered together with the
args in RespFile during soong_zip running.
Test: real tests in my local machine, and compare the
res/libphonenumber.jar before and after changes.
./cmd -o test.zip '""'-C -> [./cmd,-o,test.zip,""-C]
./cmd -o test.zip '-C -f -> [./cmd,-o,test.zip,-C -f]
./cmd -o test.zip '\"'-C -f -> [./cmd,-o,test.zip,\"-C -f]
./cmd -o test.zip '\\'-C -f -> [./cmd,-o,test.zip,\\-C -f]
./cmd -o test.zip '\a'-C -f -> [./cmd,-o,test.zip,\a-C -f]
./cmd -o test.zip \'-C -> [./cmd,-o,test.zip,'-C]
./cmd -o test.zip \\-C -> [./cmd,-o,test.zip,\-C]
./cmd -o test.zip \"-C -> [./cmd,-o,test.zip,"-C]
./cmd -o test.zip "'"-C -> [./cmd,-o,test.zip,'-C]
./cmd -o test.zip "\\"-C -f -> [./cmd,-o,test.zip,\a-C -f]
./cmd -o test.zip "\""-C -f -> [./cmd,-o,test.zip,"a-C -f]
Bug: b/72484223
Change-Id: I83c3630b70c8396c8e8a3f266244d868d754c4e8
diff --git a/zip/cmd/main.go b/zip/cmd/main.go
index c0418f7..60017aa 100644
--- a/zip/cmd/main.go
+++ b/zip/cmd/main.go
@@ -120,30 +120,12 @@
}
var (
- out = flag.String("o", "", "file to write zip file to")
- manifest = flag.String("m", "", "input jar manifest file name")
- directories = flag.Bool("d", false, "include directories in zip")
- rootPrefix = flag.String("P", "", "path prefix within the zip at which to place files")
- relativeRoot = flag.String("C", "", "path to use as relative root of files in following -f, -l, or -D arguments")
- parallelJobs = flag.Int("j", runtime.NumCPU(), "number of parallel threads to use")
- compLevel = flag.Int("L", 5, "deflate compression level (0-9)")
- emulateJar = flag.Bool("jar", false, "modify the resultant .zip to emulate the output of 'jar'")
- writeIfChanged = flag.Bool("write_if_changed", false, "only update resultant .zip if it has changed")
+ rootPrefix, relativeRoot *string
fArgs zip.FileArgs
nonDeflatedFiles = make(uniqueSet)
-
- cpuProfile = flag.String("cpuprofile", "", "write cpu profile to file")
- traceFile = flag.String("trace", "", "write trace to file")
)
-func init() {
- flag.Var(&listFiles{}, "l", "file containing list of .class files")
- flag.Var(&dir{}, "D", "directory to include in zip")
- flag.Var(&file{}, "f", "file to include in zip")
- flag.Var(&nonDeflatedFiles, "s", "file path to be stored within the zip without compression")
-}
-
func usage() {
fmt.Fprintf(os.Stderr, "usage: zip -o zipfile [-m manifest] -C dir [-f|-l file]...\n")
flag.PrintDefaults()
@@ -151,7 +133,42 @@
}
func main() {
- flag.Parse()
+ var expandedArgs []string
+ for _, arg := range os.Args {
+ if strings.HasPrefix(arg, "@") {
+ bytes, err := ioutil.ReadFile(strings.TrimPrefix(arg, "@"))
+ if err != nil {
+ fmt.Fprintln(os.Stderr, err.Error())
+ os.Exit(1)
+ }
+ respArgs := zip.ReadRespFile(bytes)
+ expandedArgs = append(expandedArgs, respArgs...)
+ } else {
+ expandedArgs = append(expandedArgs, arg)
+ }
+ }
+
+ flags := flag.NewFlagSet("flags", flag.ExitOnError)
+
+ out := flags.String("o", "", "file to write zip file to")
+ manifest := flags.String("m", "", "input jar manifest file name")
+ directories := flags.Bool("d", false, "include directories in zip")
+ rootPrefix = flags.String("P", "", "path prefix within the zip at which to place files")
+ relativeRoot = flags.String("C", "", "path to use as relative root of files in following -f, -l, or -D arguments")
+ parallelJobs := flags.Int("j", runtime.NumCPU(), "number of parallel threads to use")
+ compLevel := flags.Int("L", 5, "deflate compression level (0-9)")
+ emulateJar := flags.Bool("jar", false, "modify the resultant .zip to emulate the output of 'jar'")
+ writeIfChanged := flags.Bool("write_if_changed", false, "only update resultant .zip if it has changed")
+
+ cpuProfile := flags.String("cpuprofile", "", "write cpu profile to file")
+ traceFile := flags.String("trace", "", "write trace to file")
+
+ flags.Var(&listFiles{}, "l", "file containing list of .class files")
+ 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")
+
+ flags.Parse(expandedArgs[1:])
err := zip.Run(zip.ZipArgs{
FileArgs: fArgs,