diff options
author | Jaewoong Jung <jungjw@google.com> | 2019-01-07 15:29:01 -0800 |
---|---|---|
committer | Dan Willemsen <dwillemsen@google.com> | 2019-01-09 00:07:01 +0000 |
commit | acb529b03859577c6d07797cba1b247e38e1c4f9 (patch) | |
tree | 455ebd2ffdbd8a1a856d43621b55e45fe8e8fea2 /androidmk | |
parent | 06af80e3a476f5f0816b14b5511a393daf4f4459 (diff) | |
download | build_soong-acb529b03859577c6d07797cba1b247e38e1c4f9.tar.gz build_soong-acb529b03859577c6d07797cba1b247e38e1c4f9.tar.bz2 build_soong-acb529b03859577c6d07797cba1b247e38e1c4f9.zip |
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
Diffstat (limited to 'androidmk')
-rw-r--r-- | androidmk/cmd/androidmk/android.go | 26 | ||||
-rw-r--r-- | androidmk/cmd/androidmk/androidmk_test.go | 11 | ||||
-rw-r--r-- | androidmk/cmd/androidmk/values.go | 17 | ||||
-rw-r--r-- | androidmk/parser/scope.go | 25 |
4 files changed, 53 insertions, 26 deletions
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index db88685d..d16ac934 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -739,27 +739,31 @@ var conditionalTranslations = map[string]map[bool]string{ true: "product_variables.pdk"}, } -func mydir(args []string) string { - return "." +func mydir(args []string) []string { + return []string{"."} } -func allFilesUnder(wildcard string) func(args []string) string { - return func(args []string) string { - dir := "" +func allFilesUnder(wildcard string) func(args []string) []string { + return func(args []string) []string { + dirs := []string{""} 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 { - return "**/*.java" +func allSubdirJavaFiles(args []string) []string { + return []string{"**/*.java"} } -func includeIgnored(args []string) string { - return include_ignored +func includeIgnored(args []string) []string { + return []string{include_ignored} } var moduleTypes = map[string]string{ diff --git a/androidmk/cmd/androidmk/androidmk_test.go b/androidmk/cmd/androidmk/androidmk_test.go index 0f6c5ac7..40fc9f3e 100644 --- a/androidmk/cmd/androidmk/androidmk_test.go +++ b/androidmk/cmd/androidmk/androidmk_test.go @@ -554,6 +554,10 @@ include $(call all-makefiles-under,$(LOCAL_PATH)) LOCAL_SRC_FILES := d.java LOCAL_UNINSTALLABLE_MODULE := false include $(BUILD_JAVA_LIBRARY) + + include $(CLEAR_VARS) + LOCAL_SRC_FILES := $(call all-java-files-under, src gen) + include $(BUILD_STATIC_JAVA_LIBRARY) `, expected: ` java_library { @@ -574,6 +578,13 @@ include $(call all-makefiles-under,$(LOCAL_PATH)) installable: true, srcs: ["d.java"], } + + java_library { + srcs: [ + "src/**/*.java", + "gen/**/*.java", + ], + } `, }, { diff --git a/androidmk/cmd/androidmk/values.go b/androidmk/cmd/androidmk/values.go index d240a01f..90f2e74b 100644 --- a/androidmk/cmd/androidmk/values.go +++ b/androidmk/cmd/androidmk/values.go @@ -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) { if val1 == nil { return val2, nil @@ -63,7 +71,10 @@ func makeToStringExpression(ms *mkparser.MakeString, scope mkparser.Scope) (bppa for i, s := range ms.Strings[1:] { 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 { name := ms.Variables[i].Name if !name.Const() { @@ -125,9 +136,7 @@ func makeToListExpression(ms *mkparser.MakeString, scope mkparser.Scope) (bppars for _, f := range fields { if len(f.Variables) == 1 && f.Strings[0] == "" && f.Strings[1] == "" { if ret, ok := f.Variables[0].EvalFunction(scope); ok { - listValue.Values = append(listValue.Values, &bpparser.String{ - Value: ret, - }) + listValue.Values = append(listValue.Values, stringListToStringValueList(ret)...) } else { // Variable by itself, variable is probably a list if !f.Variables[0].Name.Const() { diff --git a/androidmk/parser/scope.go b/androidmk/parser/scope.go index 167e470b..8111c89e 100644 --- a/androidmk/parser/scope.go +++ b/androidmk/parser/scope.go @@ -21,13 +21,13 @@ import ( type Scope interface { Get(name string) string Set(name, value string) - Call(name string, args []string) string - SetFunc(name string, f func([]string) string) + Call(name string, args []string) []string + SetFunc(name string, f func([]string) []string) } type scope struct { variables map[string]string - functions map[string]func([]string) string + functions map[string]func([]string) []string parent Scope } @@ -47,22 +47,22 @@ func (s *scope) Set(name, value string) { 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 { 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 } func NewScope(parent Scope) Scope { return &scope{ variables: make(map[string]string), - functions: make(map[string]func([]string) string), + functions: make(map[string]func([]string) []string), parent: parent, } } @@ -74,7 +74,7 @@ func init() { builtinScope[builtinDollar] = "$" } -func (v Variable) EvalFunction(scope Scope) (string, bool) { +func (v Variable) EvalFunction(scope Scope) ([]string, bool) { f := v.Name.SplitN(" \t", 2) if len(f) > 1 && f[0].Const() { fname := f[0].Value(nil) @@ -88,17 +88,20 @@ func (v Variable) EvalFunction(scope Scope) (string, bool) { if fname == "call" { return scope.Call(argVals[0], argVals[1:]), true } 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 { 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 { panic("Cannot take the value of a variable in a nil scope") |