-
Notifications
You must be signed in to change notification settings - Fork 218
Expand file tree
/
Copy pathemscripten-toolchain.xml
More file actions
217 lines (167 loc) · 7.6 KB
/
emscripten-toolchain.xml
File metadata and controls
217 lines (167 loc) · 7.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
<xml>
<!--
The Emscipten hxcpp compiler can be invoked from haxe with the 'emscripten' define.
haxe -main Main -cpp cpp -D emscripten
Setup:
Emscripten can be installed as per website, then EMSDK, EMSDK_PYTHON and optionally EMSDK_NODE should be set.
Hxcpp will now generate wasm, not asmjs.
Wasm output consists of a ".js" boot file and a ".wasm" file. The .js file can be run from node directly or
via the hxcpp tool, eg: haxelib run hxcpp cpp/Test.js
If -D HXCPP_LINK_EMSCRIPTEN_EXT=".html" is passed or specified, then an additional html output,
eg, Test.html, will be generated.
Specifying HXCPP_LINK_EMRUN adds code ro redirect output secially for the emrun server.
The resulting can be used for running the code in a browser from a local server.
eg: $EMSDK/upstream/emscripten/emrun(.bat) cpp/Test.html
Exceptions:
You can specify HXCPP_LINK_NO_EXCEPTIONS to reduce overhead by removing exceptions,
for example if compiling non-haxe code. Generally, haxe code needs exceptions.
-fwasm-exceptions is a newer addition and will be used by default. If you need
greater compatibility, you can specify HXCPP_NO_WASM_EXEPTIONS
Garbage Collection:
Currently, the 'spill-pointers' options is needed for GC. If you do not need gc,
for example compiling non-haxe code, you can disable by specifying HXCPP_NO_GC_LINK
emscripten target will default to single-threaded, which allows for some GC optimizations
-->
<setup name="emscripten" />
<set name="HXCPP_LINK_EMSCRIPTEN_EXT" value=".js" unless="HXCPP_LINK_EMSCRIPTEN_EXT" />
<set name="EMSCRIPTEN_ROOT" value="${EMSDK}/upstream/emscripten" if="EMSDK" unless="EMSCRIPTEN_ROOT" />
<set name="HXCPP_SINGLE_THREADED_APP" value="1" unless="HXCPP_MULTI_THREADED_APP" />
<path name="${EMSDK}" if="EMSDK" />
<path name="${EMSCRIPTEN_ROOT}" if="EMSCRIPTEN_ROOT" />
<path name="${dir:EMSDK_PYTHON}" if="EMSDK_PYTHON" />
<set name="HXCPP_RANLIB" value="emranlib" />
<set name="HXCPP_AR" value="emar" />
<set name="HXCPP_M32" value="1"/>
<unset name="HXCPP_M64" />
<section if="windows_host">
<error value="Please provide EMSDK" unless="EMSCRIPTEN_ROOT" />
<set name="HXCPP_RANLIB" value='python "${EMSCRIPTEN_ROOT}/emranlib.py"' />
<set name="HXCPP_AR" value='python "${EMSCRIPTEN_ROOT}/emar.py"' />
<set name="CXX" value='python "${EMSCRIPTEN_ROOT}/emcc.py"' />
</section>
<set name="nostrip" value="1" if="emscripten"/>
<include name="toolchain/gcc-toolchain.xml"/>
<!-- EMCC TOOLS -->
<section unless="HXCPP_OPTIM_LEVEL" >
<!-- O2 generates stack-overflow when running unit tests - not sure what best default value is
But you may be able to adjust the node stack size ti fix this.
<set name="HXCPP_OPTIM_LEVEL" value="-O2" />
-->
<set name="HXCPP_OPTIM_LEVEL" value="-O2" />
<set name="HXCPP_OPTIM_LEVEL" value="-g" if="debug" />
</section>
<compiler id="emscripten" exe="emcc">
<exe name="${CXX}" if="CXX" />
<flag value="-c"/>
<flag value="-fvisibility=hidden"/>
<cppflag value="-frtti"/>
<pchflag value="-x" />
<pchflag value="c++-header" />
<cppflag value="--std=c++11" unless="HXCPP_CPP17 || HXCPP_CPP20"/>
<cppflag value="--std=c++17" if="HXCPP_CPP17"/>
<cppflag value="--std=c++20" if="HXCPP_CPP20"/>
<section unless="HXCPP_LINK_NO_EXCEPTIONS" >
<flag name="-s" value="DISABLE_EXCEPTION_CATCHING=0" if="HXCPP_NO_WASM_EXEPTIONS" />
<flag value="-fwasm-exceptions" unless="HXCPP_NO_WASM_EXEPTIONS" />
</section>
<flag value="${HXCPP_OPTIM_LEVEL}" />
<flag value="-fpic" if="HXCPP_EMSCRIPTEN_FPIC" />
<flag value="-fPIC" if="HXCPP_EMSCRIPTEN_FPIC" />
<flag value="-DEMSCRIPTEN"/>
<flag value="-DHXCPP_JS_PRIME" if="HXCPP_JS_PRIME" />
<flag value="-DHXCPP_MULTI_THREADED" if="HXCPP_MULTI_THREADED"/>
<flag value="-DHXCPP_BIG_ENDIAN" if="HXCPP_BIG_ENDIAN"/>
<flag value="-Wno-overflow" />
<cppflag value="-Wno-invalid-offsetof" />
<cppflag value="-Wno-return-type-c-linkage" />
<flag value="-Wno-parentheses" />
<flag value="-Wno-unknown-warning-option" />
<flag value="-Wno-null-dereference" />
<flag value="-Wno-unused-value" />
<flag value="-Wno-format-extra-args" />
<flag value="-Wno-bool-conversion" />
<flag value="-Wno-warn-absolute-paths" />
<include name="toolchain/common-defines.xml" />
<flag value="-I${HXCPP}/include"/>
<objdir value="obj/emscripten${OBJEXT}"/>
<outflag value="-o "/>
<ext value=".o"/>
</compiler>
<section unless="HXCPP_LINK_OPTIM_LEVEL" >
<!-- O2 generates dodgy 'else' statement - seems ok now
<set name="HXCPP_LINK_OPTIM_LEVEL" value="-O2" />
-->
<set name="HXCPP_LINK_OPTIM_LEVEL" value="-O2" />
<set name="HXCPP_LINK_OPTIM_LEVEL" value="-O1" if="HXCPP_DEBUG_LINK" />
<set name="HXCPP_LINK_OPTIM_LEVEL" value="-g" if="debug" />
</section>
<linker id="dll" exe="emcc">
<exe name="${CXX}" if="CXX" />
<fromfile value="" if="GCC_OLD" />
<flag value="-shared"/>
<flag value="-fpic" if="HXCPP_EMSCRIPTEN_FPIC" />
<flag value="-fPIC" if="HXCPP_EMSCRIPTEN_FPIC" />
<flag value="--bind" if="HXCPP_JS_PRIME" />
<flag value="-Xlinker"/>
<flag value="--no-undefined" unless="HXCPP_ALLOW_UNDEFINED" />
<flag value="${HXCPP_LINK_OPTIM_LEVEL}"/>
<section if="HXCPP_LINK_TOTAL_MEMORY" >
<flag value="-s" />
<flag value="TOTAL_MEMORY=${HXCPP_LINK_TOTAL_MEMORY}" />
</section>
<section if="HXCPP_LINK_MEM_FILE" >
<flag value="--memory-init-file"/>
<flag value="${HXCPP_LINK_MEM_FILE}"/>
</section>
<flag name="-s" value="WASM=1" />
<flag value="--Wno-limited-postlink-optimizations" unless="HXCPP_NO_GC_LINK" />
<flag name="-s" value="BINARYEN_EXTRA_PASSES='--spill-pointers'" unless="HXCPP_NO_GC_LINK" />
<section unless="HXCPP_LINK_NO_EXCEPTIONS" >
<flag name="-s" value="DISABLE_EXCEPTION_CATCHING=0" if="HXCPP_NO_WASM_EXEPTIONS" />
<flag value="-fwasm-exceptions" unless="HXCPP_NO_WASM_EXEPTIONS" />
</section>
<!-- <flag value="-DBUILD_AS_SHARED_LIBRARY" /> -->
<!-- <lib name="-ldl"/> -->
<!-- <ext value=".js"/> -->
<ext value=".so"/>
<outflag value="-o "/>
</linker>
<linker id="exe" exe="emcc">
<exe name="${CXX}" if="CXX" />
<fromfile value="" if="GCC_OLD" />
<flag value="${HXCPP_LINK_OPTIM_LEVEL}" />
<section if="HXCPP_LINK_MEMORY_GROWTH" >
<flag value="-s" />
<flag value="ALLOW_MEMORY_GROWTH=1" />
</section>
<section if="HXCPP_LINK_SAFE_HEAP">
<flag value="-s" />
<flag value="SAFE_HEAP=1" />
</section>
<section if="HXCPP_LINK_TOTAL_MEMORY" >
<flag value="-s" />
<flag value="TOTAL_MEMORY=${HXCPP_LINK_TOTAL_MEMORY}" />
</section>
<section if="HXCPP_LINK_EMRUN" >
<flag value="--emrun" />
</section>
<section if="HXCPP_DEBUG_LINK" >
<flag value="-debug" />
</section>
<flag name="-s" value="WASM=1" />
<flag value="--Wno-limited-postlink-optimizations" unless="HXCPP_NO_GC_LINK" />
<flag name="-s" value="BINARYEN_EXTRA_PASSES='--spill-pointers'" unless="HXCPP_NO_GC_LINK" />
<section unless="HXCPP_LINK_NO_EXCEPTIONS" >
<flag name="-s" value="DISABLE_EXCEPTION_CATCHING=0" if="HXCPP_NO_WASM_EXEPTIONS" />
<flag value="-fwasm-exceptions" unless="HXCPP_NO_WASM_EXEPTIONS" />
</section>
<section if="BINARYEN_METHOD" >
<flag value="-s" />
<flag value="BINARYEN_METHOD='${BINARYEN_METHOD}'" />
</section>
<flag value="--bind" />
<!-- <lib name="-ldl"/> -->
<ext value="${HXCPP_LINK_EMSCRIPTEN_EXT}"/>
<outflag value="-o "/>
</linker>
</xml>