502 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			502 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			Go
		
	
	
	
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 `android:"path"`
 | 
						|
}
 | 
						|
 | 
						|
type mojomDowngradedFiles struct {
 | 
						|
	android.ModuleBase
 | 
						|
 | 
						|
	properties mojomDowngradedFilesProperties
 | 
						|
 | 
						|
	generatedSrcs android.Paths
 | 
						|
	outDir        android.Path
 | 
						|
}
 | 
						|
 | 
						|
var _ genrule.SourceFileGenerator = (*mojomDowngradedFiles)(nil)
 | 
						|
 | 
						|
func (m *mojomDowngradedFiles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
 | 
						|
	m.outDir = android.PathForModuleGen(ctx, "")
 | 
						|
 | 
						|
	for _, in := range android.PathsForModuleSrc(ctx, m.properties.Srcs) {
 | 
						|
		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 `android:"path"`
 | 
						|
}
 | 
						|
 | 
						|
type mojomPickles struct {
 | 
						|
	android.ModuleBase
 | 
						|
 | 
						|
	properties mojomPicklesProperties
 | 
						|
 | 
						|
	generatedSrcs android.Paths
 | 
						|
	outDir        android.Path
 | 
						|
}
 | 
						|
 | 
						|
var _ genrule.SourceFileGenerator = (*mojomPickles)(nil)
 | 
						|
 | 
						|
func (m *mojomPickles) GenerateAndroidBuildActions(ctx android.ModuleContext) {
 | 
						|
	m.outDir = android.PathForModuleGen(ctx, "")
 | 
						|
 | 
						|
	for _, in := range android.PathsForModuleSrc(ctx, m.properties.Srcs) {
 | 
						|
		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 `android:"path"`
 | 
						|
 | 
						|
	// name of the output .srcjar
 | 
						|
	Srcjar string
 | 
						|
 | 
						|
	// name of the templates module
 | 
						|
	Templates string `android:"path"`
 | 
						|
 | 
						|
	// Additional flags to pass to the bindings generation script
 | 
						|
	Flags string
 | 
						|
 | 
						|
	// list of pickles modules that will be imported
 | 
						|
	Pickles []string `android:"path"`
 | 
						|
 | 
						|
	// list of include paths
 | 
						|
	Includes []string
 | 
						|
 | 
						|
	// list of typemaps modules that will be imported
 | 
						|
	Typemaps []string `android:"path"`
 | 
						|
 | 
						|
	// If true, set --use_once_callback flag to the generator.
 | 
						|
	// This works only on C++ generation.
 | 
						|
	Use_once_callback bool
 | 
						|
}
 | 
						|
 | 
						|
// flags generates all needed flags for the build rule.
 | 
						|
func (p *mojomGenerationProperties) flags(ctx android.ModuleContext) string {
 | 
						|
	flags := []string{}
 | 
						|
 | 
						|
	for _, typemap := range android.PathsForModuleSrc(ctx, p.Typemaps) {
 | 
						|
		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 := android.GetModuleFromPathDep(ctx, m, "").(*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, android.PathsForModuleSrc(ctx, p.Pickles)...)
 | 
						|
	deps = append(deps, android.PathsForModuleSrc(ctx, p.Typemaps)...)
 | 
						|
	deps = append(deps, android.PathsForModuleSrc(ctx, []string{p.Templates})...)
 | 
						|
	return deps
 | 
						|
}
 | 
						|
 | 
						|
// templateDir returns the path where the template .zips are located.
 | 
						|
func (p *mojomGenerationProperties) templateDir(ctx android.ModuleContext) string {
 | 
						|
	srcFiles := android.PathsForModuleSrc(ctx, []string{p.Templates})
 | 
						|
	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 android.PathsForModuleSrc(ctx, p.Srcs) {
 | 
						|
		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) 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) 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) 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
 | 
						|
}
 |