aboutsummaryrefslogtreecommitdiffstats
path: root/androidmk
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2015-04-03 16:51:45 -0700
committerColin Cross <ccross@android.com>2015-04-03 16:51:45 -0700
commit16daa921e3510d6ba3c6d9dc8a9aea7ebc5ceba8 (patch)
tree68c40a9f42b5e404af77ad128516168cd31eabfb /androidmk
parent2fe6687847a137c6897b19afefa187a38a2a8b6e (diff)
downloadbuild_soong-16daa921e3510d6ba3c6d9dc8a9aea7ebc5ceba8.tar.gz
build_soong-16daa921e3510d6ba3c6d9dc8a9aea7ebc5ceba8.tar.bz2
build_soong-16daa921e3510d6ba3c6d9dc8a9aea7ebc5ceba8.zip
androidmk: support translating all-java-files-under
Change-Id: I4c343f6d8d23d42dddc256ff022016b595bb3841
Diffstat (limited to 'androidmk')
-rw-r--r--androidmk/cmd/androidmk/android.go12
-rw-r--r--androidmk/cmd/androidmk/androidmk.go4
-rw-r--r--androidmk/cmd/androidmk/values.go65
-rw-r--r--androidmk/parser/scope.go13
4 files changed, 62 insertions, 32 deletions
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go
index 9de0197f..cba51244 100644
--- a/androidmk/cmd/androidmk/android.go
+++ b/androidmk/cmd/androidmk/android.go
@@ -2,6 +2,8 @@ package main
import (
"android/soong/androidmk/parser"
+ "fmt"
+ "strings"
)
const (
@@ -103,6 +105,15 @@ func mydir(args []string) string {
return "."
}
+func allJavaFilesUnder(args []string) string {
+ dir := ""
+ if len(args) > 0 {
+ dir = strings.TrimSpace(args[0])
+ }
+
+ return fmt.Sprintf("%s/**/*.java", dir)
+}
+
var moduleTypes = map[string]string{
"BUILD_SHARED_LIBRARY": "cc_library_shared",
"BUILD_STATIC_LIBRARY": "cc_library_static",
@@ -127,6 +138,7 @@ func androidScope() parser.Scope {
globalScope := parser.NewScope(nil)
globalScope.Set("CLEAR_VARS", clear_vars)
globalScope.SetFunc("my-dir", mydir)
+ globalScope.SetFunc("all-java-files-under", allJavaFilesUnder)
for k, v := range moduleTypes {
globalScope.Set(k, v)
diff --git a/androidmk/cmd/androidmk/androidmk.go b/androidmk/cmd/androidmk/androidmk.go
index 8ac58bfd..178ce093 100644
--- a/androidmk/cmd/androidmk/androidmk.go
+++ b/androidmk/cmd/androidmk/androidmk.go
@@ -343,9 +343,9 @@ func setVariable(file *bpFile, val *mkparser.MakeString, plusequals bool, name s
var err error
switch typ {
case bpparser.List:
- exp, err = makeToListExpression(val)
+ exp, err = makeToListExpression(val, file.scope)
case bpparser.String:
- exp, err = makeToStringExpression(val)
+ exp, err = makeToStringExpression(val, file.scope)
case bpparser.Bool:
exp, err = makeToBoolExpression(val)
default:
diff --git a/androidmk/cmd/androidmk/values.go b/androidmk/cmd/androidmk/values.go
index 927c44a7..ce2f2796 100644
--- a/androidmk/cmd/androidmk/values.go
+++ b/androidmk/cmd/androidmk/values.go
@@ -17,6 +17,10 @@ func stringToStringValue(s string) *bpparser.Value {
}
func addValues(val1, val2 *bpparser.Value) (*bpparser.Value, error) {
+ if val1 == nil {
+ return val2, nil
+ }
+
if val1.Type == bpparser.String && val2.Type == bpparser.List {
val1 = &bpparser.Value{
Type: bpparser.List,
@@ -40,7 +44,7 @@ func addValues(val1, val2 *bpparser.Value) (*bpparser.Value, error) {
}, nil
}
-func makeToStringExpression(ms *mkparser.MakeString) (*bpparser.Value, error) {
+func makeToStringExpression(ms *mkparser.MakeString, scope mkparser.Scope) (*bpparser.Value, error) {
var val *bpparser.Value
var err error
@@ -49,22 +53,22 @@ func makeToStringExpression(ms *mkparser.MakeString) (*bpparser.Value, error) {
}
for i, s := range ms.Strings[1:] {
- name := ms.Variables[i].Name
- if !name.Const() {
- return nil, fmt.Errorf("Unsupported non-const variable name %s", name.Dump())
- }
- tmp := &bpparser.Value{
- Type: bpparser.String,
- Variable: name.Value(nil),
- }
+ if ret, ok := ms.Variables[i].EvalFunction(scope); ok {
+ val, err = addValues(val, stringToStringValue(ret))
+ } else {
+ name := ms.Variables[i].Name
+ if !name.Const() {
+ return nil, fmt.Errorf("Unsupported non-const variable name %s", name.Dump())
+ }
+ tmp := &bpparser.Value{
+ Type: bpparser.String,
+ Variable: name.Value(nil),
+ }
- if val != nil {
val, err = addValues(val, tmp)
if err != nil {
return nil, err
}
- } else {
- val = tmp
}
if s != "" {
@@ -95,7 +99,7 @@ func stringToListValue(s string) *bpparser.Value {
}
-func makeToListExpression(ms *mkparser.MakeString) (*bpparser.Value, error) {
+func makeToListExpression(ms *mkparser.MakeString, scope mkparser.Scope) (*bpparser.Value, error) {
fields := ms.Split(" \t")
var listOfListValues []*bpparser.Value
@@ -106,22 +110,29 @@ func makeToListExpression(ms *mkparser.MakeString) (*bpparser.Value, error) {
for _, f := range fields {
if len(f.Variables) == 1 && f.Strings[0] == "" && f.Strings[1] == "" {
- // Variable by itself, variable is probably a list
- if !f.Variables[0].Name.Const() {
- return nil, fmt.Errorf("unsupported non-const variable name")
- }
- if len(listValue.ListValue) > 0 {
- listOfListValues = append(listOfListValues, listValue)
- }
- listOfListValues = append(listOfListValues, &bpparser.Value{
- Type: bpparser.List,
- Variable: f.Variables[0].Name.Value(nil),
- })
- listValue = &bpparser.Value{
- Type: bpparser.List,
+ if ret, ok := f.Variables[0].EvalFunction(scope); ok {
+ listValue.ListValue = append(listValue.ListValue, bpparser.Value{
+ Type: bpparser.String,
+ StringValue: ret,
+ })
+ } else {
+ // Variable by itself, variable is probably a list
+ if !f.Variables[0].Name.Const() {
+ return nil, fmt.Errorf("unsupported non-const variable name")
+ }
+ if len(listValue.ListValue) > 0 {
+ listOfListValues = append(listOfListValues, listValue)
+ }
+ listOfListValues = append(listOfListValues, &bpparser.Value{
+ Type: bpparser.List,
+ Variable: f.Variables[0].Name.Value(nil),
+ })
+ listValue = &bpparser.Value{
+ Type: bpparser.List,
+ }
}
} else {
- s, err := makeToStringExpression(f)
+ s, err := makeToStringExpression(f, scope)
if err != nil {
return nil, err
}
diff --git a/androidmk/parser/scope.go b/androidmk/parser/scope.go
index 742ad388..5e94ea58 100644
--- a/androidmk/parser/scope.go
+++ b/androidmk/parser/scope.go
@@ -58,7 +58,7 @@ func init() {
builtinScope["__builtin_dollar"] = "$"
}
-func (v Variable) Value(scope Scope) string {
+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)
@@ -70,13 +70,20 @@ func (v Variable) Value(scope Scope) string {
}
if fname == "call" {
- return scope.Call(argVals[0], argVals[1:])
+ return scope.Call(argVals[0], argVals[1:]), true
} else {
- return "__builtin_func:" + fname + " " + strings.Join(argVals, " ")
+ return "__builtin_func:" + fname + " " + strings.Join(argVals, " "), true
}
}
}
+ return "", false
+}
+
+func (v Variable) Value(scope Scope) string {
+ if ret, ok := v.EvalFunction(scope); ok {
+ return ret
+ }
return scope.Get(v.Name.Value(scope))
}