• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2014 The Native Client Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import("//build/config/sysroot.gni")
6import("//build/config/nacl/config.gni")
7import("//build/toolchain/nacl_toolchain.gni")
8
9# Add the toolchain revision as a preprocessor define so that sources are
10# rebuilt when a toolchain is updated.
11# Idea we could use the toolchain deps feature, but currently that feature is
12# bugged and does not trigger a rebuild.
13# https://code.google.com/p/chromium/issues/detail?id=431880
14# Calls to get the toolchain revision are relatively slow, so do them all in a
15# single batch to amortize python startup, etc.
16revisions = exec_script("//native_client/build/get_toolchain_revision.py",
17                        [
18                          "nacl_x86_glibc",
19                          "nacl_arm_glibc",
20                          "pnacl_newlib",
21                        ],
22                        "trim list lines")
23nacl_x86_glibc_rev = revisions[0]
24nacl_arm_glibc_rev = revisions[1]
25
26# TODO(mcgrathr): Uncomment this when
27# https://code.google.com/p/chromium/issues/detail?id=395883 is fixed.
28#pnacl_newlib_rev = revisions[2]
29
30template("pnacl_toolchain") {
31  assert(defined(invoker.executable_extension),
32         "Must define executable_extension")
33
34  # TODO(mcgrathr): See above.
35  pnacl_newlib_rev = revisions[2]
36
37  # The PNaCl toolchain tools are all wrapper scripts rather than binary
38  # executables.  On POSIX systems, nobody cares what kind of executable
39  # file you are.  But on Windows, scripts (.bat files) cannot be run
40  # directly and need the Windows shell (cmd.exe) specified explicily.
41  # TODO(mcgrathr): Hoist this to top level when
42  # https://code.google.com/p/chromium/issues/detail?id=395883 is fixed.
43  if (host_os == "win") {
44    # NOTE!  The //build/toolchain/gcc_*_wrapper.py scripts recognize
45    # this exact prefix string, so they must be updated if this string
46    # is changed in any way.
47    scriptprefix = "cmd /c call "
48    scriptsuffix = ".bat"
49  } else {
50    scriptprefix = ""
51    scriptsuffix = ""
52  }
53
54  # When the compilers are run via goma or ccache rather than directly by
55  # GN/Ninja, the goma/ccache wrapper handles .bat files but gets confused
56  # by being given the scriptprefix.
57  if (host_os == "win" && !use_goma && cc_wrapper == "") {
58    compiler_scriptprefix = scriptprefix
59  } else {
60    compiler_scriptprefix = ""
61  }
62
63  nacl_toolchain(target_name) {
64    toolchain_package = "pnacl_newlib"
65    toolchain_revision = pnacl_newlib_rev
66    toolchain_cpu = "pnacl"
67    toolprefix =
68        rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/pnacl-",
69                    root_build_dir)
70
71    is_clang = true
72    cc = compiler_scriptprefix + toolprefix + "clang" + scriptsuffix
73    cxx = compiler_scriptprefix + toolprefix + "clang++" + scriptsuffix
74    ar = scriptprefix + toolprefix + "ar" + scriptsuffix
75    readelf = scriptprefix + toolprefix + "readelf" + scriptsuffix
76    nm = scriptprefix + toolprefix + "nm" + scriptsuffix
77    if (defined(invoker.strip)) {
78      strip = scriptprefix + toolprefix + invoker.strip + scriptsuffix
79    }
80
81    # Note this is not the usual "ld = cxx" because "ld" uses are
82    # never run via goma, so this needs scriptprefix.
83    ld = scriptprefix + toolprefix + "clang++" + scriptsuffix
84
85    executable_extension = invoker.executable_extension
86  }
87}
88
89pnacl_toolchain("newlib_pnacl") {
90  executable_extension = ".pexe"
91
92  # The pnacl-finalize tool turns a .pexe.debug file into a .pexe file.
93  # It's very similar in purpose to the traditional "strip" utility: it
94  # turns what comes out of the linker into what you actually want to
95  # distribute and run.  PNaCl doesn't have a "strip"-like utility that
96  # you ever actually want to use other than pnacl-finalize, so just
97  # make pnacl-finalize the strip tool rather than adding an additional
98  # step like "postlink" to run pnacl-finalize.
99  strip = "finalize"
100}
101
102pnacl_toolchain("newlib_pnacl_nonsfi") {
103  executable_extension = ""
104  strip = "strip"
105}
106
107template("nacl_glibc_toolchain") {
108  toolchain_cpu = target_name
109  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
110  assert(defined(invoker.toolchain_package), "Must define toolchain_package")
111  assert(defined(invoker.toolchain_revision), "Must define toolchain_revision")
112  forward_variables_from(invoker,
113                         [
114                           "toolchain_package",
115                           "toolchain_revision",
116                         ])
117
118  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
119                               invoker.toolchain_tuple + "-",
120                           root_build_dir)
121
122  # TODO(mcgrathr): Hoist this to top level when
123  # https://code.google.com/p/chromium/issues/detail?id=395883 is fixed.
124  if (host_os == "win") {
125    toolsuffix = ".exe"
126  } else {
127    toolsuffix = ""
128  }
129
130  nacl_toolchain("glibc_" + toolchain_cpu) {
131    is_clang = false
132    is_nacl_glibc = true
133
134    cc = toolprefix + "gcc" + toolsuffix
135    cxx = toolprefix + "g++" + toolsuffix
136    ar = toolprefix + "ar" + toolsuffix
137    ld = cxx
138    readelf = toolprefix + "readelf" + toolsuffix
139    nm = toolprefix + "nm" + toolsuffix
140    strip = toolprefix + "strip" + toolsuffix
141  }
142}
143
144nacl_glibc_toolchain("x86") {
145  toolchain_package = "nacl_x86_glibc"
146  toolchain_revision = nacl_x86_glibc_rev
147
148  # Rely on the :compiler_cpu_abi config adding the -m32 flag here rather
149  # than using the i686-nacl binary directly.  This is a because i686-nacl-gcc
150  # is a shell script wrapper around x86_64-nacl-gcc and goma has trouble with
151  # compiler executables that are shell scripts (so the i686 'compiler' is not
152  # currently in goma).
153  toolchain_tuple = "x86_64-nacl"
154}
155
156nacl_glibc_toolchain("x64") {
157  toolchain_package = "nacl_x86_glibc"
158  toolchain_revision = nacl_x86_glibc_rev
159  toolchain_tuple = "x86_64-nacl"
160}
161
162nacl_glibc_toolchain("arm") {
163  toolchain_package = "nacl_arm_glibc"
164  toolchain_revision = nacl_arm_glibc_rev
165  toolchain_tuple = "arm-nacl"
166}
167
168template("nacl_clang_toolchain") {
169  toolchain_cpu = target_name
170  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
171
172  # TODO(mcgrathr): See above.
173  pnacl_newlib_rev = revisions[2]
174
175  toolchain_package = "pnacl_newlib"
176  toolchain_revision = pnacl_newlib_rev
177  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
178                               invoker.toolchain_tuple + "-",
179                           root_build_dir)
180
181  # TODO(mcgrathr): Hoist this to top level when
182  # https://code.google.com/p/chromium/issues/detail?id=395883 is fixed.
183  if (host_os == "win") {
184    toolsuffix = ".exe"
185  } else {
186    toolsuffix = ""
187  }
188
189  nacl_toolchain("clang_newlib_" + toolchain_cpu) {
190    is_clang = true
191    cc = toolprefix + "clang" + toolsuffix
192    cxx = toolprefix + "clang++" + toolsuffix
193    ar = toolprefix + "ar" + toolsuffix
194    ld = cxx
195    readelf = toolprefix + "readelf" + toolsuffix
196    nm = toolprefix + "nm" + toolsuffix
197    strip = toolprefix + "strip" + toolsuffix
198  }
199}
200
201template("nacl_irt_toolchain") {
202  toolchain_cpu = target_name
203  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
204
205  # TODO(mcgrathr): See above.
206  pnacl_newlib_rev = revisions[2]
207
208  toolchain_package = "pnacl_newlib"
209  toolchain_revision = pnacl_newlib_rev
210  toolprefix = rebase_path("${nacl_toolchain_dir}/${toolchain_package}/bin/" +
211                               invoker.toolchain_tuple + "-",
212                           root_build_dir)
213
214  # TODO(mcgrathr): Hoist this to top level when
215  # https://code.google.com/p/chromium/issues/detail?id=395883 is fixed.
216  if (host_os == "win") {
217    toolsuffix = ".exe"
218  } else {
219    toolsuffix = ""
220  }
221
222  link_irt = rebase_path("//native_client/build/link_irt.py", root_build_dir)
223
224  tls_edit_label =
225      "//native_client/src/tools/tls_edit:tls_edit($host_toolchain)"
226  host_toolchain_out_dir =
227      rebase_path(get_label_info(tls_edit_label, "root_out_dir"),
228                  root_build_dir)
229  tls_edit = "${host_toolchain_out_dir}/tls_edit"
230
231  nacl_toolchain("irt_" + toolchain_cpu) {
232    is_clang = true
233    cc = toolprefix + "clang" + toolsuffix
234    cxx = toolprefix + "clang++" + toolsuffix
235    ar = toolprefix + "ar" + toolsuffix
236    readelf = toolprefix + "readelf" + toolsuffix
237    nm = toolprefix + "nm" + toolsuffix
238    strip = toolprefix + "strip" + toolsuffix
239
240    # Always build the IRT with full debugging symbols, regardless of
241    # how Chromium itself is being built (or other NaCl executables).
242    symbol_level = 2
243
244    # Some IRT implementations (notably, Chromium's) contain C++ code,
245    # so we need to link w/ the C++ linker.
246    ld = "${python_path} ${link_irt} --tls-edit=${tls_edit} --link-cmd=${cxx} --readelf-cmd=${readelf}"
247
248    # TODO(ncbray): depend on link script
249    deps = [
250      tls_edit_label,
251    ]
252  }
253}
254
255template("nacl_clang_toolchains") {
256  assert(defined(invoker.toolchain_tuple), "Must define toolchain_tuple")
257  nacl_clang_toolchain(target_name) {
258    toolchain_tuple = invoker.toolchain_tuple
259  }
260  nacl_irt_toolchain(target_name) {
261    toolchain_tuple = invoker.toolchain_tuple
262  }
263}
264
265nacl_clang_toolchains("x86") {
266  # Rely on :compiler_cpu_abi adding -m32.  See nacl_x86_glibc above.
267  toolchain_tuple = "x86_64-nacl"
268}
269
270nacl_clang_toolchains("x64") {
271  toolchain_tuple = "x86_64-nacl"
272}
273
274nacl_clang_toolchains("arm") {
275  toolchain_tuple = "arm-nacl"
276}
277