1*6dbdd20aSAndroid Build Coastguard Worker# Copyright (C) 2018 The Android Open Source Project 2*6dbdd20aSAndroid Build Coastguard Worker# 3*6dbdd20aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*6dbdd20aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*6dbdd20aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*6dbdd20aSAndroid Build Coastguard Worker# 7*6dbdd20aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*6dbdd20aSAndroid Build Coastguard Worker# 9*6dbdd20aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*6dbdd20aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*6dbdd20aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*6dbdd20aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*6dbdd20aSAndroid Build Coastguard Worker# limitations under the License. 14*6dbdd20aSAndroid Build Coastguard Worker 15*6dbdd20aSAndroid Build Coastguard Workerimport("../wasm_vars.gni") 16*6dbdd20aSAndroid Build Coastguard Worker 17*6dbdd20aSAndroid Build Coastguard Worker# Used by //gn/standalone/toolchain/BUILD.gn . 18*6dbdd20aSAndroid Build Coastguard Workerem_config = rebase_path(".emscripten", "") 19*6dbdd20aSAndroid Build Coastguard Workerif (is_mac_host) { 20*6dbdd20aSAndroid Build Coastguard Worker emsdk_dir = rebase_path("//buildtools/mac/emsdk", "") 21*6dbdd20aSAndroid Build Coastguard Worker} else { 22*6dbdd20aSAndroid Build Coastguard Worker emsdk_dir = rebase_path("//buildtools/linux64/emsdk", "") 23*6dbdd20aSAndroid Build Coastguard Worker} 24*6dbdd20aSAndroid Build Coastguard Worker 25*6dbdd20aSAndroid Build Coastguard Worker# Defines a WASM library target. 26*6dbdd20aSAndroid Build Coastguard Worker# Args: 27*6dbdd20aSAndroid Build Coastguard Worker# generate_js: when true generates a .wasm file and a .js file that wraps it 28*6dbdd20aSAndroid Build Coastguard Worker# and provides the boilerplate to initialize the module. 29*6dbdd20aSAndroid Build Coastguard Worker# generate_html: when true generates also an example .html file which contains 30*6dbdd20aSAndroid Build Coastguard Worker# a minimal console to interact with the module (useful for testing). 31*6dbdd20aSAndroid Build Coastguard Workertemplate("wasm_lib") { 32*6dbdd20aSAndroid Build Coastguard Worker assert(defined(invoker.name)) 33*6dbdd20aSAndroid Build Coastguard Worker 34*6dbdd20aSAndroid Build Coastguard Worker # If the name is foo the target_name must be foo_wasm. 35*6dbdd20aSAndroid Build Coastguard Worker assert(invoker.name + "_wasm" == target_name) 36*6dbdd20aSAndroid Build Coastguard Worker _lib_name = invoker.name 37*6dbdd20aSAndroid Build Coastguard Worker if (is_wasm) { 38*6dbdd20aSAndroid Build Coastguard Worker _exports = "['ccall', 'callMain', 'addFunction', 'FS']" 39*6dbdd20aSAndroid Build Coastguard Worker _target_ldflags = [ 40*6dbdd20aSAndroid Build Coastguard Worker "-s", 41*6dbdd20aSAndroid Build Coastguard Worker "WASM=1", 42*6dbdd20aSAndroid Build Coastguard Worker "-s", 43*6dbdd20aSAndroid Build Coastguard Worker "ENVIRONMENT=web,worker", 44*6dbdd20aSAndroid Build Coastguard Worker "-s", 45*6dbdd20aSAndroid Build Coastguard Worker "DISABLE_EXCEPTION_CATCHING=1", 46*6dbdd20aSAndroid Build Coastguard Worker "-s", 47*6dbdd20aSAndroid Build Coastguard Worker "NO_DYNAMIC_EXECUTION=1", 48*6dbdd20aSAndroid Build Coastguard Worker "-s", 49*6dbdd20aSAndroid Build Coastguard Worker "INITIAL_MEMORY=33554432", 50*6dbdd20aSAndroid Build Coastguard Worker "-s", 51*6dbdd20aSAndroid Build Coastguard Worker "MAXIMUM_MEMORY=4GB", 52*6dbdd20aSAndroid Build Coastguard Worker "-s", 53*6dbdd20aSAndroid Build Coastguard Worker "ALLOW_MEMORY_GROWTH=1", 54*6dbdd20aSAndroid Build Coastguard Worker "-s", 55*6dbdd20aSAndroid Build Coastguard Worker "ALLOW_TABLE_GROWTH=1", 56*6dbdd20aSAndroid Build Coastguard Worker "-s", 57*6dbdd20aSAndroid Build Coastguard Worker "WASM_ASYNC_COMPILATION=0", 58*6dbdd20aSAndroid Build Coastguard Worker "-s", 59*6dbdd20aSAndroid Build Coastguard Worker "EXTRA_EXPORTED_RUNTIME_METHODS=" + _exports, 60*6dbdd20aSAndroid Build Coastguard Worker 61*6dbdd20aSAndroid Build Coastguard Worker # This forces the MEMFS filesystem library to always use typed arrays 62*6dbdd20aSAndroid Build Coastguard Worker # instead of building strings/arrays when appending to a file. This allows 63*6dbdd20aSAndroid Build Coastguard Worker # to deal with pseudo-files larger than 128 MB when calling traceconv. 64*6dbdd20aSAndroid Build Coastguard Worker "-s", 65*6dbdd20aSAndroid Build Coastguard Worker "MEMFS_APPEND_TO_TYPED_ARRAYS=1", 66*6dbdd20aSAndroid Build Coastguard Worker 67*6dbdd20aSAndroid Build Coastguard Worker # Reduces global namespace pollution. 68*6dbdd20aSAndroid Build Coastguard Worker "-s", 69*6dbdd20aSAndroid Build Coastguard Worker "MODULARIZE=1", 70*6dbdd20aSAndroid Build Coastguard Worker 71*6dbdd20aSAndroid Build Coastguard Worker # This is to prevent that two different wasm modules end up generating 72*6dbdd20aSAndroid Build Coastguard Worker # JS that overrides the same global variable (var Module = ...) 73*6dbdd20aSAndroid Build Coastguard Worker "-s", 74*6dbdd20aSAndroid Build Coastguard Worker "EXPORT_NAME=${target_name}", 75*6dbdd20aSAndroid Build Coastguard Worker 76*6dbdd20aSAndroid Build Coastguard Worker "-lworkerfs.js", # For FS.filesystems.WORKERFS 77*6dbdd20aSAndroid Build Coastguard Worker ] 78*6dbdd20aSAndroid Build Coastguard Worker if (is_debug) { 79*6dbdd20aSAndroid Build Coastguard Worker _target_ldflags += [ 80*6dbdd20aSAndroid Build Coastguard Worker "-s", 81*6dbdd20aSAndroid Build Coastguard Worker "ASSERTIONS=2", 82*6dbdd20aSAndroid Build Coastguard Worker "-s", 83*6dbdd20aSAndroid Build Coastguard Worker "SAFE_HEAP=1", 84*6dbdd20aSAndroid Build Coastguard Worker "-s", 85*6dbdd20aSAndroid Build Coastguard Worker "STACK_OVERFLOW_CHECK=1", 86*6dbdd20aSAndroid Build Coastguard Worker "-g4", 87*6dbdd20aSAndroid Build Coastguard Worker "-O0", 88*6dbdd20aSAndroid Build Coastguard Worker ] 89*6dbdd20aSAndroid Build Coastguard Worker } else { 90*6dbdd20aSAndroid Build Coastguard Worker _target_ldflags += [ 91*6dbdd20aSAndroid Build Coastguard Worker "-s", 92*6dbdd20aSAndroid Build Coastguard Worker "ASSERTIONS=1", 93*6dbdd20aSAndroid Build Coastguard Worker "-g2", # Required for getting C++ symbol names. 94*6dbdd20aSAndroid Build Coastguard Worker "-O3", 95*6dbdd20aSAndroid Build Coastguard Worker ] 96*6dbdd20aSAndroid Build Coastguard Worker } 97*6dbdd20aSAndroid Build Coastguard Worker 98*6dbdd20aSAndroid Build Coastguard Worker if (defined(invoker.js_library)) { 99*6dbdd20aSAndroid Build Coastguard Worker _target_ldflags += [ 100*6dbdd20aSAndroid Build Coastguard Worker "--js-library", 101*6dbdd20aSAndroid Build Coastguard Worker invoker.js_library, 102*6dbdd20aSAndroid Build Coastguard Worker ] 103*6dbdd20aSAndroid Build Coastguard Worker } 104*6dbdd20aSAndroid Build Coastguard Worker 105*6dbdd20aSAndroid Build Coastguard Worker _vars_to_forward = [ 106*6dbdd20aSAndroid Build Coastguard Worker "cflags", 107*6dbdd20aSAndroid Build Coastguard Worker "defines", 108*6dbdd20aSAndroid Build Coastguard Worker "deps", 109*6dbdd20aSAndroid Build Coastguard Worker "includes", 110*6dbdd20aSAndroid Build Coastguard Worker "sources", 111*6dbdd20aSAndroid Build Coastguard Worker "include_dirs", 112*6dbdd20aSAndroid Build Coastguard Worker "public_configs", 113*6dbdd20aSAndroid Build Coastguard Worker "testonly", 114*6dbdd20aSAndroid Build Coastguard Worker "visibility", 115*6dbdd20aSAndroid Build Coastguard Worker ] 116*6dbdd20aSAndroid Build Coastguard Worker 117*6dbdd20aSAndroid Build Coastguard Worker executable("${_lib_name}.js") { 118*6dbdd20aSAndroid Build Coastguard Worker forward_variables_from(invoker, _vars_to_forward) 119*6dbdd20aSAndroid Build Coastguard Worker ldflags = _target_ldflags 120*6dbdd20aSAndroid Build Coastguard Worker output_extension = "" 121*6dbdd20aSAndroid Build Coastguard Worker } 122*6dbdd20aSAndroid Build Coastguard Worker 123*6dbdd20aSAndroid Build Coastguard Worker # This is just a workaround to deal with the fact that GN doesn't allow 124*6dbdd20aSAndroid Build Coastguard Worker # spcifying extra outputs for an executable() target. In reality the .wasm 125*6dbdd20aSAndroid Build Coastguard Worker # file here is generated by the executable() target above, together with the 126*6dbdd20aSAndroid Build Coastguard Worker # .js file. This dummy target is here to tell GN "there is a target that 127*6dbdd20aSAndroid Build Coastguard Worker # outputs also the .wasm file", so we can depend on that in copy() targets. 128*6dbdd20aSAndroid Build Coastguard Worker action("${_lib_name}.wasm") { 129*6dbdd20aSAndroid Build Coastguard Worker inputs = [] 130*6dbdd20aSAndroid Build Coastguard Worker deps = [ ":${_lib_name}.js" ] 131*6dbdd20aSAndroid Build Coastguard Worker outputs = [ "$root_out_dir/$_lib_name.wasm" ] 132*6dbdd20aSAndroid Build Coastguard Worker if (is_debug) { 133*6dbdd20aSAndroid Build Coastguard Worker outputs += [ "$root_out_dir/$_lib_name.wasm.map" ] 134*6dbdd20aSAndroid Build Coastguard Worker } 135*6dbdd20aSAndroid Build Coastguard Worker args = [ "--noop" ] 136*6dbdd20aSAndroid Build Coastguard Worker script = "//gn/standalone/build_tool_wrapper.py" 137*6dbdd20aSAndroid Build Coastguard Worker } 138*6dbdd20aSAndroid Build Coastguard Worker 139*6dbdd20aSAndroid Build Coastguard Worker copy("${_lib_name}.d.ts") { 140*6dbdd20aSAndroid Build Coastguard Worker sources = [ "//gn/standalone/wasm_typescript_declaration.d.ts" ] 141*6dbdd20aSAndroid Build Coastguard Worker outputs = [ "$root_out_dir/$_lib_name.d.ts" ] 142*6dbdd20aSAndroid Build Coastguard Worker } 143*6dbdd20aSAndroid Build Coastguard Worker } else { # is_wasm 144*6dbdd20aSAndroid Build Coastguard Worker not_needed(invoker, "*") 145*6dbdd20aSAndroid Build Coastguard Worker } 146*6dbdd20aSAndroid Build Coastguard Worker 147*6dbdd20aSAndroid Build Coastguard Worker group(target_name) { 148*6dbdd20aSAndroid Build Coastguard Worker deps = [ 149*6dbdd20aSAndroid Build Coastguard Worker ":${_lib_name}.d.ts($wasm_toolchain)", 150*6dbdd20aSAndroid Build Coastguard Worker ":${_lib_name}.js($wasm_toolchain)", 151*6dbdd20aSAndroid Build Coastguard Worker ":${_lib_name}.wasm($wasm_toolchain)", 152*6dbdd20aSAndroid Build Coastguard Worker ] 153*6dbdd20aSAndroid Build Coastguard Worker } 154*6dbdd20aSAndroid Build Coastguard Worker} # template 155