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

# Runs the version processing script over the given template file to produce
# an output file. This is used for generating various forms of files that
# incorporate the product name and version.
#
# Unlike GYP, this will actually compile the resulting file, so you don't need
# to add it separately to the sources, just depend on the target.
#
# In GYP this is a rule that runs once per ".ver" file. In GN this just
# processes one file per invocation of the template so you may have to have
# multiple targets.
#
# Parameters:
#   sources (optional):
#     List of file names to read. When converting a GYP target, this should
#     list the 'source' (see above) as well as any extra_variable_files.
#     The files will be passed to version.py in the order specified here.
#
#   output:
#     File name of file to write. In GYP this is unspecified and it will
#     make up a file name for you based on the input name, and tack on
#     "_version.rc" to the end. But in GN you need to specify the full name.
#
#   template_file (optional):
#     Template file to use (not a list). Most Windows users that want to use
#     this to process a .rc template should use process_version_rc_template(),
#     defined in //chrome/process_version_rc_template.gni, instead.
#
#   extra_args (optional):
#     Extra arguments to pass to version.py. Any "-f <filename>" args should
#     use sources instead.
#
#   process_only (optional, defaults to false)
#     Set to generate only one action that processes the version file and
#     doesn't attempt to link the result into a source set. This is for if
#     you are processing the version as data only.
#
#   visibility (optional)
#
# Example:
#   process_version("myversion") {
#     sources = [
#       "//chrome/VERSION"
#       "myfile.h.in"
#     ]
#     output = "$target_gen_dir/myfile.h"
#     extra_args = [ "-e", "FOO=42" ]
#   }
template("process_version") {
  assert(defined(invoker.output), "Output must be defined for $target_name")

  process_only = defined(invoker.process_only) && invoker.process_only

  if (process_only) {
    action_name = target_name
  } else {
    action_name = target_name + "_action"
    source_set_name = target_name
  }

  action(action_name) {
    script = "//build/util/version.py"

    inputs = []
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }
    if (defined(invoker.template_file)) {
      inputs += [ invoker.template_file ]
    }

    outputs = [
      invoker.output,
    ]

    args = []

    if (is_official_build) {
      args += [ "--official" ]
    }

    if (defined(invoker.sources)) {
      inputs += invoker.sources
      foreach(i, invoker.sources) {
        args += [
          "-f",
          rebase_path(i, root_build_dir),
        ]
      }
    }

    if (defined(invoker.extra_args)) {
      args += invoker.extra_args
    }
    args += [
      "-o",
      rebase_path(invoker.output, root_build_dir),
    ]
    if (defined(invoker.template_file)) {
      args += [ rebase_path(invoker.template_file, root_build_dir) ]
    }

    forward_variables_from(invoker, [ "deps" ])

    if (process_only) {
      # When processing only, visibility gets applied to this target.
      forward_variables_from(invoker, [ "visibility" ])
    } else {
      # When linking the result, only the source set can depend on the action.
      visibility = [ ":$source_set_name" ]
    }
  }

  if (!process_only) {
    source_set(source_set_name) {
      forward_variables_from(invoker, [ "visibility" ])
      sources = get_target_outputs(":$action_name")
      public_deps = [
        ":$action_name",
      ]
    }
  }
}
