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

import("//build/config/android/rules.gni")

# Generate ResourceRewriter.java from Android Libraries according the dep
# graph.
# Argument:
#   deps
#     The same deps of target that uses the generated ResourceRewriter.
#   package_name
#     The package name of ResourceRewriter.java.
#
# This target generates a single srcjar containing generated
# ResourceRewrite.java which will list the R classes generated by all the
# Android libraries reachabled from the target specified in deps. Add this
# target to srcjar_deps of android_library will call  ResourceRewriter.
#
template("generate_resource_rewriter") {
  set_sources_assignment_filter([])
  assert(defined(invoker.package_name))

  _final_target_name = target_name
  _build_config = "$target_gen_dir/${target_name}.build_config"
  _build_config_target_name = "$target_name$build_config_target_suffix"
  _srcjar = "$target_gen_dir/${target_name}.srcjar"
  write_build_config(_build_config_target_name) {
    possible_config_deps = invoker.deps
    type = "resource_rewriter"
    build_config = _build_config
  }

  action(_final_target_name) {
    forward_variables_from(invoker, [ "visibility" ])
    inputs = [
      _build_config,
    ]
    deps = invoker.deps + [ ":${_build_config_target_name}" ]
    script = "//build/android/gyp/generate_resource_rewriter.py"

    _rebased_build_config = rebase_path(_build_config, root_build_dir)
    args = [
      "--package-name",
      invoker.package_name,
      "--dep-packages",
      "@FileArg($_rebased_build_config:resources:extra_package_names)",
      "--srcjar",
      rebase_path(_srcjar, root_build_dir),
    ]
    outputs = [
      _srcjar,
    ]
  }
}
