# 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 (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_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
  }
}
