diff options
-rw-r--r-- | Android.bp | 183 | ||||
-rwxr-xr-x | libchrome_tools/merge_srcjars.py | 26 | ||||
-rw-r--r-- | soong/Android.bp | 14 | ||||
-rw-r--r-- | soong/bindings_generator.go | 427 |
4 files changed, 521 insertions, 129 deletions
diff --git a/Android.bp b/Android.bp index 051e18eca7..4dd1aa904e 100644 --- a/Android.bp +++ b/Android.bp @@ -685,12 +685,44 @@ python_binary_host { defaults: ["libmojo_scripts"], } +python_binary_host { + name: "merge_srcjars", + main: "libchrome_tools/merge_srcjars.py", + srcs: ["libchrome_tools/merge_srcjars.py"], + version: { + py3: { + enabled: true, + }, + py2: { + enabled: false, + }, + }, +} + +// TODO(lhchavez): Delete this once all other projects have been migrated. cc_prebuilt_binary { name: "mojom_source_generator_sh", srcs: ["libchrome_tools/mojom_source_generator.sh"], host_supported: true, } +genrule { + name: "libmojo_mojom_templates", + cmd: "$(location mojom_bindings_generator)" + + " --use_bundled_pylibs precompile" + + " -o $(genDir)", + + tools: [ + "mojom_bindings_generator", + ], + + out: [ + "cpp_templates.zip", + "java_templates.zip", + "js_templates.zip", + ], +} + python_binary_host { name: "mojom_generate_type_mappings", main: "libchrome_tools/mojom_generate_type_mappings.py", @@ -723,115 +755,27 @@ genrule { out: ["common_custom_types__type_mappings"], } -genrule { - name: "libmojo_mojom_headers", - cmd: "$(location mojom_source_generator_sh)" + - " --mojom_bindings_generator=$(location mojom_bindings_generator)" + - " --package=external/libchrome" + - " --output_dir=$(genDir)" + - " --bytecode_path=$(genDir)" + - " --typemap=$(location common_custom_types__type_mappings)" + - " --generators=c++" + - " --use_new_wrapper_types" + - " $(in)", - - tools: [ - "mojom_bindings_generator", - "mojom_source_generator_sh", - ], - - tool_files: [":libmojo_common_custom_types__type_mappings"], - +generate_mojom_pickles { + name: "libmojo_mojom_pickles", srcs: [":libmojo_mojom_files"], +} - out: [ - "ipc/ipc.mojom.h", - "ipc/ipc.mojom-shared.h", - "ipc/ipc.mojom-shared-internal.h", - "mojo/common/file.mojom.h", - "mojo/common/file.mojom-shared.h", - "mojo/common/file.mojom-shared-internal.h", - "mojo/common/file_path.mojom.h", - "mojo/common/file_path.mojom-shared.h", - "mojo/common/file_path.mojom-shared-internal.h", - "mojo/common/string16.mojom.h", - "mojo/common/string16.mojom-shared.h", - "mojo/common/string16.mojom-shared-internal.h", - "mojo/common/text_direction.mojom.h", - "mojo/common/text_direction.mojom-shared.h", - "mojo/common/text_direction.mojom-shared-internal.h", - "mojo/common/time.mojom.h", - "mojo/common/time.mojom-shared.h", - "mojo/common/time.mojom-shared-internal.h", - "mojo/common/unguessable_token.mojom.h", - "mojo/common/unguessable_token.mojom-shared.h", - "mojo/common/unguessable_token.mojom-shared-internal.h", - "mojo/common/values.mojom.h", - "mojo/common/values.mojom-shared.h", - "mojo/common/values.mojom-shared-internal.h", - "mojo/common/version.mojom.h", - "mojo/common/version.mojom-shared.h", - "mojo/common/version.mojom-shared-internal.h", - "mojo/public/interfaces/bindings/interface_control_messages.mojom.h", - "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.h", - "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared-internal.h", - "mojo/public/interfaces/bindings/pipe_control_messages.mojom.h", - "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.h", - "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared-internal.h", - "ui/gfx/geometry/mojo/geometry.mojom.h", - "ui/gfx/geometry/mojo/geometry.mojom-shared.h", - "ui/gfx/geometry/mojo/geometry.mojom-shared-internal.h", - "ui/gfx/range/mojo/range.mojom.h", - "ui/gfx/range/mojo/range.mojom-shared.h", - "ui/gfx/range/mojo/range.mojom-shared-internal.h", - ], +generate_mojom_headers { + name: "libmojo_mojom_headers", + srcs: [":libmojo_mojom_files"], + pickles: [":libmojo_mojom_pickles"], + templates: ":libmojo_mojom_templates", + flags: "--disallow_native_types", + typemaps: [":libmojo_common_custom_types__type_mappings"], } -genrule { +generate_mojom_srcs { name: "libmojo_mojom_srcs", - cmd: "$(location mojom_source_generator_sh)" + - " --mojom_bindings_generator=$(location mojom_bindings_generator)" + - " --package=external/libchrome" + - " --output_dir=$(genDir)" + - " --bytecode_path=$(genDir)" + - " --typemap=$(location common_custom_types__type_mappings)" + - " --generators=c++" + - " --use_new_wrapper_types" + - " $(in)", - - tools: [ - "mojom_bindings_generator", - "mojom_source_generator_sh", - ], - - tool_files: [":libmojo_common_custom_types__type_mappings"], - srcs: [":libmojo_mojom_files"], - - out: [ - "ipc/ipc.mojom.cc", - "ipc/ipc.mojom-shared.cc", - "mojo/common/file.mojom.cc", - "mojo/common/file.mojom-shared.cc", - "mojo/common/string16.mojom.cc", - "mojo/common/string16.mojom-shared.cc", - "mojo/common/text_direction.mojom.cc", - "mojo/common/text_direction.mojom-shared.cc", - "mojo/common/time.mojom.cc", - "mojo/common/time.mojom-shared.cc", - "mojo/common/unguessable_token.mojom.cc", - "mojo/common/unguessable_token.mojom-shared.cc", - "mojo/common/version.mojom.cc", - "mojo/common/version.mojom-shared.cc", - "mojo/public/interfaces/bindings/interface_control_messages.mojom.cc", - "mojo/public/interfaces/bindings/interface_control_messages.mojom-shared.cc", - "mojo/public/interfaces/bindings/pipe_control_messages.mojom.cc", - "mojo/public/interfaces/bindings/pipe_control_messages.mojom-shared.cc", - "ui/gfx/geometry/mojo/geometry.mojom.cc", - "ui/gfx/geometry/mojo/geometry.mojom-shared.cc", - "ui/gfx/range/mojo/range.mojom.cc", - "ui/gfx/range/mojo/range.mojom-shared.cc", - ], + pickles: [":libmojo_mojom_pickles"], + templates: ":libmojo_mojom_templates", + flags: "--disallow_native_types", + typemaps: [":libmojo_common_custom_types__type_mappings"], } // TODO(hidehiko): Remove JNI for ContextUtils, after cleaning up the @@ -875,15 +819,11 @@ cc_library_shared { name: "libmojo", vendor_available: true, + generated_sources: ["libmojo_mojom_srcs"], generated_headers: [ "libmojo_jni_headers", "libmojo_mojom_headers", ], - - generated_sources: [ - "libmojo_mojom_srcs", - ], - export_generated_headers: [ "libmojo_jni_headers", "libmojo_mojom_headers", @@ -936,29 +876,14 @@ cc_library_shared { export_include_dirs: ["."], } -genrule { +generate_mojom_srcjar { name: "libmojo_mojom_java_srcs", - cmd: "$(location mojom_source_generator_sh)" + - " --mojom_bindings_generator=$(location mojom_bindings_generator)" + - " --package=external/libchrome" + - " --output_dir=$(genDir)" + - " --bytecode_path=$(genDir)" + - " --typemap=$(location common_custom_types__type_mappings)" + - " --generators=java" + - " --use_new_wrapper_types" + - " --srcjar=$(out)" + - " $(in)", - - tools: [ - "mojom_bindings_generator", - "mojom_source_generator_sh", - ], - - tool_files: [":libmojo_common_custom_types__type_mappings"], - srcs: [":libmojo_mojom_files"], - - out: ["libmojo_mojom.srcjar"], + pickles: [":libmojo_mojom_pickles"], + srcjar: "libmojo_mojom.srcjar", + templates: ":libmojo_mojom_templates", + flags: "--disallow_native_types", + typemaps: [":libmojo_common_custom_types__type_mappings"], } java_library { diff --git a/libchrome_tools/merge_srcjars.py b/libchrome_tools/merge_srcjars.py new file mode 100755 index 0000000000..f774764087 --- /dev/null +++ b/libchrome_tools/merge_srcjars.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 + +"""Merges several .srcjar files.""" + +import argparse +import zipfile + + +def _main(): + parser = argparse.ArgumentParser(description="Merge several .srcjar files") + parser.add_argument("--output", type=argparse.FileType("wb"), + help="The path of the output .srcjar") + parser.add_argument("srcjar", metavar="SRCJAR", type=argparse.FileType("rb"), + nargs="+", + help="The path of the .srcjar files to merge") + args = parser.parse_args() + + with zipfile.ZipFile(args.output, "w") as output: + for srcjar_path in args.srcjar: + with zipfile.ZipFile(srcjar_path, "r") as srcjar: + for path in srcjar.namelist(): + output.writestr(path, srcjar.read(path)) + + +if __name__ == "__main__": + _main() diff --git a/soong/Android.bp b/soong/Android.bp new file mode 100644 index 0000000000..7230b812d2 --- /dev/null +++ b/soong/Android.bp @@ -0,0 +1,14 @@ +bootstrap_go_package { + name: "soong-libchrome", + pkgPath: "android/soong/external/libchrome", + deps: [ + "blueprint", + "soong", + "soong-android", + "soong-genrule", + ], + srcs: [ + "bindings_generator.go", + ], + pluginFor: ["soong_build"], +} diff --git a/soong/bindings_generator.go b/soong/bindings_generator.go new file mode 100644 index 0000000000..36462cb036 --- /dev/null +++ b/soong/bindings_generator.go @@ -0,0 +1,427 @@ +package libchrome + +import ( + "fmt" + "path" + "path/filepath" + "strings" + + "android/soong/android" + "android/soong/genrule" + + "github.com/google/blueprint" +) + +func init() { + 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") + mergeSrcjars = pctx.HostBinToolVariable("mergeSrcjars", "merge_srcjars") + + 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", + }, "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=${generator} + --use_new_wrapper_types + ${in}`, + CommandDeps: []string{ + "${mojomBindingsGenerator}", + }, + Description: "Mojo sources generation $in => $out", + }, "generator", "package", "flags", "outDir", "templateDir") + + mergeSrcjarsRule = pctx.StaticRule("mergeSrcjarsRule", blueprint.RuleParams{ + Command: "${mergeSrcjars} --output=${out} ${in}", + CommandDeps: []string{ + "${mergeSrcjars}", + }, + Description: "Merge .srcjars $in => $out", + }) +) + +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, "") + // TODO(lhchavez): Actually make this generate files once libchrome + // roll progresses. +} + +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 +} + +// 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 p.Includes { + includePath, err := filepath.Abs(include) + if err != nil { + ctx.PropertyErrorf("includes", "Failed to get the absolute path for %s: %q", include, err) + } + flags = append(flags, fmt.Sprintf("-I=%s:%s", includePath, includePath)) + } + 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) + } + + 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, + generator string, + descriptions []mojomSrcsRuleDescription, +) android.Paths { + packageName := android.PathForModuleSrc(ctx, "").Rel() + 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") + + 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{ + "generator": generator, + "package": packageName, + "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 +} |