diff options
author | Patrice Arruda <patricearruda@google.com> | 2019-05-08 10:16:21 -0700 |
---|---|---|
committer | Patrice Arruda <patricearruda@google.com> | 2019-05-10 12:59:37 -0700 |
commit | 77311df787358903a16dbc7c88ce601533142b06 (patch) | |
tree | c3b6b44b0094ab685e0fc6de6bb3535ca236ef67 /bpfix | |
parent | fcf9979aa76bd079c8d5ef5de85f5e2d3292d9db (diff) | |
download | build_soong-77311df787358903a16dbc7c88ce601533142b06.tar.gz build_soong-77311df787358903a16dbc7c88ce601533142b06.tar.bz2 build_soong-77311df787358903a16dbc7c88ce601533142b06.zip |
Soong: Add mk2bp conversion for prebuilt_usr_share.
There are a couple of makefiles that have etc with $(TARGET_OUT)/usr/share
as the local module path. Added the conversion in androidmk for target
and host.
Bug: b/132123818
Test: Wrote and ran unit test cases, did a test conversion on
external/neven/Android.mk makefile.
Change-Id: Iafed89f4cee499f561a1235f8870b1f1329e99bc
Diffstat (limited to 'bpfix')
-rw-r--r-- | bpfix/bpfix/bpfix.go | 86 |
1 files changed, 50 insertions, 36 deletions
diff --git a/bpfix/bpfix/bpfix.go b/bpfix/bpfix/bpfix.go index 706c0ec2..f217da6a 100644 --- a/bpfix/bpfix/bpfix.go +++ b/bpfix/bpfix/bpfix.go @@ -431,14 +431,6 @@ func getStringProperty(prop *parser.Property, fieldName string) string { return "" } -// Create sub_dir: attribute for the given path -func makePrebuiltEtcDestination(mod *parser.Module, path string) { - mod.Properties = append(mod.Properties, &parser.Property{ - Name: "sub_dir", - Value: &parser.String{Value: path}, - }) -} - // Set the value of the given attribute to the error message func indicateAttributeError(mod *parser.Module, attributeName string, format string, a ...interface{}) error { msg := fmt.Sprintf(format, a...) @@ -464,16 +456,52 @@ func resolveLocalModule(mod *parser.Module, val parser.Expression) parser.Expres return val } -// A prefix to strip before setting 'filename' attribute and an array of boolean attributes to set. -type filenamePrefixToFlags struct { +// etcPrebuiltModuleUpdate contains information on updating certain parts of a defined module such as: +// * changing the module type from prebuilt_etc to a different one +// * stripping the prefix of the install path based on the module type +// * appending additional boolean properties to the prebuilt module +type etcPrebuiltModuleUpdate struct { + // The prefix of the install path defined in local_module_path. The prefix is removed from local_module_path + // before setting the 'filename' attribute. prefix string - flags []string + + // There is only one prebuilt module type in makefiles. In Soong, there are multiple versions of + // prebuilts based on local_module_path. By default, it is "prebuilt_etc" if modType is blank. An + // example is if the local_module_path contains $(TARGET_OUT)/usr/share, the module type is + // considered as prebuilt_usr_share. + modType string + + // Additional boolean attributes to be added in the prebuilt module. Each added boolean attribute + // has a value of true. + flags []string +} + +func (f etcPrebuiltModuleUpdate) update(m *parser.Module, path string) bool { + updated := false + if path == f.prefix { + updated = true + } else if trimmedPath := strings.TrimPrefix(path, f.prefix+"/"); trimmedPath != path { + m.Properties = append(m.Properties, &parser.Property{ + Name: "sub_dir", + Value: &parser.String{Value: trimmedPath}, + }) + updated = true + } + if updated { + for _, flag := range f.flags { + m.Properties = append(m.Properties, &parser.Property{Name: flag, Value: &parser.Bool{Value: true, Token: "true"}}) + } + if f.modType != "" { + m.Type = f.modType + } + } + return updated } -var localModulePathRewrite = map[string][]filenamePrefixToFlags{ - "HOST_OUT": {{prefix: "/etc"}}, +var localModuleUpdate = map[string][]etcPrebuiltModuleUpdate{ + "HOST_OUT": {{prefix: "/etc", modType: "prebuilt_etc_host"}, {prefix: "/usr/share", modType: "prebuilt_usr_share_host"}}, "PRODUCT_OUT": {{prefix: "/system/etc"}, {prefix: "/vendor/etc", flags: []string{"proprietary"}}}, - "TARGET_OUT": {{prefix: "/etc"}}, + "TARGET_OUT": {{prefix: "/etc"}, {prefix: "/usr/share", modType: "prebuilt_usr_share"}}, "TARGET_OUT_ETC": {{prefix: ""}}, "TARGET_OUT_PRODUCT": {{prefix: "/etc", flags: []string{"product_specific"}}}, "TARGET_OUT_PRODUCT_ETC": {{prefix: "", flags: []string{"product_specific"}}}, @@ -526,37 +554,23 @@ func rewriteAndroidmkPrebuiltEtc(f *Fixer) error { if prop_local_module_path, ok := mod.GetProperty(local_module_path); ok { removeProperty(mod, local_module_path) prefixVariableName := getStringProperty(prop_local_module_path, "var") - path := getStringProperty(prop_local_module_path, "fixed") - if prefixRewrites, ok := localModulePathRewrite[prefixVariableName]; ok { - rewritten := false - for _, prefixRewrite := range prefixRewrites { - if path == prefixRewrite.prefix { - rewritten = true - } else if trimmedPath := strings.TrimPrefix(path, prefixRewrite.prefix+"/"); trimmedPath != path { - makePrebuiltEtcDestination(mod, trimmedPath) - rewritten = true - } - if rewritten { - for _, flag := range prefixRewrite.flags { - mod.Properties = append(mod.Properties, &parser.Property{Name: flag, Value: &parser.Bool{Value: true, Token: "true"}}) - } - break - } + if moduleUpdates, ok := localModuleUpdate[prefixVariableName]; ok { + path := getStringProperty(prop_local_module_path, "fixed") + updated := false + for i := 0; i < len(moduleUpdates) && !updated; i++ { + updated = moduleUpdates[i].update(mod, path) } - if !rewritten { + if !updated { expectedPrefices := "" sep := "" - for _, prefixRewrite := range prefixRewrites { + for _, moduleUpdate := range moduleUpdates { expectedPrefices += sep sep = ", " - expectedPrefices += prefixRewrite.prefix + expectedPrefices += moduleUpdate.prefix } return indicateAttributeError(mod, "filename", "LOCAL_MODULE_PATH value under $(%s) should start with %s", prefixVariableName, expectedPrefices) } - if prefixVariableName == "HOST_OUT" { - mod.Type = "prebuilt_etc_host" - } } else { return indicateAttributeError(mod, "filename", "Cannot handle $(%s) for the prebuilt_etc", prefixVariableName) } |