blob: 86a155a7fb12e00bc2a473952dbf431b63f1e4ed [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.
#
# 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.
#
# 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/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" ]
}
if (use_ozone) {
grit_defines += [ "-D", "use_ozone" ]
}
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_printing != 0) {
grit_defines += [ "-D", "enable_printing" ]
if (enable_printing == 1) {
grit_defines += [ "-D", "enable_full_printing" ]
}
}
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" ]
}
# Note: enable_hangout_services_extension is omitted. It is never set in the
# GYP build. Need to figure out what it's for.
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")
assert(!defined(invoker.sources) && !defined(invoker.outputs),
"Neither \"sources\" nor \"outputs\" can 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
}
# 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_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", "$rebased_output_dir", source_path, "-f", resource_ids ] +
grit_flags,
"list lines")
# The names returned by grit are relative to the current (build) directory,
# but references to files in this template are expected to be relative to the
# invoking BUILD.gn file's directory. Make it absolute so there's no
# ambiguity.
grit_outputs = get_path_info(
rebase_path(grit_outputs_build_rel, ".", root_build_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 innter 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) {
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
args = [
"-i", source_path, "build",
"-f", resource_ids,
"-o", rebased_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
}
}
}