# 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", "MODULARIZE=1", "-s", "WASM=1", "-s", "NO_FILESYSTEM=1", "-s", "DISABLE_EXCEPTION_CATCHING=1", "-s", "NO_DYNAMIC_EXECUTION=1", "-s", "TOTAL_MEMORY=536870912", "-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" } copy("${_lib_name}.d.ts") { sources = [ "//gn/standalone/wasm_typescript_declaration.d.ts", ] outputs = [ "$root_out_dir/$_lib_name.d.ts", ] } } else { # is_wasm not_needed(invoker, "*") } group(target_name) { deps = [ ":${_lib_name}.d.ts($wasm_toolchain)", ":${_lib_name}.js($wasm_toolchain)", ":${_lib_name}.wasm($wasm_toolchain)", ] } } # template