| # Copyright (C) 2018 The Android Open Source Project |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| wasm_toolchain = "//gn/standalone/toolchain:wasm" |
| is_wasm = current_toolchain == wasm_toolchain |
| emsdk_dir = rebase_path("//buildtools/emsdk", "") |
| nodejs_dir = rebase_path("//buildtools/nodejs", "") |
| |
| # This variable is used by the //gn/standalone/toolchain/BUILD.gn. |
| em_config = "EMSCRIPTEN_ROOT='$emsdk_dir/emscripten';" |
| em_config += "LLVM_ROOT='$emsdk_dir/llvm';" |
| em_config += "BINARYEN_ROOT='$emsdk_dir/llvm/binaryen';" |
| em_config += "EMSCRIPTEN_NATIVE_OPTIMIZER='$emsdk_dir/llvm/optimizer';" |
| em_config += "NODE_JS='$nodejs_dir/bin/node';" |
| em_config += "COMPILER_ENGINE=NODE_JS;" |
| em_config += "JS_ENGINES=[NODE_JS];" |
| em_config = "\"$em_config\"" |
| |
| # Defines a WASM library target. |
| # Args: |
| # generate_js: when true generates a .wasm file and a .js file that wraps it |
| # and provides the boilerplate to initialize the module. |
| # generate_html: when true generates also an example .html file which contains |
| # a minimal console to interact with the module (useful for testing). |
| template("wasm_lib") { |
| _lib_name = target_name |
| |
| if (is_wasm) { |
| assert(defined(invoker.sources)) |
| _target_ldflags = [ |
| "-s", |
| "WASM=1", |
| "-s", |
| "NO_FILESYSTEM=1", |
| "-s", |
| "DISABLE_EXCEPTION_CATCHING=1", |
| "-s", |
| "TOTAL_MEMORY=33554432", |
| "-s", |
| "RESERVED_FUNCTION_POINTERS=32", |
| "-s", |
| "BINARYEN_METHOD='native-wasm'", |
| "-s", |
| "EXPORT_FUNCTION_TABLES=1", |
| "-s", |
| "EXTRA_EXPORTED_RUNTIME_METHODS=['ccall', 'cwrap', 'addFunction']", |
| ] |
| if (!is_debug) { |
| _target_ldflags += [ "-O3" ] |
| } |
| |
| if (defined(invoker.js_library)) { |
| _target_ldflags += [ |
| "--js-library", |
| invoker.js_library, |
| ] |
| } |
| |
| _vars_to_forward = [ |
| "cflags", |
| "defines", |
| "deps", |
| "includes", |
| "sources", |
| "include_dirs", |
| "public_configs", |
| "testonly", |
| "visibility", |
| ] |
| |
| executable("${_lib_name}.js") { |
| forward_variables_from(invoker, _vars_to_forward) |
| ldflags = _target_ldflags |
| output_extension = "" |
| } |
| |
| # This is just a workaround to deal with the fact that GN doesn't allow |
| # spcifying extra outputs for an executable() target. In reality the .wasm |
| # file here is generated by the executable() target above, together with the |
| # .js file. This dummy target is here to tell GN "there is a target that |
| # outputs also the .wasm file", so we can depend on that in copy() targets. |
| action("${_lib_name}.wasm") { |
| inputs = [] |
| deps = [ |
| ":${_lib_name}.js", |
| ] |
| outputs = [ |
| "$root_out_dir/$_lib_name.wasm", |
| ] |
| args = [ "--noop" ] |
| script = "//gn/standalone/build_tool_wrapper.py" |
| } |
| } else { # is_wasm |
| not_needed(invoker, "*") |
| } |
| |
| group(target_name) { |
| deps = [ |
| ":${_lib_name}.js($wasm_toolchain)", |
| ":${_lib_name}.wasm($wasm_toolchain)", |
| ] |
| } |
| } # template |