diff options
author | Sasha Smundak <asmundak@google.com> | 2019-01-22 10:33:49 -0800 |
---|---|---|
committer | Sasha Smundak <asmundak@google.com> | 2019-01-24 18:46:31 -0800 |
commit | 70547643040729f54a9535cc3fefc350f1af3a2a (patch) | |
tree | 5db5c80512f55887af921f67545632aa3e1fe975 /androidmk | |
parent | 2f4789d6128d2c773e3a968e8d6fb7ec4e19e838 (diff) | |
download | build_soong-70547643040729f54a9535cc3fefc350f1af3a2a.tar.gz build_soong-70547643040729f54a9535cc3fefc350f1af3a2a.tar.bz2 build_soong-70547643040729f54a9535cc3fefc350f1af3a2a.zip |
Convert BUILD_PREBUILT with LOCAL_MODULE_CLASS=ETC to prebuilt_etc
The conversion is a two-step process: first, when processing
BUILT_PREBUILT, convert LOCAL_SOURCE_PATH to a variable reference+fixed
subpath path in the blueprint AST. Then, set various boolean flags
depending on variable being referenced. androidmk_test.go has a test for
each handled case.
Change-Id: Iabd18d5f8645ca7077536863cd6640df5b24d24a
Fixes: 122906526
Test: treehugger
Diffstat (limited to 'androidmk')
-rw-r--r-- | androidmk/cmd/androidmk/android.go | 52 | ||||
-rw-r--r-- | androidmk/cmd/androidmk/androidmk_test.go | 204 |
2 files changed, 255 insertions, 1 deletions
diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index e7f2531d..aef8944d 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -56,6 +56,7 @@ var rewriteProperties = map[string](func(variableAssignmentContext) error){ "LOCAL_CFLAGS": cflags, "LOCAL_UNINSTALLABLE_MODULE": invert("installable"), "LOCAL_PROGUARD_ENABLED": proguardEnabled, + "LOCAL_MODULE_PATH": prebuiltModulePath, // composite functions "LOCAL_MODULE_TAGS": includeVariableIf(bpVariable{"tags", bpparser.ListType}, not(valueDumpEquals("optional"))), @@ -519,6 +520,55 @@ func prebuiltClass(ctx variableAssignmentContext) error { return nil } +func makeBlueprintStringAssignment(file *bpFile, prefix string, suffix string, value string) error { + val, err := makeVariableToBlueprint(file, mkparser.SimpleMakeString(value, mkparser.NoPos), bpparser.StringType) + if err == nil { + err = setVariable(file, false, prefix, suffix, val, true) + } + return err +} + +// If variable is a literal variable name, return the name, otherwise return "" +func varLiteralName(variable mkparser.Variable) string { + if len(variable.Name.Variables) == 0 { + return variable.Name.Strings[0] + } + return "" +} + +func prebuiltModulePath(ctx variableAssignmentContext) error { + // Cannot handle appending + if ctx.append { + return fmt.Errorf("Cannot handle appending to LOCAL_MODULE_PATH") + } + // Analyze value in order to set the correct values for the 'device_specific', + // 'product_specific', 'product_services_specific' 'vendor'/'soc_specific', + // 'product_services_specific' attribute. Two cases are allowed: + // $(VAR)/<literal-value> + // $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)/<literal-value> + // The last case is equivalent to $(TARGET_OUT_VENDOR)/<literal-value> + // Map the variable name if present to `local_module_path_var` + // Map literal-path to local_module_path_fixed + varname := "" + fixed := "" + val := ctx.mkvalue + if len(val.Variables) == 1 && varLiteralName(val.Variables[0]) != "" && len(val.Strings) == 2 && val.Strings[0] == "" { + fixed = val.Strings[1] + varname = val.Variables[0].Name.Strings[0] + } else if len(val.Variables) == 2 && varLiteralName(val.Variables[0]) == "PRODUCT_OUT" && varLiteralName(val.Variables[1]) == "TARGET_COPY_OUT_VENDOR" && + len(val.Strings) == 3 && val.Strings[0] == "" && val.Strings[1] == "/" { + fixed = val.Strings[2] + varname = "TARGET_OUT_VENDOR" + } else { + return fmt.Errorf("LOCAL_MODULE_PATH value should start with $(<some-varaible>)/ or $(PRODUCT_OUT)/$(TARGET_COPY_VENDOR)/") + } + err := makeBlueprintStringAssignment(ctx.file, "local_module_path", "var", varname) + if err == nil && fixed != "" { + err = makeBlueprintStringAssignment(ctx.file, "local_module_path", "fixed", fixed) + } + return err +} + func ldflags(ctx variableAssignmentContext) error { val, err := makeVariableToBlueprint(ctx.file, ctx.mkvalue, bpparser.ListType) if err != nil { @@ -816,6 +866,7 @@ var prebuiltTypes = map[string]string{ "STATIC_LIBRARIES": "cc_prebuilt_library_static", "EXECUTABLES": "cc_prebuilt_binary", "JAVA_LIBRARIES": "java_import", + "ETC": "prebuilt_etc", } var soongModuleTypes = map[string]bool{} @@ -834,7 +885,6 @@ func androidScope() mkparser.Scope { globalScope.SetFunc("first-makefiles-under", includeIgnored) globalScope.SetFunc("all-named-subdir-makefiles", includeIgnored) globalScope.SetFunc("all-subdir-makefiles", includeIgnored) - for k, v := range moduleTypes { globalScope.Set(k, v) soongModuleTypes[v] = true diff --git a/androidmk/cmd/androidmk/androidmk_test.go b/androidmk/cmd/androidmk/androidmk_test.go index 5fbe62a0..52b8476a 100644 --- a/androidmk/cmd/androidmk/androidmk_test.go +++ b/androidmk/cmd/androidmk/androidmk_test.go @@ -824,6 +824,210 @@ java_library { } `, }, + { + desc: "prebuilt_etc_TARGET_OUT_ETC", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_SRC_FILES := mymod +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + src: "mymod", + sub_dir: "foo/bar", + +} +`, + }, + + { + desc: "prebuilt_etc_PRODUCT_OUT/system/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/etc/foo/bar +LOCAL_SRC_FILES := $(LOCAL_MODULE) +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + + src: "etc.test1", + sub_dir: "foo/bar", + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_ODM/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_ODM)/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + device_specific: true, + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_PRODUCT/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT)/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + product_specific: true, + + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_PRODUCT_ETC", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_ETC)/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + product_specific: true, + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_PRODUCT_SERVICES/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_SERVICES)/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + product_services_specific: true, + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_PRODUCT_SERVICES_ETC", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_PRODUCT_SERVICES_ETC)/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + product_services_specific: true, + + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_VENDOR/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + proprietary: true, + +} +`, + }, + { + desc: "prebuilt_etc_PRODUCT_OUT/TARGET_COPY_OUT_VENDOR/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR)/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + proprietary: true, + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_OUT_VENDOR_ETC", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_ETC)/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + proprietary: true, + +} +`, + }, + { + desc: "prebuilt_etc_TARGET_RECOVERY_ROOT_OUT/system/etc", + in: ` +include $(CLEAR_VARS) +LOCAL_MODULE := etc.test1 +LOCAL_MODULE_CLASS := ETC +LOCAL_MODULE_PATH := $(TARGET_RECOVERY_ROOT_OUT)/system/etc/foo/bar +include $(BUILD_PREBUILT) +`, + expected: ` +prebuilt_etc { + name: "etc.test1", + sub_dir: "foo/bar", + recovery: true, + +} +`, + }, } func TestEndToEnd(t *testing.T) { |