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" ]
}
}
}