File: BUILD.gn

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (342 lines) | stat: -rw-r--r-- 11,562 bytes parent folder | download | duplicates (5)
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
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
# Copyright (c) 2014 The Native Client 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/nacl/config.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/nacl_toolchain.gni")

# Add the toolchain revision as a preprocessor define so that sources are
# rebuilt when a toolchain is updated.
# Idea we could use the toolchain deps feature, but currently that feature is
# bugged and does not trigger a rebuild.
# https://code.google.com/p/chromium/issues/detail?id=431880
# Calls to get the toolchain revision are relatively slow, so do them all in a
# single batch to amortize python startup, etc.
revisions = exec_script("//native_client/build/get_toolchain_revision.py",
                        [
                          "nacl_x86_glibc",
                          "nacl_arm_glibc",
                          "pnacl_newlib",
                          "saigo_newlib",
                        ],
                        "trim list lines")
nacl_x86_glibc_rev = revisions[0]
nacl_arm_glibc_rev = revisions[1]

pnacl_newlib_rev = revisions[2]
saigo_newlib_rev = revisions[3]

if (host_os == "win") {
  toolsuffix = ".exe"
} else {
  toolsuffix = ""
}

# The PNaCl toolchain tools are all wrapper scripts rather than binary
# executables.  On POSIX systems, nobody cares what kind of executable
# file you are.  But on Windows, scripts (.bat files) cannot be run
# directly and need the Windows shell (cmd.exe) specified explicily.
if (host_os == "win") {
  # NOTE!  The //build/toolchain/gcc_*_wrapper.py scripts recognize
  # this exact prefix string, so they must be updated if this string
  # is changed in any way.
  scriptprefix = "cmd /c call "
  scriptsuffix = ".bat"
} else {
  scriptprefix = ""
  scriptsuffix = ""
}

# When the compilers are run via reclient or ccache rather than directly by
# GN/Ninja, the reclient/ccache wrapper handles .bat files but gets confused
# by being given the scriptprefix.
if (host_os == "win" && !use_reclient && cc_wrapper == "") {
  compiler_scriptprefix = scriptprefix
} else {
  compiler_scriptprefix = ""
}

template("pnacl_toolchain") {
  assert(defined(invoker.executable_extension),
         "Must define executable_extension")

  nacl_toolchain(target_name) {
    toolchain_package = "pnacl_newlib"
    toolchain_revision = pnacl_newlib_rev
    toolprefix =
        rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/pnacl-",
                    root_build_dir)

    if (host_os == "win") {
      # Flip the slashes so that copy/paste of the commands works.
      # This is also done throughout build\toolchain\win\BUILD.gn
      toolprefix = string_replace(toolprefix, "/", "\\")
    }

    cc = compiler_scriptprefix + toolprefix + "clang" + scriptsuffix
    cxx = compiler_scriptprefix + toolprefix + "clang++" + scriptsuffix
    ar = toolprefix + "ar" + scriptsuffix
    readelf = scriptprefix + toolprefix + "readelf" + scriptsuffix
    nm = scriptprefix + toolprefix + "nm" + scriptsuffix
    if (defined(invoker.strip)) {
      strip = scriptprefix + toolprefix + invoker.strip + scriptsuffix
    }
    forward_variables_from(invoker,
                           [
                             "executable_extension",
                             "is_clang_analysis_supported",
                             "extra_cppflags",
                           ])

    # Note this is not the usual "ld = cxx" because "ld" uses are
    # never run via rbe, so this needs scriptprefix.
    ld = scriptprefix + toolprefix + "clang++" + scriptsuffix

    toolchain_args = {
      is_clang = true
      current_cpu = "pnacl"
      use_lld = false
    }
  }
}

