Fix few issues with filegroups am: 955dc4999e
am: daf0ac55ea
Change-Id: I28fe1931c64564cf1a0f34e4a0cc042e6c9ccc9e
This commit is contained in:
committed by
android-build-merger
commit
6c77d18183
94
android/filegroup.go
Normal file
94
android/filegroup.go
Normal 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(), " "),
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user