|  | # Copyright 2014 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | # Instantiate grit. This will produce a script target to run grit, and a | 
|  | # static library that compiles the .cc files. | 
|  | # | 
|  | # Parameters | 
|  | # | 
|  | #   source (required) | 
|  | #       Path to .grd file. | 
|  | # | 
|  | #   outputs (required) | 
|  | #       List of outputs from grit, relative to the target_gen_dir. If supplied, | 
|  | #       a call to Grit to compute the outputs can be skipped which will make | 
|  | #       GN run faster. Grit will verify at build time that this list is correct | 
|  | #       and will fail if there is a mismatch between the outputs specified by | 
|  | #       the .grd file and the outputs list here. | 
|  | # | 
|  | #       To get this list, you can look in the .grd file for | 
|  | #       <output filename="..." and put those filename here. The base directory | 
|  | #       of the list in Grit and the output list specified in the GN grit target | 
|  | #       are the same (the target_gen_dir) so you can generally copy the names | 
|  | #       exactly. | 
|  | # | 
|  | #       To get the list of outputs programatically, run: | 
|  | #           python tools/grit/grit_info.py --outputs . path/to/your.grd | 
|  | #       And strip the leading "./" from the output files. | 
|  | # | 
|  | #   defines (optional) | 
|  | #       Extra defines to pass to grit (on top of the global grit_defines list). | 
|  | # | 
|  | #   grit_flags (optional) | 
|  | #       List of strings containing extra command-line flags to pass to Grit. | 
|  | # | 
|  | #   resource_ids (optional) | 
|  | #       Path to a grit "firstidsfile". Default is | 
|  | #       //tools/gritsettings/resource_ids. Set to "" to use the value specified | 
|  | #       in the <grit> nodes of the processed files. | 
|  | # | 
|  | #   output_dir (optional) | 
|  | #       Directory for generated files. If you specify this, you will often | 
|  | #       want to specify output_name if the target name is not particularly | 
|  | #       unique, since this can cause files from multiple grit targets to | 
|  | #       overwrite each other. | 
|  | # | 
|  | #   output_name (optiona) | 
|  | #       Provide an alternate base name for the generated files, like the .d | 
|  | #       files. Normally these are based on the target name and go in the | 
|  | #       output_dir, but if multiple targets with the same name end up in | 
|  | #       the same output_dir, they can collide. | 
|  | # | 
|  | #   use_qualified_include (optional) | 
|  | #       If set, output_dir is not added to include_dirs. | 
|  | # | 
|  | #   deps  (optional) | 
|  | #   visibility  (optional) | 
|  | #       Normal meaning. | 
|  | # | 
|  | # Example | 
|  | # | 
|  | #   grit("my_resources") { | 
|  | #     # Source and outputs are required. | 
|  | #     source = "myfile.grd" | 
|  | #     outputs = [ | 
|  | #       "foo_strings.h", | 
|  | #       "foo_strings.pak", | 
|  | #     ] | 
|  | # | 
|  | #     grit_flags = [ "-E", "foo=bar" ]  # Optional extra flags. | 
|  | #     # You can also put deps here if the grit source depends on generated | 
|  | #     # files. | 
|  | #   } | 
|  | import("//build/config/crypto.gni") | 
|  | import("//build/config/features.gni") | 
|  | import("//build/config/ui.gni") | 
|  |  | 
|  | grit_defines = [] | 
|  |  | 
|  | # Mac and iOS want Title Case strings. | 
|  | use_titlecase_in_grd_files = is_mac || is_ios | 
|  | if (use_titlecase_in_grd_files) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "use_titlecase", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_chrome_branded) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "_google_chrome", | 
|  | "-E", | 
|  | "CHROMIUM_BUILD=google_chrome", | 
|  | ] | 
|  | } else { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "_chromium", | 
|  | "-E", | 
|  | "CHROMIUM_BUILD=chromium", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_chromeos) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "chromeos", | 
|  | "-D", | 
|  | "scale_factors=2x", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_desktop_linux) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "desktop_linux", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (use_nss_certs) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "use_nss", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (enable_image_loader_extension) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "image_loader_extension", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (enable_remoting) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "remoting", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_android) { | 
|  | grit_defines += [ | 
|  | "-t", | 
|  | "android", | 
|  | "-E", | 
|  | "ANDROID_JAVA_TAGGED_ONLY=true", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_mac || is_ios) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "scale_factors=2x", | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (is_ios) { | 
|  | grit_defines += [ | 
|  | "-t", | 
|  | "ios", | 
|  |  | 
|  | # iOS uses a whitelist to filter resources. | 
|  | "-w", | 
|  | rebase_path("//build/ios/grit_whitelist.txt", root_build_dir), | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (enable_extensions) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_extensions", | 
|  | ] | 
|  | } | 
|  | if (enable_plugins) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_plugins", | 
|  | ] | 
|  | } | 
|  | if (enable_basic_printing || enable_print_preview) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_printing", | 
|  | ] | 
|  | if (enable_print_preview) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_print_preview", | 
|  | ] | 
|  | } | 
|  | } | 
|  | if (enable_themes) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_themes", | 
|  | ] | 
|  | } | 
|  | if (enable_app_list) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_app_list", | 
|  | ] | 
|  | } | 
|  | if (enable_settings_app) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_settings_app", | 
|  | ] | 
|  | } | 
|  | if (enable_google_now) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_google_now", | 
|  | ] | 
|  | } | 
|  |  | 
|  | # Note: use_concatenated_impulse_responses is omitted. It is never used and | 
|  | # should probably be removed from GYP build. | 
|  | if (enable_webrtc) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_webrtc", | 
|  | ] | 
|  | } | 
|  | if (enable_hangout_services_extension) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_hangout_services_extension", | 
|  | ] | 
|  | } | 
|  | if (enable_task_manager) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_task_manager", | 
|  | ] | 
|  | } | 
|  | if (enable_notifications) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_notifications", | 
|  | ] | 
|  | } | 
|  | if (enable_wifi_bootstrapping) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_wifi_bootstrapping", | 
|  | ] | 
|  | } | 
|  | if (enable_service_discovery) { | 
|  | grit_defines += [ | 
|  | "-D", | 
|  | "enable_service_discovery", | 
|  | ] | 
|  | } | 
|  |  | 
|  | grit_resource_id_file = "//tools/gritsettings/resource_ids" | 
|  | grit_info_script = "//tools/grit/grit_info.py" | 
|  |  | 
|  | template("grit") { | 
|  | assert(defined(invoker.source), | 
|  | "\"source\" must be defined for the grit template $target_name") | 
|  |  | 
|  | if (defined(invoker.resource_ids)) { | 
|  | resource_ids = invoker.resource_ids | 
|  | } else { | 
|  | resource_ids = grit_resource_id_file | 
|  | } | 
|  |  | 
|  | if (defined(invoker.output_dir)) { | 
|  | output_dir = invoker.output_dir | 
|  | } else { | 
|  | output_dir = target_gen_dir | 
|  | } | 
|  |  | 
|  | if (defined(invoker.output_name)) { | 
|  | grit_output_name = invoker.output_name | 
|  | } else { | 
|  | grit_output_name = target_name | 
|  | } | 
|  |  | 
|  | # These are all passed as arguments to the script so have to be relative to | 
|  | # the build directory. | 
|  | if (resource_ids != "") { | 
|  | resource_ids = rebase_path(resource_ids, root_build_dir) | 
|  | } | 
|  | rebased_output_dir = rebase_path(output_dir, root_build_dir) | 
|  | source_path = rebase_path(invoker.source, root_build_dir) | 
|  |  | 
|  | if (defined(invoker.grit_flags)) { | 
|  | grit_flags = invoker.grit_flags | 
|  | } else { | 
|  | grit_flags = []  # These are optional so default to empty list. | 
|  | } | 
|  |  | 
|  | grit_inputs = [ invoker.source ] | 
|  |  | 
|  | assert_files_flags = [] | 
|  |  | 
|  | # We want to make sure the declared outputs actually match what Grit is | 
|  | # writing. We write the list to a file (some of the output lists are long | 
|  | # enough to not fit on a Windows command line) and ask Grit to verify those | 
|  | # are the actual outputs at runtime. | 
|  | asserted_list_file = | 
|  | "$target_out_dir/${grit_output_name}_expected_outputs.txt" | 
|  | write_file(asserted_list_file, | 
|  | rebase_path(invoker.outputs, root_build_dir, output_dir)) | 
|  | assert_files_flags += [ "--assert-file-list=" + | 
|  | rebase_path(asserted_list_file, root_build_dir) ] | 
|  | grit_outputs = | 
|  | get_path_info(rebase_path(invoker.outputs, ".", output_dir), "abspath") | 
|  |  | 
|  | # The config and the action below get this visibility son only the generated | 
|  | # source set can depend on them. The variable "target_name" will get | 
|  | # overwritten inside the inner classes so we need to compute it here. | 
|  | target_visibility = [ ":$target_name" ] | 
|  |  | 
|  | # The current grit setup makes an file in $output_dir/grit/foo.h that | 
|  | # the source code expects to include via "grit/foo.h". It would be nice to | 
|  | # change this to including absolute paths relative to the root gen directory | 
|  | # (like "mycomponent/foo.h"). This config sets up the include path. | 
|  | grit_config = target_name + "_grit_config" | 
|  | config(grit_config) { | 
|  | if (!defined(invoker.use_qualified_include) || | 
|  | !invoker.use_qualified_include) { | 
|  | include_dirs = [ output_dir ] | 
|  | } | 
|  | visibility = target_visibility | 
|  | } | 
|  |  | 
|  | grit_custom_target = target_name + "_grit" | 
|  | action(grit_custom_target) { | 
|  | script = "//tools/grit/grit.py" | 
|  | inputs = grit_inputs | 
|  | outputs = grit_outputs | 
|  | depfile = "$output_dir/${grit_output_name}.d" | 
|  |  | 
|  | args = [ | 
|  | "-i", | 
|  | source_path, | 
|  | "build", | 
|  | ] | 
|  | if (resource_ids != "") { | 
|  | args += [ | 
|  | "-f", | 
|  | resource_ids, | 
|  | ] | 
|  | } | 
|  | args += [ | 
|  | "-o", | 
|  | rebased_output_dir, | 
|  | "--depdir", | 
|  | ".", | 
|  | "--depfile", | 
|  | rebase_path(depfile, root_build_dir), | 
|  | "--write-only-new=1", | 
|  | ] + grit_defines | 
|  |  | 
|  | # Add extra defines with -D flags. | 
|  | if (defined(invoker.defines)) { | 
|  | foreach(i, invoker.defines) { | 
|  | args += [ | 
|  | "-D", | 
|  | i, | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | args += grit_flags + assert_files_flags | 
|  |  | 
|  | if (defined(invoker.visibility)) { | 
|  | # This needs to include both what the invoker specified (since they | 
|  | # probably include generated headers from this target), as well as the | 
|  | # generated source set (since there's no guarantee that the visibility | 
|  | # specified by the invoker includes our target). | 
|  | # | 
|  | # Only define visibility at all if the invoker specified it. Otherwise, | 
|  | # we want to keep the public "no visibility specified" default. | 
|  | visibility = target_visibility + invoker.visibility | 
|  | } | 
|  |  | 
|  | deps = [ | 
|  | "//tools/grit:grit_sources", | 
|  | ] | 
|  | if (defined(invoker.deps)) { | 
|  | deps += invoker.deps | 
|  | } | 
|  | } | 
|  |  | 
|  | # This is the thing that people actually link with, it must be named the | 
|  | # same as the argument the template was invoked with. | 
|  | source_set(target_name) { | 
|  | # Since we generate a file, we need to be run before the targets that | 
|  | # depend on us. | 
|  | sources = grit_outputs | 
|  |  | 
|  | # Deps set on the template invocation will go on the grit script running | 
|  | # target rather than this library. | 
|  | deps = [ | 
|  | ":$grit_custom_target", | 
|  | ] | 
|  | public_configs = [ ":$grit_config" ] | 
|  |  | 
|  | if (defined(invoker.public_configs)) { | 
|  | public_configs += invoker.public_configs | 
|  | } | 
|  |  | 
|  | if (defined(invoker.visibility)) { | 
|  | visibility = invoker.visibility | 
|  | } | 
|  | output_name = grit_output_name | 
|  | } | 
|  | } |