summaryrefslogtreecommitdiffstats
path: root/chrome/version.gni
blob: 2b53246e3a11cba0b68d44f47ff89594c8a7df5e (plain)
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
138
139
140
141
142
143
144
145
146
147
148
149
# 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 (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"