Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / build / secondary / tools / grit / grit_rule.gni
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 # Instantiate grit. This will produce a script target to run grit, and a
6 # static library that compiles the .cc files.
7 #
8 # Parameters
9 #
10 #   source (required)
11 #       Path to .grd file.
12 #
13 #   outputs (required)
14 #       List of outputs from grit, relative to the target_gen_dir. If supplied,
15 #       a call to Grit to compute the outputs can be skipped which will make
16 #       GN run faster. Grit will verify at build time that this list is correct
17 #       and will fail if there is a mismatch between the outputs specified by
18 #       the .grd file and the outputs list here.
19 #
20 #       To get this list, you can look in the .grd file for
21 #       <output filename="..." and put those filename here. The base directory
22 #       of the list in Grit and the output list specified in the GN grit target
23 #       are the same (the target_gen_dir) so you can generally copy the names
24 #       exactly.
25 #
26 #       To get the list of outputs programatically, run:
27 #           python tools/grit/grit_info.py --outputs . path/to/your.grd
28 #       And strip the leading "./" from the output files.
29 #
30 #   defines (optional)
31 #       Extra defines to pass to grit (on top of the global grit_defines list).
32 #
33 #   grit_flags (optional)
34 #       List of strings containing extra command-line flags to pass to Grit.
35 #
36 #   resource_ids (optional)
37 #       Path to a grit "firstidsfile". Default is
38 #       //tools/gritsettings/resource_ids. Set to "" to use the value specified
39 #       in the <grit> nodes of the processed files.
40 #
41 #   output_dir (optional)
42 #       Directory for generated files. If you specify this, you will often
43 #       want to specify output_name if the target name is not particularly
44 #       unique, since this can cause files from multiple grit targets to
45 #       overwrite each other.
46 #
47 #   output_name (optiona)
48 #       Provide an alternate base name for the generated files, like the .d
49 #       files. Normally these are based on the target name and go in the
50 #       output_dir, but if multiple targets with the same name end up in
51 #       the same output_dir, they can collide.
52 #
53 #   use_qualified_include (optional)
54 #       If set, output_dir is not added to include_dirs.
55 #
56 #   deps  (optional)
57 #   visibility  (optional)
58 #       Normal meaning.
59 #
60 # Example
61 #
62 #   grit("my_resources") {
63 #     # Source and outputs are required.
64 #     source = "myfile.grd"
65 #     outputs = [
66 #       "foo_strings.h",
67 #       "foo_strings.pak",
68 #     ]
69 #
70 #     grit_flags = [ "-E", "foo=bar" ]  # Optional extra flags.
71 #     # You can also put deps here if the grit source depends on generated
72 #     # files.
73 #   }
74 import ("//build/config/crypto.gni")
75 import ("//build/config/features.gni")
76 import ("//build/config/ui.gni")
77
78 grit_defines = []
79
80 # Mac and iOS want Title Case strings.
81 use_titlecase_in_grd_files = is_mac || is_ios
82 if (use_titlecase_in_grd_files) {
83   grit_defines += [ "-D", "use_titlecase" ]
84 }
85
86 if (is_chrome_branded) {
87   grit_defines += [
88     "-D", "_google_chrome",
89     "-E", "CHROMIUM_BUILD=google_chrome",
90   ]
91 } else {
92   grit_defines += [
93     "-D", "_chromium",
94     "-E", "CHROMIUM_BUILD=chromium",
95   ]
96 }
97
98 if (is_chromeos) {
99   grit_defines += [
100     "-D", "chromeos",
101     "-D", "scale_factors=2x"
102   ]
103 }
104
105 if (is_desktop_linux) {
106   grit_defines += [ "-D", "desktop_linux" ]
107 }
108
109 if (toolkit_views) {
110   grit_defines += [ "-D", "toolkit_views" ]
111 }
112
113 if (use_aura) {
114   grit_defines += [ "-D", "use_aura" ]
115 }
116
117 if (use_ash) {
118   grit_defines += [ "-D", "use_ash" ]
119 }
120
121 if (use_nss_certs) {
122   grit_defines += [ "-D", "use_nss" ]
123 }
124
125 if (use_ozone) {
126   grit_defines += [ "-D", "use_ozone" ]
127 }
128
129 if (enable_image_loader_extension) {
130   grit_defines += [ "-D", "image_loader_extension" ]
131 }
132
133 if (enable_remoting) {
134   grit_defines += [ "-D", "remoting" ]
135 }
136
137 if (is_android) {
138   grit_defines += [
139     "-t", "android",
140     "-E", "ANDROID_JAVA_TAGGED_ONLY=true",
141   ]
142 }
143
144 if (is_mac || is_ios) {
145   grit_defines += [ "-D", "scale_factors=2x" ]
146 }
147
148 if (is_ios) {
149   grit_defines += [
150     "-t", "ios",
151     # iOS uses a whitelist to filter resources.
152     "-w", rebase_path("//build/ios/grit_whitelist.txt", root_build_dir),
153   ]
154 }
155
156 if (enable_extensions) {
157   grit_defines += [ "-D", "enable_extensions" ]
158 }
159 if (enable_plugins) {
160   grit_defines += [ "-D", "enable_plugins" ]
161 }
162 if (printing_mode != 0) {
163   grit_defines += [ "-D", "enable_printing" ]
164   if (printing_mode == 1) {
165     grit_defines += [ "-D", "enable_full_printing" ]
166   }
167 }
168 if (enable_themes) {
169   grit_defines += [ "-D", "enable_themes" ]
170 }
171 if (enable_app_list) {
172   grit_defines += [ "-D", "enable_app_list" ]
173 }
174 if (enable_settings_app) {
175   grit_defines += [ "-D", "enable_settings_app" ]
176 }
177 if (enable_google_now) {
178   grit_defines += [ "-D", "enable_google_now" ]
179 }
180 # Note: use_concatenated_impulse_responses is omitted. It is never used and
181 # should probably be removed from GYP build.
182 if (enable_webrtc) {
183   grit_defines += [ "-D", "enable_webrtc" ]
184 }
185 # Note: enable_hangout_services_extension is omitted. It is never set in the
186 # GYP build. Need to figure out what it's for.
187 if (enable_task_manager) {
188   grit_defines += [ "-D", "enable_task_manager" ]
189 }
190 if (enable_notifications) {
191   grit_defines += [ "-D", "enable_notifications" ]
192 }
193 if (enable_wifi_bootstrapping) {
194   grit_defines += [ "-D", "enable_wifi_bootstrapping" ]
195 }
196 if (enable_service_discovery) {
197   grit_defines += [ "-D", "enable_service_discovery" ]
198 }
199
200 grit_resource_id_file = "//tools/gritsettings/resource_ids"
201 grit_info_script = "//tools/grit/grit_info.py"
202
203 template("grit") {
204   assert(defined(invoker.source),
205          "\"source\" must be defined for the grit template $target_name")
206
207   if (defined(invoker.resource_ids)) {
208     resource_ids = invoker.resource_ids
209   } else {
210     resource_ids = grit_resource_id_file
211   }
212
213   if (defined(invoker.output_dir)) {
214     output_dir = invoker.output_dir
215   } else {
216     output_dir = target_gen_dir
217   }
218
219   if (defined(invoker.output_name)) {
220     grit_output_name = invoker.output_name
221   } else {
222     grit_output_name = target_name
223   }
224
225   # These are all passed as arguments to the script so have to be relative to
226   # the build directory.
227   if (resource_ids != "") {
228     resource_ids = rebase_path(resource_ids, root_build_dir)
229   }
230   rebased_output_dir = rebase_path(output_dir, root_build_dir)
231   source_path = rebase_path(invoker.source, root_build_dir)
232
233   if (defined(invoker.grit_flags)) {
234     grit_flags = invoker.grit_flags
235   } else {
236     grit_flags = []  # These are optional so default to empty list.
237   }
238
239   grit_inputs = [ invoker.source ]
240
241   assert_files_flags = []
242
243   # We want to make sure the declared outputs actually match what Grit is
244   # writing. We write the list to a file (some of the output lists are long
245   # enough to not fit on a Windows command line) and ask Grit to verify those
246   # are the actual outputs at runtime.
247   asserted_list_file =
248       "$target_out_dir/${grit_output_name}_expected_outputs.txt"
249   write_file(asserted_list_file,
250              rebase_path(invoker.outputs, root_build_dir, output_dir))
251   assert_files_flags += [
252     "--assert-file-list=" + rebase_path(asserted_list_file, root_build_dir),
253   ]
254   grit_outputs = get_path_info(
255       rebase_path(invoker.outputs, ".", output_dir),
256       "abspath")
257
258   # The config and the action below get this visibility son only the generated
259   # source set can depend on them. The variable "target_name" will get
260   # overwritten inside the inner classes so we need to compute it here.
261   target_visibility = ":$target_name"
262
263   # The current grit setup makes an file in $output_dir/grit/foo.h that
264   # the source code expects to include via "grit/foo.h". It would be nice to
265   # change this to including absolute paths relative to the root gen directory
266   # (like "mycomponent/foo.h"). This config sets up the include path.
267   grit_config = target_name + "_grit_config"
268   config(grit_config) {
269     if (!defined(invoker.use_qualified_include) ||
270         !invoker.use_qualified_include) {
271       include_dirs = [ output_dir ]
272     }
273     visibility = target_visibility
274   }
275
276   grit_custom_target = target_name + "_grit"
277   action(grit_custom_target) {
278     script = "//tools/grit/grit.py"
279     inputs = grit_inputs
280     outputs = grit_outputs
281     depfile = "$output_dir/${grit_output_name}.d"
282
283     args = [
284       "-i", source_path, "build",
285       "-f", resource_ids,
286       "-o", rebased_output_dir,
287       "--depdir", ".",
288       "--depfile", rebase_path(depfile, root_build_dir),
289     ] + grit_defines
290
291     # Add extra defines with -D flags.
292     if (defined(invoker.defines)) {
293       foreach (i, invoker.defines) {
294         args += [ "-D", i ]
295       }
296     }
297
298     args += grit_flags + assert_files_flags
299
300     visibility = target_visibility
301
302     deps = [ "//tools/grit:grit_sources" ]
303     if (defined(invoker.deps)) {
304       deps += invoker.deps
305     }
306   }
307
308   # This is the thing that people actually link with, it must be named the
309   # same as the argument the template was invoked with.
310   source_set(target_name) {
311     # Since we generate a file, we need to be run before the targets that
312     # depend on us.
313     sources = grit_outputs
314
315     # Deps set on the template invocation will go on the grit script running
316     # target rather than this library.
317     deps = [ ":$grit_custom_target" ]
318     direct_dependent_configs = [ ":$grit_config" ]
319
320     if (defined(invoker.visibility)) {
321       visibility = invoker.visibility
322     }
323     output_name = grit_output_name
324   }
325 }