blob: 1e67474802bf1366e2b058e6befe8bd5185ab173 [file] [log] [blame]
# 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
# Path to .grd file.
#
# grit_flags (optional)
# List of strings containing extra command-line flags to pass to Grit.
#
# deps (optional)
# visibility (optional)
# Normal meaning.
#
# Example
#
# grit("my_resources") {
# source = "myfile.grd" # source is required.
# 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/features.gni")
import ("//build/config/ui.gni")
grit_defines = []
if (is_chromeos) {
grit_defines += [
"-D", "chromeos",
"-D", "scale_factors=2x"
]
}
if (is_desktop_linux) {
grit_defines += [ "-D", "desktop_linux" ]
}
if (is_android) {
grit_defines += [
"-t", "android",
"-E", "ANDROID_JAVA_TAGGED_ONLY=true",
]
}
if (enable_extensions) {
grit_defines += [ "-D", "enable_extensions" ]
}
if (enable_plugins) {
grit_defines += [ "-D", "enable_plugins" ]
}
# TODO(GYP) the rest of the grit_defines from the gyp build.
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")
assert(!defined(invoker.sources) && !defined(invoker.outputs),
"Neither \"sources\" nor \"outputs\" can be defined for the grit " +
"template $target_name")
# These are all passed as arguments to the script so have to be relative to
# the build directory.
resource_ids =
rebase_path(grit_resource_id_file, root_build_dir)
output_dir = rebase_path(target_gen_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_build_rel = exec_script(grit_info_script,
[ "--inputs", source_path, "-f", resource_ids] + grit_flags, "list lines")
# The inputs are relative to the current (build) directory, rebase to
# the current one.
grit_inputs = rebase_path(grit_inputs_build_rel, ".", root_build_dir) + [
grit_resource_id_file,
]
grit_outputs_build_rel = exec_script(grit_info_script,
[ "--outputs", "$output_dir", source_path, "-f", resource_ids ] +
grit_flags,
"list lines")
# The inputs are relative to the current (build) directory, rebase to
# the current one.
grit_outputs = rebase_path(grit_outputs_build_rel, ".", root_build_dir)
# 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 innter classes so we need to compute it here.
target_visibility = ":$target_name"
# The current grit setup makes an file in $target_gen_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) {
include_dirs = [ target_gen_dir ]
visibility = target_visibility
}
grit_custom_target = target_name + "_grit"
action(grit_custom_target) {
script = "//tools/grit/grit.py"
source_prereqs = grit_inputs
outputs = grit_outputs
args = [
"-i", source_path, "build",
"-f", resource_ids,
"-o", output_dir,
] + grit_defines + grit_flags
visibility = target_visibility
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" ]
direct_dependent_configs = [ ":$grit_config" ]
if (defined(invoker.visibility)) {
visibility = invoker.visibility
}
if (defined(invoker.output_name)) {
output_name = invoker.output_name
}
}
}