Support response file inputs in build_license_metadata

Soong can produce very large lists of dependencies that exceed the
command line length limit when calling build_license_metadata.  Add
support for reading arguments from a response file.

Bug: 207445310
Test: m
Change-Id: I6b68e3a7468e797cfbe53ff5d9da2ec9badb000f
This commit is contained in:
Colin Cross 2021-11-29 13:51:48 -08:00
parent d5e7af9003
commit a8077126e8
2 changed files with 43 additions and 20 deletions

View file

@ -25,5 +25,6 @@ blueprint_go_binary {
"license_metadata_proto",
"golang-protobuf-proto",
"golang-protobuf-encoding-prototext",
"soong-response",
],
}

View file

@ -26,28 +26,12 @@ import (
"google.golang.org/protobuf/proto"
"android/soong/compliance/license_metadata_proto"
"android/soong/response"
)
var (
packageName = flag.String("p", "", "license package name")
moduleType = newMultiString("mt", "module type")
moduleClass = newMultiString("mc", "module class")
kinds = newMultiString("k", "license kinds")
conditions = newMultiString("c", "license conditions")
notices = newMultiString("n", "license notice file")
deps = newMultiString("d", "license metadata file dependency")
sources = newMultiString("s", "source (input) dependency")
built = newMultiString("t", "built targets")
installed = newMultiString("i", "installed targets")
roots = newMultiString("r", "root directory of project")
installedMap = newMultiString("m", "map dependent targets to their installed names")
isContainer = flag.Bool("is_container", false, "preserved dependent target name when given")
outFile = flag.String("o", "", "output file")
)
func newMultiString(name, usage string) *multiString {
func newMultiString(flags *flag.FlagSet, name, usage string) *multiString {
var f multiString
flag.Var(&f, name, usage)
flags.Var(&f, name, usage)
return &f
}
@ -57,7 +41,45 @@ func (ms *multiString) String() string { return strings.Join(*ms, ", ") }
func (ms *multiString) Set(s string) error { *ms = append(*ms, s); return nil }
func main() {
flag.Parse()
var expandedArgs []string
for _, arg := range os.Args[1:] {
if strings.HasPrefix(arg, "@") {
f, err := os.Open(strings.TrimPrefix(arg, "@"))
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
respArgs, err := response.ReadRspFile(f)
f.Close()
if err != nil {
fmt.Fprintln(os.Stderr, err.Error())
os.Exit(1)
}
expandedArgs = append(expandedArgs, respArgs...)
} else {
expandedArgs = append(expandedArgs, arg)
}
}
flags := flag.NewFlagSet("flags", flag.ExitOnError)
packageName := flags.String("p", "", "license package name")
moduleType := newMultiString(flags, "mt", "module type")
kinds := newMultiString(flags, "k", "license kinds")
moduleClass := newMultiString(flags, "mc", "module class")
conditions := newMultiString(flags, "c", "license conditions")
notices := newMultiString(flags, "n", "license notice file")
deps := newMultiString(flags, "d", "license metadata file dependency")
sources := newMultiString(flags, "s", "source (input) dependency")
built := newMultiString(flags, "t", "built targets")
installed := newMultiString(flags, "i", "installed targets")
roots := newMultiString(flags, "r", "root directory of project")
installedMap := newMultiString(flags, "m", "map dependent targets to their installed names")
isContainer := flags.Bool("is_container", false, "preserved dependent target name when given")
outFile := flags.String("o", "", "output file")
flags.Parse(expandedArgs)
metadata := license_metadata_proto.LicenseMetadata{}
metadata.PackageName = proto.String(*packageName)