pnacl_toolchain("newlib_pnacl") {
  executable_extension = ".pexe"

  # The pnacl-finalize tool turns a .pexe.debug file into a .pexe file.
  # It's very similar in purpose to the traditional "strip" utility: it
  # turns what comes out of the linker into what you actually want to
  # distribute and run.  PNaCl doesn't have a "strip"-like utility that
  # you ever actually want to use other than pnacl-finalize, so just
  # make pnacl-finalize the strip tool rather than adding an additional
  # step like "postlink" to run pnacl-finalize.
  strip = "finalize"
}

template("nacl_glibc_toolchain") {
  toolchain_cpu = target_name
  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
  assert(defined(invoker.toolchain_package), "Must define toolchain_package")
  assert(defined(invoker.toolchain_revision), "Must define toolchain_revision")
  forward_variables_from(invoker,
                         [
                           "toolchain_package",
                           "toolchain_revision",
                         ])

  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
                               invoker.toolchain_tuple + "-",
                           root_build_dir)

  if (host_os == "win") {
    # Flip the slashes so that copy/paste of the commands works.
    # This is also done throughout build\toolchain\win\BUILD.gn
    toolprefix = string_replace(toolprefix, "/", "\\")
  }

  nacl_toolchain("glibc_" + toolchain_cpu) {
    cc = toolprefix + "gcc" + toolsuffix
    cxx = toolprefix + "g++" + toolsuffix
    ar = toolprefix + "ar" + toolsuffix
    ld = cxx
    readelf = toolprefix + "readelf" + toolsuffix
    nm = toolprefix + "nm" + toolsuffix
    strip = toolprefix + "strip" + toolsuffix

    toolchain_args = {
      current_cpu = toolchain_cpu

      # reclient does not support gcc.
      use_remoteexec = false
      is_clang = false
      is_nacl_glibc = true
      use_lld = false
    }
  }
}

nacl_glibc_toolchain("x86") {
  toolchain_package = "nacl_x86_glibc"
  toolchain_revision = nacl_x86_glibc_rev

  # Rely on the :compiler_cpu_abi config adding the -m32 flag here rather
  # than using the i686-nacl binary directly.
  toolchain_tuple = "x86_64-nacl"
}

nacl_glibc_toolchain("x64") {
  toolchain_package = "nacl_x86_glibc"
  toolchain_revision = nacl_x86_glibc_rev
  toolchain_tuple = "x86_64-nacl"
}

nacl_glibc_toolchain("arm") {
  toolchain_package = "nacl_arm_glibc"
  toolchain_revision = nacl_arm_glibc_rev
  toolchain_tuple = "arm-nacl"
}

template("nacl_clang_toolchain") {
  toolchain_cpu = target_name
  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")

  toolchain_package = "pnacl_newlib"
  toolchain_revision = pnacl_newlib_rev
  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
                               invoker.toolchain_tuple + "-",
                           root_build_dir)

  if (host_os == "win") {
    # Flip the slashes so that copy/paste of the commands works.
    # This is also done throughout build\toolchain\win\BUILD.gn
    toolprefix = string_replace(toolprefix, "/", "\\")
  }

  nacl_toolchain("clang_newlib_" + toolchain_cpu) {
    cc = toolprefix + "clang" + toolsuffix
    cxx = toolprefix + "clang++" + toolsuffix
    ar = toolprefix + "ar" + toolsuffix
    ld = cxx
    readelf = toolprefix + "readelf" + toolsuffix
    nm = toolprefix + "nm" + toolsuffix
    strip = toolprefix + "strip" + toolsuffix

    toolchain_args = {
      current_cpu = toolchain_cpu
      is_clang = true
      use_lld = false
    }
  }
}

