Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(795)

Unified Diff: mojo/public/tools/bindings/mojom.gni

Issue 1832703002: Mojo: Simplify typemap usage. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@mojo-bindings-variant-import
Patch Set: add missing mash dependency Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: mojo/public/tools/bindings/mojom.gni
diff --git a/mojo/public/tools/bindings/mojom.gni b/mojo/public/tools/bindings/mojom.gni
index 14ddb2fa48eb794514d97a2f58a75a7ace652d94..d9f08590b992bd7836dc7c27f48791d3ca8efac2 100644
--- a/mojo/public/tools/bindings/mojom.gni
+++ b/mojo/public/tools/bindings/mojom.gni
@@ -25,6 +25,15 @@ mojom_generator_sources = [
"$mojom_generator_script",
]
+_bindings_configuration_files = [
+ "//mojo/public/tools/bindings/chromium_bindings_configuration.gni",
+ "//mojo/public/tools/bindings/blink_bindings_configuration.gni",
+]
+_bindings_configurations = []
+foreach(config_file, _bindings_configuration_files) {
+ _bindings_configurations += [ read_file(config_file, "scope") ]
+}
+
# Generate C++/JavaScript/Java source files from mojom files. The output files
# will go under the generated file directory tree with the same path as each
# input file.
@@ -46,189 +55,243 @@ mojom_generator_sources = [
# import_dirs (optional)
# List of import directories that will get added when processing sources.
#
-# typemaps (optional)
-# A list of typemap files to apply during bindings generation.
-#
-# typemap_deps (optional)
-# A list of public dependencies needed to support active typemaps.
-#
-# variant (optional)
-# A variant name to apply to generated bindings. Variant influences
-# generated source filenames as wells the symbols they define.
-#
# testonly (optional)
#
# visibility (optional)
-#
-# for_blink (optional, C++ only)
-# Use WTF types as generated type for mojo string/array/map.
template("mojom") {
assert(
defined(invoker.sources) || defined(invoker.deps) ||
defined(invoker.public_deps),
"\"sources\" or \"deps\" must be defined for the $target_name template.")
- cpp_sources_suffix = "cpp_sources"
- cpp_sources_target_name = "${target_name}_${cpp_sources_suffix}"
- cpp_only = false
- if (defined(invoker.sources)) {
- if (defined(invoker.variant)) {
- variant = invoker.variant
- cpp_only = true
- generator_cpp_outputs = [
- "{{source_gen_dir}}/{{source_name_part}}.mojom-${variant}.cc",
- "{{source_gen_dir}}/{{source_name_part}}.mojom-${variant}.h",
- "{{source_gen_dir}}/{{source_name_part}}.mojom-${variant}-internal.h",
- ]
- } else {
- generator_cpp_outputs = [
- "{{source_gen_dir}}/{{source_name_part}}.mojom.cc",
- "{{source_gen_dir}}/{{source_name_part}}.mojom.h",
- "{{source_gen_dir}}/{{source_name_part}}.mojom-internal.h",
- ]
- }
+ all_deps = []
+ if (defined(invoker.deps)) {
+ all_deps += invoker.deps
+ }
+ if (defined(invoker.public_deps)) {
+ all_deps += invoker.public_deps
}
- if (cpp_only) {
- generator_js_outputs = []
- generator_java_outputs = []
- } else {
- generator_js_outputs =
- [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ]
- generator_java_outputs =
- [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
+ group("${target_name}__is_mojom") {
}
- if (defined(invoker.sources)) {
- generator_target_name = target_name + "__generator"
- action_foreach(generator_target_name) {
- script = mojom_generator_script
- inputs = mojom_generator_sources
- sources = invoker.sources
- deps = [
- "//mojo/public/tools/bindings:precompile_templates",
- ]
- outputs =
- generator_cpp_outputs + generator_java_outputs + generator_js_outputs
- args = [
- "--use_bundled_pylibs",
- "generate",
- "{{source}}",
- "-d",
- rebase_path("//", root_build_dir),
- "-I",
- rebase_path("//", root_build_dir),
- "-o",
- rebase_path(root_gen_dir),
- "--bytecode_path",
- rebase_path("$root_gen_dir/mojo/public/tools/bindings"),
- ]
+ # Explicitly ensure that all dependencies (invoker.deps and
+ # invoker.public_deps) are mojom targets.
+ group("${target_name}__check_deps_are_all_mojom") {
+ deps = []
+ foreach(d, all_deps) {
+ name = get_label_info(d, "label_no_toolchain")
+ toolchain = get_label_info(d, "toolchain")
+ deps += [ "${name}__is_mojom(${toolchain})" ]
+ }
+ }
- if (defined(invoker.import_dirs)) {
- foreach(import_dir, invoker.import_dirs) {
- args += [
- "-I",
- rebase_path(import_dir, root_build_dir),
- ]
+ foreach(bindings_configuration, _bindings_configurations) {
+ cpp_only = false
+ variant_suffix = ""
+ if (defined(bindings_configuration.variant)) {
+ variant = bindings_configuration.variant
+ variant_suffix = "_${variant}"
+ cpp_only = true
+ }
+ type_mappings_target_name = "${target_name}${variant_suffix}__type_mappings"
+ type_mappings_path =
+ "$target_gen_dir/${target_name}${variant_suffix}__type_mappings"
+ active_typemaps = []
+ cpp_sources_suffix = "cpp_sources"
+ cpp_sources_target_name =
+ "${target_name}${variant_suffix}_${cpp_sources_suffix}"
+ enabled_sources = []
+ if (defined(invoker.sources)) {
+ generator_cpp_outputs = []
+ generator_js_outputs = []
+ generator_java_outputs = []
+ variant_dash_suffix = ""
+ if (defined(variant)) {
+ variant_dash_suffix = "-${variant}"
+ }
+ generator_cpp_outputs += [
+ "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.cc",
+ "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}.h",
+ "{{source_gen_dir}}/{{source_name_part}}.mojom${variant_dash_suffix}-internal.h",
+ ]
+ enabled_sources = []
+ if (defined(bindings_configuration.blacklist)) {
+ foreach(source, invoker.sources) {
+ blacklisted = false
+ foreach(blacklisted_source, bindings_configuration.blacklist) {
+ if (get_path_info(source, "abspath") == blacklisted_source) {
+ blacklisted = true
+ }
+ }
+ if (!blacklisted) {
+ enabled_sources += [ source ]
+ }
+ }
+ } else {
+ enabled_sources = invoker.sources
+ }
+ foreach(source, enabled_sources) {
+ # TODO(sammc): Use a map instead of a linear scan when GN supports maps.
+ foreach(typemap, bindings_configuration.typemaps) {
+ if (get_path_info(source, "abspath") == typemap.mojom) {
+ active_typemaps += [ typemap ]
+ }
}
}
- if (cpp_only) {
- args += [
- "-g",
- "c++",
+ if (!cpp_only) {
+ generator_js_outputs =
+ [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ]
+ generator_java_outputs =
+ [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ]
+ }
+ generator_target_name = "${target_name}${variant_suffix}__generator"
+ action_foreach(generator_target_name) {
+ script = mojom_generator_script
+ inputs = mojom_generator_sources
+ sources = invoker.sources
+ deps = [
+ ":$type_mappings_target_name",
+ "//mojo/public/tools/bindings:precompile_templates",
]
- } else {
- args += [
- "-g",
- "c++,javascript,java",
+ outputs = generator_cpp_outputs + generator_java_outputs +
+ generator_js_outputs
+ args = [
+ "--use_bundled_pylibs",
+ "generate",
+ "{{source}}",
+ "-d",
+ rebase_path("//", root_build_dir),
+ "-I",
+ rebase_path("//", root_build_dir),
+ "-o",
+ rebase_path(root_gen_dir),
+ "--bytecode_path",
+ rebase_path("$root_gen_dir/mojo/public/tools/bindings"),
]
- }
- if (defined(invoker.variant)) {
- args += [
- "--variant",
- invoker.variant,
- ]
- }
+ if (defined(invoker.import_dirs)) {
+ foreach(import_dir, invoker.import_dirs) {
+ args += [
+ "-I",
+ rebase_path(import_dir, root_build_dir),
+ ]
+ }
+ }
- if (defined(invoker.typemaps)) {
- foreach(typemap, invoker.typemaps) {
+ if (cpp_only) {
args += [
- "--typemap",
- rebase_path(typemap, root_build_dir),
+ "-g",
+ "c++",
+ ]
+ } else {
+ args += [
+ "-g",
+ "c++,javascript,java",
+ ]
+ }
+
+ if (defined(bindings_configuration.variant)) {
+ args += [
+ "--variant",
+ bindings_configuration.variant,
]
}
- inputs += invoker.typemaps
- }
- if (defined(invoker.for_blink) && invoker.for_blink) {
- args += [ "--for_blink" ]
+ args += [
+ "--typemap",
+ rebase_path(type_mappings_path, root_build_dir),
+ ]
+
+ if (defined(bindings_configuration.for_blink) &&
+ bindings_configuration.for_blink) {
+ args += [ "--for_blink" ]
+ }
}
}
- }
- source_set(target_name) {
- if (defined(invoker.visibility)) {
- visibility = invoker.visibility
- }
- if (defined(invoker.testonly)) {
- testonly = invoker.testonly
- }
- if (defined(invoker.sources) && !defined(invoker.variant)) {
- data = process_file_template(invoker.sources, generator_js_outputs)
- }
+ action(type_mappings_target_name) {
+ outputs = [
+ type_mappings_path,
+ ]
+ script = "$mojom_generator_root/generate_type_mappings.py"
+ deps = []
+ args = [
+ "--output",
+ rebase_path(type_mappings_path, root_build_dir),
+ ]
- public_deps = [
- "//mojo/public/cpp/bindings",
- ]
- if (defined(invoker.sources)) {
- public_deps += [ ":${cpp_sources_target_name}" ]
- }
- if (defined(invoker.deps)) {
- public_deps += invoker.deps
- }
- if (defined(invoker.public_deps)) {
- public_deps += invoker.public_deps
- }
- if (defined(invoker.typemap_deps)) {
- public_deps += invoker.typemap_deps
- }
+ foreach(d, all_deps) {
+ name = get_label_info(d, "label_no_toolchain")
+ toolchain = get_label_info(d, "toolchain")
+ dependency_output = "${name}${variant_suffix}__type_mappings"
+ dependency_target = "${dependency_output}(${toolchain})"
+ deps += [ dependency_target ]
+ dependency_output_dir =
+ get_label_info(dependency_output, "target_gen_dir")
+ dependency_name = get_label_info(dependency_output, "name")
+ dependency_path =
+ rebase_path("$dependency_output_dir/${dependency_name}",
+ root_build_dir)
+ args += [
+ "--dependency",
+ dependency_path,
+ ]
+ }
- deps = []
- if (defined(invoker.sources)) {
- public_deps += [ ":$generator_target_name" ]
+ if (enabled_sources != []) {
+ # TODO(sammc): Pass the typemap description in a file to avoid command
+ # line length limitations.
+ typemap_description = []
+ foreach(typemap, active_typemaps) {
+ typemap_description += [ "--start-typemap" ]
+ if (defined(typemap.public_headers)) {
+ foreach(value, typemap.public_headers) {
+ typemap_description += [ "public_headers=$value" ]
+ }
+ }
+ if (defined(typemap.traits_headers)) {
+ foreach(value, typemap.traits_headers) {
+ typemap_description += [ "traits_headers=$value" ]
+ }
+ }
+ foreach(value, typemap.type_mappings) {
+ typemap_description += [ "type_mappings=$value" ]
+ }
+ }
+ args += typemap_description
+ }
}
- }
- all_deps = []
- if (defined(invoker.deps)) {
- all_deps += invoker.deps
- }
- if (defined(invoker.public_deps)) {
- all_deps += invoker.public_deps
- }
+ source_set("${target_name}${variant_suffix}") {
+ if (defined(invoker.visibility)) {
+ visibility = invoker.visibility
+ }
+ if (defined(invoker.testonly)) {
+ testonly = invoker.testonly
+ }
+ if (defined(invoker.sources) && !defined(bindings_configuration.variant)) {
+ data = process_file_template(enabled_sources, generator_js_outputs)
+ }
- if (defined(invoker.variant)) {
- variant_suffix = "of_variant_${invoker.variant}"
- } else {
- variant_suffix = "of_no_variant"
- }
- group("${target_name}__is_mojom_${variant_suffix}") {
- }
+ public_deps = [
+ ":${cpp_sources_target_name}",
+ "//mojo/public/cpp/bindings",
+ ]
+ if (defined(invoker.deps)) {
+ public_deps += invoker.deps
+ }
+ if (defined(invoker.public_deps)) {
+ public_deps += invoker.public_deps
+ }
- # Explicitly ensure that all dependencies (invoker.deps and
- # invoker.public_deps) are mojom targets of the same variant themselves.
- group("${target_name}__check_deps_are_all_mojom_${variant_suffix}") {
- deps = []
- foreach(d, all_deps) {
- name = get_label_info(d, "label_no_toolchain")
- toolchain = get_label_info(d, "toolchain")
- deps += [ "${name}__is_mojom_${variant_suffix}(${toolchain})" ]
+ deps = []
+ if (defined(invoker.sources)) {
+ public_deps += [ ":$generator_target_name" ]
+ }
}
- }
- if (defined(invoker.sources)) {
# The generated C++ source files. The main reason to introduce this target
# is so that mojo/public/cpp/bindings can depend on mojom interfaces without
# circular dependencies. It means that the target is missing the dependency
@@ -239,69 +302,93 @@ template("mojom") {
if (defined(invoker.testonly)) {
testonly = invoker.testonly
}
- sources = process_file_template(invoker.sources, generator_cpp_outputs)
+ if (enabled_sources != []) {
+ sources = process_file_template(enabled_sources, generator_cpp_outputs)
+ }
deps = [
- ":$generator_target_name",
+ "//mojo/public/cpp/bindings:struct_traits",
"//mojo/public/interfaces/bindings:bindings__generator",
]
+ if (enabled_sources != []) {
+ deps += [ ":$generator_target_name" ]
+ }
public_deps = [
"//base",
]
- if (defined(invoker.typemap_deps)) {
- public_deps += invoker.typemap_deps
- }
foreach(d, all_deps) {
# Resolve the name, so that a target //mojo/something becomes
# //mojo/something:something and we can append cpp_sources_suffix to
# get the cpp dependency name.
- full_name = get_label_info(d, "label_no_toolchain")
- deps += [ "${full_name}_${cpp_sources_suffix}" ]
+ full_name = get_label_info("$d", "label_no_toolchain")
+ deps += [ "${full_name}${variant_suffix}_${cpp_sources_suffix}" ]
}
- if (defined(invoker.for_blink) && invoker.for_blink) {
+ foreach(typemap, active_typemaps) {
+ if (defined(typemap.public_headers)) {
+ sources += typemap.public_headers
+ }
+ if (defined(typemap.traits_headers)) {
+ sources += typemap.traits_headers
+ }
+ if (defined(typemap.sources)) {
+ sources += typemap.sources
+ }
+ if (defined(typemap.deps)) {
+ deps += typemap.deps
+ }
+ }
+ if (defined(bindings_configuration.for_blink) &&
+ bindings_configuration.for_blink) {
public_deps += [ "//mojo/public/cpp/bindings:wtf_support" ]
}
}
- }
- if (is_android && !cpp_only) {
- import("//build/config/android/rules.gni")
+ if (!cpp_only && is_android) {
+ import("//build/config/android/rules.gni")
- java_srcjar_target_name = target_name + "_java_sources"
- action(java_srcjar_target_name) {
- script = "//mojo/public/tools/gn/zip.py"
- inputs = process_file_template(invoker.sources, generator_java_outputs)
- output = "$target_gen_dir/$target_name.srcjar"
- outputs = [
- output,
- ]
- rebase_inputs = rebase_path(inputs, root_build_dir)
- rebase_output = rebase_path(output, root_build_dir)
- args = [
- "--zip-inputs=$rebase_inputs",
- "--output=$rebase_output",
- ]
- deps = [
- ":$generator_target_name",
- ]
- }
+ java_srcjar_target_name = target_name + "_java_sources"
+ action(java_srcjar_target_name) {
+ script = "//mojo/public/tools/gn/zip.py"
+ inputs = []
+ if (enabled_sources != []) {
+ inputs =
+ process_file_template(enabled_sources, generator_java_outputs)
+ }
+ output = "$target_gen_dir/$target_name.srcjar"
+ outputs = [
+ output,
+ ]
+ rebase_inputs = rebase_path(inputs, root_build_dir)
+ rebase_output = rebase_path(output, root_build_dir)
+ args = [
+ "--zip-inputs=$rebase_inputs",
+ "--output=$rebase_output",
+ ]
+ deps = []
+ if (enabled_sources != []) {
+ deps = [
+ ":$generator_target_name",
+ ]
+ }
+ }
- java_target_name = target_name + "_java"
- android_library(java_target_name) {
- deps = [
- "//base:base_java",
- "//mojo/public/java:bindings",
- "//mojo/public/java:system",
- ]
+ java_target_name = target_name + "_java"
+ android_library(java_target_name) {
+ deps = [
+ "//base:base_java",
+ "//mojo/public/java:bindings",
+ "//mojo/public/java:system",
+ ]
- foreach(d, all_deps) {
- # Resolve the name, so that a target //mojo/something becomes
- # //mojo/something:something and we can append "_java" to get the java
- # dependency name.
- full_name = get_label_info(d, "label_no_toolchain")
- deps += [ "${full_name}_java" ]
- }
+ foreach(d, all_deps) {
+ # Resolve the name, so that a target //mojo/something becomes
+ # //mojo/something:something and we can append "_java" to get the java
+ # dependency name.
+ full_name = get_label_info(d, "label_no_toolchain")
+ deps += [ "${full_name}_java" ]
+ }
- srcjar_deps = [ ":$java_srcjar_target_name" ]
+ srcjar_deps = [ ":$java_srcjar_target_name" ]
+ }
}
}
}
« no previous file with comments | « mojo/public/tools/bindings/generate_type_mappings.py ('k') | mojo/public/tools/bindings/mojom_get_generator_typemap_args.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698