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:
parent
6284323772
commit
955dc4999e
|
@ -46,6 +46,7 @@ bootstrap_go_package {
|
|||
"android/defaults.go",
|
||||
"android/defs.go",
|
||||
"android/expand.go",
|
||||
"android/filegroup.go",
|
||||
"android/hooks.go",
|
||||
"android/makevars.go",
|
||||
"android/module.go",
|
||||
|
@ -186,7 +187,6 @@ bootstrap_go_package {
|
|||
"soong-shared",
|
||||
],
|
||||
srcs: [
|
||||
"genrule/filegroup.go",
|
||||
"genrule/genrule.go",
|
||||
],
|
||||
pluginFor: ["soong_build"],
|
||||
|
|
|
@ -12,17 +12,16 @@
|
|||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package genrule
|
||||
package android
|
||||
|
||||
import (
|
||||
"android/soong/android"
|
||||
"io"
|
||||
"strings"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
func init() {
|
||||
android.RegisterModuleType("filegroup", FileGroupFactory)
|
||||
RegisterModuleType("filegroup", FileGroupFactory)
|
||||
}
|
||||
|
||||
type fileGroupProperties struct {
|
||||
|
@ -43,34 +42,34 @@ type fileGroupProperties struct {
|
|||
}
|
||||
|
||||
type fileGroup struct {
|
||||
android.ModuleBase
|
||||
ModuleBase
|
||||
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
|
||||
// boundaries. filegroups (and genrules) can be referenced from srcs properties of other modules
|
||||
// using the syntax ":module".
|
||||
func FileGroupFactory() android.Module {
|
||||
func FileGroupFactory() Module {
|
||||
module := &fileGroup{}
|
||||
module.AddProperties(&module.properties)
|
||||
android.InitAndroidModule(module)
|
||||
InitAndroidModule(module)
|
||||
return module
|
||||
}
|
||||
|
||||
func (fg *fileGroup) DepsMutator(ctx android.BottomUpMutatorContext) {
|
||||
android.ExtractSourcesDeps(ctx, fg.properties.Srcs)
|
||||
android.ExtractSourcesDeps(ctx, fg.properties.Exclude_srcs)
|
||||
func (fg *fileGroup) DepsMutator(ctx BottomUpMutatorContext) {
|
||||
ExtractSourcesDeps(ctx, fg.properties.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))
|
||||
}
|
||||
|
||||
func (fg *fileGroup) Srcs() android.Paths {
|
||||
return append(android.Paths{}, fg.srcs...)
|
||||
func (fg *fileGroup) Srcs() Paths {
|
||||
return append(Paths{}, fg.srcs...)
|
||||
}
|
||||
|
||||
var androidMkTemplate = template.Must(template.New("filegroup").Parse(`
|
||||
|
@ -81,9 +80,9 @@ endif
|
|||
.KATI_READONLY := {{.makeVar}}
|
||||
`))
|
||||
|
||||
func (fg *fileGroup) AndroidMk() android.AndroidMkData {
|
||||
return android.AndroidMkData{
|
||||
Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) {
|
||||
func (fg *fileGroup) AndroidMk() AndroidMkData {
|
||||
return AndroidMkData{
|
||||
Custom: func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData) {
|
||||
if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" {
|
||||
androidMkTemplate.Execute(w, map[string]string{
|
||||
"makeVar": makeVar,
|
|
@ -323,6 +323,7 @@ func InitAndroidModule(m Module) {
|
|||
&base.nameProperties,
|
||||
&base.commonProperties,
|
||||
&base.variableProperties)
|
||||
base.customizableProperties = m.GetProperties()
|
||||
}
|
||||
|
||||
func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
|
||||
|
|
|
@ -59,7 +59,9 @@ func (p *Prebuilt) SingleSourcePath(ctx ModuleContext) Path {
|
|||
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) {
|
||||
|
@ -79,7 +81,7 @@ func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) {
|
|||
|
||||
func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) {
|
||||
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
|
||||
|
@ -119,10 +121,12 @@ func PrebuiltSelectModuleMutator(ctx TopDownMutatorContext) {
|
|||
}
|
||||
}
|
||||
|
||||
// PrebuiltReplaceMutator replaces dependencies on the source module with dependencies on the
|
||||
// prebuilt when both modules exist and the prebuilt should be used. When the prebuilt should not
|
||||
// be used, disable installing it.
|
||||
func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) {
|
||||
// PrebuiltPostDepsMutator does two operations. It replace dependencies on the
|
||||
// source module with dependencies on the prebuilt when both modules exist and
|
||||
// the prebuilt should be used. When the prebuilt should not be used, disable
|
||||
// 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 {
|
||||
p := m.Prebuilt()
|
||||
name := m.base().BaseModuleName()
|
||||
|
@ -133,6 +137,9 @@ func PrebuiltReplaceMutator(ctx BottomUpMutatorContext) {
|
|||
} else {
|
||||
m.SkipInstall()
|
||||
}
|
||||
if len(*p.srcs) > 0 {
|
||||
ExtractSourceDeps(ctx, &(*p.srcs)[0])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -109,6 +109,19 @@ var prebuiltsTests = []struct {
|
|||
}`,
|
||||
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) {
|
||||
|
@ -125,6 +138,7 @@ func TestPrebuilts(t *testing.T) {
|
|||
ctx := NewTestContext()
|
||||
ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators)
|
||||
ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators)
|
||||
ctx.RegisterModuleType("filegroup", ModuleFactoryAdaptor(FileGroupFactory))
|
||||
ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule))
|
||||
ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule))
|
||||
ctx.Register()
|
||||
|
|
|
@ -16,7 +16,6 @@ package cc
|
|||
|
||||
import (
|
||||
"android/soong/android"
|
||||
"android/soong/genrule"
|
||||
|
||||
"fmt"
|
||||
"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("vendor_public_library", android.ModuleFactoryAdaptor(vendorPublicLibraryFactory))
|
||||
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.BottomUp("image", vendorMutator).Parallel()
|
||||
ctx.BottomUp("link", linkageMutator).Parallel()
|
||||
|
|
|
@ -22,7 +22,6 @@ import (
|
|||
"testing"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/genrule"
|
||||
)
|
||||
|
||||
type dataFile struct {
|
||||
|
@ -129,7 +128,7 @@ func TestDataTests(t *testing.T) {
|
|||
"dir/bar/baz": nil,
|
||||
})
|
||||
ctx.RegisterModuleType("filegroup",
|
||||
android.ModuleFactoryAdaptor(genrule.FileGroupFactory))
|
||||
android.ModuleFactoryAdaptor(android.FileGroupFactory))
|
||||
ctx.RegisterModuleType("test",
|
||||
android.ModuleFactoryAdaptor(newTest))
|
||||
ctx.Register()
|
||||
|
|
|
@ -78,7 +78,7 @@ func testContext(config android.Config, bp string,
|
|||
ctx.RegisterModuleType("java_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
|
||||
ctx.RegisterModuleType("java_system_modules", android.ModuleFactoryAdaptor(SystemModulesFactory))
|
||||
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("droiddoc", android.ModuleFactoryAdaptor(DroiddocFactory))
|
||||
ctx.RegisterModuleType("droiddoc_host", android.ModuleFactoryAdaptor(DroiddocHostFactory))
|
||||
|
|
Loading…
Reference in New Issue