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:
@@ -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"],
|
||||||
|
@@ -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,
|
@@ -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) {
|
||||||
|
@@ -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])
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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()
|
||||||
|
@@ -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()
|
||||||
|
@@ -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()
|
||||||
|
@@ -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))
|
||||||
|
Reference in New Issue
Block a user