Handle multi dir all-*-files-under function calls.

This change fixes a bug where androidmk assumes all-*-files-under
function only takes one directory parameter.

Test: androidmk_text.go, manual execution
Change-Id: Ib1614a2ddde7ea1120c1c37126231988f4862165
This commit is contained in:
Jaewoong Jung
2019-01-07 15:29:01 -08:00
committed by Dan Willemsen
parent 06af80e3a4
commit acb529b038
4 changed files with 53 additions and 26 deletions

View File

@@ -739,27 +739,31 @@ var conditionalTranslations = map[string]map[bool]string{
true: "product_variables.pdk"}, true: "product_variables.pdk"},
} }
func mydir(args []string) string { func mydir(args []string) []string {
return "." return []string{"."}
} }
func allFilesUnder(wildcard string) func(args []string) string { func allFilesUnder(wildcard string) func(args []string) []string {
return func(args []string) string { return func(args []string) []string {
dir := "" dirs := []string{""}
if len(args) > 0 { if len(args) > 0 {
dir = strings.TrimSpace(args[0]) dirs = strings.Fields(args[0])
} }
return fmt.Sprintf("%s/**/"+wildcard, dir) paths := make([]string, len(dirs))
for i := range paths {
paths[i] = fmt.Sprintf("%s/**/"+wildcard, dirs[i])
}
return paths
} }
} }
func allSubdirJavaFiles(args []string) string { func allSubdirJavaFiles(args []string) []string {
return "**/*.java" return []string{"**/*.java"}
} }
func includeIgnored(args []string) string { func includeIgnored(args []string) []string {
return include_ignored return []string{include_ignored}
} }
var moduleTypes = map[string]string{ var moduleTypes = map[string]string{

View File

@@ -554,6 +554,10 @@ include $(call all-makefiles-under,$(LOCAL_PATH))
LOCAL_SRC_FILES := d.java LOCAL_SRC_FILES := d.java
LOCAL_UNINSTALLABLE_MODULE := false LOCAL_UNINSTALLABLE_MODULE := false
include $(BUILD_JAVA_LIBRARY) include $(BUILD_JAVA_LIBRARY)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-java-files-under, src gen)
include $(BUILD_STATIC_JAVA_LIBRARY)
`, `,
expected: ` expected: `
java_library { java_library {
@@ -574,6 +578,13 @@ include $(call all-makefiles-under,$(LOCAL_PATH))
installable: true, installable: true,
srcs: ["d.java"], srcs: ["d.java"],
} }
java_library {
srcs: [
"src/**/*.java",
"gen/**/*.java",
],
}
`, `,
}, },
{ {

View File

@@ -29,6 +29,14 @@ func stringToStringValue(s string) bpparser.Expression {
} }
} }
func stringListToStringValueList(list []string) []bpparser.Expression {
valList := make([]bpparser.Expression, len(list))
for i, l := range list {
valList[i] = stringToStringValue(l)
}
return valList
}
func addValues(val1, val2 bpparser.Expression) (bpparser.Expression, error) { func addValues(val1, val2 bpparser.Expression) (bpparser.Expression, error) {
if val1 == nil { if val1 == nil {
return val2, nil return val2, nil
@@ -63,7 +71,10 @@ func makeToStringExpression(ms *mkparser.MakeString, scope mkparser.Scope) (bppa
for i, s := range ms.Strings[1:] { for i, s := range ms.Strings[1:] {
if ret, ok := ms.Variables[i].EvalFunction(scope); ok { if ret, ok := ms.Variables[i].EvalFunction(scope); ok {
val, err = addValues(val, stringToStringValue(ret)) if len(ret) > 1 {
return nil, fmt.Errorf("Unexpected list value %s", ms.Dump())
}
val, err = addValues(val, stringToStringValue(ret[0]))
} else { } else {
name := ms.Variables[i].Name name := ms.Variables[i].Name
if !name.Const() { if !name.Const() {
@@ -125,9 +136,7 @@ func makeToListExpression(ms *mkparser.MakeString, scope mkparser.Scope) (bppars
for _, f := range fields { for _, f := range fields {
if len(f.Variables) == 1 && f.Strings[0] == "" && f.Strings[1] == "" { if len(f.Variables) == 1 && f.Strings[0] == "" && f.Strings[1] == "" {
if ret, ok := f.Variables[0].EvalFunction(scope); ok { if ret, ok := f.Variables[0].EvalFunction(scope); ok {
listValue.Values = append(listValue.Values, &bpparser.String{ listValue.Values = append(listValue.Values, stringListToStringValueList(ret)...)
Value: ret,
})
} else { } else {
// Variable by itself, variable is probably a list // Variable by itself, variable is probably a list
if !f.Variables[0].Name.Const() { if !f.Variables[0].Name.Const() {

View File

@@ -21,13 +21,13 @@ import (
type Scope interface { type Scope interface {
Get(name string) string Get(name string) string
Set(name, value string) Set(name, value string)
Call(name string, args []string) string Call(name string, args []string) []string
SetFunc(name string, f func([]string) string) SetFunc(name string, f func([]string) []string)
} }
type scope struct { type scope struct {
variables map[string]string variables map[string]string
functions map[string]func([]string) string functions map[string]func([]string) []string
parent Scope parent Scope
} }
@@ -47,22 +47,22 @@ func (s *scope) Set(name, value string) {
s.variables[name] = value s.variables[name] = value
} }
func (s *scope) Call(name string, args []string) string { func (s *scope) Call(name string, args []string) []string {
if f, ok := s.functions[name]; ok { if f, ok := s.functions[name]; ok {
return f(args) return f(args)
} }
return "<func:'" + name + "' unset>" return []string{"<func:'" + name + "' unset>"}
} }
func (s *scope) SetFunc(name string, f func([]string) string) { func (s *scope) SetFunc(name string, f func([]string) []string) {
s.functions[name] = f s.functions[name] = f
} }
func NewScope(parent Scope) Scope { func NewScope(parent Scope) Scope {
return &scope{ return &scope{
variables: make(map[string]string), variables: make(map[string]string),
functions: make(map[string]func([]string) string), functions: make(map[string]func([]string) []string),
parent: parent, parent: parent,
} }
} }
@@ -74,7 +74,7 @@ func init() {
builtinScope[builtinDollar] = "$" builtinScope[builtinDollar] = "$"
} }
func (v Variable) EvalFunction(scope Scope) (string, bool) { func (v Variable) EvalFunction(scope Scope) ([]string, bool) {
f := v.Name.SplitN(" \t", 2) f := v.Name.SplitN(" \t", 2)
if len(f) > 1 && f[0].Const() { if len(f) > 1 && f[0].Const() {
fname := f[0].Value(nil) fname := f[0].Value(nil)
@@ -88,17 +88,20 @@ func (v Variable) EvalFunction(scope Scope) (string, bool) {
if fname == "call" { if fname == "call" {
return scope.Call(argVals[0], argVals[1:]), true return scope.Call(argVals[0], argVals[1:]), true
} else { } else {
return "__builtin_func:" + fname + " " + strings.Join(argVals, " "), true return []string{"__builtin_func:" + fname + " " + strings.Join(argVals, " ")}, true
} }
} }
} }
return "", false return []string{""}, false
} }
func (v Variable) Value(scope Scope) string { func (v Variable) Value(scope Scope) string {
if ret, ok := v.EvalFunction(scope); ok { if ret, ok := v.EvalFunction(scope); ok {
return ret if len(ret) > 1 {
panic("Expected a single value, but instead got a list")
}
return ret[0]
} }
if scope == nil { if scope == nil {
panic("Cannot take the value of a variable in a nil scope") panic("Cannot take the value of a variable in a nil scope")