summaryrefslogtreecommitdiffstats
path: root/tools/grit
diff options
context:
space:
mode:
authorbrettw <brettw@chromium.org>2015-08-26 16:06:11 -0700
committerCommit bot <commit-bot@chromium.org>2015-08-26 23:07:22 +0000
commit82d10f697a4268dd9ae0fffd8f3dfb1fb42901e5 (patch)
treeb2b5b40a214f087c67a4945cc9ceac525a06fdd3 /tools/grit
parente066fd88ea5b327288f4e348b16a61675abb9adb (diff)
downloadchromium_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.gn27
-rw-r--r--tools/grit/grit_rule.gni482
-rw-r--r--tools/grit/repack.gni47
-rw-r--r--tools/grit/stamp_grit_sources.py55
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))