1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage android 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "maps" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 22*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workerfunc init() { 26*333d2b36SAndroid Build Coastguard Worker RegisterFilegroupBuildComponents(InitRegistrationContext) 27*333d2b36SAndroid Build Coastguard Worker} 28*333d2b36SAndroid Build Coastguard Worker 29*333d2b36SAndroid Build Coastguard Workervar PrepareForTestWithFilegroup = FixtureRegisterWithContext(func(ctx RegistrationContext) { 30*333d2b36SAndroid Build Coastguard Worker RegisterFilegroupBuildComponents(ctx) 31*333d2b36SAndroid Build Coastguard Worker}) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Workerfunc RegisterFilegroupBuildComponents(ctx RegistrationContext) { 34*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("filegroup", FileGroupFactory) 35*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("filegroup_defaults", FileGroupDefaultsFactory) 36*333d2b36SAndroid Build Coastguard Worker} 37*333d2b36SAndroid Build Coastguard Worker 38*333d2b36SAndroid Build Coastguard Workertype fileGroupProperties struct { 39*333d2b36SAndroid Build Coastguard Worker // srcs lists files that will be included in this filegroup 40*333d2b36SAndroid Build Coastguard Worker Srcs proptools.Configurable[[]string] `android:"path"` 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker Exclude_srcs proptools.Configurable[[]string] `android:"path"` 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Worker // Sources the will be included in the filegroup, but any module dependencies will be added 45*333d2b36SAndroid Build Coastguard Worker // using the device os and the device's first architecture's variant. 46*333d2b36SAndroid Build Coastguard Worker Device_first_srcs proptools.Configurable[[]string] `android:"path_device_first"` 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker // Sources the will be included in the filegroup, but any module dependencies will be added 49*333d2b36SAndroid Build Coastguard Worker // using the device os and the common architecture's variant. 50*333d2b36SAndroid Build Coastguard Worker Device_common_srcs proptools.Configurable[[]string] `android:"path_device_common"` 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker // The base path to the files. May be used by other modules to determine which portion 53*333d2b36SAndroid Build Coastguard Worker // of the path to use. For example, when a filegroup is used as data in a cc_test rule, 54*333d2b36SAndroid Build Coastguard Worker // the base path is stripped off the path and the remaining path is used as the 55*333d2b36SAndroid Build Coastguard Worker // installation directory. 56*333d2b36SAndroid Build Coastguard Worker Path *string 57*333d2b36SAndroid Build Coastguard Worker 58*333d2b36SAndroid Build Coastguard Worker // Create a make variable with the specified name that contains the list of files in the 59*333d2b36SAndroid Build Coastguard Worker // filegroup, relative to the root of the source tree. 60*333d2b36SAndroid Build Coastguard Worker Export_to_make_var *string 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workertype fileGroup struct { 64*333d2b36SAndroid Build Coastguard Worker ModuleBase 65*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 66*333d2b36SAndroid Build Coastguard Worker properties fileGroupProperties 67*333d2b36SAndroid Build Coastguard Worker srcs Paths 68*333d2b36SAndroid Build Coastguard Worker} 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Workervar _ SourceFileProducer = (*fileGroup)(nil) 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker// filegroup contains a list of files that are referenced by other modules 73*333d2b36SAndroid Build Coastguard Worker// properties (such as "srcs") using the syntax ":<name>". filegroup are 74*333d2b36SAndroid Build Coastguard Worker// also be used to export files across package boundaries. 75*333d2b36SAndroid Build Coastguard Workerfunc FileGroupFactory() Module { 76*333d2b36SAndroid Build Coastguard Worker module := &fileGroup{} 77*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 78*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(module) 79*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(module) 80*333d2b36SAndroid Build Coastguard Worker return module 81*333d2b36SAndroid Build Coastguard Worker} 82*333d2b36SAndroid Build Coastguard Worker 83*333d2b36SAndroid Build Coastguard Workervar _ blueprint.JSONActionSupplier = (*fileGroup)(nil) 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Workerfunc (fg *fileGroup) JSONActions() []blueprint.JSONAction { 86*333d2b36SAndroid Build Coastguard Worker ins := make([]string, 0, len(fg.srcs)) 87*333d2b36SAndroid Build Coastguard Worker outs := make([]string, 0, len(fg.srcs)) 88*333d2b36SAndroid Build Coastguard Worker for _, p := range fg.srcs { 89*333d2b36SAndroid Build Coastguard Worker ins = append(ins, p.String()) 90*333d2b36SAndroid Build Coastguard Worker outs = append(outs, p.Rel()) 91*333d2b36SAndroid Build Coastguard Worker } 92*333d2b36SAndroid Build Coastguard Worker return []blueprint.JSONAction{ 93*333d2b36SAndroid Build Coastguard Worker blueprint.JSONAction{ 94*333d2b36SAndroid Build Coastguard Worker Inputs: ins, 95*333d2b36SAndroid Build Coastguard Worker Outputs: outs, 96*333d2b36SAndroid Build Coastguard Worker }, 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker} 99*333d2b36SAndroid Build Coastguard Worker 100*333d2b36SAndroid Build Coastguard Workerfunc (fg *fileGroup) GenerateAndroidBuildActions(ctx ModuleContext) { 101*333d2b36SAndroid Build Coastguard Worker srcs := PathsForModuleSrcExcludes(ctx, fg.properties.Srcs.GetOrDefault(ctx, nil), fg.properties.Exclude_srcs.GetOrDefault(ctx, nil)) 102*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, PathsForModuleSrc(ctx, fg.properties.Device_first_srcs.GetOrDefault(ctx, nil))...) 103*333d2b36SAndroid Build Coastguard Worker srcs = append(srcs, PathsForModuleSrc(ctx, fg.properties.Device_common_srcs.GetOrDefault(ctx, nil))...) 104*333d2b36SAndroid Build Coastguard Worker if fg.properties.Path != nil { 105*333d2b36SAndroid Build Coastguard Worker srcs = PathsWithModuleSrcSubDir(ctx, srcs, String(fg.properties.Path)) 106*333d2b36SAndroid Build Coastguard Worker } 107*333d2b36SAndroid Build Coastguard Worker SetProvider(ctx, blueprint.SrcsFileProviderKey, blueprint.SrcsFileProviderData{SrcPaths: srcs.Strings()}) 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker var aconfigDeclarations []string 110*333d2b36SAndroid Build Coastguard Worker var intermediateCacheOutputPaths Paths 111*333d2b36SAndroid Build Coastguard Worker var srcjars Paths 112*333d2b36SAndroid Build Coastguard Worker modeInfos := make(map[string]ModeInfo) 113*333d2b36SAndroid Build Coastguard Worker ctx.VisitDirectDeps(func(module Module) { 114*333d2b36SAndroid Build Coastguard Worker if dep, ok := OtherModuleProvider(ctx, module, CodegenInfoProvider); ok { 115*333d2b36SAndroid Build Coastguard Worker aconfigDeclarations = append(aconfigDeclarations, dep.AconfigDeclarations...) 116*333d2b36SAndroid Build Coastguard Worker intermediateCacheOutputPaths = append(intermediateCacheOutputPaths, dep.IntermediateCacheOutputPaths...) 117*333d2b36SAndroid Build Coastguard Worker srcjars = append(srcjars, dep.Srcjars...) 118*333d2b36SAndroid Build Coastguard Worker maps.Copy(modeInfos, dep.ModeInfos) 119*333d2b36SAndroid Build Coastguard Worker } 120*333d2b36SAndroid Build Coastguard Worker }) 121*333d2b36SAndroid Build Coastguard Worker 122*333d2b36SAndroid Build Coastguard Worker fg.srcs = srcs 123*333d2b36SAndroid Build Coastguard Worker SetProvider(ctx, CodegenInfoProvider, CodegenInfo{ 124*333d2b36SAndroid Build Coastguard Worker AconfigDeclarations: aconfigDeclarations, 125*333d2b36SAndroid Build Coastguard Worker IntermediateCacheOutputPaths: intermediateCacheOutputPaths, 126*333d2b36SAndroid Build Coastguard Worker Srcjars: srcjars, 127*333d2b36SAndroid Build Coastguard Worker ModeInfos: modeInfos, 128*333d2b36SAndroid Build Coastguard Worker }) 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc (fg *fileGroup) Srcs() Paths { 132*333d2b36SAndroid Build Coastguard Worker return append(Paths{}, fg.srcs...) 133*333d2b36SAndroid Build Coastguard Worker} 134*333d2b36SAndroid Build Coastguard Worker 135*333d2b36SAndroid Build Coastguard Workerfunc (fg *fileGroup) MakeVars(ctx MakeVarsModuleContext) { 136*333d2b36SAndroid Build Coastguard Worker if makeVar := String(fg.properties.Export_to_make_var); makeVar != "" { 137*333d2b36SAndroid Build Coastguard Worker ctx.StrictRaw(makeVar, strings.Join(fg.srcs.Strings(), " ")) 138*333d2b36SAndroid Build Coastguard Worker } 139*333d2b36SAndroid Build Coastguard Worker} 140*333d2b36SAndroid Build Coastguard Worker 141*333d2b36SAndroid Build Coastguard Worker// Defaults 142*333d2b36SAndroid Build Coastguard Workertype FileGroupDefaults struct { 143*333d2b36SAndroid Build Coastguard Worker ModuleBase 144*333d2b36SAndroid Build Coastguard Worker DefaultsModuleBase 145*333d2b36SAndroid Build Coastguard Worker} 146*333d2b36SAndroid Build Coastguard Worker 147*333d2b36SAndroid Build Coastguard Workerfunc FileGroupDefaultsFactory() Module { 148*333d2b36SAndroid Build Coastguard Worker module := &FileGroupDefaults{} 149*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&fileGroupProperties{}) 150*333d2b36SAndroid Build Coastguard Worker InitDefaultsModule(module) 151*333d2b36SAndroid Build Coastguard Worker 152*333d2b36SAndroid Build Coastguard Worker return module 153*333d2b36SAndroid Build Coastguard Worker} 154*333d2b36SAndroid Build Coastguard Worker 155*333d2b36SAndroid Build Coastguard Worker// Collect information for opening IDE project files in java/jdeps.go. 156*333d2b36SAndroid Build Coastguard Worker// Copied from build/soong/genrule/genrule.go 157*333d2b36SAndroid Build Coastguard Workerfunc (fg *fileGroup) IDEInfo(ctx BaseModuleContext, dpInfo *IdeInfo) { 158*333d2b36SAndroid Build Coastguard Worker dpInfo.Srcs = append(dpInfo.Srcs, fg.Srcs().Strings()...) 159*333d2b36SAndroid Build Coastguard Worker for _, src := range fg.properties.Srcs.GetOrDefault(ctx, nil) { 160*333d2b36SAndroid Build Coastguard Worker if mod, _ := SrcIsModuleWithTag(src); mod != "" { 161*333d2b36SAndroid Build Coastguard Worker // Register the module name without any tags in `Deps` 162*333d2b36SAndroid Build Coastguard Worker dpInfo.Deps = append(dpInfo.Deps, mod) 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker } 165*333d2b36SAndroid Build Coastguard Worker} 166