template("nacl_irt_toolchain") {
  toolchain_cpu = target_name
  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")

  toolchain_package = "saigo_newlib"
  toolchain_revision = saigo_newlib_rev
  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
                               invoker.toolchain_tuple + "-",
                           root_build_dir)

  if (host_os == "win") {
    # Flip the slashes so that copy/paste of the commands works.
    # This is also done throughout build\toolchain\win\BUILD.gn
    toolprefix = string_replace(toolprefix, "/", "\\")
  }

  link_irt = rebase_path("//native_client/build/link_irt.py", root_build_dir)

  tls_edit_label =
      "//native_client/src/tools/tls_edit:tls_edit($host_toolchain)"
  host_toolchain_out_dir =
      rebase_path(get_label_info(tls_edit_label, "root_out_dir"),
                  root_build_dir)
  tls_edit = "${host_toolchain_out_dir}/tls_edit"

  nacl_toolchain("irt_" + toolchain_cpu) {
    cc = toolprefix + "clang" + toolsuffix
    cxx = toolprefix + "clang++" + toolsuffix
    ar = toolprefix + "ar" + toolsuffix
    readelf = toolprefix + "readelf" + toolsuffix
    nm = toolprefix + "nm" + toolsuffix
    strip = toolprefix + "strip" + toolsuffix

    # Some IRT implementations (notably, Chromium's) contain C++ code,
    # so we need to link w/ the C++ linker.
    ld = "${python_path} ${link_irt} --tls-edit=${tls_edit} --link-cmd=${cxx} --readelf-cmd=${readelf}"

    # reclient requires explicit upload of toolchain lib
    if (is_chromeos && use_remoteexec) {
      if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") {
        extra_cppflags = " " + invoker.extra_cppflags
      } else {
        extra_cppflags = ""
      }

      libdir = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/lib",
                           root_build_dir)
      extra_cppflags += " -B${libdir}"
    }

    toolchain_args = {
      current_cpu = toolchain_cpu
      is_clang = true
      use_lld = false
      is_nacl_saigo = true
      host_toolchain_is_msan = is_msan
      host_toolchain_msan_track_origins = msan_track_origins
    }

    # TODO(ncbray): depend on link script
    deps = [ tls_edit_label ]
  }
}

# This is essentially a clone of nacl_irt_toolchain above, except it uses the
# standard ld. This toolchain can be used to build regular nexes for NaCl
# browser tests.
template("nacl_test_irt_toolchain") {
  toolchain_cpu = target_name
  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")

  toolchain_package = "saigo_newlib"
  toolchain_revision = saigo_newlib_rev
  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
                               invoker.toolchain_tuple + "-",
                           root_build_dir)

  if (host_os == "win") {
    # Flip the slashes so that copy/paste of the commands works.
    # This is also done throughout build\toolchain\win\BUILD.gn
    toolprefix = string_replace(toolprefix, "/", "\\")
  }

  nacl_toolchain("test_irt_" + toolchain_cpu) {
    cc = toolprefix + "clang" + toolsuffix
    cxx = toolprefix + "clang++" + toolsuffix
    ar = toolprefix + "ar" + toolsuffix
    ld = cxx
    readelf = toolprefix + "readelf" + toolsuffix
    nm = toolprefix + "nm" + toolsuffix
    strip = toolprefix + "strip" + toolsuffix

    toolchain_args = {
      current_cpu = toolchain_cpu
      is_clang = true
      use_lld = false
      is_nacl_saigo = true
    }
  }
}

template("nacl_clang_toolchains") {
  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
  nacl_clang_toolchain(target_name) {
    toolchain_tuple = invoker.toolchain_tuple
  }
  nacl_irt_toolchain(target_name) {
    toolchain_tuple = invoker.toolchain_tuple
  }
  nacl_test_irt_toolchain(target_name) {
    toolchain_tuple = invoker.toolchain_tuple
  }
}

nacl_clang_toolchains("x86") {
  # Rely on :compiler_cpu_abi adding -m32.  See nacl_x86_glibc above.
  toolchain_tuple = "x86_64-nacl"
}

nacl_clang_toolchains("x64") {
  toolchain_tuple = "x86_64-nacl"
}

nacl_clang_toolchains("arm") {
  toolchain_tuple = "arm-nacl"
}

nacl_clang_toolchains("mipsel") {
  toolchain_tuple = "mipsel-nacl"
}