# Copyright 2015 the V8 project authors. All rights reserved. # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are # met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above # copyright notice, this list of conditions and the following # disclaimer in the documentation and/or other materials provided # with the distribution. # * Neither the name of Google Inc. nor the names of its # contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import("//build/config/v8_target_cpu.gni") declare_args() { # The v8 snapshot needs to be built by code that is compiled with a # toolchain that matches the bit-width of the target CPU, but runs on # the host. v8_snapshot_toolchain = "" } # Try to infer the appropriate snapshot toolchain for the v8_current_cpu # where possible. # # Assume that v8_target_cpu (and hence v8_current_cpu) has been validated # as supported on the current host CPU and OS in v8_target_cpu.gni. The # logic below is complicated enough without also needing to do input # validation. # # There are test cases for this code posted as an attachment to # https://crbug.com/625353. # # TODO(GYP): Currently only regular (non-cross) compiles, and cross-compiles # from x64 hosts to Intel, ARM, or MIPS targets, are implemented. Add support # for the other supported configurations. if (v8_snapshot_toolchain == "") { if (current_os == host_os && current_cpu == host_cpu) { # This is not a cross-compile, so build the snapshot with the current # toolchain. v8_snapshot_toolchain = current_toolchain } else if (current_os == host_os && current_cpu == "x86" && host_cpu == "x64") { # This is an x64 -> x86 cross-compile, but x64 hosts can usually run x86 # binaries built for the same OS, so build the snapshot with the current # toolchain here, too. v8_snapshot_toolchain = current_toolchain } else if (current_os == "win" && host_os == "mac" && is_clang) { # This is a mac -> win cross-compile, which is only supported w/ clang. v8_snapshot_toolchain = "//build/toolchain/mac:clang_${v8_current_cpu}" } else if (host_cpu == "x64" && (v8_current_cpu == "mips" || v8_current_cpu == "mips64")) { # We don't support snapshot generation for big-endian targets, # therefore snapshots will need to be built using native mksnapshot # in combination with qemu v8_snapshot_toolchain = current_toolchain } else if (host_cpu == "x64") { # This is a cross-compile from an x64 host to either a non-Intel target # cpu or a different target OS. Clang will always be used by default on the # host, unless this is a ChromeOS build, in which case the same toolchain # (Clang or GCC) will be used for target and host by default. if (is_chromeos && !is_clang) { _clang = "" } else { _clang = "clang_" } if (v8_current_cpu == "x64" || v8_current_cpu == "x86") { _cpus = v8_current_cpu } else if (v8_current_cpu == "arm64" || v8_current_cpu == "mips64el") { _cpus = "x64_v8_${v8_current_cpu}" } else if (v8_current_cpu == "arm" || v8_current_cpu == "mipsel") { _cpus = "x86_v8_${v8_current_cpu}" } else { # This branch should not be reached; leave _cpus blank so the assert # below will fail. _cpus = "" } if (_cpus != "") { v8_snapshot_toolchain = "//build/toolchain/${host_os}:${_clang}${_cpus}" } } } assert(v8_snapshot_toolchain != "", "Do not know how to build a snapshot for $current_toolchain " + "on $host_os $host_cpu")