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

import("//build/config/chrome_build.gni")

# 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.
#
# This template automatically includes VERSION, LASTCHANGE, and BRANDING. It
# automatically uses the template file .
# GYP parameterizes this template file but all current invocations use this
# same one. If in the future we need to set it, this should be added as an
# optional argument.
#
# 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.
#
#   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 uses for generating
#     resources will want to specify the chrome_version_rc_template defined
#     below.
#
#   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 = [ "myfile.h.in" ]
#     output = "$target_gen_dir/myfile.h"
#     extra_args = ["-e", "FOO=42"]
#     extra_files = [ "foo/BRANDING" ]
#   }
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"

    lastchange_path = "//build/util/LASTCHANGE"
    version_path = "//chrome/VERSION"
    if (is_chrome_branded) {
      branding_path = "//chrome/app/theme/google_chrome/BRANDING"
    } else {
      branding_path = "//chrome/app/theme/chromium/BRANDING"
    }

    inputs = [
      version_path,
      lastchange_path,
      branding_path,
    ]
    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),
        ]
      }
    }

    args += [
      "-f",
      rebase_path(version_path, root_build_dir),
      "-f",
      rebase_path(branding_path, root_build_dir),
      "-f",
      rebase_path(lastchange_path, 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",
      ]
    }
  }
}

chrome_version_rc_template = "//chrome/app/chrome_version.rc.version"
