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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
build / toolchain / cros / BUILD.gn [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/config/compiler/compiler.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/cros/cros_config.gni")
import("//build/toolchain/cros_toolchain.gni")
import("//build/toolchain/gcc_toolchain.gni")
# This is mostly identical to gcc_toolchain, but handles relativizing toolchain
# paths. This is needed for CrOS since these paths often change based on the
# environment. For example, cxx is a relative path picked up on $PATH in the
# chroot. But in Simple Chrome, cxx is a system-absolute path.
template("cros_toolchain") {
if (lacros_use_chromium_toolchain) {
clang_toolchain(target_name) {
forward_variables_from(invoker, "*")
}
} else {
gcc_toolchain(target_name) {
forward_variables_from(invoker, "*")
toolchain_args.cc_wrapper = ""
toolchain_args.clang_use_chrome_plugins = false
# CrOS's target toolchain wrapper prefers to invoke rewrapper itself, so
# pass it the rewrapper path via cmd-line arg. Otherwise, for both CrOS's
# host wrapper (used in the ebuild) and Chrome's clang (used in Simple
# Chrome), prepend rewrapper like normal.
if (use_reclient && invoker.needs_rewrapper_path_arg) {
extra_cppflags += "--rewrapper-path $reclient_cros_cc_wrapper --rewrapper-cfg ${reclient_cc_cfg_file}"
}
# Relativize path if compiler is specified such that not to lookup from
# $PATH and cc/cxx does not contain additional flags.
if (cc != get_path_info(cc, "file") &&
string_replace(cc, " ", "") == cc) {
cc = rebase_path(cc, root_build_dir)
}
if (cxx != get_path_info(cxx, "file") &&
string_replace(cxx, " ", "") == cxx) {
cxx = rebase_path(cxx, root_build_dir)
}
if (ar != get_path_info(ar, "file") &&
string_replace(ar, " ", "") == ar) {
ar = rebase_path(ar, root_build_dir)
}
if (ld != get_path_info(ld, "file") &&
string_replace(ld, " ", "") == ld) {
ld = rebase_path(ld, root_build_dir)
}
}
}
}
# This is the normal toolchain for most targets.
cros_toolchain("target") {
toolchain_args = {
current_cpu = target_cpu
current_os = "chromeos"
sysroot = target_sysroot
}
if (!lacros_use_chromium_toolchain) {
ar = cros_target_ar
cc = cros_target_cc
cxx = cros_target_cxx
ld = cros_target_ld
if (cros_target_nm != "") {
nm = cros_target_nm
}
if (cros_target_readelf != "") {
readelf = cros_target_readelf
}
extra_cflags = cros_target_extra_cflags
extra_cppflags = cros_target_extra_cppflags
extra_cxxflags = cros_target_extra_cxxflags
extra_ldflags = cros_target_extra_ldflags
needs_rewrapper_path_arg = cros_needs_rewrapper_path_arg
}
}
# This is a special toolchain needed just for the nacl_bootstrap target in
# //native_client/src/trusted/service_runtime/linux. It is identical
# to ":target" except that it forces `use_debug_fission1 and `use_sysroot` off,
# and allows the user to set different sets of extra flags.
cros_toolchain("nacl_bootstrap") {
toolchain_args = {
if (target_cpu == "arm64") {
current_cpu = "arm"
} else {
current_cpu = target_cpu
}
current_os = "chromeos"
use_debug_fission = false
use_sysroot = false
}
if (!lacros_use_chromium_toolchain) {
ar = cros_target_ar
cc = cros_target_cc
cxx = cros_target_cxx
ld = cros_target_ld
if (cros_target_nm != "") {
nm = cros_target_nm
}
if (cros_target_readelf != "") {
readelf = cros_target_readelf
}
extra_cflags = cros_nacl_bootstrap_extra_cflags
extra_cppflags = cros_nacl_bootstrap_extra_cppflags
extra_cxxflags = cros_nacl_bootstrap_extra_cxxflags
extra_ldflags = cros_nacl_bootstrap_extra_ldflags
needs_rewrapper_path_arg = cros_needs_rewrapper_path_arg
}
# We build for ARM32, even when the rest of the build targets ARM64.
if (target_cpu == "arm64") {
ar = cros_nacl_helper_arm32_ar
cc = cros_nacl_helper_arm32_cc
cxx = cros_nacl_helper_arm32_cxx
ld = cros_nacl_helper_arm32_ld
# Avoid accidental use of Arm64 sysroot because of SYSROOT
# env variable set in ChromeOS builds.
toolchain_args.sysroot = cros_nacl_helper_arm32_sysroot
}
}
# This is a special toolchain needed just for the nacl_helper target for
# building an Arm32 nacl_helper binary on Arm64 ChromeOS targets.
cros_toolchain("nacl_helper_arm32") {
toolchain_args = {
current_cpu = "arm"
current_os = "chromeos"
use_debug_fission = false
sysroot = cros_nacl_helper_arm32_sysroot
# Disable some uses of libraries that this build does not require. The
# sysroot for this build does not provide them, and they would be pulled in
# by indirect dependencies of nacl_helper otherwise.
use_cras = false
use_nss_certs = false
use_system_libdrm = false
use_system_libsync = false
}
ar = cros_nacl_helper_arm32_ar
cc = cros_nacl_helper_arm32_cc
cxx = cros_nacl_helper_arm32_cxx
ld = cros_nacl_helper_arm32_ld
readelf = cros_nacl_helper_arm32_readelf
extra_cflags = ""
extra_cppflags = ""
extra_cxxflags = ""
extra_ldflags = ""
if (!lacros_use_chromium_toolchain) {
needs_rewrapper_path_arg = cros_needs_rewrapper_path_arg
}
}
cros_toolchain("host") {
toolchain_args = {
current_cpu = host_cpu
current_os = "linux"
sysroot = cros_host_sysroot
}
if (!lacros_use_chromium_toolchain) {
# These are args for the template.
ar = cros_host_ar
cc = cros_host_cc
cxx = cros_host_cxx
ld = cros_host_ld
if (cros_host_nm != "") {
nm = cros_host_nm
}
if (cros_host_readelf != "") {
readelf = cros_host_readelf
}
extra_cflags = cros_host_extra_cflags
extra_cppflags = cros_host_extra_cppflags
extra_cxxflags = cros_host_extra_cxxflags
extra_ldflags = cros_host_extra_ldflags
needs_rewrapper_path_arg = false
}
}
cros_toolchain("v8_snapshot") {
toolchain_args = {
if (target_cpu == "x86" || target_cpu == "arm" || target_cpu == "mipsel") {
current_cpu = "x86"
} else {
current_cpu = "x64"
}
v8_current_cpu = v8_target_cpu
current_os = "linux"
sysroot = cros_v8_snapshot_sysroot
}
if (!lacros_use_chromium_toolchain) {
# These are args for the template.
ar = cros_v8_snapshot_ar
cc = cros_v8_snapshot_cc
cxx = cros_v8_snapshot_cxx
ld = cros_v8_snapshot_ld
if (cros_v8_snapshot_nm != "") {
nm = cros_v8_snapshot_nm
}
if (cros_v8_snapshot_readelf != "") {
readelf = cros_v8_snapshot_readelf
}
extra_cflags = cros_v8_snapshot_extra_cflags
extra_cppflags = cros_v8_snapshot_extra_cppflags
extra_cxxflags = cros_v8_snapshot_extra_cxxflags
extra_ldflags = cros_v8_snapshot_extra_ldflags
needs_rewrapper_path_arg = false
}
}