xref: /aosp_15_r20/external/libchrome/soong/bindings_generator.go (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Workerpackage libchrome
2*635a8641SAndroid Build Coastguard Worker
3*635a8641SAndroid Build Coastguard Workerimport (
4*635a8641SAndroid Build Coastguard Worker	"fmt"
5*635a8641SAndroid Build Coastguard Worker	"path"
6*635a8641SAndroid Build Coastguard Worker	"strings"
7*635a8641SAndroid Build Coastguard Worker
8*635a8641SAndroid Build Coastguard Worker	"android/soong/android"
9*635a8641SAndroid Build Coastguard Worker	"android/soong/genrule"
10*635a8641SAndroid Build Coastguard Worker
11*635a8641SAndroid Build Coastguard Worker	"github.com/google/blueprint"
12*635a8641SAndroid Build Coastguard Worker)
13*635a8641SAndroid Build Coastguard Worker
14*635a8641SAndroid Build Coastguard Workerfunc init() {
15*635a8641SAndroid Build Coastguard Worker	android.RegisterModuleType("generate_mojom_downgraded_files", mojomDowngradedFilesFactory)
16*635a8641SAndroid Build Coastguard Worker	android.RegisterModuleType("generate_mojom_pickles", mojomPicklesFactory)
17*635a8641SAndroid Build Coastguard Worker	android.RegisterModuleType("generate_mojom_headers", mojomHeadersFactory)
18*635a8641SAndroid Build Coastguard Worker	android.RegisterModuleType("generate_mojom_srcs", mojomSrcsFactory)
19*635a8641SAndroid Build Coastguard Worker	android.RegisterModuleType("generate_mojom_srcjar", mojomSrcjarFactory)
20*635a8641SAndroid Build Coastguard Worker}
21*635a8641SAndroid Build Coastguard Worker
22*635a8641SAndroid Build Coastguard Workervar (
23*635a8641SAndroid Build Coastguard Worker	pctx = android.NewPackageContext("android/soong/external/libchrome")
24*635a8641SAndroid Build Coastguard Worker
25*635a8641SAndroid Build Coastguard Worker	mojomBindingsGenerator = pctx.HostBinToolVariable("mojomBindingsGenerator", "mojom_bindings_generator")
26*635a8641SAndroid Build Coastguard Worker	mojomTypesDowngrader   = pctx.HostBinToolVariable("mojomTypesDowngrader", "mojom_types_downgrader")
27*635a8641SAndroid Build Coastguard Worker	mergeZips              = pctx.HostBinToolVariable("mergeZips", "merge_zips")
28*635a8641SAndroid Build Coastguard Worker
29*635a8641SAndroid Build Coastguard Worker	downgradeMojomTypesRule = pctx.StaticRule("downgradeMojomTypesRule", blueprint.RuleParams{
30*635a8641SAndroid Build Coastguard Worker		Command: `${mojomTypesDowngrader}
31*635a8641SAndroid Build Coastguard Worker		${in}
32*635a8641SAndroid Build Coastguard Worker		--outdir ${outDir}`,
33*635a8641SAndroid Build Coastguard Worker		CommandDeps: []string{
34*635a8641SAndroid Build Coastguard Worker			"${mojomTypesDowngrader}",
35*635a8641SAndroid Build Coastguard Worker		},
36*635a8641SAndroid Build Coastguard Worker		Description: "Downgrade mojom files $in => $out",
37*635a8641SAndroid Build Coastguard Worker	}, "outDir")
38*635a8641SAndroid Build Coastguard Worker
39*635a8641SAndroid Build Coastguard Worker	generateMojomPicklesRule = pctx.StaticRule("generateMojomPicklesRule", blueprint.RuleParams{
40*635a8641SAndroid Build Coastguard Worker		Command: `${mojomBindingsGenerator}
41*635a8641SAndroid Build Coastguard Worker		--use_bundled_pylibs parse
42*635a8641SAndroid Build Coastguard Worker		-d ${package}
43*635a8641SAndroid Build Coastguard Worker		${flags}
44*635a8641SAndroid Build Coastguard Worker		-o ${outDir}
45*635a8641SAndroid Build Coastguard Worker		${in}`,
46*635a8641SAndroid Build Coastguard Worker		CommandDeps: []string{
47*635a8641SAndroid Build Coastguard Worker			"${mojomBindingsGenerator}",
48*635a8641SAndroid Build Coastguard Worker		},
49*635a8641SAndroid Build Coastguard Worker		Description: "Mojo pickles generation $in => $out",
50*635a8641SAndroid Build Coastguard Worker		Restat:      true,
51*635a8641SAndroid Build Coastguard Worker	}, "package", "flags", "outDir")
52*635a8641SAndroid Build Coastguard Worker
53*635a8641SAndroid Build Coastguard Worker	generateMojomSrcsRule = pctx.StaticRule("generateMojomSrcsRule", blueprint.RuleParams{
54*635a8641SAndroid Build Coastguard Worker		Command: `${mojomBindingsGenerator}
55*635a8641SAndroid Build Coastguard Worker		--use_bundled_pylibs generate
56*635a8641SAndroid Build Coastguard Worker		-o ${outDir}
57*635a8641SAndroid Build Coastguard Worker		-I=${package}:${package}
58*635a8641SAndroid Build Coastguard Worker		-d ${package}
59*635a8641SAndroid Build Coastguard Worker		${flags}
60*635a8641SAndroid Build Coastguard Worker		--bytecode_path=${templateDir}
61*635a8641SAndroid Build Coastguard Worker		--generators=${mojomGenerator}
62*635a8641SAndroid Build Coastguard Worker		--use_new_wrapper_types
63*635a8641SAndroid Build Coastguard Worker		${in}`,
64*635a8641SAndroid Build Coastguard Worker		CommandDeps: []string{
65*635a8641SAndroid Build Coastguard Worker			"${mojomBindingsGenerator}",
66*635a8641SAndroid Build Coastguard Worker		},
67*635a8641SAndroid Build Coastguard Worker		Description: "Mojo sources generation $in => $out",
68*635a8641SAndroid Build Coastguard Worker		Restat:      true,
69*635a8641SAndroid Build Coastguard Worker	}, "mojomGenerator", "package", "flags", "outDir", "templateDir")
70*635a8641SAndroid Build Coastguard Worker
71*635a8641SAndroid Build Coastguard Worker	mergeSrcjarsRule = pctx.StaticRule("mergeSrcjarsRule", blueprint.RuleParams{
72*635a8641SAndroid Build Coastguard Worker		Command: "${mergeZips} ${out} ${in}",
73*635a8641SAndroid Build Coastguard Worker		CommandDeps: []string{
74*635a8641SAndroid Build Coastguard Worker			"${mergeZips}",
75*635a8641SAndroid Build Coastguard Worker		},
76*635a8641SAndroid Build Coastguard Worker		Description: "Merge .srcjars $in => $out",
77*635a8641SAndroid Build Coastguard Worker	})
78*635a8641SAndroid Build Coastguard Worker)
79*635a8641SAndroid Build Coastguard Worker
80*635a8641SAndroid Build Coastguard Workertype mojomDowngradedFilesProperties struct {
81*635a8641SAndroid Build Coastguard Worker	// list of input files
82*635a8641SAndroid Build Coastguard Worker	Srcs []string `android:"path"`
83*635a8641SAndroid Build Coastguard Worker}
84*635a8641SAndroid Build Coastguard Worker
85*635a8641SAndroid Build Coastguard Workertype mojomDowngradedFiles struct {
86*635a8641SAndroid Build Coastguard Worker	android.ModuleBase
87*635a8641SAndroid Build Coastguard Worker
88*635a8641SAndroid Build Coastguard Worker	properties mojomDowngradedFilesProperties
89*635a8641SAndroid Build Coastguard Worker
90*635a8641SAndroid Build Coastguard Worker	generatedSrcs android.Paths
91*635a8641SAndroid Build Coastguard Worker	outDir        android.Path
92*635a8641SAndroid Build Coastguard Worker}
93*635a8641SAndroid Build Coastguard Worker
94*635a8641SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*mojomDowngradedFiles)(nil)
95*635a8641SAndroid Build Coastguard Worker
96*635a8641SAndroid Build Coastguard Workerfunc (m *mojomDowngradedFiles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
97*635a8641SAndroid Build Coastguard Worker	m.outDir = android.PathForModuleGen(ctx, "")
98*635a8641SAndroid Build Coastguard Worker
99*635a8641SAndroid Build Coastguard Worker	for _, in := range android.PathsForModuleSrc(ctx, m.properties.Srcs) {
100*635a8641SAndroid Build Coastguard Worker		if !strings.HasSuffix(in.Rel(), ".mojom") {
101*635a8641SAndroid Build Coastguard Worker			ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
102*635a8641SAndroid Build Coastguard Worker			continue
103*635a8641SAndroid Build Coastguard Worker		}
104*635a8641SAndroid Build Coastguard Worker
105*635a8641SAndroid Build Coastguard Worker		out := android.PathForModuleGen(ctx, in.Rel())
106*635a8641SAndroid Build Coastguard Worker		m.generatedSrcs = append(m.generatedSrcs, out)
107*635a8641SAndroid Build Coastguard Worker
108*635a8641SAndroid Build Coastguard Worker		ctx.ModuleBuild(pctx, android.ModuleBuildParams{
109*635a8641SAndroid Build Coastguard Worker			Rule:   downgradeMojomTypesRule,
110*635a8641SAndroid Build Coastguard Worker			Input:  in,
111*635a8641SAndroid Build Coastguard Worker			Output: out,
112*635a8641SAndroid Build Coastguard Worker			Args: map[string]string{
113*635a8641SAndroid Build Coastguard Worker				"outDir":  path.Dir(out.String()),
114*635a8641SAndroid Build Coastguard Worker			},
115*635a8641SAndroid Build Coastguard Worker		})
116*635a8641SAndroid Build Coastguard Worker	}
117*635a8641SAndroid Build Coastguard Worker}
118*635a8641SAndroid Build Coastguard Worker
119*635a8641SAndroid Build Coastguard Workerfunc (m *mojomDowngradedFiles) GeneratedHeaderDirs() android.Paths {
120*635a8641SAndroid Build Coastguard Worker	return nil
121*635a8641SAndroid Build Coastguard Worker}
122*635a8641SAndroid Build Coastguard Worker
123*635a8641SAndroid Build Coastguard Workerfunc (m *mojomDowngradedFiles) GeneratedDeps() android.Paths {
124*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
125*635a8641SAndroid Build Coastguard Worker}
126*635a8641SAndroid Build Coastguard Worker
127*635a8641SAndroid Build Coastguard Workerfunc (m *mojomDowngradedFiles) GeneratedSourceFiles() android.Paths {
128*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
129*635a8641SAndroid Build Coastguard Worker}
130*635a8641SAndroid Build Coastguard Worker
131*635a8641SAndroid Build Coastguard Workerfunc (m *mojomDowngradedFiles) Srcs() android.Paths {
132*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
133*635a8641SAndroid Build Coastguard Worker}
134*635a8641SAndroid Build Coastguard Worker
135*635a8641SAndroid Build Coastguard Workerfunc mojomDowngradedFilesFactory() android.Module {
136*635a8641SAndroid Build Coastguard Worker	m := &mojomDowngradedFiles{}
137*635a8641SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
138*635a8641SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
139*635a8641SAndroid Build Coastguard Worker	return m
140*635a8641SAndroid Build Coastguard Worker}
141*635a8641SAndroid Build Coastguard Worker
142*635a8641SAndroid Build Coastguard Workertype mojomPicklesProperties struct {
143*635a8641SAndroid Build Coastguard Worker	// list of input files
144*635a8641SAndroid Build Coastguard Worker	Srcs []string `android:"path"`
145*635a8641SAndroid Build Coastguard Worker}
146*635a8641SAndroid Build Coastguard Worker
147*635a8641SAndroid Build Coastguard Workertype mojomPickles struct {
148*635a8641SAndroid Build Coastguard Worker	android.ModuleBase
149*635a8641SAndroid Build Coastguard Worker
150*635a8641SAndroid Build Coastguard Worker	properties mojomPicklesProperties
151*635a8641SAndroid Build Coastguard Worker
152*635a8641SAndroid Build Coastguard Worker	generatedSrcs android.Paths
153*635a8641SAndroid Build Coastguard Worker	outDir        android.Path
154*635a8641SAndroid Build Coastguard Worker}
155*635a8641SAndroid Build Coastguard Worker
156*635a8641SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*mojomPickles)(nil)
157*635a8641SAndroid Build Coastguard Worker
158*635a8641SAndroid Build Coastguard Workerfunc (m *mojomPickles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
159*635a8641SAndroid Build Coastguard Worker	m.outDir = android.PathForModuleGen(ctx, "")
160*635a8641SAndroid Build Coastguard Worker
161*635a8641SAndroid Build Coastguard Worker	for _, in := range android.PathsForModuleSrc(ctx, m.properties.Srcs) {
162*635a8641SAndroid Build Coastguard Worker		if !strings.HasSuffix(in.Rel(), ".mojom") {
163*635a8641SAndroid Build Coastguard Worker			ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
164*635a8641SAndroid Build Coastguard Worker			continue
165*635a8641SAndroid Build Coastguard Worker		}
166*635a8641SAndroid Build Coastguard Worker
167*635a8641SAndroid Build Coastguard Worker		srcRoot := strings.TrimSuffix(in.String(), in.Rel())
168*635a8641SAndroid Build Coastguard Worker
169*635a8641SAndroid Build Coastguard Worker		relStem := strings.TrimSuffix(in.Rel(), ".mojom")
170*635a8641SAndroid Build Coastguard Worker
171*635a8641SAndroid Build Coastguard Worker		out := android.PathForModuleGen(ctx, relStem+".p")
172*635a8641SAndroid Build Coastguard Worker		m.generatedSrcs = append(m.generatedSrcs, out)
173*635a8641SAndroid Build Coastguard Worker
174*635a8641SAndroid Build Coastguard Worker		ctx.ModuleBuild(pctx, android.ModuleBuildParams{
175*635a8641SAndroid Build Coastguard Worker			Rule:   generateMojomPicklesRule,
176*635a8641SAndroid Build Coastguard Worker			Input:  in,
177*635a8641SAndroid Build Coastguard Worker			Output: out,
178*635a8641SAndroid Build Coastguard Worker			Args: map[string]string{
179*635a8641SAndroid Build Coastguard Worker				"package": srcRoot,
180*635a8641SAndroid Build Coastguard Worker				"outDir":  m.outDir.String(),
181*635a8641SAndroid Build Coastguard Worker			},
182*635a8641SAndroid Build Coastguard Worker		})
183*635a8641SAndroid Build Coastguard Worker	}
184*635a8641SAndroid Build Coastguard Worker}
185*635a8641SAndroid Build Coastguard Worker
186*635a8641SAndroid Build Coastguard Workerfunc (m *mojomPickles) GeneratedHeaderDirs() android.Paths {
187*635a8641SAndroid Build Coastguard Worker	return nil
188*635a8641SAndroid Build Coastguard Worker}
189*635a8641SAndroid Build Coastguard Worker
190*635a8641SAndroid Build Coastguard Workerfunc (m *mojomPickles) GeneratedDeps() android.Paths {
191*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
192*635a8641SAndroid Build Coastguard Worker}
193*635a8641SAndroid Build Coastguard Worker
194*635a8641SAndroid Build Coastguard Workerfunc (m *mojomPickles) GeneratedSourceFiles() android.Paths {
195*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
196*635a8641SAndroid Build Coastguard Worker}
197*635a8641SAndroid Build Coastguard Worker
198*635a8641SAndroid Build Coastguard Workerfunc (m *mojomPickles) Srcs() android.Paths {
199*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
200*635a8641SAndroid Build Coastguard Worker}
201*635a8641SAndroid Build Coastguard Worker
202*635a8641SAndroid Build Coastguard Workerfunc mojomPicklesFactory() android.Module {
203*635a8641SAndroid Build Coastguard Worker	m := &mojomPickles{}
204*635a8641SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
205*635a8641SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
206*635a8641SAndroid Build Coastguard Worker	return m
207*635a8641SAndroid Build Coastguard Worker}
208*635a8641SAndroid Build Coastguard Worker
209*635a8641SAndroid Build Coastguard Worker// mojomGenerationProperties are the common properties across the header,
210*635a8641SAndroid Build Coastguard Worker// source and Java source modules.
211*635a8641SAndroid Build Coastguard Workertype mojomGenerationProperties struct {
212*635a8641SAndroid Build Coastguard Worker	// list of input files
213*635a8641SAndroid Build Coastguard Worker	Srcs []string `android:"path"`
214*635a8641SAndroid Build Coastguard Worker
215*635a8641SAndroid Build Coastguard Worker	// name of the output .srcjar
216*635a8641SAndroid Build Coastguard Worker	Srcjar string
217*635a8641SAndroid Build Coastguard Worker
218*635a8641SAndroid Build Coastguard Worker	// name of the templates module
219*635a8641SAndroid Build Coastguard Worker	Templates string `android:"path"`
220*635a8641SAndroid Build Coastguard Worker
221*635a8641SAndroid Build Coastguard Worker	// Additional flags to pass to the bindings generation script
222*635a8641SAndroid Build Coastguard Worker	Flags string
223*635a8641SAndroid Build Coastguard Worker
224*635a8641SAndroid Build Coastguard Worker	// list of pickles modules that will be imported
225*635a8641SAndroid Build Coastguard Worker	Pickles []string `android:"path"`
226*635a8641SAndroid Build Coastguard Worker
227*635a8641SAndroid Build Coastguard Worker	// list of include paths
228*635a8641SAndroid Build Coastguard Worker	Includes []string
229*635a8641SAndroid Build Coastguard Worker
230*635a8641SAndroid Build Coastguard Worker	// list of typemaps modules that will be imported
231*635a8641SAndroid Build Coastguard Worker	Typemaps []string `android:"path"`
232*635a8641SAndroid Build Coastguard Worker
233*635a8641SAndroid Build Coastguard Worker	// If true, set --use_once_callback flag to the generator.
234*635a8641SAndroid Build Coastguard Worker	// This works only on C++ generation.
235*635a8641SAndroid Build Coastguard Worker	Use_once_callback bool
236*635a8641SAndroid Build Coastguard Worker}
237*635a8641SAndroid Build Coastguard Worker
238*635a8641SAndroid Build Coastguard Worker// flags generates all needed flags for the build rule.
239*635a8641SAndroid Build Coastguard Workerfunc (p *mojomGenerationProperties) flags(ctx android.ModuleContext) string {
240*635a8641SAndroid Build Coastguard Worker	flags := []string{}
241*635a8641SAndroid Build Coastguard Worker
242*635a8641SAndroid Build Coastguard Worker	for _, typemap := range android.PathsForModuleSrc(ctx, p.Typemaps) {
243*635a8641SAndroid Build Coastguard Worker		flags = append(flags, fmt.Sprintf("--typemap=%s", typemap.String()))
244*635a8641SAndroid Build Coastguard Worker	}
245*635a8641SAndroid Build Coastguard Worker	for _, include := range android.PathsForSource(ctx, p.Includes) {
246*635a8641SAndroid Build Coastguard Worker		flags = append(flags, fmt.Sprintf("-I=%s:%s", include, include))
247*635a8641SAndroid Build Coastguard Worker	}
248*635a8641SAndroid Build Coastguard Worker	for _, pickle := range p.Pickles {
249*635a8641SAndroid Build Coastguard Worker		m := android.SrcIsModule(pickle)
250*635a8641SAndroid Build Coastguard Worker		if m == "" {
251*635a8641SAndroid Build Coastguard Worker			ctx.PropertyErrorf("pickles", "not a module: %q", m)
252*635a8641SAndroid Build Coastguard Worker			continue
253*635a8641SAndroid Build Coastguard Worker		}
254*635a8641SAndroid Build Coastguard Worker		module := android.GetModuleFromPathDep(ctx, m, "").(*mojomPickles)
255*635a8641SAndroid Build Coastguard Worker		flags = append(flags, fmt.Sprintf("--gen_dir=%s", module.outDir.String()))
256*635a8641SAndroid Build Coastguard Worker	}
257*635a8641SAndroid Build Coastguard Worker	if p.Flags != "" {
258*635a8641SAndroid Build Coastguard Worker		flags = append(flags, p.Flags)
259*635a8641SAndroid Build Coastguard Worker	}
260*635a8641SAndroid Build Coastguard Worker	if p.Use_once_callback {
261*635a8641SAndroid Build Coastguard Worker		flags = append(flags, "--use_once_callback")
262*635a8641SAndroid Build Coastguard Worker	}
263*635a8641SAndroid Build Coastguard Worker
264*635a8641SAndroid Build Coastguard Worker	return strings.Join(flags, " ")
265*635a8641SAndroid Build Coastguard Worker}
266*635a8641SAndroid Build Coastguard Worker
267*635a8641SAndroid Build Coastguard Worker// implicitDeps collects all dependencies of the module.
268*635a8641SAndroid Build Coastguard Workerfunc (p *mojomGenerationProperties) implicitDeps(ctx android.ModuleContext) android.Paths {
269*635a8641SAndroid Build Coastguard Worker	deps := android.Paths{}
270*635a8641SAndroid Build Coastguard Worker	deps = append(deps, android.PathsForModuleSrc(ctx, p.Pickles)...)
271*635a8641SAndroid Build Coastguard Worker	deps = append(deps, android.PathsForModuleSrc(ctx, p.Typemaps)...)
272*635a8641SAndroid Build Coastguard Worker	deps = append(deps, android.PathsForModuleSrc(ctx, []string{p.Templates})...)
273*635a8641SAndroid Build Coastguard Worker	return deps
274*635a8641SAndroid Build Coastguard Worker}
275*635a8641SAndroid Build Coastguard Worker
276*635a8641SAndroid Build Coastguard Worker// templateDir returns the path where the template .zips are located.
277*635a8641SAndroid Build Coastguard Workerfunc (p *mojomGenerationProperties) templateDir(ctx android.ModuleContext) string {
278*635a8641SAndroid Build Coastguard Worker	srcFiles := android.PathsForModuleSrc(ctx, []string{p.Templates})
279*635a8641SAndroid Build Coastguard Worker	if len(srcFiles) == 0 {
280*635a8641SAndroid Build Coastguard Worker		ctx.PropertyErrorf("templates", "module %s does not produce any files", p.Templates)
281*635a8641SAndroid Build Coastguard Worker		return ""
282*635a8641SAndroid Build Coastguard Worker	}
283*635a8641SAndroid Build Coastguard Worker	return path.Dir(srcFiles[0].String())
284*635a8641SAndroid Build Coastguard Worker}
285*635a8641SAndroid Build Coastguard Worker
286*635a8641SAndroid Build Coastguard Worker// mojomSrcsRuleDescription has the necessary arguments to perform one
287*635a8641SAndroid Build Coastguard Worker// invocation of generateMojomSrcsRule.
288*635a8641SAndroid Build Coastguard Workertype mojomSrcsRuleDescription struct {
289*635a8641SAndroid Build Coastguard Worker	generatedExtensions []string
290*635a8641SAndroid Build Coastguard Worker	extraFlags          string
291*635a8641SAndroid Build Coastguard Worker}
292*635a8641SAndroid Build Coastguard Worker
293*635a8641SAndroid Build Coastguard Worker// generateBuildActions generates all the necessary build actions for the
294*635a8641SAndroid Build Coastguard Worker// current module.
295*635a8641SAndroid Build Coastguard Workerfunc (p *mojomGenerationProperties) generateBuildActions(
296*635a8641SAndroid Build Coastguard Worker	ctx android.ModuleContext,
297*635a8641SAndroid Build Coastguard Worker	mojomGenerator string,
298*635a8641SAndroid Build Coastguard Worker	descriptions []mojomSrcsRuleDescription,
299*635a8641SAndroid Build Coastguard Worker) android.Paths {
300*635a8641SAndroid Build Coastguard Worker	outDir := android.PathForModuleGen(ctx, "")
301*635a8641SAndroid Build Coastguard Worker	implicitDeps := p.implicitDeps(ctx)
302*635a8641SAndroid Build Coastguard Worker	templateDir := p.templateDir(ctx)
303*635a8641SAndroid Build Coastguard Worker	generatedSrcs := android.Paths{}
304*635a8641SAndroid Build Coastguard Worker
305*635a8641SAndroid Build Coastguard Worker	for _, in := range android.PathsForModuleSrc(ctx, p.Srcs) {
306*635a8641SAndroid Build Coastguard Worker		if !strings.HasSuffix(in.Rel(), ".mojom") {
307*635a8641SAndroid Build Coastguard Worker			ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
308*635a8641SAndroid Build Coastguard Worker			continue
309*635a8641SAndroid Build Coastguard Worker		}
310*635a8641SAndroid Build Coastguard Worker		relStem := strings.TrimSuffix(in.Rel(), ".mojom")
311*635a8641SAndroid Build Coastguard Worker		srcRoot := strings.TrimSuffix(in.String(), in.Rel())
312*635a8641SAndroid Build Coastguard Worker
313*635a8641SAndroid Build Coastguard Worker		for _, description := range descriptions {
314*635a8641SAndroid Build Coastguard Worker			outs := android.WritablePaths{}
315*635a8641SAndroid Build Coastguard Worker			for _, ext := range description.generatedExtensions {
316*635a8641SAndroid Build Coastguard Worker				out := android.PathForModuleGen(ctx, relStem+ext)
317*635a8641SAndroid Build Coastguard Worker				outs = append(outs, out)
318*635a8641SAndroid Build Coastguard Worker				generatedSrcs = append(generatedSrcs, out)
319*635a8641SAndroid Build Coastguard Worker			}
320*635a8641SAndroid Build Coastguard Worker			ctx.ModuleBuild(pctx, android.ModuleBuildParams{
321*635a8641SAndroid Build Coastguard Worker				Rule:      generateMojomSrcsRule,
322*635a8641SAndroid Build Coastguard Worker				Input:     in,
323*635a8641SAndroid Build Coastguard Worker				Implicits: implicitDeps,
324*635a8641SAndroid Build Coastguard Worker				Outputs:   outs,
325*635a8641SAndroid Build Coastguard Worker				Args: map[string]string{
326*635a8641SAndroid Build Coastguard Worker					"mojomGenerator": mojomGenerator,
327*635a8641SAndroid Build Coastguard Worker					"package":        srcRoot,
328*635a8641SAndroid Build Coastguard Worker					"flags":          fmt.Sprintf("%s %s", p.flags(ctx), description.extraFlags),
329*635a8641SAndroid Build Coastguard Worker					"outDir":         outDir.String(),
330*635a8641SAndroid Build Coastguard Worker					"templateDir":    templateDir,
331*635a8641SAndroid Build Coastguard Worker				},
332*635a8641SAndroid Build Coastguard Worker			})
333*635a8641SAndroid Build Coastguard Worker		}
334*635a8641SAndroid Build Coastguard Worker	}
335*635a8641SAndroid Build Coastguard Worker
336*635a8641SAndroid Build Coastguard Worker	return generatedSrcs
337*635a8641SAndroid Build Coastguard Worker}
338*635a8641SAndroid Build Coastguard Worker
339*635a8641SAndroid Build Coastguard Worker// mojomHeaders generates all the .h files for a .mojom source.
340*635a8641SAndroid Build Coastguard Workertype mojomHeaders struct {
341*635a8641SAndroid Build Coastguard Worker	android.ModuleBase
342*635a8641SAndroid Build Coastguard Worker
343*635a8641SAndroid Build Coastguard Worker	properties mojomGenerationProperties
344*635a8641SAndroid Build Coastguard Worker
345*635a8641SAndroid Build Coastguard Worker	exportedHeaderDirs android.Paths
346*635a8641SAndroid Build Coastguard Worker	generatedSrcs      android.Paths
347*635a8641SAndroid Build Coastguard Worker}
348*635a8641SAndroid Build Coastguard Worker
349*635a8641SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*mojomHeaders)(nil)
350*635a8641SAndroid Build Coastguard Worker
351*635a8641SAndroid Build Coastguard Workerfunc (m *mojomHeaders) GenerateAndroidBuildActions(ctx android.ModuleContext) {
352*635a8641SAndroid Build Coastguard Worker	m.generatedSrcs = m.properties.generateBuildActions(
353*635a8641SAndroid Build Coastguard Worker		ctx,
354*635a8641SAndroid Build Coastguard Worker		"c++",
355*635a8641SAndroid Build Coastguard Worker		[]mojomSrcsRuleDescription{
356*635a8641SAndroid Build Coastguard Worker			{
357*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom.h"},
358*635a8641SAndroid Build Coastguard Worker				extraFlags:          "",
359*635a8641SAndroid Build Coastguard Worker			},
360*635a8641SAndroid Build Coastguard Worker			{
361*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom-shared.h", ".mojom-shared-internal.h"},
362*635a8641SAndroid Build Coastguard Worker				extraFlags:          "--generate_non_variant_code",
363*635a8641SAndroid Build Coastguard Worker			},
364*635a8641SAndroid Build Coastguard Worker			{
365*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom-shared-message-ids.h"},
366*635a8641SAndroid Build Coastguard Worker				extraFlags:          "--generate_message_ids --generate_non_variant_code",
367*635a8641SAndroid Build Coastguard Worker			},
368*635a8641SAndroid Build Coastguard Worker		},
369*635a8641SAndroid Build Coastguard Worker	)
370*635a8641SAndroid Build Coastguard Worker	m.exportedHeaderDirs = append(m.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
371*635a8641SAndroid Build Coastguard Worker}
372*635a8641SAndroid Build Coastguard Worker
373*635a8641SAndroid Build Coastguard Workerfunc (m *mojomHeaders) GeneratedHeaderDirs() android.Paths {
374*635a8641SAndroid Build Coastguard Worker	return m.exportedHeaderDirs
375*635a8641SAndroid Build Coastguard Worker}
376*635a8641SAndroid Build Coastguard Worker
377*635a8641SAndroid Build Coastguard Workerfunc (m *mojomHeaders) GeneratedDeps() android.Paths {
378*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
379*635a8641SAndroid Build Coastguard Worker}
380*635a8641SAndroid Build Coastguard Worker
381*635a8641SAndroid Build Coastguard Workerfunc (m *mojomHeaders) GeneratedSourceFiles() android.Paths {
382*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
383*635a8641SAndroid Build Coastguard Worker}
384*635a8641SAndroid Build Coastguard Worker
385*635a8641SAndroid Build Coastguard Workerfunc (m *mojomHeaders) Srcs() android.Paths {
386*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
387*635a8641SAndroid Build Coastguard Worker}
388*635a8641SAndroid Build Coastguard Worker
389*635a8641SAndroid Build Coastguard Workerfunc mojomHeadersFactory() android.Module {
390*635a8641SAndroid Build Coastguard Worker	m := &mojomHeaders{}
391*635a8641SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
392*635a8641SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
393*635a8641SAndroid Build Coastguard Worker	return m
394*635a8641SAndroid Build Coastguard Worker}
395*635a8641SAndroid Build Coastguard Worker
396*635a8641SAndroid Build Coastguard Worker// mojomHeaders generates all the .cc files for a .mojom source.
397*635a8641SAndroid Build Coastguard Workertype mojomSrcs struct {
398*635a8641SAndroid Build Coastguard Worker	android.ModuleBase
399*635a8641SAndroid Build Coastguard Worker
400*635a8641SAndroid Build Coastguard Worker	properties mojomGenerationProperties
401*635a8641SAndroid Build Coastguard Worker
402*635a8641SAndroid Build Coastguard Worker	generatedSrcs android.Paths
403*635a8641SAndroid Build Coastguard Worker}
404*635a8641SAndroid Build Coastguard Worker
405*635a8641SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*mojomSrcs)(nil)
406*635a8641SAndroid Build Coastguard Worker
407*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
408*635a8641SAndroid Build Coastguard Worker	m.generatedSrcs = m.properties.generateBuildActions(
409*635a8641SAndroid Build Coastguard Worker		ctx,
410*635a8641SAndroid Build Coastguard Worker		"c++",
411*635a8641SAndroid Build Coastguard Worker		[]mojomSrcsRuleDescription{
412*635a8641SAndroid Build Coastguard Worker			{
413*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom.cc"},
414*635a8641SAndroid Build Coastguard Worker				extraFlags:          "",
415*635a8641SAndroid Build Coastguard Worker			},
416*635a8641SAndroid Build Coastguard Worker			{
417*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom-shared.cc"},
418*635a8641SAndroid Build Coastguard Worker				extraFlags:          "--generate_non_variant_code",
419*635a8641SAndroid Build Coastguard Worker			},
420*635a8641SAndroid Build Coastguard Worker		},
421*635a8641SAndroid Build Coastguard Worker	)
422*635a8641SAndroid Build Coastguard Worker}
423*635a8641SAndroid Build Coastguard Worker
424*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcs) GeneratedHeaderDirs() android.Paths {
425*635a8641SAndroid Build Coastguard Worker	return nil
426*635a8641SAndroid Build Coastguard Worker}
427*635a8641SAndroid Build Coastguard Worker
428*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcs) GeneratedDeps() android.Paths {
429*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
430*635a8641SAndroid Build Coastguard Worker}
431*635a8641SAndroid Build Coastguard Worker
432*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcs) GeneratedSourceFiles() android.Paths {
433*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
434*635a8641SAndroid Build Coastguard Worker}
435*635a8641SAndroid Build Coastguard Worker
436*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcs) Srcs() android.Paths {
437*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
438*635a8641SAndroid Build Coastguard Worker}
439*635a8641SAndroid Build Coastguard Worker
440*635a8641SAndroid Build Coastguard Workerfunc mojomSrcsFactory() android.Module {
441*635a8641SAndroid Build Coastguard Worker	m := &mojomSrcs{}
442*635a8641SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
443*635a8641SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
444*635a8641SAndroid Build Coastguard Worker	return m
445*635a8641SAndroid Build Coastguard Worker}
446*635a8641SAndroid Build Coastguard Worker
447*635a8641SAndroid Build Coastguard Worker// mojomHeaders generates the .srcjar file for a set of .mojom source.
448*635a8641SAndroid Build Coastguard Workertype mojomSrcjar struct {
449*635a8641SAndroid Build Coastguard Worker	android.ModuleBase
450*635a8641SAndroid Build Coastguard Worker
451*635a8641SAndroid Build Coastguard Worker	properties mojomGenerationProperties
452*635a8641SAndroid Build Coastguard Worker
453*635a8641SAndroid Build Coastguard Worker	outDir        android.Path
454*635a8641SAndroid Build Coastguard Worker	generatedSrcs android.Paths
455*635a8641SAndroid Build Coastguard Worker}
456*635a8641SAndroid Build Coastguard Worker
457*635a8641SAndroid Build Coastguard Workervar _ genrule.SourceFileGenerator = (*mojomSrcjar)(nil)
458*635a8641SAndroid Build Coastguard Worker
459*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcjar) GenerateAndroidBuildActions(ctx android.ModuleContext) {
460*635a8641SAndroid Build Coastguard Worker	srcjars := m.properties.generateBuildActions(
461*635a8641SAndroid Build Coastguard Worker		ctx,
462*635a8641SAndroid Build Coastguard Worker		"java",
463*635a8641SAndroid Build Coastguard Worker		[]mojomSrcsRuleDescription{
464*635a8641SAndroid Build Coastguard Worker			{
465*635a8641SAndroid Build Coastguard Worker				generatedExtensions: []string{".mojom.srcjar"},
466*635a8641SAndroid Build Coastguard Worker				extraFlags:          "",
467*635a8641SAndroid Build Coastguard Worker			},
468*635a8641SAndroid Build Coastguard Worker		},
469*635a8641SAndroid Build Coastguard Worker	)
470*635a8641SAndroid Build Coastguard Worker
471*635a8641SAndroid Build Coastguard Worker	out := android.PathForModuleGen(ctx, m.properties.Srcjar)
472*635a8641SAndroid Build Coastguard Worker	ctx.ModuleBuild(pctx, android.ModuleBuildParams{
473*635a8641SAndroid Build Coastguard Worker		Rule:   mergeSrcjarsRule,
474*635a8641SAndroid Build Coastguard Worker		Inputs: srcjars,
475*635a8641SAndroid Build Coastguard Worker		Output: out,
476*635a8641SAndroid Build Coastguard Worker	})
477*635a8641SAndroid Build Coastguard Worker	m.generatedSrcs = append(m.generatedSrcs, out)
478*635a8641SAndroid Build Coastguard Worker}
479*635a8641SAndroid Build Coastguard Worker
480*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcjar) GeneratedHeaderDirs() android.Paths {
481*635a8641SAndroid Build Coastguard Worker	return nil
482*635a8641SAndroid Build Coastguard Worker}
483*635a8641SAndroid Build Coastguard Worker
484*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcjar) GeneratedDeps() android.Paths {
485*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
486*635a8641SAndroid Build Coastguard Worker}
487*635a8641SAndroid Build Coastguard Worker
488*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcjar) GeneratedSourceFiles() android.Paths {
489*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
490*635a8641SAndroid Build Coastguard Worker}
491*635a8641SAndroid Build Coastguard Worker
492*635a8641SAndroid Build Coastguard Workerfunc (m *mojomSrcjar) Srcs() android.Paths {
493*635a8641SAndroid Build Coastguard Worker	return append(android.Paths{}, m.generatedSrcs...)
494*635a8641SAndroid Build Coastguard Worker}
495*635a8641SAndroid Build Coastguard Worker
496*635a8641SAndroid Build Coastguard Workerfunc mojomSrcjarFactory() android.Module {
497*635a8641SAndroid Build Coastguard Worker	m := &mojomSrcjar{}
498*635a8641SAndroid Build Coastguard Worker	m.AddProperties(&m.properties)
499*635a8641SAndroid Build Coastguard Worker	android.InitAndroidModule(m)
500*635a8641SAndroid Build Coastguard Worker	return m
501*635a8641SAndroid Build Coastguard Worker}
502