# 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.
#
#   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/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

    # TODO(knn): Remove this once grit has rolled to recognize the flag.
    depend_on_stamp =
        defined(invoker.depend_on_stamp) && invoker.depend_on_stamp
    if (depend_on_stamp) {
      # Need this for migrating existing targets without clobbering.
      depfile = "$output_dir/${grit_output_name}_stamp.d"
      outputs = [
        "${depfile}.stamp",
      ]
    } else {
      depfile = "$output_dir/${grit_output_name}.d"
      outputs = []
    }
    outputs += 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",
    ]
    if (depend_on_stamp) {
      args += [ "--depend-on-stamp" ]
    }
    args += 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 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.configs)) {
      configs += invoker.configs
    }

    if (defined(invoker.visibility)) {
      visibility = invoker.visibility
    }
    output_name = grit_output_name
  }
}
