blob: 79940573b317ecf650f30f4835cd585d603af650 [file] [log] [blame]
# Copyright (c) 2013 The Chromium 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/toolchain/ccache.gni")
import("//build/toolchain/gcc_toolchain.gni")
# Defines the configuration of emscripten for building WASM targets.
declare_args() {
# The location of an activated embedded emsdk.
emsdk_dir = rebase_path("//flutter/prebuilts/emsdk")
wasm_use_pthreads = false
wasm_use_dwarf = false
}
em_config_path = "$emsdk_dir/.emscripten"
if (use_ccache) {
# ccache only supports compilation, not linking.
compiler_prefix = "ccache "
} else {
compiler_prefix = ""
}
template("wasm_toolchain") {
gcc_toolchain(target_name) {
extra_toolchain_args = {
if (defined(invoker.extra_toolchain_args)) {
forward_variables_from(invoker.extra_toolchain_args, "*")
}
}
# emsdk_dir and em_config are defined in wasm.gni.
ar = "$emsdk_dir/upstream/emscripten/emar --em-config $em_config_path"
cc = "$compiler_prefix$emsdk_dir/upstream/emscripten/emcc --em-config $em_config_path"
cxx = "$compiler_prefix$emsdk_dir/upstream/emscripten/em++ --em-config $em_config_path"
asm = "$emsdk_dir/upstream/emscripten/emcc --em-config $em_config_path"
# emscripten emits this .worker.js file conditionally depending on whether
# pthreads are on or not. Unfortunately, there is no way to conditionally
# change the outputs of the toolchain depending on flags that are specified
# in the target or configs. In order to resolve this, we will always
# specify the .worker.js file as an output, and touch the path to create a
# dummy file. If the target does use pthreads, this dummy file will be
# overwritten. If the target does not, the dummy file will satisfy the
# toolchain's requirement that it has this as an output.
ld = "$emsdk_dir/upstream/emscripten/em++ --em-config $em_config_path"
readelf = "readelf"
nm = "nm"
toolchain_cpu = "wasm"
toolchain_os = "wasm"
is_clang = true
link_outputs = [
"{{root_out_dir}}/{{target_output_name}}.wasm",
# We always output a symbol map.
"{{root_out_dir}}/{{target_output_name}}.js.symbols",
]
if (is_debug && !wasm_use_dwarf) {
link_outputs += [ "{{root_out_dir}}/{{target_output_name}}.wasm.map" ]
}
}
}
# Defines a WASM library target.
# Args:
# export_name: The public name of the module to expose (EXPORT_NAME for
# emscripten). Defaults to target_name.
template("wasm_lib") {
export_name = target_name
if (defined(invoker.export_name)) {
export_name = invoker.export_name
}
_target_ldflags = [
# This is to prevent that two different wasm modules end up generating
# JS that overrides the same global variable (var Module = ...)
"-s",
"EXPORT_NAME=${export_name}",
]
if (defined(invoker.ldflags)) {
_target_ldflags += invoker.ldflags
}
_target_cflags = [
"-s",
"MAIN_MODULE=1",
]
if (defined(invoker.cflags)) {
_target_cflags += invoker.cflags
}
_vars_to_forward = [
"defines",
"deps",
"includes",
"inputs",
"sources",
"include_dirs",
"public_configs",
"testonly",
"visibility",
]
_lib_name = target_name
executable("$_lib_name") {
forward_variables_from(invoker, _vars_to_forward)
cflags = _target_cflags
ldflags = _target_ldflags
output_extension = "js"
}
}