Fix few issues with filegroups am: 955dc4999e

am: daf0ac55ea

Change-Id: I28fe1931c64564cf1a0f34e4a0cc042e6c9ccc9e
This commit is contained in:
Pirama Arumuga Nainar
2018-04-18 14:15:29 -07:00
committed by android-build-merger
8 changed files with 48 additions and 29 deletions

94
android/filegroup.go Normal file
View File

@@ -0,0 +1,94 @@
// Copyright 2016 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 (
"io"
"strings"
"text/template"
)
func init() {
RegisterModuleType("filegroup", FileGroupFactory)
}
type fileGroupProperties struct {
// srcs lists files that will be included in this filegroup
Srcs []string
Exclude_srcs []string
// The base path to the files. May be used by other modules to determine which portion
// of the path to use. For example, when a filegroup is used as data in a cc_test rule,
// the base path is stripped off the path and the remaining path is used as the
// installation directory.
Path *string
// Create a make variable with the specified name that contains the list of files in the
// filegroup, relative to the root of the source tree.
Export_to_make_var *string
}
type fileGroup struct {
ModuleBase
properties fileGroupProperties
srcs Paths
}
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() Module {
module := &fileGroup{}
module.AddProperties(&module.properties)
InitAndroidModule(module)
return module
}
func (fg *fileGroup) DepsMutator(ctx BottomUpMutatorContext) {
ExtractSourcesDeps(ctx, fg.properties.Srcs)
ExtractSourcesDeps(ctx, fg.properties.Exclude_srcs)
}
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() Paths {
return append(Paths{}, fg.srcs...)
}
var androidMkTemplate = template.Must(template.New("filegroup").Parse(`
ifdef {{.makeVar}}
$(error variable {{.makeVar}} set by soong module is already set in make)
endif
{{.makeVar}} := {{.value}}
.KATI_READONLY := {{.makeVar}}
`))
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,
"value": strings.Join(fg.srcs.Strings(), " "),
})
}
},
}
}

View File

@@ -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) {

View File

@@ -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])
}
}
}

View File

@@ -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()