1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137

build / util / process_version.gni [blame]

# Copyright 2014 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/util/lastchange.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.
#
# 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.
#
#   executable (optional, defaults to false)
#     Sets the executable bit on the output file (POSIX 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"

    sources = [ "//build/util/android_chrome_version.py" ]

    inputs = [ lastchange_file ]
    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.executable) && invoker.executable) {
      args += [ "-x" ]
    }

    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",
                               "deps",
                             ])
      sources = get_target_outputs(":$action_name")
      public_deps = [ ":$action_name" ]
    }
  }
}