You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
532 lines
14 KiB
532 lines
14 KiB
package libchrome
|
|
|
|
import (
|
|
"fmt"
|
|
"path"
|
|
"strings"
|
|
|
|
"android/soong/android"
|
|
"android/soong/genrule"
|
|
|
|
"github.com/google/blueprint"
|
|
)
|
|
|
|
func init() {
|
|
android.RegisterModuleType("generate_mojom_downgraded_files", mojomDowngradedFilesFactory)
|
|
android.RegisterModuleType("generate_mojom_pickles", mojomPicklesFactory)
|
|
android.RegisterModuleType("generate_mojom_headers", mojomHeadersFactory)
|
|
android.RegisterModuleType("generate_mojom_srcs", mojomSrcsFactory)
|
|
android.RegisterModuleType("generate_mojom_srcjar", mojomSrcjarFactory)
|
|
}
|
|
|
|
var (
|
|
pctx = android.NewPackageContext("android/soong/external/libchrome")
|
|
|
|
mojomBindingsGenerator = pctx.HostBinToolVariable("mojomBindingsGenerator", "mojom_bindings_generator")
|
|
mojomTypesDowngrader = pctx.HostBinToolVariable("mojomTypesDowngrader", "mojom_types_downgrader")
|
|
mergeZips = pctx.HostBinToolVariable("mergeZips", "merge_zips")
|
|
|
|
downgradeMojomTypesRule = pctx.StaticRule("downgradeMojomTypesRule", blueprint.RuleParams{
|
|
Command: `${mojomTypesDowngrader}
|
|
${in}
|
|
--outdir ${outDir}`,
|
|
CommandDeps: []string{
|
|
"${mojomTypesDowngrader}",
|
|
},
|
|
Description: "Downgrade mojom files $in => $out",
|
|
}, "outDir")
|
|
|
|
generateMojomPicklesRule = pctx.StaticRule("generateMojomPicklesRule", blueprint.RuleParams{
|
|
Command: `${mojomBindingsGenerator}
|
|
--use_bundled_pylibs parse
|
|
-d ${package}
|
|
${flags}
|
|
-o ${outDir}
|
|
${in}`,
|
|
CommandDeps: []string{
|
|
"${mojomBindingsGenerator}",
|
|
},
|
|
Description: "Mojo pickles generation $in => $out",
|
|
Restat: true,
|
|
}, "package", "flags", "outDir")
|
|
|
|
generateMojomSrcsRule = pctx.StaticRule("generateMojomSrcsRule", blueprint.RuleParams{
|
|
Command: `${mojomBindingsGenerator}
|
|
--use_bundled_pylibs generate
|
|
-o ${outDir}
|
|
-I=${package}:${package}
|
|
-d ${package}
|
|
${flags}
|
|
--bytecode_path=${templateDir}
|
|
--generators=${mojomGenerator}
|
|
--use_new_wrapper_types
|
|
${in}`,
|
|
CommandDeps: []string{
|
|
"${mojomBindingsGenerator}",
|
|
},
|
|
Description: "Mojo sources generation $in => $out",
|
|
Restat: true,
|
|
}, "mojomGenerator", "package", "flags", "outDir", "templateDir")
|
|
|
|
mergeSrcjarsRule = pctx.StaticRule("mergeSrcjarsRule", blueprint.RuleParams{
|
|
Command: "${mergeZips} ${out} ${in}",
|
|
CommandDeps: []string{
|
|
"${mergeZips}",
|
|
},
|
|
Description: "Merge .srcjars $in => $out",
|
|
})
|
|
)
|
|
|
|
type mojomDowngradedFilesProperties struct {
|
|
// list of input files
|
|
Srcs []string
|
|
}
|
|
|
|
type mojomDowngradedFiles struct {
|
|
android.ModuleBase
|
|
|
|
properties mojomDowngradedFilesProperties
|
|
|
|
generatedSrcs android.Paths
|
|
outDir android.Path
|
|
}
|
|
|
|
var _ genrule.SourceFileGenerator = (*mojomDowngradedFiles)(nil)
|
|
|
|
func (m *mojomDowngradedFiles) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
android.ExtractSourcesDeps(ctx, m.properties.Srcs)
|
|
}
|
|
|
|
func (m *mojomDowngradedFiles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
m.outDir = android.PathForModuleGen(ctx, "")
|
|
|
|
for _, in := range ctx.ExpandSources(m.properties.Srcs, nil) {
|
|
if !strings.HasSuffix(in.Rel(), ".mojom") {
|
|
ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
|
|
continue
|
|
}
|
|
|
|
out := android.PathForModuleGen(ctx, in.Rel())
|
|
m.generatedSrcs = append(m.generatedSrcs, out)
|
|
|
|
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
|
Rule: downgradeMojomTypesRule,
|
|
Input: in,
|
|
Output: out,
|
|
Args: map[string]string{
|
|
"outDir": path.Dir(out.String()),
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
func (m *mojomDowngradedFiles) GeneratedHeaderDirs() android.Paths {
|
|
return nil
|
|
}
|
|
|
|
func (m *mojomDowngradedFiles) GeneratedDeps() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomDowngradedFiles) GeneratedSourceFiles() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomDowngradedFiles) Srcs() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func mojomDowngradedFilesFactory() android.Module {
|
|
m := &mojomDowngradedFiles{}
|
|
m.AddProperties(&m.properties)
|
|
android.InitAndroidModule(m)
|
|
return m
|
|
}
|
|
|
|
type mojomPicklesProperties struct {
|
|
// list of input files
|
|
Srcs []string
|
|
}
|
|
|
|
type mojomPickles struct {
|
|
android.ModuleBase
|
|
|
|
properties mojomPicklesProperties
|
|
|
|
generatedSrcs android.Paths
|
|
outDir android.Path
|
|
}
|
|
|
|
var _ genrule.SourceFileGenerator = (*mojomPickles)(nil)
|
|
|
|
func (m *mojomPickles) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
android.ExtractSourcesDeps(ctx, m.properties.Srcs)
|
|
}
|
|
|
|
func (m *mojomPickles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
m.outDir = android.PathForModuleGen(ctx, "")
|
|
|
|
for _, in := range ctx.ExpandSources(m.properties.Srcs, nil) {
|
|
if !strings.HasSuffix(in.Rel(), ".mojom") {
|
|
ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
|
|
continue
|
|
}
|
|
|
|
srcRoot := strings.TrimSuffix(in.String(), in.Rel())
|
|
|
|
relStem := strings.TrimSuffix(in.Rel(), ".mojom")
|
|
|
|
out := android.PathForModuleGen(ctx, relStem+".p")
|
|
m.generatedSrcs = append(m.generatedSrcs, out)
|
|
|
|
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
|
Rule: generateMojomPicklesRule,
|
|
Input: in,
|
|
Output: out,
|
|
Args: map[string]string{
|
|
"package": srcRoot,
|
|
"outDir": m.outDir.String(),
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
func (m *mojomPickles) GeneratedHeaderDirs() android.Paths {
|
|
return nil
|
|
}
|
|
|
|
func (m *mojomPickles) GeneratedDeps() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomPickles) GeneratedSourceFiles() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomPickles) Srcs() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func mojomPicklesFactory() android.Module {
|
|
m := &mojomPickles{}
|
|
m.AddProperties(&m.properties)
|
|
android.InitAndroidModule(m)
|
|
return m
|
|
}
|
|
|
|
// mojomGenerationProperties are the common properties across the header,
|
|
// source and Java source modules.
|
|
type mojomGenerationProperties struct {
|
|
// list of input files
|
|
Srcs []string
|
|
|
|
// name of the output .srcjar
|
|
Srcjar string
|
|
|
|
// name of the templates module
|
|
Templates string
|
|
|
|
// Additional flags to pass to the bindings generation script
|
|
Flags string
|
|
|
|
// list of pickles modules that will be imported
|
|
Pickles []string
|
|
|
|
// list of include paths
|
|
Includes []string
|
|
|
|
// list of typemaps modules that will be imported
|
|
Typemaps []string
|
|
|
|
// If true, set --use_once_callback flag to the generator.
|
|
// This works only on C++ generation.
|
|
Use_once_callback bool
|
|
}
|
|
|
|
// extractSources adds any necessary dependencies to satisfy filegroup or
|
|
// generated sources modules listed in the properties using ":module" syntax,
|
|
// if any.
|
|
func (p *mojomGenerationProperties) extractSources(ctx android.BottomUpMutatorContext) {
|
|
android.ExtractSourcesDeps(ctx, p.Srcs)
|
|
android.ExtractSourcesDeps(ctx, p.Typemaps)
|
|
android.ExtractSourcesDeps(ctx, p.Pickles)
|
|
android.ExtractSourceDeps(ctx, &p.Templates)
|
|
}
|
|
|
|
// flags generates all needed flags for the build rule.
|
|
func (p *mojomGenerationProperties) flags(ctx android.ModuleContext) string {
|
|
flags := []string{}
|
|
|
|
for _, typemap := range ctx.ExpandSources(p.Typemaps, nil) {
|
|
flags = append(flags, fmt.Sprintf("--typemap=%s", typemap.String()))
|
|
}
|
|
for _, include := range android.PathsForSource(ctx, p.Includes) {
|
|
flags = append(flags, fmt.Sprintf("-I=%s:%s", include, include))
|
|
}
|
|
for _, pickle := range p.Pickles {
|
|
m := android.SrcIsModule(pickle)
|
|
if m == "" {
|
|
ctx.PropertyErrorf("pickles", "not a module: %q", m)
|
|
continue
|
|
}
|
|
module := ctx.GetDirectDepWithTag(m, android.SourceDepTag).(*mojomPickles)
|
|
flags = append(flags, fmt.Sprintf("--gen_dir=%s", module.outDir.String()))
|
|
}
|
|
if p.Flags != "" {
|
|
flags = append(flags, p.Flags)
|
|
}
|
|
if p.Use_once_callback {
|
|
flags = append(flags, "--use_once_callback")
|
|
}
|
|
|
|
return strings.Join(flags, " ")
|
|
}
|
|
|
|
// implicitDeps collects all dependencies of the module.
|
|
func (p *mojomGenerationProperties) implicitDeps(ctx android.ModuleContext) android.Paths {
|
|
deps := android.Paths{}
|
|
deps = append(deps, ctx.ExpandSources(p.Pickles, nil)...)
|
|
deps = append(deps, ctx.ExpandSources(p.Typemaps, nil)...)
|
|
deps = append(deps, ctx.ExpandSources([]string{p.Templates}, nil)...)
|
|
return deps
|
|
}
|
|
|
|
// templateDir returns the path where the template .zips are located.
|
|
func (p *mojomGenerationProperties) templateDir(ctx android.ModuleContext) string {
|
|
srcFiles := ctx.ExpandSources([]string{p.Templates}, nil)
|
|
if len(srcFiles) == 0 {
|
|
ctx.PropertyErrorf("templates", "module %s does not produce any files", p.Templates)
|
|
return ""
|
|
}
|
|
return path.Dir(srcFiles[0].String())
|
|
}
|
|
|
|
// mojomSrcsRuleDescription has the necessary arguments to perform one
|
|
// invocation of generateMojomSrcsRule.
|
|
type mojomSrcsRuleDescription struct {
|
|
generatedExtensions []string
|
|
extraFlags string
|
|
}
|
|
|
|
// generateBuildActions generates all the necessary build actions for the
|
|
// current module.
|
|
func (p *mojomGenerationProperties) generateBuildActions(
|
|
ctx android.ModuleContext,
|
|
mojomGenerator string,
|
|
descriptions []mojomSrcsRuleDescription,
|
|
) android.Paths {
|
|
outDir := android.PathForModuleGen(ctx, "")
|
|
implicitDeps := p.implicitDeps(ctx)
|
|
templateDir := p.templateDir(ctx)
|
|
generatedSrcs := android.Paths{}
|
|
|
|
for _, in := range ctx.ExpandSources(p.Srcs, nil) {
|
|
if !strings.HasSuffix(in.Rel(), ".mojom") {
|
|
ctx.PropertyErrorf("srcs", "Source is not a .mojom file: %s", in.Rel())
|
|
continue
|
|
}
|
|
relStem := strings.TrimSuffix(in.Rel(), ".mojom")
|
|
srcRoot := strings.TrimSuffix(in.String(), in.Rel())
|
|
|
|
for _, description := range descriptions {
|
|
outs := android.WritablePaths{}
|
|
for _, ext := range description.generatedExtensions {
|
|
out := android.PathForModuleGen(ctx, relStem+ext)
|
|
outs = append(outs, out)
|
|
generatedSrcs = append(generatedSrcs, out)
|
|
}
|
|
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
|
Rule: generateMojomSrcsRule,
|
|
Input: in,
|
|
Implicits: implicitDeps,
|
|
Outputs: outs,
|
|
Args: map[string]string{
|
|
"mojomGenerator": mojomGenerator,
|
|
"package": srcRoot,
|
|
"flags": fmt.Sprintf("%s %s", p.flags(ctx), description.extraFlags),
|
|
"outDir": outDir.String(),
|
|
"templateDir": templateDir,
|
|
},
|
|
})
|
|
}
|
|
}
|
|
|
|
return generatedSrcs
|
|
}
|
|
|
|
// mojomHeaders generates all the .h files for a .mojom source.
|
|
type mojomHeaders struct {
|
|
android.ModuleBase
|
|
|
|
properties mojomGenerationProperties
|
|
|
|
exportedHeaderDirs android.Paths
|
|
generatedSrcs android.Paths
|
|
}
|
|
|
|
var _ genrule.SourceFileGenerator = (*mojomHeaders)(nil)
|
|
|
|
func (m *mojomHeaders) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
m.properties.extractSources(ctx)
|
|
}
|
|
|
|
func (m *mojomHeaders) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
m.generatedSrcs = m.properties.generateBuildActions(
|
|
ctx,
|
|
"c++",
|
|
[]mojomSrcsRuleDescription{
|
|
{
|
|
generatedExtensions: []string{".mojom.h"},
|
|
extraFlags: "",
|
|
},
|
|
{
|
|
generatedExtensions: []string{".mojom-shared.h", ".mojom-shared-internal.h"},
|
|
extraFlags: "--generate_non_variant_code",
|
|
},
|
|
{
|
|
generatedExtensions: []string{".mojom-shared-message-ids.h"},
|
|
extraFlags: "--generate_message_ids --generate_non_variant_code",
|
|
},
|
|
},
|
|
)
|
|
m.exportedHeaderDirs = append(m.exportedHeaderDirs, android.PathForModuleGen(ctx, ""))
|
|
}
|
|
|
|
func (m *mojomHeaders) GeneratedHeaderDirs() android.Paths {
|
|
return m.exportedHeaderDirs
|
|
}
|
|
|
|
func (m *mojomHeaders) GeneratedDeps() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomHeaders) GeneratedSourceFiles() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomHeaders) Srcs() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func mojomHeadersFactory() android.Module {
|
|
m := &mojomHeaders{}
|
|
m.AddProperties(&m.properties)
|
|
android.InitAndroidModule(m)
|
|
return m
|
|
}
|
|
|
|
// mojomHeaders generates all the .cc files for a .mojom source.
|
|
type mojomSrcs struct {
|
|
android.ModuleBase
|
|
|
|
properties mojomGenerationProperties
|
|
|
|
generatedSrcs android.Paths
|
|
}
|
|
|
|
var _ genrule.SourceFileGenerator = (*mojomSrcs)(nil)
|
|
|
|
func (m *mojomSrcs) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
m.properties.extractSources(ctx)
|
|
}
|
|
|
|
func (m *mojomSrcs) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
m.generatedSrcs = m.properties.generateBuildActions(
|
|
ctx,
|
|
"c++",
|
|
[]mojomSrcsRuleDescription{
|
|
{
|
|
generatedExtensions: []string{".mojom.cc"},
|
|
extraFlags: "",
|
|
},
|
|
{
|
|
generatedExtensions: []string{".mojom-shared.cc"},
|
|
extraFlags: "--generate_non_variant_code",
|
|
},
|
|
},
|
|
)
|
|
}
|
|
|
|
func (m *mojomSrcs) GeneratedHeaderDirs() android.Paths {
|
|
return nil
|
|
}
|
|
|
|
func (m *mojomSrcs) GeneratedDeps() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomSrcs) GeneratedSourceFiles() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomSrcs) Srcs() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func mojomSrcsFactory() android.Module {
|
|
m := &mojomSrcs{}
|
|
m.AddProperties(&m.properties)
|
|
android.InitAndroidModule(m)
|
|
return m
|
|
}
|
|
|
|
// mojomHeaders generates the .srcjar file for a set of .mojom source.
|
|
type mojomSrcjar struct {
|
|
android.ModuleBase
|
|
|
|
properties mojomGenerationProperties
|
|
|
|
outDir android.Path
|
|
generatedSrcs android.Paths
|
|
}
|
|
|
|
var _ genrule.SourceFileGenerator = (*mojomSrcjar)(nil)
|
|
|
|
func (m *mojomSrcjar) DepsMutator(ctx android.BottomUpMutatorContext) {
|
|
m.properties.extractSources(ctx)
|
|
}
|
|
|
|
func (m *mojomSrcjar) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
|
srcjars := m.properties.generateBuildActions(
|
|
ctx,
|
|
"java",
|
|
[]mojomSrcsRuleDescription{
|
|
{
|
|
generatedExtensions: []string{".mojom.srcjar"},
|
|
extraFlags: "",
|
|
},
|
|
},
|
|
)
|
|
|
|
out := android.PathForModuleGen(ctx, m.properties.Srcjar)
|
|
ctx.ModuleBuild(pctx, android.ModuleBuildParams{
|
|
Rule: mergeSrcjarsRule,
|
|
Inputs: srcjars,
|
|
Output: out,
|
|
})
|
|
m.generatedSrcs = append(m.generatedSrcs, out)
|
|
}
|
|
|
|
func (m *mojomSrcjar) GeneratedHeaderDirs() android.Paths {
|
|
return nil
|
|
}
|
|
|
|
func (m *mojomSrcjar) GeneratedDeps() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomSrcjar) GeneratedSourceFiles() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func (m *mojomSrcjar) Srcs() android.Paths {
|
|
return append(android.Paths{}, m.generatedSrcs...)
|
|
}
|
|
|
|
func mojomSrcjarFactory() android.Module {
|
|
m := &mojomSrcjar{}
|
|
m.AddProperties(&m.properties)
|
|
android.InitAndroidModule(m)
|
|
return m
|
|
}
|