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