xref: /aosp_15_r20/build/soong/cc/gen.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2015 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 cc
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
19*333d2b36SAndroid Build Coastguard Worker	"strings"
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Worker	"android/soong/aidl_library"
22*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
23*333d2b36SAndroid Build Coastguard Worker
24*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workerfunc init() {
28*333d2b36SAndroid Build Coastguard Worker	pctx.SourcePathVariable("lexCmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/flex")
29*333d2b36SAndroid Build Coastguard Worker	pctx.SourcePathVariable("m4Cmd", "prebuilts/build-tools/${config.HostPrebuiltTag}/bin/m4")
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("aidlCmd", "aidl-cpp")
32*333d2b36SAndroid Build Coastguard Worker	pctx.HostBinToolVariable("syspropCmd", "sysprop_cpp")
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workervar (
36*333d2b36SAndroid Build Coastguard Worker	lex = pctx.AndroidStaticRule("lex",
37*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
38*333d2b36SAndroid Build Coastguard Worker			Command:     "M4=$m4Cmd $lexCmd $flags -o$out $in",
39*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$lexCmd", "$m4Cmd"},
40*333d2b36SAndroid Build Coastguard Worker		}, "flags")
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	sysprop = pctx.AndroidStaticRule("sysprop",
43*333d2b36SAndroid Build Coastguard Worker		blueprint.RuleParams{
44*333d2b36SAndroid Build Coastguard Worker			Command: "$syspropCmd --header-dir=$headerOutDir --public-header-dir=$publicOutDir " +
45*333d2b36SAndroid Build Coastguard Worker				"--source-dir=$srcOutDir --include-name=$includeName $in",
46*333d2b36SAndroid Build Coastguard Worker			CommandDeps: []string{"$syspropCmd"},
47*333d2b36SAndroid Build Coastguard Worker		},
48*333d2b36SAndroid Build Coastguard Worker		"headerOutDir", "publicOutDir", "srcOutDir", "includeName")
49*333d2b36SAndroid Build Coastguard Worker)
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Workertype YaccProperties struct {
52*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for .y and .yy compiles
53*333d2b36SAndroid Build Coastguard Worker	Flags []string
54*333d2b36SAndroid Build Coastguard Worker
55*333d2b36SAndroid Build Coastguard Worker	// whether the yacc files will produce a location.hh file
56*333d2b36SAndroid Build Coastguard Worker	Gen_location_hh *bool
57*333d2b36SAndroid Build Coastguard Worker
58*333d2b36SAndroid Build Coastguard Worker	// whether the yacc files will product a position.hh file
59*333d2b36SAndroid Build Coastguard Worker	Gen_position_hh *bool
60*333d2b36SAndroid Build Coastguard Worker}
61*333d2b36SAndroid Build Coastguard Worker
62*333d2b36SAndroid Build Coastguard Workerfunc genYacc(ctx android.ModuleContext, rule *android.RuleBuilder, yaccFile android.Path,
63*333d2b36SAndroid Build Coastguard Worker	outFile android.ModuleGenPath, props *YaccProperties) (headerFiles android.Paths) {
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	outDir := android.PathForModuleGen(ctx, "yacc")
66*333d2b36SAndroid Build Coastguard Worker	headerFile := android.GenPathWithExt(ctx, "yacc", yaccFile, "h")
67*333d2b36SAndroid Build Coastguard Worker	ret := android.Paths{headerFile}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Worker	cmd := rule.Command()
70*333d2b36SAndroid Build Coastguard Worker
71*333d2b36SAndroid Build Coastguard Worker	// Fix up #line markers to not use the sbox temporary directory
72*333d2b36SAndroid Build Coastguard Worker	// android.sboxPathForOutput(outDir, outDir) returns the sbox placeholder for the out
73*333d2b36SAndroid Build Coastguard Worker	// directory itself, without any filename appended.
74*333d2b36SAndroid Build Coastguard Worker	sboxOutDir := cmd.PathForOutput(outDir)
75*333d2b36SAndroid Build Coastguard Worker	sedCmd := "sed -i.bak 's#" + sboxOutDir + "#" + outDir.String() + "#'"
76*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text(sedCmd).Input(outFile)
77*333d2b36SAndroid Build Coastguard Worker	rule.Command().Text(sedCmd).Input(headerFile)
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Worker	var flags []string
80*333d2b36SAndroid Build Coastguard Worker	if props != nil {
81*333d2b36SAndroid Build Coastguard Worker		flags = props.Flags
82*333d2b36SAndroid Build Coastguard Worker
83*333d2b36SAndroid Build Coastguard Worker		if Bool(props.Gen_location_hh) {
84*333d2b36SAndroid Build Coastguard Worker			locationHeader := outFile.InSameDir(ctx, "location.hh")
85*333d2b36SAndroid Build Coastguard Worker			ret = append(ret, locationHeader)
86*333d2b36SAndroid Build Coastguard Worker			cmd.ImplicitOutput(locationHeader)
87*333d2b36SAndroid Build Coastguard Worker			rule.Command().Text(sedCmd).Input(locationHeader)
88*333d2b36SAndroid Build Coastguard Worker		}
89*333d2b36SAndroid Build Coastguard Worker		if Bool(props.Gen_position_hh) {
90*333d2b36SAndroid Build Coastguard Worker			positionHeader := outFile.InSameDir(ctx, "position.hh")
91*333d2b36SAndroid Build Coastguard Worker			ret = append(ret, positionHeader)
92*333d2b36SAndroid Build Coastguard Worker			cmd.ImplicitOutput(positionHeader)
93*333d2b36SAndroid Build Coastguard Worker			rule.Command().Text(sedCmd).Input(positionHeader)
94*333d2b36SAndroid Build Coastguard Worker		}
95*333d2b36SAndroid Build Coastguard Worker	}
96*333d2b36SAndroid Build Coastguard Worker
97*333d2b36SAndroid Build Coastguard Worker	cmd.Text("BISON_PKGDATADIR=prebuilts/build-tools/common/bison").
98*333d2b36SAndroid Build Coastguard Worker		FlagWithInput("M4=", ctx.Config().PrebuiltBuildTool(ctx, "m4")).
99*333d2b36SAndroid Build Coastguard Worker		PrebuiltBuildTool(ctx, "bison").
100*333d2b36SAndroid Build Coastguard Worker		Flag("-d").
101*333d2b36SAndroid Build Coastguard Worker		Flags(flags).
102*333d2b36SAndroid Build Coastguard Worker		FlagWithOutput("--defines=", headerFile).
103*333d2b36SAndroid Build Coastguard Worker		Flag("-o").Output(outFile).Input(yaccFile)
104*333d2b36SAndroid Build Coastguard Worker
105*333d2b36SAndroid Build Coastguard Worker	return ret
106*333d2b36SAndroid Build Coastguard Worker}
107*333d2b36SAndroid Build Coastguard Worker
108*333d2b36SAndroid Build Coastguard Workerfunc genAidl(
109*333d2b36SAndroid Build Coastguard Worker	ctx android.ModuleContext,
110*333d2b36SAndroid Build Coastguard Worker	rule *android.RuleBuilder,
111*333d2b36SAndroid Build Coastguard Worker	outDirBase string,
112*333d2b36SAndroid Build Coastguard Worker	aidlFile android.Path,
113*333d2b36SAndroid Build Coastguard Worker	aidlHdrs android.Paths,
114*333d2b36SAndroid Build Coastguard Worker	aidlFlags string,
115*333d2b36SAndroid Build Coastguard Worker) (cppFile android.OutputPath, headerFiles android.Paths) {
116*333d2b36SAndroid Build Coastguard Worker	aidlPackage := strings.TrimSuffix(aidlFile.Rel(), aidlFile.Base())
117*333d2b36SAndroid Build Coastguard Worker	baseName := strings.TrimSuffix(aidlFile.Base(), aidlFile.Ext())
118*333d2b36SAndroid Build Coastguard Worker	shortName := baseName
119*333d2b36SAndroid Build Coastguard Worker	// TODO(b/111362593): aidl_to_cpp_common.cpp uses heuristics to figure out if
120*333d2b36SAndroid Build Coastguard Worker	//   an interface name has a leading I. Those same heuristics have been
121*333d2b36SAndroid Build Coastguard Worker	//   moved here.
122*333d2b36SAndroid Build Coastguard Worker	if len(baseName) >= 2 && baseName[0] == 'I' &&
123*333d2b36SAndroid Build Coastguard Worker		strings.ToUpper(baseName)[1] == baseName[1] {
124*333d2b36SAndroid Build Coastguard Worker		shortName = strings.TrimPrefix(baseName, "I")
125*333d2b36SAndroid Build Coastguard Worker	}
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker	outDir := android.PathForModuleGen(ctx, outDirBase)
128*333d2b36SAndroid Build Coastguard Worker	cppFile = outDir.Join(ctx, aidlPackage, baseName+".cpp")
129*333d2b36SAndroid Build Coastguard Worker	depFile := outDir.Join(ctx, aidlPackage, baseName+".cpp.d")
130*333d2b36SAndroid Build Coastguard Worker	headerI := outDir.Join(ctx, aidlPackage, baseName+".h")
131*333d2b36SAndroid Build Coastguard Worker	headerBn := outDir.Join(ctx, aidlPackage, "Bn"+shortName+".h")
132*333d2b36SAndroid Build Coastguard Worker	headerBp := outDir.Join(ctx, aidlPackage, "Bp"+shortName+".h")
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker	cmd := rule.Command()
135*333d2b36SAndroid Build Coastguard Worker	cmd.BuiltTool("aidl-cpp").
136*333d2b36SAndroid Build Coastguard Worker		// libc++ is default stl for aidl-cpp (a cc_binary_host module)
137*333d2b36SAndroid Build Coastguard Worker		ImplicitTool(ctx.Config().HostCcSharedLibPath(ctx, "libc++")).
138*333d2b36SAndroid Build Coastguard Worker		FlagWithDepFile("-d", depFile).
139*333d2b36SAndroid Build Coastguard Worker		Flag("--ninja").
140*333d2b36SAndroid Build Coastguard Worker		Flag(aidlFlags).
141*333d2b36SAndroid Build Coastguard Worker		Input(aidlFile).
142*333d2b36SAndroid Build Coastguard Worker		OutputDir().
143*333d2b36SAndroid Build Coastguard Worker		Output(cppFile).
144*333d2b36SAndroid Build Coastguard Worker		ImplicitOutputs(android.WritablePaths{
145*333d2b36SAndroid Build Coastguard Worker			headerI,
146*333d2b36SAndroid Build Coastguard Worker			headerBn,
147*333d2b36SAndroid Build Coastguard Worker			headerBp,
148*333d2b36SAndroid Build Coastguard Worker		})
149*333d2b36SAndroid Build Coastguard Worker
150*333d2b36SAndroid Build Coastguard Worker	if aidlHdrs != nil {
151*333d2b36SAndroid Build Coastguard Worker		cmd.Implicits(aidlHdrs)
152*333d2b36SAndroid Build Coastguard Worker	}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker	return cppFile, android.Paths{
155*333d2b36SAndroid Build Coastguard Worker		headerI,
156*333d2b36SAndroid Build Coastguard Worker		headerBn,
157*333d2b36SAndroid Build Coastguard Worker		headerBp,
158*333d2b36SAndroid Build Coastguard Worker	}
159*333d2b36SAndroid Build Coastguard Worker}
160*333d2b36SAndroid Build Coastguard Worker
161*333d2b36SAndroid Build Coastguard Workertype LexProperties struct {
162*333d2b36SAndroid Build Coastguard Worker	// list of module-specific flags that will be used for .l and .ll compiles
163*333d2b36SAndroid Build Coastguard Worker	Flags []string
164*333d2b36SAndroid Build Coastguard Worker}
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Workerfunc genLex(ctx android.ModuleContext, lexFile android.Path, outFile android.ModuleGenPath, props *LexProperties) {
167*333d2b36SAndroid Build Coastguard Worker	var flags []string
168*333d2b36SAndroid Build Coastguard Worker	if props != nil {
169*333d2b36SAndroid Build Coastguard Worker		flags = props.Flags
170*333d2b36SAndroid Build Coastguard Worker	}
171*333d2b36SAndroid Build Coastguard Worker	flagsString := strings.Join(flags[:], " ")
172*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
173*333d2b36SAndroid Build Coastguard Worker		Rule:        lex,
174*333d2b36SAndroid Build Coastguard Worker		Description: "lex " + lexFile.Rel(),
175*333d2b36SAndroid Build Coastguard Worker		Output:      outFile,
176*333d2b36SAndroid Build Coastguard Worker		Input:       lexFile,
177*333d2b36SAndroid Build Coastguard Worker		Args:        map[string]string{"flags": flagsString},
178*333d2b36SAndroid Build Coastguard Worker	})
179*333d2b36SAndroid Build Coastguard Worker}
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Workerfunc genSysprop(ctx android.ModuleContext, syspropFile android.Path) (android.Path, android.Paths) {
182*333d2b36SAndroid Build Coastguard Worker	headerFile := android.PathForModuleGen(ctx, "sysprop", "include", syspropFile.Rel()+".h")
183*333d2b36SAndroid Build Coastguard Worker	publicHeaderFile := android.PathForModuleGen(ctx, "sysprop/public", "include", syspropFile.Rel()+".h")
184*333d2b36SAndroid Build Coastguard Worker	cppFile := android.PathForModuleGen(ctx, "sysprop", syspropFile.Rel()+".cpp")
185*333d2b36SAndroid Build Coastguard Worker
186*333d2b36SAndroid Build Coastguard Worker	headers := android.WritablePaths{headerFile, publicHeaderFile}
187*333d2b36SAndroid Build Coastguard Worker
188*333d2b36SAndroid Build Coastguard Worker	ctx.Build(pctx, android.BuildParams{
189*333d2b36SAndroid Build Coastguard Worker		Rule:            sysprop,
190*333d2b36SAndroid Build Coastguard Worker		Description:     "sysprop " + syspropFile.Rel(),
191*333d2b36SAndroid Build Coastguard Worker		Output:          cppFile,
192*333d2b36SAndroid Build Coastguard Worker		ImplicitOutputs: headers,
193*333d2b36SAndroid Build Coastguard Worker		Input:           syspropFile,
194*333d2b36SAndroid Build Coastguard Worker		Args: map[string]string{
195*333d2b36SAndroid Build Coastguard Worker			"headerOutDir": filepath.Dir(headerFile.String()),
196*333d2b36SAndroid Build Coastguard Worker			"publicOutDir": filepath.Dir(publicHeaderFile.String()),
197*333d2b36SAndroid Build Coastguard Worker			"srcOutDir":    filepath.Dir(cppFile.String()),
198*333d2b36SAndroid Build Coastguard Worker			"includeName":  syspropFile.Rel() + ".h",
199*333d2b36SAndroid Build Coastguard Worker		},
200*333d2b36SAndroid Build Coastguard Worker	})
201*333d2b36SAndroid Build Coastguard Worker
202*333d2b36SAndroid Build Coastguard Worker	return cppFile, headers.Paths()
203*333d2b36SAndroid Build Coastguard Worker}
204*333d2b36SAndroid Build Coastguard Worker
205*333d2b36SAndroid Build Coastguard Worker// Used to communicate information from the genSources method back to the library code that uses
206*333d2b36SAndroid Build Coastguard Worker// it.
207*333d2b36SAndroid Build Coastguard Workertype generatedSourceInfo struct {
208*333d2b36SAndroid Build Coastguard Worker	// The headers created from .proto files
209*333d2b36SAndroid Build Coastguard Worker	protoHeaders android.Paths
210*333d2b36SAndroid Build Coastguard Worker
211*333d2b36SAndroid Build Coastguard Worker	// The files that can be used as order only dependencies in order to ensure that the proto header
212*333d2b36SAndroid Build Coastguard Worker	// files are up to date.
213*333d2b36SAndroid Build Coastguard Worker	protoOrderOnlyDeps android.Paths
214*333d2b36SAndroid Build Coastguard Worker
215*333d2b36SAndroid Build Coastguard Worker	// The headers created from .aidl files
216*333d2b36SAndroid Build Coastguard Worker	aidlHeaders android.Paths
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Worker	// The files that can be used as order only dependencies in order to ensure that the aidl header
219*333d2b36SAndroid Build Coastguard Worker	// files are up to date.
220*333d2b36SAndroid Build Coastguard Worker	aidlOrderOnlyDeps android.Paths
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	// The headers created from .sysprop files
223*333d2b36SAndroid Build Coastguard Worker	syspropHeaders android.Paths
224*333d2b36SAndroid Build Coastguard Worker
225*333d2b36SAndroid Build Coastguard Worker	// The files that can be used as order only dependencies in order to ensure that the sysprop
226*333d2b36SAndroid Build Coastguard Worker	// header files are up to date.
227*333d2b36SAndroid Build Coastguard Worker	syspropOrderOnlyDeps android.Paths
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Worker	// List of generated code path.
230*333d2b36SAndroid Build Coastguard Worker	//   ex) '*.cpp' files generated from '*.ll / *.yy'.
231*333d2b36SAndroid Build Coastguard Worker	generatedSources android.Paths
232*333d2b36SAndroid Build Coastguard Worker}
233*333d2b36SAndroid Build Coastguard Worker
234*333d2b36SAndroid Build Coastguard Workerfunc genSources(
235*333d2b36SAndroid Build Coastguard Worker	ctx android.ModuleContext,
236*333d2b36SAndroid Build Coastguard Worker	aidlLibraryInfos []aidl_library.AidlLibraryInfo,
237*333d2b36SAndroid Build Coastguard Worker	srcFiles android.Paths,
238*333d2b36SAndroid Build Coastguard Worker	buildFlags builderFlags,
239*333d2b36SAndroid Build Coastguard Worker) (android.Paths, android.Paths, generatedSourceInfo) {
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Worker	var info generatedSourceInfo
242*333d2b36SAndroid Build Coastguard Worker
243*333d2b36SAndroid Build Coastguard Worker	var deps android.Paths
244*333d2b36SAndroid Build Coastguard Worker	var rsFiles android.Paths
245*333d2b36SAndroid Build Coastguard Worker
246*333d2b36SAndroid Build Coastguard Worker	// aidlRule supports compiling aidl files from srcs prop while aidlLibraryRule supports
247*333d2b36SAndroid Build Coastguard Worker	// compiling aidl files from aidl_library modules specified in aidl.libs prop.
248*333d2b36SAndroid Build Coastguard Worker	// The rules are separated so that they don't wipe out the other's outputDir
249*333d2b36SAndroid Build Coastguard Worker	var aidlRule *android.RuleBuilder
250*333d2b36SAndroid Build Coastguard Worker	var aidlLibraryRule *android.RuleBuilder
251*333d2b36SAndroid Build Coastguard Worker
252*333d2b36SAndroid Build Coastguard Worker	var yaccRule_ *android.RuleBuilder
253*333d2b36SAndroid Build Coastguard Worker	yaccRule := func() *android.RuleBuilder {
254*333d2b36SAndroid Build Coastguard Worker		if yaccRule_ == nil {
255*333d2b36SAndroid Build Coastguard Worker			yaccRule_ = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "yacc"),
256*333d2b36SAndroid Build Coastguard Worker				android.PathForModuleGen(ctx, "yacc.sbox.textproto"))
257*333d2b36SAndroid Build Coastguard Worker		}
258*333d2b36SAndroid Build Coastguard Worker		return yaccRule_
259*333d2b36SAndroid Build Coastguard Worker	}
260*333d2b36SAndroid Build Coastguard Worker
261*333d2b36SAndroid Build Coastguard Worker	var generatedSources android.Paths = nil
262*333d2b36SAndroid Build Coastguard Worker
263*333d2b36SAndroid Build Coastguard Worker	for i, srcFile := range srcFiles {
264*333d2b36SAndroid Build Coastguard Worker		switch srcFile.Ext() {
265*333d2b36SAndroid Build Coastguard Worker		case ".y":
266*333d2b36SAndroid Build Coastguard Worker			cFile := android.GenPathWithExt(ctx, "yacc", srcFile, "c")
267*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cFile
268*333d2b36SAndroid Build Coastguard Worker			deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cFile, buildFlags.yacc)...)
269*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cFile)
270*333d2b36SAndroid Build Coastguard Worker		case ".yy":
271*333d2b36SAndroid Build Coastguard Worker			cppFile := android.GenPathWithExt(ctx, "yacc", srcFile, "cpp")
272*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cppFile
273*333d2b36SAndroid Build Coastguard Worker			deps = append(deps, genYacc(ctx, yaccRule(), srcFile, cppFile, buildFlags.yacc)...)
274*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cppFile)
275*333d2b36SAndroid Build Coastguard Worker		case ".l":
276*333d2b36SAndroid Build Coastguard Worker			cFile := android.GenPathWithExt(ctx, "lex", srcFile, "c")
277*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cFile
278*333d2b36SAndroid Build Coastguard Worker			genLex(ctx, srcFile, cFile, buildFlags.lex)
279*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cFile)
280*333d2b36SAndroid Build Coastguard Worker		case ".ll":
281*333d2b36SAndroid Build Coastguard Worker			cppFile := android.GenPathWithExt(ctx, "lex", srcFile, "cpp")
282*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cppFile
283*333d2b36SAndroid Build Coastguard Worker			genLex(ctx, srcFile, cppFile, buildFlags.lex)
284*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cppFile)
285*333d2b36SAndroid Build Coastguard Worker		case ".proto":
286*333d2b36SAndroid Build Coastguard Worker			ccFile, headerFile := genProto(ctx, srcFile, buildFlags)
287*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = ccFile
288*333d2b36SAndroid Build Coastguard Worker			info.protoHeaders = append(info.protoHeaders, headerFile)
289*333d2b36SAndroid Build Coastguard Worker			// Use the generated header as an order only dep to ensure that it is up to date when needed.
290*333d2b36SAndroid Build Coastguard Worker			info.protoOrderOnlyDeps = append(info.protoOrderOnlyDeps, headerFile)
291*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, ccFile)
292*333d2b36SAndroid Build Coastguard Worker		case ".aidl":
293*333d2b36SAndroid Build Coastguard Worker			if aidlRule == nil {
294*333d2b36SAndroid Build Coastguard Worker				aidlRule = android.NewRuleBuilder(pctx, ctx).Sbox(android.PathForModuleGen(ctx, "aidl"),
295*333d2b36SAndroid Build Coastguard Worker					android.PathForModuleGen(ctx, "aidl.sbox.textproto"))
296*333d2b36SAndroid Build Coastguard Worker			}
297*333d2b36SAndroid Build Coastguard Worker			baseDir := strings.TrimSuffix(srcFile.String(), srcFile.Rel())
298*333d2b36SAndroid Build Coastguard Worker			cppFile, aidlHeaders := genAidl(
299*333d2b36SAndroid Build Coastguard Worker				ctx,
300*333d2b36SAndroid Build Coastguard Worker				aidlRule,
301*333d2b36SAndroid Build Coastguard Worker				"aidl",
302*333d2b36SAndroid Build Coastguard Worker				srcFile,
303*333d2b36SAndroid Build Coastguard Worker				nil,
304*333d2b36SAndroid Build Coastguard Worker				buildFlags.aidlFlags+" -I"+baseDir,
305*333d2b36SAndroid Build Coastguard Worker			)
306*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cppFile
307*333d2b36SAndroid Build Coastguard Worker
308*333d2b36SAndroid Build Coastguard Worker			info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...)
309*333d2b36SAndroid Build Coastguard Worker			// Use the generated headers as order only deps to ensure that they are up to date when
310*333d2b36SAndroid Build Coastguard Worker			// needed.
311*333d2b36SAndroid Build Coastguard Worker			// TODO: Reduce the size of the ninja file by using one order only dep for the whole rule
312*333d2b36SAndroid Build Coastguard Worker			info.aidlOrderOnlyDeps = append(info.aidlOrderOnlyDeps, aidlHeaders...)
313*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cppFile)
314*333d2b36SAndroid Build Coastguard Worker		case ".rscript", ".fs":
315*333d2b36SAndroid Build Coastguard Worker			cppFile := rsGeneratedCppFile(ctx, srcFile)
316*333d2b36SAndroid Build Coastguard Worker			rsFiles = append(rsFiles, srcFiles[i])
317*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cppFile
318*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cppFile)
319*333d2b36SAndroid Build Coastguard Worker		case ".sysprop":
320*333d2b36SAndroid Build Coastguard Worker			cppFile, headerFiles := genSysprop(ctx, srcFile)
321*333d2b36SAndroid Build Coastguard Worker			srcFiles[i] = cppFile
322*333d2b36SAndroid Build Coastguard Worker			info.syspropHeaders = append(info.syspropHeaders, headerFiles...)
323*333d2b36SAndroid Build Coastguard Worker			// Use the generated headers as order only deps to ensure that they are up to date when
324*333d2b36SAndroid Build Coastguard Worker			// needed.
325*333d2b36SAndroid Build Coastguard Worker			info.syspropOrderOnlyDeps = append(info.syspropOrderOnlyDeps, headerFiles...)
326*333d2b36SAndroid Build Coastguard Worker			generatedSources = append(generatedSources, cppFile)
327*333d2b36SAndroid Build Coastguard Worker		}
328*333d2b36SAndroid Build Coastguard Worker	}
329*333d2b36SAndroid Build Coastguard Worker
330*333d2b36SAndroid Build Coastguard Worker	info.generatedSources = generatedSources
331*333d2b36SAndroid Build Coastguard Worker
332*333d2b36SAndroid Build Coastguard Worker	for _, aidlLibraryInfo := range aidlLibraryInfos {
333*333d2b36SAndroid Build Coastguard Worker		if aidlLibraryRule == nil {
334*333d2b36SAndroid Build Coastguard Worker			aidlLibraryRule = android.NewRuleBuilder(pctx, ctx).Sbox(
335*333d2b36SAndroid Build Coastguard Worker				android.PathForModuleGen(ctx, "aidl_library"),
336*333d2b36SAndroid Build Coastguard Worker				android.PathForModuleGen(ctx, "aidl_library.sbox.textproto"),
337*333d2b36SAndroid Build Coastguard Worker			).SandboxInputs()
338*333d2b36SAndroid Build Coastguard Worker		}
339*333d2b36SAndroid Build Coastguard Worker		for _, aidlSrc := range aidlLibraryInfo.Srcs {
340*333d2b36SAndroid Build Coastguard Worker			cppFile, aidlHeaders := genAidl(
341*333d2b36SAndroid Build Coastguard Worker				ctx,
342*333d2b36SAndroid Build Coastguard Worker				aidlLibraryRule,
343*333d2b36SAndroid Build Coastguard Worker				"aidl_library",
344*333d2b36SAndroid Build Coastguard Worker				aidlSrc,
345*333d2b36SAndroid Build Coastguard Worker				aidlLibraryInfo.Hdrs.ToList(),
346*333d2b36SAndroid Build Coastguard Worker				buildFlags.aidlFlags,
347*333d2b36SAndroid Build Coastguard Worker			)
348*333d2b36SAndroid Build Coastguard Worker
349*333d2b36SAndroid Build Coastguard Worker			srcFiles = append(srcFiles, cppFile)
350*333d2b36SAndroid Build Coastguard Worker			info.aidlHeaders = append(info.aidlHeaders, aidlHeaders...)
351*333d2b36SAndroid Build Coastguard Worker			// Use the generated headers as order only deps to ensure that they are up to date when
352*333d2b36SAndroid Build Coastguard Worker			// needed.
353*333d2b36SAndroid Build Coastguard Worker			// TODO: Reduce the size of the ninja file by using one order only dep for the whole rule
354*333d2b36SAndroid Build Coastguard Worker			info.aidlOrderOnlyDeps = append(info.aidlOrderOnlyDeps, aidlHeaders...)
355*333d2b36SAndroid Build Coastguard Worker		}
356*333d2b36SAndroid Build Coastguard Worker	}
357*333d2b36SAndroid Build Coastguard Worker
358*333d2b36SAndroid Build Coastguard Worker	if aidlRule != nil {
359*333d2b36SAndroid Build Coastguard Worker		aidlRule.Build("aidl", "gen aidl")
360*333d2b36SAndroid Build Coastguard Worker	}
361*333d2b36SAndroid Build Coastguard Worker
362*333d2b36SAndroid Build Coastguard Worker	if aidlLibraryRule != nil {
363*333d2b36SAndroid Build Coastguard Worker		aidlLibraryRule.Build("aidl_library", "gen aidl_library")
364*333d2b36SAndroid Build Coastguard Worker	}
365*333d2b36SAndroid Build Coastguard Worker
366*333d2b36SAndroid Build Coastguard Worker	if yaccRule_ != nil {
367*333d2b36SAndroid Build Coastguard Worker		yaccRule_.Build("yacc", "gen yacc")
368*333d2b36SAndroid Build Coastguard Worker	}
369*333d2b36SAndroid Build Coastguard Worker
370*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, info.protoOrderOnlyDeps...)
371*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, info.aidlOrderOnlyDeps...)
372*333d2b36SAndroid Build Coastguard Worker	deps = append(deps, info.syspropOrderOnlyDeps...)
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Worker	if len(rsFiles) > 0 {
375*333d2b36SAndroid Build Coastguard Worker		deps = append(deps, rsGenerateCpp(ctx, rsFiles, buildFlags.rsFlags)...)
376*333d2b36SAndroid Build Coastguard Worker	}
377*333d2b36SAndroid Build Coastguard Worker
378*333d2b36SAndroid Build Coastguard Worker	return srcFiles, deps, info
379*333d2b36SAndroid Build Coastguard Worker}
380