xref: /aosp_15_r20/build/soong/android/filegroup.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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