# Copyright 2017 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.

# Creates an action that aggregates vector icon files (.icon) into a C++ file.
# In addition to running the action, the outputs should be added to another
# target's sources for compilation.
#
# Parameters
#
#   icons (required)
#       A list of icon filenames to use as inputs.
#
#   icon_directory (required)
#       The path component of the location of the icons, relative to the current
#       directory. For example, if the invoking BUILD file exists in //foo/bar
#       and the icons are in //foo/bar/vector_icons/, then icon_directory should
#       be set to "vector_icons". There must also be template files in this
#       directory.
#
# Example
#
#   See BUILD.gn in this directory (//components/vector_icons/) for an example.
template("aggregate_vector_icons") {
  assert(defined(invoker.icons),
         "Need icons in $target_name listing the icon files.")
  assert(
      defined(invoker.icon_directory),
      "Need icon_directory in $target_name where the icons and templates live.")

  action(target_name) {
    visibility = [ ":*" ]

    script = "//components/vector_icons/aggregate_vector_icons.py"

    output_cc = "$target_gen_dir/vector_icons.cc"
    output_h = "$target_gen_dir/vector_icons.h"

    templates = [
      "vector_icons.cc.template",
      "vector_icons.h.template",
    ]
    inputs =
        rebase_path(templates + invoker.icons, ".", invoker.icon_directory) +
        [ "//components/vector_icons/aggregate_vector_icons.py" ]

    outputs = [
      output_cc,
      output_h,
    ]

    response_file_contents =
        rebase_path(invoker.icons, root_build_dir, invoker.icon_directory)

    args = [
      "--working_directory=" +
          rebase_path(invoker.icon_directory, root_build_dir),
      "--file_list={{response_file_name}}",
      "--output_cc=" + rebase_path(output_cc, root_build_dir),
      "--output_h=" + rebase_path(output_h, root_build_dir),
    ]
  }
}
