Loading Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ bootstrap_go_package { "android/arch_test.go", "android/config_test.go", "android/expand_test.go", "android/module_test.go", "android/namespace_test.go", "android/neverallow_test.go", "android/onceper_test.go", Loading android/module.go +43 −13 Original line number Diff line number Diff line Loading @@ -1462,39 +1462,60 @@ func findStringInSlice(str string, slice []string) int { return -1 } func SrcIsModule(s string) string { // SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input // was not a module reference. func SrcIsModule(s string) (module string) { if len(s) > 1 && s[0] == ':' { return s[1:] } return "" } type sourceDependencyTag struct { // SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the // module name and an empty string for the tag, or empty strings if the input was not a module reference. func SrcIsModuleWithTag(s string) (module, tag string) { if len(s) > 1 && s[0] == ':' { module = s[1:] if tagStart := strings.IndexByte(module, '{'); tagStart > 0 { if module[len(module)-1] == '}' { tag = module[tagStart+1 : len(module)-1] module = module[:tagStart] return module, tag } } return module, "" } return "", "" } type sourceOrOutputDependencyTag struct { blueprint.BaseDependencyTag tag string } var SourceDepTag sourceDependencyTag func sourceOrOutputDepTag(tag string) blueprint.DependencyTag { return sourceOrOutputDependencyTag{tag: tag} } var SourceDepTag = sourceOrOutputDepTag("") // Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles // using ":module" syntax, if any. // // Deprecated: tag the property with `android:"path"` instead. func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) { var deps []string set := make(map[string]bool) for _, s := range srcFiles { if m := SrcIsModule(s); m != "" { if _, found := set[m]; found { ctx.ModuleErrorf("found source dependency duplicate: %q!", m) if m, t := SrcIsModuleWithTag(s); m != "" { if _, found := set[s]; found { ctx.ModuleErrorf("found source dependency duplicate: %q!", s) } else { set[m] = true deps = append(deps, m) set[s] = true ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } } ctx.AddDependency(ctx.Module(), SourceDepTag, deps...) } // Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s Loading @@ -1503,16 +1524,25 @@ func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) { // Deprecated: tag the property with `android:"path"` instead. func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) { if s != nil { if m := SrcIsModule(*s); m != "" { ctx.AddDependency(ctx.Module(), SourceDepTag, m) if m, t := SrcIsModuleWithTag(*s); m != "" { ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } } // A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"` // using the ":module" syntax and provides a list of paths to be used as if they were listed in the property. type SourceFileProducer interface { Srcs() Paths } // A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"` // using the ":module" syntax or ":module{.tag}" syntax and provides a list of otuput files to be used as if they were // listed in the property. type OutputFileProducer interface { OutputFiles(tag string) (Paths, error) } type HostToolProvider interface { HostToolPath() OptionalPath } Loading android/module_test.go 0 → 100644 +141 −0 Original line number Diff line number Diff line // Copyright 2015 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android import "testing" func TestSrcIsModule(t *testing.T) { type args struct { s string } tests := []struct { name string args args wantModule string }{ { name: "file", args: args{ s: "foo", }, wantModule: "", }, { name: "module", args: args{ s: ":foo", }, wantModule: "foo", }, { name: "tag", args: args{ s: ":foo{.bar}", }, wantModule: "foo{.bar}", }, { name: "extra colon", args: args{ s: ":foo:bar", }, wantModule: "foo:bar", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if gotModule := SrcIsModule(tt.args.s); gotModule != tt.wantModule { t.Errorf("SrcIsModule() = %v, want %v", gotModule, tt.wantModule) } }) } } func TestSrcIsModuleWithTag(t *testing.T) { type args struct { s string } tests := []struct { name string args args wantModule string wantTag string }{ { name: "file", args: args{ s: "foo", }, wantModule: "", wantTag: "", }, { name: "module", args: args{ s: ":foo", }, wantModule: "foo", wantTag: "", }, { name: "tag", args: args{ s: ":foo{.bar}", }, wantModule: "foo", wantTag: ".bar", }, { name: "empty tag", args: args{ s: ":foo{}", }, wantModule: "foo", wantTag: "", }, { name: "extra colon", args: args{ s: ":foo:bar", }, wantModule: "foo:bar", }, { name: "invalid tag", args: args{ s: ":foo{.bar", }, wantModule: "foo{.bar", }, { name: "invalid tag 2", args: args{ s: ":foo.bar}", }, wantModule: "foo.bar}", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotModule, gotTag := SrcIsModuleWithTag(tt.args.s) if gotModule != tt.wantModule { t.Errorf("SrcIsModuleWithTag() gotModule = %v, want %v", gotModule, tt.wantModule) } if gotTag != tt.wantTag { t.Errorf("SrcIsModuleWithTag() gotTag = %v, want %v", gotTag, tt.wantTag) } }) } } android/path_properties.go +2 −4 Original line number Diff line number Diff line Loading @@ -39,14 +39,12 @@ func pathDepsMutator(ctx BottomUpMutatorContext) { pathProperties := pathPropertiesForPropertyStruct(ctx, ps) pathProperties = FirstUniqueStrings(pathProperties) var deps []string for _, s := range pathProperties { if m := SrcIsModule(s); m != "" { deps = append(deps, m) if m, t := SrcIsModuleWithTag(s); m != "" { ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } ctx.AddDependency(ctx.Module(), SourceDepTag, deps...) } } Loading android/path_properties_test.go +5 −3 Original line number Diff line number Diff line Loading @@ -41,8 +41,10 @@ func pathDepsMutatorTestModuleFactory() Module { } func (p *pathDepsMutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { ctx.VisitDirectDepsWithTag(SourceDepTag, func(dep Module) { ctx.VisitDirectDeps(func(dep Module) { if _, ok := ctx.OtherModuleDependencyTag(dep).(sourceOrOutputDependencyTag); ok { p.sourceDeps = append(p.sourceDeps, ctx.OtherModuleName(dep)) } }) } Loading @@ -59,7 +61,7 @@ func TestPathDepsMutator(t *testing.T) { name: "foo", foo: ":a", bar: [":b"], baz: ":c", baz: ":c{.bar}", qux: ":d", }`, deps: []string{"a", "b", "c"}, Loading Loading
Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,7 @@ bootstrap_go_package { "android/arch_test.go", "android/config_test.go", "android/expand_test.go", "android/module_test.go", "android/namespace_test.go", "android/neverallow_test.go", "android/onceper_test.go", Loading
android/module.go +43 −13 Original line number Diff line number Diff line Loading @@ -1462,39 +1462,60 @@ func findStringInSlice(str string, slice []string) int { return -1 } func SrcIsModule(s string) string { // SrcIsModule decodes module references in the format ":name" into the module name, or empty string if the input // was not a module reference. func SrcIsModule(s string) (module string) { if len(s) > 1 && s[0] == ':' { return s[1:] } return "" } type sourceDependencyTag struct { // SrcIsModule decodes module references in the format ":name{.tag}" into the module name and tag, ":name" into the // module name and an empty string for the tag, or empty strings if the input was not a module reference. func SrcIsModuleWithTag(s string) (module, tag string) { if len(s) > 1 && s[0] == ':' { module = s[1:] if tagStart := strings.IndexByte(module, '{'); tagStart > 0 { if module[len(module)-1] == '}' { tag = module[tagStart+1 : len(module)-1] module = module[:tagStart] return module, tag } } return module, "" } return "", "" } type sourceOrOutputDependencyTag struct { blueprint.BaseDependencyTag tag string } var SourceDepTag sourceDependencyTag func sourceOrOutputDepTag(tag string) blueprint.DependencyTag { return sourceOrOutputDependencyTag{tag: tag} } var SourceDepTag = sourceOrOutputDepTag("") // Adds necessary dependencies to satisfy filegroup or generated sources modules listed in srcFiles // using ":module" syntax, if any. // // Deprecated: tag the property with `android:"path"` instead. func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) { var deps []string set := make(map[string]bool) for _, s := range srcFiles { if m := SrcIsModule(s); m != "" { if _, found := set[m]; found { ctx.ModuleErrorf("found source dependency duplicate: %q!", m) if m, t := SrcIsModuleWithTag(s); m != "" { if _, found := set[s]; found { ctx.ModuleErrorf("found source dependency duplicate: %q!", s) } else { set[m] = true deps = append(deps, m) set[s] = true ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } } ctx.AddDependency(ctx.Module(), SourceDepTag, deps...) } // Adds necessary dependencies to satisfy filegroup or generated sources modules specified in s Loading @@ -1503,16 +1524,25 @@ func ExtractSourcesDeps(ctx BottomUpMutatorContext, srcFiles []string) { // Deprecated: tag the property with `android:"path"` instead. func ExtractSourceDeps(ctx BottomUpMutatorContext, s *string) { if s != nil { if m := SrcIsModule(*s); m != "" { ctx.AddDependency(ctx.Module(), SourceDepTag, m) if m, t := SrcIsModuleWithTag(*s); m != "" { ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } } // A module that implements SourceFileProducer can be referenced from any property that is tagged with `android:"path"` // using the ":module" syntax and provides a list of paths to be used as if they were listed in the property. type SourceFileProducer interface { Srcs() Paths } // A module that implements OutputFileProducer can be referenced from any property that is tagged with `android:"path"` // using the ":module" syntax or ":module{.tag}" syntax and provides a list of otuput files to be used as if they were // listed in the property. type OutputFileProducer interface { OutputFiles(tag string) (Paths, error) } type HostToolProvider interface { HostToolPath() OptionalPath } Loading
android/module_test.go 0 → 100644 +141 −0 Original line number Diff line number Diff line // Copyright 2015 Google Inc. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package android import "testing" func TestSrcIsModule(t *testing.T) { type args struct { s string } tests := []struct { name string args args wantModule string }{ { name: "file", args: args{ s: "foo", }, wantModule: "", }, { name: "module", args: args{ s: ":foo", }, wantModule: "foo", }, { name: "tag", args: args{ s: ":foo{.bar}", }, wantModule: "foo{.bar}", }, { name: "extra colon", args: args{ s: ":foo:bar", }, wantModule: "foo:bar", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if gotModule := SrcIsModule(tt.args.s); gotModule != tt.wantModule { t.Errorf("SrcIsModule() = %v, want %v", gotModule, tt.wantModule) } }) } } func TestSrcIsModuleWithTag(t *testing.T) { type args struct { s string } tests := []struct { name string args args wantModule string wantTag string }{ { name: "file", args: args{ s: "foo", }, wantModule: "", wantTag: "", }, { name: "module", args: args{ s: ":foo", }, wantModule: "foo", wantTag: "", }, { name: "tag", args: args{ s: ":foo{.bar}", }, wantModule: "foo", wantTag: ".bar", }, { name: "empty tag", args: args{ s: ":foo{}", }, wantModule: "foo", wantTag: "", }, { name: "extra colon", args: args{ s: ":foo:bar", }, wantModule: "foo:bar", }, { name: "invalid tag", args: args{ s: ":foo{.bar", }, wantModule: "foo{.bar", }, { name: "invalid tag 2", args: args{ s: ":foo.bar}", }, wantModule: "foo.bar}", }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { gotModule, gotTag := SrcIsModuleWithTag(tt.args.s) if gotModule != tt.wantModule { t.Errorf("SrcIsModuleWithTag() gotModule = %v, want %v", gotModule, tt.wantModule) } if gotTag != tt.wantTag { t.Errorf("SrcIsModuleWithTag() gotTag = %v, want %v", gotTag, tt.wantTag) } }) } }
android/path_properties.go +2 −4 Original line number Diff line number Diff line Loading @@ -39,14 +39,12 @@ func pathDepsMutator(ctx BottomUpMutatorContext) { pathProperties := pathPropertiesForPropertyStruct(ctx, ps) pathProperties = FirstUniqueStrings(pathProperties) var deps []string for _, s := range pathProperties { if m := SrcIsModule(s); m != "" { deps = append(deps, m) if m, t := SrcIsModuleWithTag(s); m != "" { ctx.AddDependency(ctx.Module(), sourceOrOutputDepTag(t), m) } } ctx.AddDependency(ctx.Module(), SourceDepTag, deps...) } } Loading
android/path_properties_test.go +5 −3 Original line number Diff line number Diff line Loading @@ -41,8 +41,10 @@ func pathDepsMutatorTestModuleFactory() Module { } func (p *pathDepsMutatorTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { ctx.VisitDirectDepsWithTag(SourceDepTag, func(dep Module) { ctx.VisitDirectDeps(func(dep Module) { if _, ok := ctx.OtherModuleDependencyTag(dep).(sourceOrOutputDependencyTag); ok { p.sourceDeps = append(p.sourceDeps, ctx.OtherModuleName(dep)) } }) } Loading @@ -59,7 +61,7 @@ func TestPathDepsMutator(t *testing.T) { name: "foo", foo: ":a", bar: [":b"], baz: ":c", baz: ":c{.bar}", qux: ":d", }`, deps: []string{"a", "b", "c"}, Loading