Roll src/third_party/WebKit c63b89c:29324ab (svn 202546:202547)
[chromium-blink-merge.git] / build / secondary / tools / grit / grit_rule.gni
blob260cf8d8d1be6f7050c6787e244eaba7d614ee0d
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.
5 # Instantiate grit. This will produce a script target to run grit, and a
6 # static library that compiles the .cc files.
8 # Parameters
10 #   source (required)
11 #       Path to .grd file.
13 #   outputs (required)
14 #       List of outputs from grit, relative to the target_gen_dir. Grit will
15 #       verify at build time that this list is correct and will fail if there
16 #       is a mismatch between the outputs specified by the .grd file and the
17 #       outputs list here.
19 #       To get this list, you can look in the .grd file for
20 #       <output filename="..." and put those filename here. The base directory
21 #       of the list in Grit and the output list specified in the GN grit target
22 #       are the same (the target_gen_dir) so you can generally copy the names
23 #       exactly.
25 #       To get the list of outputs programatically, run:
26 #           python tools/grit/grit_info.py --outputs . path/to/your.grd
27 #       And strip the leading "./" from the output files.
29 #   defines (optional)
30 #       Extra defines to pass to grit (on top of the global grit_defines list).
32 #   grit_flags (optional)
33 #       List of strings containing extra command-line flags to pass to Grit.
35 #   resource_ids (optional)
36 #       Path to a grit "firstidsfile". Default is
37 #       //tools/gritsettings/resource_ids. Set to "" to use the value specified
38 #       in the <grit> nodes of the processed files.
40 #   output_dir (optional)
41 #       Directory for generated files. If you specify this, you will often
42 #       want to specify output_name if the target name is not particularly
43 #       unique, since this can cause files from multiple grit targets to
44 #       overwrite each other.
46 #   output_name (optiona)
47 #       Provide an alternate base name for the generated files, like the .d
48 #       files. Normally these are based on the target name and go in the
49 #       output_dir, but if multiple targets with the same name end up in
50 #       the same output_dir, they can collide.
52 #   depfile_dir (optional)
53 #       If set, used to store the depfile and corresponding stamp file.
54 #       Defaults to output_dir
56 #   use_qualified_include (optional)
57 #       If set, output_dir is not added to include_dirs.
59 #   configs (optional)
60 #       List of additional configs to be applied to the generated target.
61 #   deps  (optional)
62 #   inputs  (optional)
63 #       List of additional files, required for grit to process source file.
64 #   visibility  (optional)
65 #       Normal meaning.
67 # Example
69 #   grit("my_resources") {
70 #     # Source and outputs are required.
71 #     source = "myfile.grd"
72 #     outputs = [
73 #       "foo_strings.h",
74 #       "foo_strings.pak",
75 #     ]
77 #     grit_flags = [ "-E", "foo=bar" ]  # Optional extra flags.
78 #     # You can also put deps here if the grit source depends on generated
79 #     # files.
80 #   }
81 import("//build/config/chrome_build.gni")
82 import("//build/config/crypto.gni")
83 import("//build/config/features.gni")
84 import("//build/config/ui.gni")
86 grit_defines = []
88 # Mac and iOS want Title Case strings.
89 use_titlecase_in_grd_files = is_mac || is_ios
90 if (use_titlecase_in_grd_files) {
91   grit_defines += [
92     "-D",
93     "use_titlecase",
94   ]
97 if (is_chrome_branded) {
98   grit_defines += [
99     "-D",
100     "_google_chrome",
101     "-E",
102     "CHROMIUM_BUILD=google_chrome",
103   ]
104 } else {
105   grit_defines += [
106     "-D",
107     "_chromium",
108     "-E",
109     "CHROMIUM_BUILD=chromium",
110   ]
113 if (is_chromeos) {
114   grit_defines += [
115     "-D",
116     "chromeos",
117     "-D",
118     "scale_factors=2x",
119   ]
122 if (is_desktop_linux) {
123   grit_defines += [
124     "-D",
125     "desktop_linux",
126   ]
129 if (toolkit_views) {
130   grit_defines += [
131     "-D",
132     "toolkit_views",
133   ]
136 if (use_aura) {
137   grit_defines += [
138     "-D",
139     "use_aura",
140   ]
143 if (use_ash) {
144   grit_defines += [
145     "-D",
146     "use_ash",
147   ]
150 if (use_nss_certs) {
151   grit_defines += [
152     "-D",
153     "use_nss_certs",
154   ]
157 if (use_ozone) {
158   grit_defines += [
159     "-D",
160     "use_ozone",
161   ]
164 if (enable_image_loader_extension) {
165   grit_defines += [
166     "-D",
167     "image_loader_extension",
168   ]
171 if (is_android) {
172   grit_defines += [
173     "-t",
174     "android",
175     "-E",
176     "ANDROID_JAVA_TAGGED_ONLY=true",
177   ]
180 if (is_mac || is_ios) {
181   grit_defines += [
182     "-D",
183     "scale_factors=2x",
184   ]
187 if (is_ios) {
188   grit_defines += [
189     "-t",
190     "ios",
192     # iOS uses a whitelist to filter resources.
193     "-w",
194     rebase_path("//build/ios/grit_whitelist.txt", root_build_dir),
195   ]
198 if (enable_extensions) {
199   grit_defines += [
200     "-D",
201     "enable_extensions",
202   ]
204 if (enable_media_router) {
205   grit_defines += [
206     "-D",
207     "enable_media_router",
208   ]
210 if (enable_plugins) {
211   grit_defines += [
212     "-D",
213     "enable_plugins",
214   ]
216 if (enable_basic_printing || enable_print_preview) {
217   grit_defines += [
218     "-D",
219     "enable_printing",
220   ]
221   if (enable_print_preview) {
222     grit_defines += [
223       "-D",
224       "enable_print_preview",
225     ]
226   }
228 if (enable_themes) {
229   grit_defines += [
230     "-D",
231     "enable_themes",
232   ]
234 if (enable_app_list) {
235   grit_defines += [
236     "-D",
237     "enable_app_list",
238   ]
240 if (enable_settings_app) {
241   grit_defines += [
242     "-D",
243     "enable_settings_app",
244   ]
246 if (enable_google_now) {
247   grit_defines += [
248     "-D",
249     "enable_google_now",
250   ]
253 if (enable_webrtc) {
254   grit_defines += [
255     "-D",
256     "enable_webrtc",
257   ]
259 if (enable_hangout_services_extension) {
260   grit_defines += [
261     "-D",
262     "enable_hangout_services_extension",
263   ]
265 if (enable_task_manager) {
266   grit_defines += [
267     "-D",
268     "enable_task_manager",
269   ]
271 if (enable_notifications) {
272   grit_defines += [
273     "-D",
274     "enable_notifications",
275   ]
277 if (enable_wifi_bootstrapping) {
278   grit_defines += [
279     "-D",
280     "enable_wifi_bootstrapping",
281   ]
283 if (enable_service_discovery) {
284   grit_defines += [
285     "-D",
286     "enable_service_discovery",
287   ]
289 if (mac_views_browser) {
290   grit_defines += [
291     "-D",
292     "mac_views_browser",
293   ]
295 if (enable_topchrome_md) {
296   grit_defines += [
297     "-D",
298     "enable_topchrome_md",
299   ]
302 grit_resource_id_file = "//tools/gritsettings/resource_ids"
303 grit_info_script = "//tools/grit/grit_info.py"
305 template("grit") {
306   assert(defined(invoker.source),
307          "\"source\" must be defined for the grit template $target_name")
309   grit_inputs = [ invoker.source ]
311   if (defined(invoker.resource_ids)) {
312     resource_ids = invoker.resource_ids
313   } else {
314     resource_ids = grit_resource_id_file
315   }
316   if (resource_ids != "") {
317     # The script depends on the ID file. Only add this dependency if the ID
318     # file is specified.
319     grit_inputs += [ resource_ids ]
320   }
322   if (defined(invoker.output_dir)) {
323     output_dir = invoker.output_dir
324   } else {
325     output_dir = target_gen_dir
326   }
328   if (defined(invoker.output_name)) {
329     grit_output_name = invoker.output_name
330   } else {
331     grit_output_name = target_name
332   }
334   if (defined(invoker.depfile_dir)) {
335     depfile_dir = invoker.depfile_dir
336   } else {
337     depfile_dir = output_dir
338   }
340   # These are all passed as arguments to the script so have to be relative to
341   # the build directory.
342   if (resource_ids != "") {
343     resource_ids = rebase_path(resource_ids, root_build_dir)
344   }
345   rebased_output_dir = rebase_path(output_dir, root_build_dir)
346   source_path = rebase_path(invoker.source, root_build_dir)
348   if (defined(invoker.grit_flags)) {
349     grit_flags = invoker.grit_flags
350   } else {
351     grit_flags = []  # These are optional so default to empty list.
352   }
354   assert_files_flags = []
356   # We want to make sure the declared outputs actually match what Grit is
357   # writing. We write the list to a file (some of the output lists are long
358   # enough to not fit on a Windows command line) and ask Grit to verify those
359   # are the actual outputs at runtime.
360   asserted_list_file =
361       "$target_out_dir/${grit_output_name}_expected_outputs.txt"
362   write_file(asserted_list_file,
363              rebase_path(invoker.outputs, root_build_dir, output_dir))
364   assert_files_flags += [ "--assert-file-list=" +
365                           rebase_path(asserted_list_file, root_build_dir) ]
366   grit_outputs =
367       get_path_info(rebase_path(invoker.outputs, ".", output_dir), "abspath")
369   # The config and the action below get this visibility son only the generated
370   # source set can depend on them. The variable "target_name" will get
371   # overwritten inside the inner classes so we need to compute it here.
372   target_visibility = [ ":$target_name" ]
374   # The current grit setup makes an file in $output_dir/grit/foo.h that
375   # the source code expects to include via "grit/foo.h". It would be nice to
376   # change this to including absolute paths relative to the root gen directory
377   # (like "mycomponent/foo.h"). This config sets up the include path.
378   grit_config = target_name + "_grit_config"
379   config(grit_config) {
380     if (!defined(invoker.use_qualified_include) ||
381         !invoker.use_qualified_include) {
382       include_dirs = [ output_dir ]
383     }
384     visibility = target_visibility
385   }
387   grit_custom_target = target_name + "_grit"
388   action(grit_custom_target) {
389     script = "//tools/grit/grit.py"
390     inputs = grit_inputs
392     depfile = "$depfile_dir/${grit_output_name}_stamp.d"
393     outputs = [ "${depfile}.stamp" ] + grit_outputs
395     args = [
396       "-i",
397       source_path,
398       "build",
399     ]
400     if (resource_ids != "") {
401       args += [
402         "-f",
403         resource_ids,
404       ]
405     }
406     args += [
407               "-o",
408               rebased_output_dir,
409               "--depdir",
410               ".",
411               "--depfile",
412               rebase_path(depfile, root_build_dir),
413               "--write-only-new=1",
414               "--depend-on-stamp",
415             ] + grit_defines
417     # Add extra defines with -D flags.
418     if (defined(invoker.defines)) {
419       foreach(i, invoker.defines) {
420         args += [
421           "-D",
422           i,
423         ]
424       }
425     }
427     args += grit_flags + assert_files_flags
429     if (defined(invoker.visibility)) {
430       # This needs to include both what the invoker specified (since they
431       # probably include generated headers from this target), as well as the
432       # generated source set (since there's no guarantee that the visibility
433       # specified by the invoker includes our target).
434       #
435       # Only define visibility at all if the invoker specified it. Otherwise,
436       # we want to keep the public "no visibility specified" default.
437       visibility = target_visibility + invoker.visibility
438     }
440     deps = [
441       "//tools/grit:grit_sources",
442     ]
443     if (defined(invoker.deps)) {
444       deps += invoker.deps
445     }
446     if (defined(invoker.inputs)) {
447       inputs += invoker.inputs
448     }
449   }
451   # This is the thing that people actually link with, it must be named the
452   # same as the argument the template was invoked with.
453   source_set(target_name) {
454     # Since we generate a file, we need to be run before the targets that
455     # depend on us.
456     sources = grit_outputs
458     # Deps set on the template invocation will go on the action that runs
459     # grit above rather than this library. This target needs to depend on the
460     # action publicly so other scripts can take the outputs from the grit
461     # script as inputs.
462     public_deps = [
463       ":$grit_custom_target",
464     ]
465     public_configs = [ ":$grit_config" ]
467     if (defined(invoker.public_configs)) {
468       public_configs += invoker.public_configs
469     }
471     if (defined(invoker.configs)) {
472       configs += invoker.configs
473     }
475     if (defined(invoker.visibility)) {
476       visibility = invoker.visibility
477     }
478     output_name = grit_output_name
479   }