Fix few issues with filegroups

Bug: http://b/64121881
Bug: http://b/78188880

- Allow filegroup's properties to be extended by a LoadHook
- Support a filegroup (':module') in a prebuilt's 'Srcs' property to
export files from a different path as the prebuilt's sources.

This change also includes a refactoring that moves genrule/filegroup.go
to android/filegroup.go so that FileGroupFactory is visible in
prebuilt_test.go.

Test: Test
https://android-review.googlesource.com/c/platform/development/+/469159
in clang-tools branch on Linux, Darwin.  Test regular build in
aosp/master.

Change-Id: I3ff6215ab2e62955f039fd1086c31f1bd50ebcf6
This commit is contained in:
Pirama Arumuga Nainar
2018-04-17 14:58:42 -07:00
parent 6284323772
commit 955dc4999e
8 changed files with 48 additions and 29 deletions

View File

@@ -46,6 +46,7 @@ bootstrap_go_package {
"android/defaults.go", "android/defaults.go",
"android/defs.go", "android/defs.go",
"android/expand.go", "android/expand.go",
"android/filegroup.go",
"android/hooks.go", "android/hooks.go",
"android/makevars.go", "android/makevars.go",
"android/module.go", "android/module.go",
@@ -186,7 +187,6 @@ bootstrap_go_package {
"soong-shared", "soong-shared",
], ],
srcs: [ srcs: [
"genrule/filegroup.go",
"genrule/genrule.go", "genrule/genrule.go",
], ],
pluginFor: ["soong_build"], pluginFor: ["soong_build"],

View File

@@ -12,17 +12,16 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
package genrule package android
import ( import (
"android/soong/android"
"io" "io"
"strings" "strings"
"text/template" "text/template"
) )
func init() { func init() {
android.RegisterModuleType("filegroup", FileGroupFactory) RegisterModuleType("filegroup", FileGroupFactory)
} }
type fileGroupProperties struct { type fileGroupProperties struct {
@@ -43,34 +42,34 @@ type fileGroupProperties struct {
} }
type fileGroup struct { type fileGroup struct {
android.ModuleBase ModuleBase
properties fileGroupProperties properties fileGroupProperties
srcs android.Paths srcs Paths
} }
var _ android.SourceFileProducer = (*fileGroup)(nil) var _ SourceFileProducer = (*fileGroup)(nil)
// filegroup modules contain a list of files, and can be used to export files across package // filegroup modules contain a list of files, and can be used to export files across package
// boundaries. filegroups (and genrules) can be referenced from srcs properties of other modules // boundaries. filegroups (and genrules) can be referenced from srcs properties of other modules
// using the syntax ":module". // using the syntax ":module".
func FileGroupFactory() android.Module { func FileGroupFactory() Module {
module := &fileGroup{} module := &fileGroup{}
module.AddProperties(&module.properties) module.AddProperties(&module.properties)
android.InitAndroidModule(module) InitAndroidModule(module)
return module return module
} }
func (fg *fileGroup) DepsMutator(ctx android.BottomUpMutatorContext) { func (fg *fileGroup) DepsMutator(ctx BottomUpMutatorContext) {
android.ExtractSourcesDeps(ctx, fg.properties.Srcs) ExtractSourcesDeps(ctx, fg.properties.Srcs)
android.ExtractSourcesDeps(ctx, fg.properties.Exclude_srcs) ExtractSourcesDeps(ctx, fg.properties.Exclude_srcs)
} }
func (fg *fileGroup) GenerateAndroidBuildActions(ctx android.ModuleContext) { func (fg *fileGroup) GenerateAndroidBuildActions(ctx ModuleContext) {
fg.srcs = ctx.ExpandSourcesSubDir(fg.properties.Srcs, fg.properties.Exclude_srcs, String(fg.properties.Path)) fg.srcs = ctx.ExpandSourcesSubDir(fg.properties.Srcs, fg.properties.Exclude_srcs, String(fg.properties.Path))
} }
func (fg *fileGroup) Srcs() android.Paths { func (fg *fileGroup) Srcs() Paths {
return append(android.Paths{}, fg.srcs...) return append(Paths{}, fg.srcs...)
} }
var androidMkTemplate = template.Must(template.New("filegroup").Parse(` var androidMkTemplate = template.Must(template.New("filegroup").Parse(`
@@ -81,9 +80,9 @@ endif
.KATI_READONLY := {{.makeVar}} .KATI_READONLY := {{.makeVar}}
`)) `))
func (fg *fileGroup) AndroidMk() android.AndroidMkData { func (fg *fileGroup) AndroidMk() AndroidMkData {
return android.AndroidMkData{ return AndroidMkData{
Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) {
if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" { if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" {
androidMkTemplate.Execute(w, map[string]string{ androidMkTemplate.Execute(w, map[string]string{
"makeVar": makeVar, "makeVar": makeVar,

View File

@@ -323,6 +323,7 @@ func InitAndroidModule(m Module) {
&base.nameProperties, &base.nameProperties,
&base.commonProperties, &base.commonProperties,
&base.variableProperties) &base.variableProperties)
base.customizableProperties = m.GetProperties()
} }
func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) { func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {

View File

@@ -59,7 +59,9 @@ func (p *Prebuilt) SingleSourcePath(ctx ModuleContext) Path {
return nil return nil
} }
return PathForModuleSrc(ctx, (*p.srcs)[0]) // Return the singleton source after expanding any filegroup in the
// sources.
return ctx.ExpandSource((*p.srcs)[0], "")
} }
func InitPrebuiltModule(module PrebuiltInterface, srcs *[]string) { func InitPrebuiltModule(module PrebuiltInterface, srcs *[]string) {
@@ -79,7 +81,7 @@ func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) {
func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) {
ctx.TopDown("prebuilt_select", PrebuiltSelectModuleMutator).Parallel() ctx.TopDown("prebuilt_select", PrebuiltSelectModuleMutator).Parallel()
ctx.BottomUp("prebuilt_replace", PrebuiltReplaceMutator).Parallel() ctx.BottomUp("prebuilt_postdeps", PrebuiltPostDepsMutator).Parallel()
} }
// prebuiltMutator ensures that there is always a module with an undecorated name, and marks // prebuiltMutator ensures that there is always a module with an undecorated name, and marks
@@ -119,10 +121,12 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) {
} }
} }
// PrebuiltReplaceMutator replaces dependencies on the source module with dependencies on the // PrebuiltPostDepsMutator does two operations. It replace dependencies on the
// prebuilt when both modules exist and the prebuilt should be used. When the prebuilt should not // source module with dependencies on the prebuilt when both modules exist and
// be used, disable installing it. // the prebuilt should be used. When the prebuilt should not be used, disable
func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) { // installing it. Secondly, it also adds a sourcegroup to any filegroups found
// in the prebuilt's 'Srcs' property.
func PrebuiltPostDepsMutator(ctx BottomUpMutatorContext) {
if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil { if m, ok := ctx.Module().(PrebuiltInterface); ok && m.Prebuilt() != nil {
p := m.Prebuilt() p := m.Prebuilt()
name := m.base().BaseModuleName() name := m.base().BaseModuleName()
@@ -133,6 +137,9 @@ func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) {
} else { } else {
m.SkipInstall() m.SkipInstall()
} }
if len(*p.srcs) > 0 {
ExtractSourceDeps(ctx, &(*p.srcs)[0])
}
} }
} }

