2 # This file builds the js components using emscripten. You normally don't need
3 # to run this, as the builds are bundled in the repo in bin/. Running this is
4 # useful if you are a developer and want to update those builds.
7 # Usage: EMSCRIPTEN=path/to/emscripten build-js.sh # explicit emscripten dir
9 # Emscripten's em++ and tools/webidl_binder.py will be accessed through the
10 # env var EMSCRIPTEN, e.g. ${EMSCRIPTEN}/em++
12 # You can get emscripten from
13 # http://kripken.github.io/emscripten-site/docs/getting_started/downloads.html
17 if [ "$1" == "-h" ] ||
[ "$1" == "--help" ] ||
[ "$1" == "-help" ]; then
18 echo "usage: $0 [-g]" >&2
19 echo " -g produce debug build" >&2
21 echo "If EMSCRIPTEN is set in the envionment, emscripten will be loaded"
22 echo "from that directory. Otherwise the location of emscripten is resolved"
27 if [ -z $EMSCRIPTEN ]; then
28 if (which emcc
>/dev
/null
); then
29 # Found emcc in PATH -- set EMSCRIPTEN (we need this to access webidl_binder.py)
30 EMSCRIPTEN
=$
(dirname "$(which emcc)")
32 echo "$0: EMSCRIPTEN environment variable is not set and emcc was not found in PATH" >&2
35 elif [ ! -d "$EMSCRIPTEN" ]; then
36 echo "$0: \"$EMSCRIPTEN\" (\$EMSCRIPTEN) is not a directory" >&2
40 EMCC_ARGS
="-std=c++11 --memory-init-file 0"
41 EMCC_ARGS
="$EMCC_ARGS -s ALLOW_MEMORY_GROWTH=1"
42 EMCC_ARGS
="$EMCC_ARGS -s DEMANGLE_SUPPORT=1"
43 EMCC_ARGS
="$EMCC_ARGS -s DISABLE_EXCEPTION_CATCHING=0" # Exceptions are thrown and caught when optimizing endless loops
46 if [ "$1" == "-g" ]; then
47 EMCC_ARGS
="$EMCC_ARGS -O2" # need emcc js opts to be decently fast
48 EMCC_ARGS
="$EMCC_ARGS --llvm-opts 0 --llvm-lto 0"
49 EMCC_ARGS
="$EMCC_ARGS -profiling"
52 EMCC_ARGS
="$EMCC_ARGS -Oz"
53 EMCC_ARGS
="$EMCC_ARGS --llvm-lto 1"
54 EMCC_ARGS
="$EMCC_ARGS -s ELIMINATE_DUPLICATE_FUNCTIONS=1"
56 # See https://gist.github.com/rsms/e33c61a25a31c08260161a087be03169
59 if [ "$1" != "-g" ]; then
60 EMCC_ARGS
="$EMCC_ARGS --closure 1"
63 echo "building shared bitcode"
67 src
/asmjs
/asm_v_wasm.cpp \
68 src
/asmjs
/shared-constants.cpp \
69 src
/cfg
/Relooper.cpp \
70 src
/emscripten-optimizer
/optimizer-shared.cpp \
71 src
/emscripten-optimizer
/parser.cpp \
72 src
/emscripten-optimizer
/simple_ast.cpp \
73 src
/ir
/ExpressionAnalyzer.cpp \
74 src
/ir
/ExpressionManipulator.cpp \
75 src
/ir
/LocalGraph.cpp \
77 src
/passes
/CoalesceLocals.cpp \
78 src
/passes
/CodeFolding.cpp \
79 src
/passes
/CodePushing.cpp \
80 src
/passes
/ConstHoisting.cpp \
81 src
/passes
/DeadCodeElimination.cpp \
82 src
/passes
/DuplicateFunctionElimination.cpp \
83 src
/passes
/ExtractFunction.cpp \
84 src
/passes
/Flatten.cpp \
85 src
/passes
/I64ToI32Lowering.cpp \
86 src
/passes
/Inlining.cpp \
87 src
/passes
/InstrumentLocals.cpp \
88 src
/passes
/InstrumentMemory.cpp \
89 src
/passes
/LegalizeJSInterface.cpp \
90 src
/passes
/LocalCSE.cpp \
91 src
/passes
/LogExecution.cpp \
92 src
/passes
/MemoryPacking.cpp \
93 src
/passes
/MergeBlocks.cpp \
94 src
/passes
/Metrics.cpp \
95 src
/passes
/NameList.cpp \
96 src
/passes
/OptimizeInstructions.cpp \
97 src
/passes
/PickLoadSigns.cpp \
98 src
/passes
/PostEmscripten.cpp \
99 src
/passes
/Precompute.cpp \
100 src
/passes
/Print.cpp \
101 src
/passes
/PrintCallGraph.cpp \
102 src
/passes
/RelooperJumpThreading.cpp \
103 src
/passes
/RemoveImports.cpp \
104 src
/passes
/RemoveMemory.cpp \
105 src
/passes
/RemoveUnusedBrs.cpp \
106 src
/passes
/RemoveUnusedModuleElements.cpp \
107 src
/passes
/RemoveUnusedNames.cpp \
108 src
/passes
/ReorderFunctions.cpp \
109 src
/passes
/ReorderLocals.cpp \
110 src
/passes
/ReReloop.cpp \
111 src
/passes
/SafeHeap.cpp \
112 src
/passes
/SimplifyLocals.cpp \
113 src
/passes
/SSAify.cpp \
114 src
/passes
/TrapMode.cpp \
115 src
/passes
/Untee.cpp \
116 src
/passes
/Vacuum.cpp \
117 src
/support
/bits.cpp \
118 src
/support
/colors.cpp \
119 src
/support
/safe_integer.cpp \
120 src
/support
/threads.cpp \
121 src
/wasm
/literal.cpp \
122 src
/wasm
/wasm-binary.cpp \
123 src
/wasm
/wasm-s-parser.cpp \
124 src
/wasm
/wasm-type.cpp \
125 src
/wasm
/wasm-validator.cpp \
127 src
/wasm-emscripten.cpp \
131 echo "building wasm.js"
138 -o bin
/wasm
${OUT_FILE_SUFFIX}.js \
140 -s 'EXPORT_NAME="WasmJS"'
142 echo "building binaryen.js"
144 function export_function
{ if [ -z ${EXPORTED_FUNCTIONS} ]; then EXPORTED_FUNCTIONS='"'$1'"'; else EXPORTED_FUNCTIONS=${EXPORTED_FUNCTIONS}',"'$1'"'; fi }
145 export_function
"_BinaryenNone"
146 export_function
"_BinaryenInt32"
147 export_function
"_BinaryenInt64"
148 export_function
"_BinaryenFloat32"
149 export_function
"_BinaryenFloat64"
150 export_function
"_BinaryenUndefined"
151 export_function
"_BinaryenInvalidId"
152 export_function
"_BinaryenBlockId"
153 export_function
"_BinaryenIfId"
154 export_function
"_BinaryenLoopId"
155 export_function
"_BinaryenBreakId"
156 export_function
"_BinaryenSwitchId"
157 export_function
"_BinaryenCallId"
158 export_function
"_BinaryenCallImportId"
159 export_function
"_BinaryenCallIndirectId"
160 export_function
"_BinaryenGetLocalId"
161 export_function
"_BinaryenSetLocalId"
162 export_function
"_BinaryenGetGlobalId"
163 export_function
"_BinaryenSetGlobalId"
164 export_function
"_BinaryenLoadId"
165 export_function
"_BinaryenStoreId"
166 export_function
"_BinaryenConstId"
167 export_function
"_BinaryenUnaryId"
168 export_function
"_BinaryenBinaryId"
169 export_function
"_BinaryenSelectId"
170 export_function
"_BinaryenDropId"
171 export_function
"_BinaryenReturnId"
172 export_function
"_BinaryenHostId"
173 export_function
"_BinaryenNopId"
174 export_function
"_BinaryenUnreachableId"
175 export_function
"_BinaryenAtomicCmpxchgId"
176 export_function
"_BinaryenAtomicRMWId"
177 export_function
"_BinaryenAtomicWaitId"
178 export_function
"_BinaryenAtomicWakeId"
179 export_function
"_BinaryenModuleCreate"
180 export_function
"_BinaryenModuleDispose"
181 export_function
"_BinaryenAddFunctionType"
182 export_function
"_BinaryenGetFunctionTypeBySignature"
183 export_function
"_BinaryenLiteralInt32"
184 export_function
"_BinaryenLiteralInt64"
185 export_function
"_BinaryenLiteralFloat32"
186 export_function
"_BinaryenLiteralFloat64"
187 export_function
"_BinaryenLiteralFloat32Bits"
188 export_function
"_BinaryenLiteralFloat64Bits"
189 export_function
"_BinaryenClzInt32"
190 export_function
"_BinaryenCtzInt32"
191 export_function
"_BinaryenPopcntInt32"
192 export_function
"_BinaryenNegFloat32"
193 export_function
"_BinaryenAbsFloat32"
194 export_function
"_BinaryenCeilFloat32"
195 export_function
"_BinaryenFloorFloat32"
196 export_function
"_BinaryenTruncFloat32"
197 export_function
"_BinaryenNearestFloat32"
198 export_function
"_BinaryenSqrtFloat32"
199 export_function
"_BinaryenEqZInt32"
200 export_function
"_BinaryenClzInt64"
201 export_function
"_BinaryenCtzInt64"
202 export_function
"_BinaryenPopcntInt64"
203 export_function
"_BinaryenNegFloat64"
204 export_function
"_BinaryenAbsFloat64"
205 export_function
"_BinaryenCeilFloat64"
206 export_function
"_BinaryenFloorFloat64"
207 export_function
"_BinaryenTruncFloat64"
208 export_function
"_BinaryenNearestFloat64"
209 export_function
"_BinaryenSqrtFloat64"
210 export_function
"_BinaryenEqZInt64"
211 export_function
"_BinaryenExtendSInt32"
212 export_function
"_BinaryenExtendUInt32"
213 export_function
"_BinaryenWrapInt64"
214 export_function
"_BinaryenTruncSFloat32ToInt32"
215 export_function
"_BinaryenTruncSFloat32ToInt64"
216 export_function
"_BinaryenTruncUFloat32ToInt32"
217 export_function
"_BinaryenTruncUFloat32ToInt64"
218 export_function
"_BinaryenTruncSFloat64ToInt32"
219 export_function
"_BinaryenTruncSFloat64ToInt64"
220 export_function
"_BinaryenTruncUFloat64ToInt32"
221 export_function
"_BinaryenTruncUFloat64ToInt64"
222 export_function
"_BinaryenReinterpretFloat32"
223 export_function
"_BinaryenReinterpretFloat64"
224 export_function
"_BinaryenConvertSInt32ToFloat32"
225 export_function
"_BinaryenConvertSInt32ToFloat64"
226 export_function
"_BinaryenConvertUInt32ToFloat32"
227 export_function
"_BinaryenConvertUInt32ToFloat64"
228 export_function
"_BinaryenConvertSInt64ToFloat32"
229 export_function
"_BinaryenConvertSInt64ToFloat64"
230 export_function
"_BinaryenConvertUInt64ToFloat32"
231 export_function
"_BinaryenConvertUInt64ToFloat64"
232 export_function
"_BinaryenPromoteFloat32"
233 export_function
"_BinaryenDemoteFloat64"
234 export_function
"_BinaryenReinterpretInt32"
235 export_function
"_BinaryenReinterpretInt64"
236 export_function
"_BinaryenAddInt32"
237 export_function
"_BinaryenSubInt32"
238 export_function
"_BinaryenMulInt32"
239 export_function
"_BinaryenDivSInt32"
240 export_function
"_BinaryenDivUInt32"
241 export_function
"_BinaryenRemSInt32"
242 export_function
"_BinaryenRemUInt32"
243 export_function
"_BinaryenAndInt32"
244 export_function
"_BinaryenOrInt32"
245 export_function
"_BinaryenXorInt32"
246 export_function
"_BinaryenShlInt32"
247 export_function
"_BinaryenShrUInt32"
248 export_function
"_BinaryenShrSInt32"
249 export_function
"_BinaryenRotLInt32"
250 export_function
"_BinaryenRotRInt32"
251 export_function
"_BinaryenEqInt32"
252 export_function
"_BinaryenNeInt32"
253 export_function
"_BinaryenLtSInt32"
254 export_function
"_BinaryenLtUInt32"
255 export_function
"_BinaryenLeSInt32"
256 export_function
"_BinaryenLeUInt32"
257 export_function
"_BinaryenGtSInt32"
258 export_function
"_BinaryenGtUInt32"
259 export_function
"_BinaryenGeSInt32"
260 export_function
"_BinaryenGeUInt32"
261 export_function
"_BinaryenAddInt64"
262 export_function
"_BinaryenSubInt64"
263 export_function
"_BinaryenMulInt64"
264 export_function
"_BinaryenDivSInt64"
265 export_function
"_BinaryenDivUInt64"
266 export_function
"_BinaryenRemSInt64"
267 export_function
"_BinaryenRemUInt64"
268 export_function
"_BinaryenAndInt64"
269 export_function
"_BinaryenOrInt64"
270 export_function
"_BinaryenXorInt64"
271 export_function
"_BinaryenShlInt64"
272 export_function
"_BinaryenShrUInt64"
273 export_function
"_BinaryenShrSInt64"
274 export_function
"_BinaryenRotLInt64"
275 export_function
"_BinaryenRotRInt64"
276 export_function
"_BinaryenEqInt64"
277 export_function
"_BinaryenNeInt64"
278 export_function
"_BinaryenLtSInt64"
279 export_function
"_BinaryenLtUInt64"
280 export_function
"_BinaryenLeSInt64"
281 export_function
"_BinaryenLeUInt64"
282 export_function
"_BinaryenGtSInt64"
283 export_function
"_BinaryenGtUInt64"
284 export_function
"_BinaryenGeSInt64"
285 export_function
"_BinaryenGeUInt64"
286 export_function
"_BinaryenAddFloat32"
287 export_function
"_BinaryenSubFloat32"
288 export_function
"_BinaryenMulFloat32"
289 export_function
"_BinaryenDivFloat32"
290 export_function
"_BinaryenCopySignFloat32"
291 export_function
"_BinaryenMinFloat32"
292 export_function
"_BinaryenMaxFloat32"
293 export_function
"_BinaryenEqFloat32"
294 export_function
"_BinaryenNeFloat32"
295 export_function
"_BinaryenLtFloat32"
296 export_function
"_BinaryenLeFloat32"
297 export_function
"_BinaryenGtFloat32"
298 export_function
"_BinaryenGeFloat32"
299 export_function
"_BinaryenAddFloat64"
300 export_function
"_BinaryenSubFloat64"
301 export_function
"_BinaryenMulFloat64"
302 export_function
"_BinaryenDivFloat64"
303 export_function
"_BinaryenCopySignFloat64"
304 export_function
"_BinaryenMinFloat64"
305 export_function
"_BinaryenMaxFloat64"
306 export_function
"_BinaryenEqFloat64"
307 export_function
"_BinaryenNeFloat64"
308 export_function
"_BinaryenLtFloat64"
309 export_function
"_BinaryenLeFloat64"
310 export_function
"_BinaryenGtFloat64"
311 export_function
"_BinaryenGeFloat64"
312 export_function
"_BinaryenPageSize"
313 export_function
"_BinaryenCurrentMemory"
314 export_function
"_BinaryenGrowMemory"
315 export_function
"_BinaryenHasFeature"
316 export_function
"_BinaryenAtomicRMWAdd"
317 export_function
"_BinaryenAtomicRMWSub"
318 export_function
"_BinaryenAtomicRMWAnd"
319 export_function
"_BinaryenAtomicRMWOr"
320 export_function
"_BinaryenAtomicRMWXor"
321 export_function
"_BinaryenAtomicRMWXchg"
322 export_function
"_BinaryenBlock"
323 export_function
"_BinaryenIf"
324 export_function
"_BinaryenLoop"
325 export_function
"_BinaryenBreak"
326 export_function
"_BinaryenSwitch"
327 export_function
"_BinaryenCall"
328 export_function
"_BinaryenCallImport"
329 export_function
"_BinaryenCallIndirect"
330 export_function
"_BinaryenGetLocal"
331 export_function
"_BinaryenSetLocal"
332 export_function
"_BinaryenTeeLocal"
333 export_function
"_BinaryenGetGlobal"
334 export_function
"_BinaryenSetGlobal"
335 export_function
"_BinaryenLoad"
336 export_function
"_BinaryenStore"
337 export_function
"_BinaryenConst"
338 export_function
"_BinaryenUnary"
339 export_function
"_BinaryenBinary"
340 export_function
"_BinaryenSelect"
341 export_function
"_BinaryenDrop"
342 export_function
"_BinaryenReturn"
343 export_function
"_BinaryenHost"
344 export_function
"_BinaryenNop"
345 export_function
"_BinaryenUnreachable"
346 export_function
"_BinaryenAtomicRMW"
347 export_function
"_BinaryenAtomicCmpxchg"
348 export_function
"_BinaryenAtomicWait"
349 export_function
"_BinaryenAtomicWake"
350 export_function
"_BinaryenExpressionGetId"
351 export_function
"_BinaryenExpressionGetType"
352 export_function
"_BinaryenExpressionPrint"
353 export_function
"_BinaryenConstGetValueI32"
354 export_function
"_BinaryenConstGetValueI64Low"
355 export_function
"_BinaryenConstGetValueI64High"
356 export_function
"_BinaryenConstGetValueF32"
357 export_function
"_BinaryenConstGetValueF64"
358 export_function
"_BinaryenAddFunction"
359 export_function
"_BinaryenAddGlobal"
360 export_function
"_BinaryenAddImport"
361 export_function
"_BinaryenRemoveImport"
362 export_function
"_BinaryenAddExport"
363 export_function
"_BinaryenRemoveExport"
364 export_function
"_BinaryenSetFunctionTable"
365 export_function
"_BinaryenSetMemory"
366 export_function
"_BinaryenSetStart"
367 export_function
"_BinaryenModuleParse"
368 export_function
"_BinaryenModulePrint"
369 export_function
"_BinaryenModulePrintAsmjs"
370 export_function
"_BinaryenModuleValidate"
371 export_function
"_BinaryenModuleOptimize"
372 export_function
"_BinaryenModuleRunPasses"
373 export_function
"_BinaryenModuleAutoDrop"
374 export_function
"_BinaryenModuleWrite"
375 export_function
"_BinaryenModuleRead"
376 export_function
"_BinaryenModuleInterpret"
377 export_function
"_RelooperCreate"
378 export_function
"_RelooperAddBlock"
379 export_function
"_RelooperAddBranch"
380 export_function
"_RelooperAddBlockWithSwitch"
381 export_function
"_RelooperAddBranchForSwitch"
382 export_function
"_RelooperRenderAndDispose"
383 export_function
"_BinaryenSetAPITracing"
390 -s EXPORTED_FUNCTIONS
=[${EXPORTED_FUNCTIONS}] \
391 -o bin
/binaryen
${OUT_FILE_SUFFIX}.js \
392 --pre-js src
/js
/binaryen.js-pre.js \
393 --post-js src
/js
/binaryen.js-post.js