diff options
author | brettw <brettw@chromium.org> | 2015-08-26 16:06:11 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-26 23:07:22 +0000 |
commit | 82d10f697a4268dd9ae0fffd8f3dfb1fb42901e5 (patch) | |
tree | b2b5b40a214f087c67a4945cc9ceac525a06fdd3 /tools/grit | |
parent | e066fd88ea5b327288f4e348b16a61675abb9adb (diff) | |
download | chromium_src-82d10f697a4268dd9ae0fffd8f3dfb1fb42901e5.zip chromium_src-82d10f697a4268dd9ae0fffd8f3dfb1fb42901e5.tar.gz chromium_src-82d10f697a4268dd9ae0fffd8f3dfb1fb42901e5.tar.bz2 |
Move GN grit scripts out of secondary tree.
These build files were in the secondary tree because I thought tools/grit was DEPSed in. However, this directory is in the Chrome tree. The DEPSed-in directory is tools/grit/grit. Moving these files to the expected place will make things more clear.
Review URL: https://codereview.chromium.org/1317013002
Cr-Commit-Position: refs/heads/master@{#345713}
Diffstat (limited to 'tools/grit')
-rw-r--r-- | tools/grit/BUILD.gn | 27 | ||||
-rw-r--r-- | tools/grit/grit_rule.gni | 482 | ||||
-rw-r--r-- | tools/grit/repack.gni | 47 | ||||
-rw-r--r-- | tools/grit/stamp_grit_sources.py | 55 |
4 files changed, 611 insertions, 0 deletions
diff --git a/tools/grit/BUILD.gn b/tools/grit/BUILD.gn new file mode 100644 index 0000000..3e98c05 --- /dev/null +++ b/tools/grit/BUILD.gn @@ -0,0 +1,27 @@ +# 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. + +# This target creates a stamp file that depends on all the sources in the grit +# directory. By depending on this, a target can force itself to be rebuilt if +# grit itself changes. +action("grit_sources") { + depfile = "$target_out_dir/grit_sources.d" + script = "//tools/grit/stamp_grit_sources.py" + + inputs = [ + "grit.py", + ] + + # Note that we can't call this "grit_sources.stamp" because that file is + # implicitly created by GN for script actions. + outputs = [ + "$target_out_dir/grit_sources.script.stamp", + ] + + args = [ + rebase_path("//tools/grit", root_build_dir), + rebase_path(outputs[0], root_build_dir), + rebase_path(depfile, root_build_dir), + ] +} diff --git a/tools/grit/grit_rule.gni b/tools/grit/grit_rule.gni new file mode 100644 index 0000000..6520535 --- /dev/null +++ b/tools/grit/grit_rule.gni @@ -0,0 +1,482 @@ +# 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. 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. +# +# depfile_dir (optional) +# If set, used to store the depfile and corresponding stamp file. +# Defaults to output_dir +# +# use_qualified_include (optional) +# If set, output_dir is not added to include_dirs. +# +# configs (optional) +# List of additional configs to be applied to the generated target. +# deps (optional) +# inputs (optional) +# List of additional files, required for grit to process source file. +# 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/chrome_build.gni") +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 (toolkit_views) { + grit_defines += [ + "-D", + "toolkit_views", + ] +} + +if (use_aura) { + grit_defines += [ + "-D", + "use_aura", + ] +} + +if (use_ash) { + grit_defines += [ + "-D", + "use_ash", + ] +} + +if (use_nss_certs) { + grit_defines += [ + "-D", + "use_nss_certs", + ] +} + +if (use_ozone) { + grit_defines += [ + "-D", + "use_ozone", + ] +} + +if (enable_image_loader_extension) { + grit_defines += [ + "-D", + "image_loader_extension", + ] +} + +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_media_router) { + grit_defines += [ + "-D", + "enable_media_router", + ] +} +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", + ] +} +if (mac_views_browser) { + grit_defines += [ + "-D", + "mac_views_browser", + ] +} +if (enable_topchrome_md) { + grit_defines += [ + "-D", + "enable_topchrome_md", + ] +} + +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") + + grit_inputs = [ invoker.source ] + + if (defined(invoker.resource_ids)) { + resource_ids = invoker.resource_ids + } else { + resource_ids = grit_resource_id_file + } + if (resource_ids != "") { + # The script depends on the ID file. Only add this dependency if the ID + # file is specified. + grit_inputs += [ resource_ids ] + } + + 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 + } + + if (defined(invoker.depfile_dir)) { + depfile_dir = invoker.depfile_dir + } else { + depfile_dir = output_dir + } + + # 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. + } + + 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 + + depfile = "$depfile_dir/${grit_output_name}_stamp.d" + outputs = [ "${depfile}.stamp" ] + grit_outputs + + 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", + "--depend-on-stamp", + ] + 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 + } + if (defined(invoker.inputs)) { + inputs += invoker.inputs + } + } + + # 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 action that runs + # grit above rather than this library. This target needs to depend on the + # action publicly so other scripts can take the outputs from the grit + # script as inputs. + public_deps = [ + ":$grit_custom_target", + ] + public_configs = [ ":$grit_config" ] + + if (defined(invoker.public_configs)) { + public_configs += invoker.public_configs + } + + if (defined(invoker.configs)) { + configs += invoker.configs + } + + if (defined(invoker.visibility)) { + visibility = invoker.visibility + } + output_name = grit_output_name + } +} diff --git a/tools/grit/repack.gni b/tools/grit/repack.gni new file mode 100644 index 0000000..1030674 --- /dev/null +++ b/tools/grit/repack.gni @@ -0,0 +1,47 @@ +# 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. + +# This file defines a template to invoke grit repack in a consistent manner. +# +# Parameters: +# sources [required] +# List of pak files that need to be combined. +# +# output [required] +# File name (single string) of the output file. +# +# repack_options [optional] +# List of extra arguments to pass. +# +# deps [optional] +# visibility [optional] +# Normal meaning. +template("repack") { + action(target_name) { + assert(defined(invoker.sources), "Need sources for $target_name") + assert(defined(invoker.output), "Need output for $target_name") + + if (defined(invoker.visibility)) { + visibility = invoker.visibility + } + + script = "//tools/grit/grit/format/repack.py" + + inputs = invoker.sources + outputs = [ + invoker.output, + ] + + args = [] + if (defined(invoker.repack_options)) { + args += invoker.repack_options + } + args += [ rebase_path(invoker.output, root_build_dir) ] + args += rebase_path(invoker.sources, root_build_dir) + + if (defined(invoker.deps)) { + deps = invoker.deps + } + } +} diff --git a/tools/grit/stamp_grit_sources.py b/tools/grit/stamp_grit_sources.py new file mode 100644 index 0000000..d43d4b8 --- /dev/null +++ b/tools/grit/stamp_grit_sources.py @@ -0,0 +1,55 @@ +# 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. + +# This script enumerates the files in the given directory, writing an empty +# stamp file and a .d file listing the inputs required to make the stamp. This +# allows us to dynamically depend on the grit sources without enumerating the +# grit directory for every invocation of grit (which is what adding the source +# files to every .grd file's .d file would entail) or shelling out to grit +# synchronously during GN execution to get the list (which would be slow). +# +# Usage: +# stamp_grit_sources.py <directory> <stamp-file> <.d-file> + +import os +import sys + +def GritSourceFiles(grit_root_dir): + files = [] + for root, _, filenames in os.walk(grit_root_dir): + grit_src = [os.path.join(root, f) for f in filenames + if f.endswith('.py') and not f.endswith('_unittest.py')] + files.extend(grit_src) + files = [f.replace('\\', '/') for f in files] + return sorted(files) + + +def WriteDepFile(dep_file, stamp_file, source_files): + with open(dep_file, "w") as f: + f.write(stamp_file) + f.write(": ") + f.write(' '.join(source_files)) + + +def WriteStampFile(stamp_file): + with open(stamp_file, "w"): + pass + + +def main(argv): + if len(argv) != 4: + print "Error: expecting 3 args." + return 1 + + grit_root_dir = sys.argv[1] + stamp_file = sys.argv[2] + dep_file = sys.argv[3] + + WriteStampFile(stamp_file) + WriteDepFile(dep_file, stamp_file, GritSourceFiles(grit_root_dir)) + return 0 + + +if __name__ == '__main__': + sys.exit(main(sys.argv)) |