# 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 (//ui/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 = "//ui/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)

    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),
      "--file_list={{response_file_name}}",
      "--output_cc=" + rebase_path(output_cc, root_build_dir),
      "--output_h=" + rebase_path(output_h, root_build_dir),
    ]
  }
}
