Ben Murdoch | 097c5b2 | 2016-05-18 11:27:45 +0100 | [diff] [blame^] | 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 | |
| 5 | import("//build/config/sysroot.gni") |
| 6 | import("//build/config/nacl/config.gni") |
| 7 | import("//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. |
| 16 | revisions = 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") |
| 23 | nacl_x86_glibc_rev = revisions[0] |
| 24 | nacl_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 | |
| 30 | template("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 | |
| 89 | pnacl_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 | |
| 102 | pnacl_toolchain("newlib_pnacl_nonsfi") { |
| 103 | executable_extension = "" |
| 104 | strip = "strip" |
| 105 | } |
| 106 | |
| 107 | template("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 | |
| 144 | nacl_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 | |
| 156 | nacl_glibc_toolchain("x64") { |
| 157 | toolchain_package = "nacl_x86_glibc" |
| 158 | toolchain_revision = nacl_x86_glibc_rev |
| 159 | toolchain_tuple = "x86_64-nacl" |
| 160 | } |
| 161 | |
| 162 | nacl_glibc_toolchain("arm") { |
| 163 | toolchain_package = "nacl_arm_glibc" |
| 164 | toolchain_revision = nacl_arm_glibc_rev |
| 165 | toolchain_tuple = "arm-nacl" |
| 166 | } |
| 167 | |
| 168 | template("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 | |
| 201 | template("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 | |
| 255 | template("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 | |
| 265 | nacl_clang_toolchains("x86") { |
| 266 | # Rely on :compiler_cpu_abi adding -m32. See nacl_x86_glibc above. |
| 267 | toolchain_tuple = "x86_64-nacl" |
| 268 | } |
| 269 | |
| 270 | nacl_clang_toolchains("x64") { |
| 271 | toolchain_tuple = "x86_64-nacl" |
| 272 | } |
| 273 | |
| 274 | nacl_clang_toolchains("arm") { |
| 275 | toolchain_tuple = "arm-nacl" |
| 276 | } |