xref: /aosp_15_r20/external/perfetto/gn/standalone/wasm.gni (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
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