-
Notifications
You must be signed in to change notification settings - Fork 28
/
Copy pathCMakeLists.txt
273 lines (236 loc) · 9.09 KB
/
CMakeLists.txt
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
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
cmake_minimum_required(VERSION 3.13 FATAL_ERROR)
set(CMAKE_POLICY_DEFAULT_CMP0077 NEW)
FIND_PACKAGE(Python3)
set(PYTHON ${Python3_EXECUTABLE} CACHE STRING "Python path")
set(EMSCRIPTEN_ROOT $ENV{EMSDK}/upstream/emscripten CACHE STRING "Emscripten path")
set(CMAKE_TOOLCHAIN_FILE ${EMSCRIPTEN_ROOT}/cmake/Modules/Platform/Emscripten.cmake)
set(WEBIDL_BINDER_SCRIPT ${EMSCRIPTEN_ROOT}/tools/webidl_binder.py)
set(JOLT_FRONT_MATTER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/front-matter.js)
set(JOLT_HEADER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/JoltJS.h)
set(JOLT_IDL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/JoltJS.idl)
set(OUTPUT_FOLDER ${CMAKE_CURRENT_SOURCE_DIR}/dist/)
set(JOLT_TYPING ${OUTPUT_FOLDER}/types.d.ts)
# Option to turn on memory profiling
option(ENABLE_MEMORY_PROFILER "Enable emscriptens memory profiler to help find leaks" OFF)
# Option to turn on double precision
option(DOUBLE_PRECISION "Compile the library in double precision mode" OFF)
# Option to turn multi threading on
option(ENABLE_MULTI_THREADING "Compile the library in multi threading mode (warning: doesn't work in Safari nor with any JS callbacks currently)'" OFF)
# Option to turn on SIMD
option(ENABLE_SIMD "Enable SIMD instructions (warning: last major browser to support this was Safari 16.4 in March 2023)" OFF)
# Option to speed up compilation by only compiling the WASM compat version
option(BUILD_WASM_COMPAT_ONLY "Compile online the WASM compat version of the library (speeds up compilation)" OFF)
# Enable for resizable heap, with some amount of slowness
option(ALLOW_MEMORY_GROWTH "Allow Memory Growth" OFF)
# Default initial memory size is 64*1024*1024 = 64MB
set(INITIAL_MEMORY 67108864 CACHE STRING "Initial Memory")
# Default maximum memory size is 128*1024*1024 = 128MB (only used when ALLOW_MEMORY_GROWTH is true)
set(MAXIMUM_MEMORY 134217728 CACHE STRING "Maximum Memory")
# The configurations we support
set(CMAKE_CONFIGURATION_TYPES "Debug;Release;Distribution")
# No floating point exception checking
set(FLOATING_POINT_EXCEPTIONS_ENABLED OFF)
# Turn off LTO
set(INTERPROCEDURAL_OPTIMIZATION OFF)
# Override debug symbols
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(GENERATE_DEBUG_SYMBOLS ON)
set(JPH_DEBUG_SYMBOL_FORMAT "source-map" CACHE STRING "")
else()
set(GENERATE_DEBUG_SYMBOLS OFF)
endif()
# Turn off custom allocator
set(DISABLE_CUSTOM_ALLOCATOR ON)
# Turn off ObjectStream
set(ENABLE_OBJECT_STREAM OFF)
# Use 32-bit object layers to support more bits in ObjectLayerPairFilterMask
set(OBJECT_LAYER_BITS 32)
# Enable multi threading
if (ENABLE_MULTI_THREADING)
set(MULTI_THREADED_FLAG
-pthread
--post-js ${CMAKE_CURRENT_SOURCE_DIR}/multi-threaded.js
-s SHARED_MEMORY)
set(ENVIRONMENT_FLAG
-s ENVIRONMENT='web,node,worker'
-s PTHREAD_POOL_SIZE=16)
set(CMAKE_CXX_FLAGS "-pthread -s SHARED_MEMORY")
set(OUTPUT_BASE_NAME "${OUTPUT_FOLDER}jolt-physics.multithread")
set(REMOVE_THREAD_LOCAL "")
else()
set(MULTI_THREADED_FLAG "")
set(ENVIRONMENT_FLAG "-s ENVIRONMENT='web,node'")
set(OUTPUT_BASE_NAME "${OUTPUT_FOLDER}jolt-physics")
# Tried to keep this multi-platform since windows/mac/linux all treat -i different,
# though this creates extra backup file in a non-tracked folder.
# Removing 'thread_local' from the generated binding code fixes a small 'residual' allocation
# in the proper_cleanup.html demo and it is not needed when in single threaded mode.
# See: https://github.com/jrouwe/JoltPhysics.js/discussions/222#discussioncomment-11381106
set(REMOVE_THREAD_LOCAL sed -i.bak -e "s:thread_local::g" glue.cpp)
endif()
# Enable SIMD flags
if (ENABLE_SIMD)
set(ENABLE_SIMD_FLAG
-msimd128
-msse4.2)
set(USE_WASM_SIMD ON)
else()
set(ENABLE_SIMD_FLAG "")
set(USE_WASM_SIMD OFF)
endif()
# Include Jolt
include(FetchContent)
FetchContent_Declare(
JoltPhysics
GIT_REPOSITORY "https://github.com/jrouwe/JoltPhysics"
GIT_TAG "v5.3.0"
SOURCE_SUBDIR "Build"
)
FetchContent_MakeAvailable(JoltPhysics)
# Enable resizable heap, with some amount of slowness. Default is 128*1024*1024 = 128MB
if (ALLOW_MEMORY_GROWTH)
set(MEMORY_GROWTH_FLAG
-s ALLOW_MEMORY_GROWTH=1
-s MAXIMUM_MEMORY=${MAXIMUM_MEMORY})
else()
set(MEMORY_GROWTH_FLAG "")
endif()
# Enable memory profiler
if (ENABLE_MEMORY_PROFILER)
set(MEMORY_PROFILER_FLAG "--memoryprofiler")
set(INCLUDE_DEMANGLE_ALL_FLAG "-s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE='$demangleAll'")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${MEMORY_PROFILER_FLAG}")
else()
set(MEMORY_PROFILER_FLAG "")
set(INCLUDE_DEMANGLE_ALL_FLAG "")
endif()
set(EMCC_ARGS
-fno-rtti
-fno-exceptions
--extern-pre-js ${JOLT_FRONT_MATTER_FILE}
--post-js glue.js
--closure=1
${MULTI_THREADED_FLAG}
--post-js ${CMAKE_CURRENT_SOURCE_DIR}/helpers.js
${MEMORY_GROWTH_FLAG}
-s ALLOW_TABLE_GROWTH=1
-s WASM_BIGINT=0
${ENVIRONMENT_FLAG}
-s EXPORT_ES6=1
-s EXPORT_NAME="Jolt"
-s MODULARIZE=1
-s NO_EXIT_RUNTIME=1
-s NO_FILESYSTEM=1
-s STACK_SIZE=1048576
-s INITIAL_MEMORY=${INITIAL_MEMORY}
${MEMORY_PROFILER_FLAG}
${INCLUDE_DEMANGLE_ALL_FLAG}
${ENABLE_SIMD_FLAG})
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(EMCC_ARGS
${EMCC_ARGS}
-g${JPH_DEBUG_SYMBOL_FORMAT}
-s ASSERTIONS)
else()
set(EMCC_ARGS
${EMCC_ARGS}
-O3)
endif()
set(EMCC_JS_ARGS ${EMCC_ARGS}
-s AGGRESSIVE_VARIABLE_ELIMINATION=1
-s ELIMINATE_DUPLICATE_FUNCTIONS=1
-s SINGLE_FILE=1
-s WASM=0)
if (NOT ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug"))
# LEGACY_VM_SUPPORT does not currently work in debug builds, see: https://github.com/emscripten-core/emscripten/issues/23687
set(EMCC_JS_ARGS ${EMCC_JS_ARGS} -s LEGACY_VM_SUPPORT=1)
endif()
set(EMCC_WASM_ARGS ${EMCC_ARGS}
-s BINARYEN_IGNORE_IMPLICIT_TRAPS=1
-s WASM=1)
set(EMCC_WASM_COMPAT_ARGS ${EMCC_WASM_ARGS}
-s SINGLE_FILE=1)
set(EMCC_GLUE_ARGS
-c
-I${JoltPhysics_SOURCE_DIR}/..
-Wall
-std=c++17
-fno-rtti
-fno-exceptions
${MULTI_THREADED_FLAG}
-DJPH_OBJECT_LAYER_BITS=32
-DJPH_DISABLE_CUSTOM_ALLOCATOR
-include ${JOLT_HEADER_FILE}
${MEMORY_PROFILER_FLAG}
${ENABLE_SIMD_FLAG})
# Can't find a way to automatically inherit settings set by target_compile_definitions, so hardcoding defines here
if ("${CMAKE_BUILD_TYPE}" STREQUAL "Debug")
set(JOLT_IDL_FILE ${JOLT_IDL_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/JoltJS-DebugRenderer.idl )
set(EMCC_GLUE_ARGS
${EMCC_GLUE_ARGS}
-DJPH_DEBUG_RENDERER -DJPH_PROFILE_ENABLED -D_DEBUG)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
set(JOLT_IDL_FILE ${JOLT_IDL_FILE} ${CMAKE_CURRENT_SOURCE_DIR}/JoltJS-DebugRenderer.idl )
set(EMCC_GLUE_ARGS
${EMCC_GLUE_ARGS}
-DJPH_DEBUG_RENDERER -DJPH_PROFILE_ENABLED -DNDEBUG)
elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "Distribution")
set(EMCC_GLUE_ARGS
${EMCC_GLUE_ARGS}
-DNDEBUG)
else()
message("Unknown CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
# Add double precision define
if (DOUBLE_PRECISION)
set(EMCC_GLUE_ARGS ${EMCC_GLUE_ARGS} -DJPH_DOUBLE_PRECISION)
endif()
project("JoltPhysics.js")
add_custom_command(
OUTPUT ${JOLT_TYPING}
COMMAND npx webidl-dts-gen -e -d -i jolt.idl -o ${JOLT_TYPING} -n Jolt
DEPENDS jolt.idl
COMMENT "Generating JoltPhysics.js bindings"
VERBATIM)
add_custom_command(
OUTPUT glue.cpp glue.js jolt.idl
BYPRODUCTS parser.out WebIDLGrammar.pkl
COMMAND cat ${JOLT_IDL_FILE} > jolt.idl
COMMAND ${PYTHON} ${WEBIDL_BINDER_SCRIPT} jolt.idl glue
COMMAND ${REMOVE_THREAD_LOCAL}
DEPENDS ${JOLT_IDL_FILE}
COMMENT "Generating JoltPhysics.js bindings"
VERBATIM)
add_custom_command(
OUTPUT glue.o
COMMAND emcc glue.cpp ${EMCC_GLUE_ARGS} -o glue.o
DEPENDS glue.cpp ${JOLT_HEADER_FILE}
COMMENT "Building JoltPhysics.js bindings"
VERBATIM)
add_custom_target(jolt-bindings ALL DEPENDS glue.js glue.o ${JOLT_TYPING})
if (NOT BUILD_WASM_COMPAT_ONLY)
if (NOT ENABLE_MULTI_THREADING # Not compatible with multi threading due to error: 'void wasm::I64ToI32Lowering::visitStore(Store *): Assertion `!curr->isAtomic && "atomic store not implemented"' failed.'
AND NOT ENABLE_SIMD) # Not compatible with SIMD due to error: 'unhandled unaligned load'
add_custom_command(
OUTPUT ${OUTPUT_BASE_NAME}.js
COMMAND emcc glue.o $<TARGET_FILE:Jolt> ${EMCC_JS_ARGS} -o ${OUTPUT_BASE_NAME}.js
DEPENDS jolt-bindings ${JOLT_FRONT_MATTER_FILE} ${JOLT_TARGETS} ${JOLT_IDL_FILE} ${JOLT_HEADER_FILE}
COMMENT "Building JoltPhysics.js javascript"
VERBATIM)
add_custom_target(jolt-javascript ALL DEPENDS ${OUTPUT_BASE_NAME}.js)
endif()
add_custom_command(
OUTPUT ${OUTPUT_BASE_NAME}.wasm.js ${OUTPUT_BASE_NAME}.wasm.wasm
COMMAND emcc glue.o $<TARGET_FILE:Jolt> ${EMCC_WASM_ARGS} -o ${OUTPUT_BASE_NAME}.wasm.js
DEPENDS jolt-bindings ${JOLT_FRONT_MATTER_FILE} ${JOLT_TARGETS} ${JOLT_IDL_FILE} ${JOLT_HEADER_FILE}
COMMENT "Building JoltPhysics.js webassembly"
VERBATIM)
add_custom_target(jolt-wasm ALL DEPENDS ${OUTPUT_BASE_NAME}.wasm.js ${OUTPUT_BASE_NAME}.wasm.wasm)
endif()
add_custom_command(
OUTPUT ${OUTPUT_BASE_NAME}.wasm-compat.js
COMMAND emcc glue.o $<TARGET_FILE:Jolt> ${EMCC_WASM_COMPAT_ARGS} -o ${OUTPUT_BASE_NAME}.wasm-compat.js
DEPENDS jolt-bindings ${JOLT_FRONT_MATTER_FILE} ${JOLT_TARGETS} ${JOLT_IDL_FILE} ${JOLT_HEADER_FILE}
COMMENT "Building JoltPhysics.js compat webassembly"
VERBATIM)
add_custom_target(jolt-wasm-compat ALL DEPENDS ${OUTPUT_BASE_NAME}.wasm-compat.js)