View File

@@ -109,6 +109,19 @@ var prebuiltsTests = []struct {
}`, }`,
prebuilt: false, prebuilt: false,
}, },
{
name: "prebuilt file from filegroup preferred",
modules: `
filegroup {
name: "fg",
}
prebuilt {
name: "bar",
prefer: true,
srcs: [":fg"],
}`,
prebuilt: true,
},
} }
func TestPrebuilts(t *testing.T) { func TestPrebuilts(t *testing.T) {
@@ -125,6 +138,7 @@ func TestPrebuilts(t *testing.T) {
ctx := NewTestContext() ctx := NewTestContext()
ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators) ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators)
ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators) ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators)
ctx.RegisterModuleType("filegroup", ModuleFactoryAdaptor(FileGroupFactory))
ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule)) ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule))
ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule)) ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule))
ctx.Register() ctx.Register()

View File

@@ -16,7 +16,6 @@ package cc
import ( import (
"android/soong/android" "android/soong/android"
"android/soong/genrule"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
@@ -62,7 +61,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android.
ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory)) ctx.RegisterModuleType("llndk_headers", android.ModuleFactoryAdaptor(llndkHeadersFactory))
ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory)) ctx.RegisterModuleType("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory))
ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(objectFactory)) ctx.RegisterModuleType("cc_object", android.ModuleFactoryAdaptor(objectFactory))
ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(genrule.FileGroupFactory)) ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) {
ctx.BottomUp("image", vendorMutator).Parallel() ctx.BottomUp("image", vendorMutator).Parallel()
ctx.BottomUp("link", linkageMutator).Parallel() ctx.BottomUp("link", linkageMutator).Parallel()

View File

@@ -22,7 +22,6 @@ import (
"testing" "testing"
"android/soong/android" "android/soong/android"
"android/soong/genrule"
) )
type dataFile struct { type dataFile struct {
@@ -129,7 +128,7 @@ func TestDataTests(t *testing.T) {
"dir/bar/baz": nil, "dir/bar/baz": nil,
}) })
ctx.RegisterModuleType("filegroup", ctx.RegisterModuleType("filegroup",
android.ModuleFactoryAdaptor(genrule.FileGroupFactory)) android.ModuleFactoryAdaptor(android.FileGroupFactory))
ctx.RegisterModuleType("test", ctx.RegisterModuleType("test",
android.ModuleFactoryAdaptor(newTest)) android.ModuleFactoryAdaptor(newTest))
ctx.Register() ctx.Register()

View File

@@ -78,7 +78,7 @@ func testContext(config android.Config, bp string,
ctx.RegisterModuleType("java_defaults", android.ModuleFactoryAdaptor(defaultsFactory)) ctx.RegisterModuleType("java_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
ctx.RegisterModuleType("java_system_modules", android.ModuleFactoryAdaptor(SystemModulesFactory)) ctx.RegisterModuleType("java_system_modules", android.ModuleFactoryAdaptor(SystemModulesFactory))
ctx.RegisterModuleType("java_genrule", android.ModuleFactoryAdaptor(genRuleFactory)) ctx.RegisterModuleType("java_genrule", android.ModuleFactoryAdaptor(genRuleFactory))
ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(genrule.FileGroupFactory)) ctx.RegisterModuleType("filegroup", android.ModuleFactoryAdaptor(android.FileGroupFactory))
ctx.RegisterModuleType("genrule", android.ModuleFactoryAdaptor(genrule.GenRuleFactory)) ctx.RegisterModuleType("genrule", android.ModuleFactoryAdaptor(genrule.GenRuleFactory))
ctx.RegisterModuleType("droiddoc", android.ModuleFactoryAdaptor(DroiddocFactory)) ctx.RegisterModuleType("droiddoc", android.ModuleFactoryAdaptor(DroiddocFactory))
ctx.RegisterModuleType("droiddoc_host", android.ModuleFactoryAdaptor(DroiddocHostFactory)) ctx.RegisterModuleType("droiddoc_host", android.ModuleFactoryAdaptor(DroiddocHostFactory))