OLD | NEW |
| (Empty) |
1 # Copyright 2014 The Chromium Authors. All rights reserved. | |
2 # Use of this source code is governed by a BSD-style license that can be | |
3 # found in the LICENSE file. | |
4 | |
5 import("../../mojo_sdk.gni") | |
6 | |
7 # Generate C++ and JavaScript source files from mojom files. The output files | |
8 # will go under the generated file directory tree with the same path as each | |
9 # input file. | |
10 # | |
11 # If a mojom target is intended for use in a client repo where the location of | |
12 # the Mojo SDK will be different than its location in the Mojo repo, | |
13 # dependencies on the SDK should be specified relative to the parent directory | |
14 # of the Mojo public SDK in |mojo_sdk_deps| rather than via absolute paths in | |
15 # |deps|. | |
16 # | |
17 # Parameters: | |
18 # | |
19 # sources (required) | |
20 # List of source .mojom files to compile. | |
21 # | |
22 # deps (optional) | |
23 # Note: this can contain only other mojom targets. | |
24 # | |
25 # mojo_sdk_deps (optional) | |
26 # List of deps specified relative to the parent directory of the Mojo | |
27 # public SDK. These deps will be added as ordinary deps rebased to the | |
28 # current directory. | |
29 # | |
30 # public_deps (optional) | |
31 # Note: this can contain only other mojom targets. | |
32 # | |
33 # mojo_sdk_public_deps (optional) | |
34 # List of public deps specified relative to the parent directory of the | |
35 # Mojo public SDK. These deps will be added as ordinary public deps | |
36 # rebased to the current directory. | |
37 # | |
38 # import_dirs (optional) | |
39 # List of import directories that will get added when processing sources. | |
40 # | |
41 # testonly (optional) | |
42 # | |
43 # visibility (optional) | |
44 template("mojom") { | |
45 assert(defined(invoker.sources), | |
46 "\"sources\" must be defined for the $target_name template.") | |
47 | |
48 generator_root = rebase_path("mojo/public/tools/bindings", ".", mojo_root) | |
49 generator_script = "$generator_root/mojom_bindings_generator.py" | |
50 generator_sources = [ | |
51 generator_script, | |
52 "$generator_root/generators/cpp_templates/enum_declaration.tmpl", | |
53 "$generator_root/generators/cpp_templates/interface_declaration.tmpl", | |
54 "$generator_root/generators/cpp_templates/interface_definition.tmpl", | |
55 "$generator_root/generators/cpp_templates/interface_macros.tmpl", | |
56 "$generator_root/generators/cpp_templates/interface_proxy_declaration.tmpl", | |
57 "$generator_root/generators/cpp_templates/interface_request_validator_declar
ation.tmpl", | |
58 "$generator_root/generators/cpp_templates/interface_response_validator_decla
ration.tmpl", | |
59 "$generator_root/generators/cpp_templates/interface_stub_declaration.tmpl", | |
60 "$generator_root/generators/cpp_templates/module.cc.tmpl", | |
61 "$generator_root/generators/cpp_templates/module.h.tmpl", | |
62 "$generator_root/generators/cpp_templates/module-internal.h.tmpl", | |
63 "$generator_root/generators/cpp_templates/params_definition.tmpl", | |
64 "$generator_root/generators/cpp_templates/struct_declaration.tmpl", | |
65 "$generator_root/generators/cpp_templates/struct_definition.tmpl", | |
66 "$generator_root/generators/cpp_templates/struct_serialization_declaration.t
mpl", | |
67 "$generator_root/generators/cpp_templates/struct_serialization_definition.tm
pl", | |
68 "$generator_root/generators/cpp_templates/struct_macros.tmpl", | |
69 "$generator_root/generators/cpp_templates/wrapper_class_declaration.tmpl", | |
70 "$generator_root/generators/cpp_templates/wrapper_class_definition.tmpl", | |
71 "$generator_root/generators/dart_templates/enum_definition.tmpl", | |
72 "$generator_root/generators/dart_templates/interface_definition.tmpl", | |
73 "$generator_root/generators/dart_templates/module.lib.tmpl", | |
74 "$generator_root/generators/dart_templates/module_definition.tmpl", | |
75 "$generator_root/generators/dart_templates/struct_definition.tmpl", | |
76 "$generator_root/generators/java_templates/constant_definition.tmpl", | |
77 "$generator_root/generators/java_templates/constants.java.tmpl", | |
78 "$generator_root/generators/java_templates/enum.java.tmpl", | |
79 "$generator_root/generators/java_templates/enum_definition.tmpl", | |
80 "$generator_root/generators/java_templates/header.java.tmpl", | |
81 "$generator_root/generators/java_templates/interface.java.tmpl", | |
82 "$generator_root/generators/java_templates/interface_definition.tmpl", | |
83 "$generator_root/generators/java_templates/interface_internal.java.tmpl", | |
84 "$generator_root/generators/java_templates/struct.java.tmpl", | |
85 "$generator_root/generators/java_templates/struct_definition.tmpl", | |
86 "$generator_root/generators/js_templates/enum_definition.tmpl", | |
87 "$generator_root/generators/js_templates/interface_definition.tmpl", | |
88 "$generator_root/generators/js_templates/module.amd.tmpl", | |
89 "$generator_root/generators/js_templates/module.sky.tmpl", | |
90 "$generator_root/generators/js_templates/module_definition.tmpl", | |
91 "$generator_root/generators/js_templates/struct_definition.tmpl", | |
92 "$generator_root/generators/python_templates/module_macros.tmpl", | |
93 "$generator_root/generators/python_templates/module.py.tmpl", | |
94 "$generator_root/generators/mojom_cpp_generator.py", | |
95 "$generator_root/generators/mojom_dart_generator.py", | |
96 "$generator_root/generators/mojom_js_generator.py", | |
97 "$generator_root/generators/mojom_java_generator.py", | |
98 "$generator_root/generators/mojom_python_generator.py", | |
99 "$generator_root/pylib/mojom/__init__.py", | |
100 "$generator_root/pylib/mojom/error.py", | |
101 "$generator_root/pylib/mojom/generate/__init__.py", | |
102 "$generator_root/pylib/mojom/generate/data.py", | |
103 "$generator_root/pylib/mojom/generate/generator.py", | |
104 "$generator_root/pylib/mojom/generate/module.py", | |
105 "$generator_root/pylib/mojom/generate/pack.py", | |
106 "$generator_root/pylib/mojom/generate/template_expander.py", | |
107 "$generator_root/pylib/mojom/parse/__init__.py", | |
108 "$generator_root/pylib/mojom/parse/ast.py", | |
109 "$generator_root/pylib/mojom/parse/lexer.py", | |
110 "$generator_root/pylib/mojom/parse/parser.py", | |
111 "$generator_root/pylib/mojom/parse/translate.py", | |
112 ] | |
113 generator_cpp_outputs = [ | |
114 "{{source_gen_dir}}/{{source_name_part}}.mojom.cc", | |
115 "{{source_gen_dir}}/{{source_name_part}}.mojom.h", | |
116 "{{source_gen_dir}}/{{source_name_part}}.mojom-internal.h", | |
117 ] | |
118 generator_dart_outputs = | |
119 [ "{{source_gen_dir}}/{{source_name_part}}.mojom.dart" ] | |
120 generator_java_outputs = | |
121 [ "{{source_gen_dir}}/{{source_name_part}}.mojom.srcjar" ] | |
122 generator_js_outputs = [ "{{source_gen_dir}}/{{source_name_part}}.mojom.js" ] | |
123 generator_python_outputs = | |
124 [ "{{source_gen_dir}}/{{source_name_part}}_mojom.py" ] | |
125 | |
126 rebased_mojo_sdk_public_deps = [] | |
127 if (defined(invoker.mojo_sdk_public_deps)) { | |
128 foreach(sdk_dep, invoker.mojo_sdk_public_deps) { | |
129 # Check that the SDK dep was not mistakenly given as an absolute path. | |
130 assert(get_path_info(sdk_dep, "abspath") != sdk_dep) | |
131 rebased_mojo_sdk_public_deps += [ rebase_path(sdk_dep, ".", mojo_root) ] | |
132 } | |
133 } | |
134 | |
135 rebased_mojo_sdk_deps = [] | |
136 if (defined(invoker.mojo_sdk_deps)) { | |
137 foreach(sdk_dep, invoker.mojo_sdk_deps) { | |
138 # Check that the SDK dep was not mistakenly given as an absolute path. | |
139 assert(get_path_info(sdk_dep, "abspath") != sdk_dep) | |
140 rebased_mojo_sdk_deps += [ rebase_path(sdk_dep, ".", mojo_root) ] | |
141 } | |
142 } | |
143 | |
144 if (defined(invoker.visibility)) { | |
145 # Need to save this because the the target_name is overwritten inside the | |
146 # action to be that of the action itself. Only define this in the case the | |
147 # var is used to avoid unused var error. | |
148 target_visibility = [ ":$target_name" ] | |
149 } | |
150 | |
151 generator_target_name = target_name + "__generator" | |
152 action_foreach(generator_target_name) { | |
153 if (defined(invoker.visibility)) { | |
154 visibility = target_visibility + invoker.visibility | |
155 } | |
156 script = generator_script | |
157 inputs = generator_sources | |
158 sources = invoker.sources | |
159 outputs = | |
160 generator_cpp_outputs + generator_dart_outputs + | |
161 generator_java_outputs + generator_js_outputs + generator_python_outputs | |
162 args = [ | |
163 "{{source}}", | |
164 "--use_bundled_pylibs", | |
165 "-d", | |
166 rebase_path("//", root_build_dir), | |
167 "-I", | |
168 rebase_path("//", root_build_dir), | |
169 "-I", | |
170 rebase_path(mojo_root, root_build_dir), | |
171 "-o", | |
172 rebase_path(root_gen_dir), | |
173 ] | |
174 | |
175 if (defined(invoker.import_dirs)) { | |
176 foreach(import_dir, invoker.import_dirs) { | |
177 args += [ | |
178 "-I", | |
179 rebase_path(import_dir, root_build_dir), | |
180 ] | |
181 } | |
182 } | |
183 } | |
184 | |
185 source_set(target_name) { | |
186 if (defined(invoker.visibility)) { | |
187 visibility = invoker.visibility | |
188 } | |
189 if (defined(invoker.testonly)) { | |
190 testonly = invoker.testonly | |
191 } | |
192 sources = process_file_template(invoker.sources, generator_cpp_outputs) | |
193 data = process_file_template(invoker.sources, generator_js_outputs) | |
194 | |
195 public_configs = | |
196 rebase_path([ "mojo/public/build/config:mojo_sdk" ], ".", mojo_root) | |
197 | |
198 public_deps = rebase_path([ "mojo/public/cpp/bindings" ], ".", mojo_root) | |
199 public_deps += rebased_mojo_sdk_public_deps | |
200 if (defined(invoker.public_deps)) { | |
201 public_deps += invoker.public_deps | |
202 } | |
203 | |
204 deps = [ | |
205 ":$generator_target_name", | |
206 ] | |
207 deps += rebased_mojo_sdk_deps | |
208 if (defined(invoker.deps)) { | |
209 deps += invoker.deps | |
210 } | |
211 } | |
212 | |
213 all_deps = rebased_mojo_sdk_deps + rebased_mojo_sdk_public_deps | |
214 if (defined(invoker.deps)) { | |
215 all_deps += invoker.deps | |
216 } | |
217 if (defined(invoker.public_deps)) { | |
218 all_deps += invoker.public_deps | |
219 } | |
220 | |
221 group("${target_name}__is_mojom") { | |
222 } | |
223 | |
224 # Explicitly ensure that all dependencies (invoker.deps and | |
225 # invoker.public_deps) are mojom targets themselves. | |
226 group("${target_name}__check_deps_are_all_mojom") { | |
227 deps = [] | |
228 foreach(d, all_deps) { | |
229 name = get_label_info(d, "label_no_toolchain") | |
230 toolchain = get_label_info(d, "toolchain") | |
231 deps += [ "${name}__is_mojom(${toolchain})" ] | |
232 } | |
233 } | |
234 | |
235 if (is_android) { | |
236 import("//build/config/android/rules.gni") | |
237 | |
238 java_target_name = target_name + "_java" | |
239 android_library(java_target_name) { | |
240 deps = rebase_path([ | |
241 "mojo/public/java:bindings", | |
242 "mojo/public/java:system", | |
243 ], | |
244 ".", | |
245 mojo_root) | |
246 | |
247 foreach(d, all_deps) { | |
248 # Resolve the name, so that a target //mojo/something becomes | |
249 # //mojo/something:something and we can append "_java" to get the java | |
250 # dependency name. | |
251 full_name = get_label_info(d, "label_no_toolchain") | |
252 deps += [ "${full_name}_java" ] | |
253 } | |
254 | |
255 srcjars = process_file_template(invoker.sources, generator_java_outputs) | |
256 } | |
257 } | |
258 } | |
OLD | NEW |