2617316f6c
If the cflags are identical, and there aren't extra sources in the static version of a cc_library, then we can re-use the static library in the build of the shared library. Change-Id: I54c59aa3edcc47bc777132461b8e6a84cef0587e
227 lines
5.4 KiB
Go
227 lines
5.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"strings"
|
|
"testing"
|
|
"unicode"
|
|
|
|
bpparser "github.com/google/blueprint/parser"
|
|
)
|
|
|
|
var valueTestCases = []struct {
|
|
blueprint string
|
|
expected string
|
|
}{
|
|
{
|
|
blueprint: `test = false`,
|
|
expected: `false`,
|
|
},
|
|
{
|
|
blueprint: `test = "string"`,
|
|
expected: `string`,
|
|
},
|
|
{
|
|
blueprint: `test = ["a", "b"]`,
|
|
expected: `\
|
|
a \
|
|
b
|
|
`,
|
|
},
|
|
}
|
|
|
|
func TestValueToString(t *testing.T) {
|
|
for _, testCase := range valueTestCases {
|
|
blueprint, errs := bpparser.Parse("", strings.NewReader(testCase.blueprint), nil)
|
|
if len(errs) > 0 {
|
|
t.Errorf("Failed to read blueprint: %q", errs)
|
|
}
|
|
|
|
str, err := valueToString(blueprint.Defs[0].(*bpparser.Assignment).Value)
|
|
if err != nil {
|
|
t.Error(err.Error())
|
|
}
|
|
expect(t, testCase.blueprint, testCase.expected, str)
|
|
}
|
|
}
|
|
|
|
var moduleTestCases = []struct {
|
|
blueprint string
|
|
androidmk string
|
|
}{
|
|
// Target-only
|
|
{
|
|
blueprint: `cc_library_shared { name: "test", }`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_SHARED_LIBRARY)`,
|
|
},
|
|
// Host-only
|
|
{
|
|
blueprint: `cc_library_host_shared { name: "test", }`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_HOST_SHARED_LIBRARY)`,
|
|
},
|
|
// Target and Host
|
|
{
|
|
blueprint: `cc_library_shared { name: "test", host_supported: true, }`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_HOST_SHARED_LIBRARY)`,
|
|
},
|
|
// Static and Shared
|
|
{
|
|
blueprint: `cc_library { name: "test", srcs: ["a"], }`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_WHOLE_STATIC_LIBRARIES := \
|
|
test
|
|
include $(BUILD_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_SRC_FILES := \
|
|
a
|
|
include $(BUILD_STATIC_LIBRARY)`,
|
|
},
|
|
// Static and Shared / Target and Host
|
|
{
|
|
blueprint: `cc_library { name: "test", host_supported: true, }`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_WHOLE_STATIC_LIBRARIES := \
|
|
test
|
|
include $(BUILD_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_STATIC_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_WHOLE_STATIC_LIBRARIES := \
|
|
test
|
|
include $(BUILD_HOST_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
include $(BUILD_HOST_STATIC_LIBRARY)`,
|
|
},
|
|
// Static and Shared properties
|
|
{
|
|
blueprint: `cc_library {
|
|
name: "test",
|
|
srcs: ["a"],
|
|
static: { srcs: ["c"], static_libs: ["l"], },
|
|
shared: { srcs: ["b"], },
|
|
multilib: { lib32: { shared: { cflags: ["f"], }, }, },
|
|
}`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_SRC_FILES := \
|
|
a \
|
|
b
|
|
LOCAL_CFLAGS_32 := \
|
|
f
|
|
include $(BUILD_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_SRC_FILES := \
|
|
a \
|
|
c
|
|
LOCAL_STATIC_LIBRARIES := \
|
|
l
|
|
include $(BUILD_STATIC_LIBRARY)`,
|
|
},
|
|
// Static and Shared properties, use whole static lib, but add extra shared srcs
|
|
{
|
|
blueprint: `cc_library {
|
|
name: "test",
|
|
srcs: ["a"],
|
|
shared: { srcs: ["b"], },
|
|
}`,
|
|
androidmk: `include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_WHOLE_STATIC_LIBRARIES := \
|
|
test
|
|
LOCAL_SRC_FILES := \
|
|
b
|
|
include $(BUILD_SHARED_LIBRARY)
|
|
|
|
include $(CLEAR_VARS)
|
|
LOCAL_MODULE := test
|
|
LOCAL_SRC_FILES := \
|
|
a
|
|
include $(BUILD_STATIC_LIBRARY)`,
|
|
},
|
|
// Manual translation
|
|
{
|
|
blueprint: `/* Android.mk:start
|
|
# Manual translation
|
|
Android.mk:end */
|
|
cc_library { name: "test", host_supported: true, }`,
|
|
androidmk: `# Manual translation`,
|
|
},
|
|
// Ignored translation
|
|
{
|
|
blueprint: `/* Android.mk:ignore */
|
|
cc_library { name: "test", host_supported: true, }`,
|
|
androidmk: ``,
|
|
},
|
|
}
|
|
|
|
func TestModules(t *testing.T) {
|
|
for _, testCase := range moduleTestCases {
|
|
blueprint, errs := bpparser.Parse("", strings.NewReader(testCase.blueprint), nil)
|
|
if len(errs) > 0 {
|
|
t.Errorf("Failed to read blueprint: %q", errs)
|
|
}
|
|
|
|
buf := &bytes.Buffer{}
|
|
writer := &androidMkWriter{
|
|
blueprint: blueprint,
|
|
path: "",
|
|
Writer: buf,
|
|
}
|
|
|
|
module := blueprint.Defs[0].(*bpparser.Module)
|
|
err := writer.handleModule(module)
|
|
if err != nil {
|
|
t.Errorf("Unexpected error %s", err.Error())
|
|
}
|
|
|
|
expect(t, testCase.blueprint, testCase.androidmk, buf.String())
|
|
}
|
|
}
|
|
|
|
// Trim left whitespace, and any trailing newlines. Leave inner blank lines and
|
|
// right whitespace so that we can still check line continuations are correct
|
|
func trim(str string) string {
|
|
var list []string
|
|
for _, s := range strings.Split(str, "\n") {
|
|
list = append(list, strings.TrimLeftFunc(s, unicode.IsSpace))
|
|
}
|
|
return strings.TrimRight(strings.Join(list, "\n"), "\n")
|
|
}
|
|
|
|
func expect(t *testing.T, testCase string, expected string, out string) {
|
|
expected = trim(expected)
|
|
out = trim(out)
|
|
if expected != out {
|
|
sep := " "
|
|
if strings.Index(expected, "\n") != -1 || strings.Index(out, "\n") != -1 {
|
|
sep = "\n"
|
|
}
|
|
|
|
t.Errorf("test case: %s", testCase)
|
|
t.Errorf("unexpected difference:")
|
|
t.Errorf(" expected:%s%s", sep, expected)
|
|
t.Errorf(" got:%s%s", sep, out)
|
|
}
|
|
}
|