-
Notifications
You must be signed in to change notification settings - Fork 153
Expand file tree
/
Copy pathCMakeLists.txt
More file actions
302 lines (264 loc) · 11.7 KB
/
CMakeLists.txt
File metadata and controls
302 lines (264 loc) · 11.7 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
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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
cmake_minimum_required(VERSION 3.21)
if(POLICY CMP0135)
cmake_policy(SET CMP0135 NEW)
endif()
include(FetchContent)
# --------------------------------------------------
# Declarations
# --------------------------------------------------
# EXCLUDE_FROM_ALL is used to prevent FetchContent from automatically adding
# targets to the ALL_BUILD target. We do this for all dependencies except
# JsRuntimeHost because JsRuntimeHost has top-level targets (e.g., AppRuntime)
# that are part of the Babylon Native contract. When adding dependencies using
# FetchContent, add the EXCLUDE_FROM_ALL option except where there are top-level
# targets that are part of the Babylon Native contract.
FetchContent_Declare(AndroidExtensions
GIT_REPOSITORY https://github.com/BabylonJS/AndroidExtensions.git
GIT_TAG 2e85a8d43b89246c460112c9e5546ad54b6e87b4
EXCLUDE_FROM_ALL)
FetchContent_Declare(arcana.cpp
GIT_REPOSITORY https://github.com/microsoft/arcana.cpp.git
GIT_TAG b9bf9d85fce37d5fc9dbfc4a4dc5e1531bee215a
EXCLUDE_FROM_ALL)
FetchContent_Declare(arcore-android-sdk
GIT_REPOSITORY https://github.com/google-ar/arcore-android-sdk.git
GIT_TAG 98cb803de5482fb2b36effe8be3b5a0d3b726976
EXCLUDE_FROM_ALL)
FetchContent_Declare(base-n
GIT_REPOSITORY https://github.com/azawadzki/base-n.git
GIT_TAG 7573e77c0b9b0e8a5fb63d96dbde212c921993b4
EXCLUDE_FROM_ALL)
FetchContent_Declare(bgfx.cmake
GIT_REPOSITORY https://github.com/BabylonJS/bgfx.cmake.git
GIT_TAG be578c80f6c1c1e4d2b5baa163bd452f1d3b88fa
EXCLUDE_FROM_ALL)
FetchContent_Declare(CMakeExtensions
GIT_REPOSITORY https://github.com/BabylonJS/CMakeExtensions.git
GIT_TAG 631780e42886e5f12bfd1a5568c7395f1d657f43
EXCLUDE_FROM_ALL)
FetchContent_Declare(glslang
GIT_REPOSITORY https://github.com/BabylonJS/glslang.git
GIT_TAG 39a80699a315cb7f66c4ab3180edd4e2910fab28
EXCLUDE_FROM_ALL)
FetchContent_Declare(googletest
URL "https://github.com/google/googletest/archive/refs/tags/v1.17.0.tar.gz"
EXCLUDE_FROM_ALL)
FetchContent_Declare(ios-cmake
GIT_REPOSITORY https://github.com/leetal/ios-cmake.git
GIT_TAG 4.5.0
EXCLUDE_FROM_ALL)
FetchContent_Declare(JsRuntimeHost
GIT_REPOSITORY https://github.com/BabylonJS/JsRuntimeHost.git
GIT_TAG 808601482588b7f806d91231288310b94766dc84)
FetchContent_Declare(libwebp
GIT_REPOSITORY https://github.com/webmproject/libwebp.git
GIT_TAG 57e324e2eb99be46df46d77b65705e34a7ae616c
EXCLUDE_FROM_ALL)
FetchContent_Declare(metal-cpp
GIT_REPOSITORY https://github.com/bkaradzic/metal-cpp.git
GIT_TAG metal-cpp_26
EXCLUDE_FROM_ALL)
FetchContent_Declare(SPIRV-Cross
GIT_REPOSITORY https://github.com/BabylonJS/SPIRV-Cross.git
GIT_TAG 0e1654748e9e54b5469fb0fbc1c715b96fa06f8f
EXCLUDE_FROM_ALL)
# --------------------------------------------------
FetchContent_MakeAvailable(CMakeExtensions)
# BABYLON_NATIVE_BUILD_SOURCETREE flag is used by BabylonReactNative NPM build process.
# CMake script is run twice. At package creation, BABYLON_NATIVE_BUILD_SOURCETREE is ON
# which makes all dependencies to be fetched and packaged.
# At build time, cmake is run again on BabylonNative root but FETCHCONTENT_FULLY_DISCONNECTED is ON
# and FetchContent_MakeAvailable_With_Message will use provided local folder provided to cmake command line
# like '-DFETCHCONTENT_SOURCE_DIR_BGFX.CMAKE=../shared/Babylon/....'
if(VISIONOS OR IOS OR BABYLON_NATIVE_BUILD_SOURCETREE)
FetchContent_MakeAvailable_With_Message(ios-cmake)
if(NOT BABYLON_NATIVE_BUILD_SOURCETREE)
set(CMAKE_TOOLCHAIN_FILE "${ios-cmake_SOURCE_DIR}/ios.toolchain.cmake" CACHE PATH "")
endif()
set(ENABLE_ARC OFF CACHE STRING "Enables or disables ARC support.")
endif()
if(VISIONOS)
set(PLATFORM "VISIONOSCOMBINED" CACHE STRING "")
set(DEPLOYMENT_TARGET "1.0" CACHE STRING "")
elseif(IOS)
set(PLATFORM "OS64COMBINED" CACHE STRING "")
set(DEPLOYMENT_TARGET "13" CACHE STRING "")
endif()
project(BabylonNative)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Suppress "Performing Test ..." output from check_c_compiler_flag() and similar macros.
set(CMAKE_REQUIRED_QUIET TRUE)
# --------------------------------------------------
# Options
# --------------------------------------------------
# General
option(BABYLON_NATIVE_BUILD_APPS "Build Babylon Native apps." ${PROJECT_IS_TOP_LEVEL})
option(BABYLON_NATIVE_INSTALL "Include the install target." ${PROJECT_IS_TOP_LEVEL})
option(BABYLON_DEBUG_TRACE "Enable debug trace." OFF)
# WARNING: This is experimental. Only use it if you can ensure that your application will properly handle thread affinity.
option(BABYLON_NATIVE_CHECK_THREAD_AFFINITY "Checks thread safety in the graphics device calls. It can be removed if hosting application ensures thread coherence." ON)
# Plugins
option(BABYLON_NATIVE_PLUGIN_EXTERNALTEXTURE "Include Babylon Native Plugin ExternalTexture." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVECAMERA "Include Babylon Native Plugin NativeCamera." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVECAPTURE "Include Babylon Native Plugin NativeCapture." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEENCODING "Include Babylon Native Plugin NativeEncoding." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEENGINE "Include Babylon Native Plugin NativeEngine." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEENGINE_WEBP "Include Babylon Native Plugin NativeEngine - WebP." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEENGINE_COMPILESHADERS "Include Babylon Native Plugin NativeEngine - Compile Shaders." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEINPUT "Include Babylon Native Plugin NativeInput." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEOPTIMIZATIONS "Include Babylon Native Plugin NativeOptimizations." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVETRACING "Include Babylon Native Plugin NativeTracing." ON)
option(BABYLON_NATIVE_PLUGIN_NATIVEXR "Include Babylon Native Plugin XR." ON)
option(BABYLON_NATIVE_PLUGIN_SHADERCACHE "Include Babylon Native Plugin ShaderCache." ON)
option(BABYLON_NATIVE_PLUGIN_SHADERCOMPILER "Include Babylon Native Plugin ShaderCompiler." ON)
option(BABYLON_NATIVE_PLUGIN_SHADERTOOL "Include Babylon Native Plugin ShaderTool." ON)
option(BABYLON_NATIVE_PLUGIN_TESTUTILS "Include Babylon Native Plugin TestUtils." ON)
# Polyfills
option(BABYLON_NATIVE_POLYFILL_WINDOW "Include Babylon Native Polyfill Window." ON)
option(BABYLON_NATIVE_POLYFILL_CANVAS "Include Babylon Native Polyfill Canvas." ON)
# Sanitizers
option(ENABLE_SANITIZERS "Enable AddressSanitizer and UBSan" OFF)
if(ENABLE_SANITIZERS)
set(ENABLE_RTTI ON CACHE BOOL "" FORCE)
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU")
set(SANITIZERS "address,undefined")
# Check for Clang since vptr and fdsan are Clang-specific
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
# vptr is not supported on Windows.
if(NOT WIN32)
list(APPEND SANITIZERS "vptr")
endif()
# FDSan only works on Android builds with Clang
if (ANDROID)
list(APPEND SANITIZERS "fdsan")
endif()
endif()
string(JOIN "," SANITIZER_FLAGS ${SANITIZERS})
add_compile_options(-fsanitize=${SANITIZER_FLAGS} -fno-omit-frame-pointer)
add_link_options(-fsanitize=${SANITIZER_FLAGS})
elseif(MSVC)
# MSVC only supports AddressSanitizer
add_compile_options(/fsanitize=address /Zi /Od)
else()
message(FATAL_ERROR "Sanitizers not supported on this compiler.")
endif()
endif()
# --------------------------------------------------
if(ANDROID)
set(BABYLON_NATIVE_PLATFORM "Android")
elseif(IOS)
set(BABYLON_NATIVE_PLATFORM "iOS")
elseif (VISIONOS)
set(BABYLON_NATIVE_PLATFORM "visionOS")
elseif(APPLE)
set(BABYLON_NATIVE_PLATFORM "macOS")
elseif(WINDOWS_STORE)
set(BABYLON_NATIVE_PLATFORM "WinRT")
elseif(WIN32)
set(BABYLON_NATIVE_PLATFORM "Win32")
elseif(UNIX)
set(BABYLON_NATIVE_PLATFORM "Unix")
else()
message(FATAL_ERROR "Unrecognized platform: ${CMAKE_SYSTEM_NAME}")
endif()
if(APPLE)
set(GRAPHICS_API Metal)
elseif(UNIX)
if(NOT GRAPHICS_API)
set(GRAPHICS_API OpenGL)
else()
if(NOT GRAPHICS_API STREQUAL Vulkan AND NOT GRAPHICS_API STREQUAL OpenGL)
message(FATAL_ERROR "Unrecognized/Unsupported render API: ${GRAPHICS_API}")
endif()
endif()
elseif(WIN32)
if(NOT GRAPHICS_API)
set(GRAPHICS_API D3D11)
elseif(GRAPHICS_API STREQUAL "OpenGLWindowsDevOnly")
# OpenGLES via ANGLE from a Chromium-based browser (dev-only).
set(GRAPHICS_API OpenGL)
set(BABYLON_NATIVE_OPENGLES_FROM_BROWSER ON)
else()
if(NOT GRAPHICS_API STREQUAL Vulkan AND NOT GRAPHICS_API STREQUAL D3D11 AND NOT GRAPHICS_API STREQUAL D3D12)
message(FATAL_ERROR "Unrecognized/Unsupported render API: ${GRAPHICS_API}")
endif()
endif()
endif()
# Find ANGLE libraries from Edge or Chrome when using OpenGLWindowsDevOnly.
if(BABYLON_NATIVE_OPENGLES_FROM_BROWSER)
foreach(_browser_exe "msedge.exe" "chrome.exe")
if(ANGLE_LIBEGL)
break()
endif()
foreach(_reg_root "HKLM" "HKCU")
if(ANGLE_LIBEGL)
break()
endif()
execute_process(
COMMAND reg query "${_reg_root}\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\App Paths\\${_browser_exe}" /ve
OUTPUT_VARIABLE _reg_output
ERROR_QUIET
RESULT_VARIABLE _reg_result
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(NOT _reg_result EQUAL 0)
continue()
endif()
string(REGEX MATCH "REG_SZ[ \t]+([^\r\n]+)" _ "${_reg_output}")
string(STRIP "${CMAKE_MATCH_1}" _browser_path)
if(NOT _browser_path)
continue()
endif()
cmake_path(GET _browser_path PARENT_PATH _browser_dir)
file(GLOB _version_dirs LIST_DIRECTORIES true "${_browser_dir}/[0-9]*")
list(SORT _version_dirs ORDER DESCENDING)
foreach(_version_dir ${_version_dirs})
if(IS_DIRECTORY "${_version_dir}" AND EXISTS "${_version_dir}/libEGL.dll")
set(ANGLE_LIBEGL "${_version_dir}/libEGL.dll")
set(ANGLE_LIBGLESV2 "${_version_dir}/libGLESv2.dll")
message(STATUS "Found ANGLE libraries in: ${_version_dir}")
break()
endif()
endforeach()
endforeach()
endforeach()
if(NOT ANGLE_LIBEGL)
message(FATAL_ERROR "OpenGLWindowsDevOnly requires ANGLE libraries (libEGL.dll, libGLESv2.dll) from Edge or Chrome, but none were found.")
endif()
endif()
if(APPLE)
set(BABYLON_NATIVE_PLATFORM_IMPL_EXT "mm")
else()
set(BABYLON_NATIVE_PLATFORM_IMPL_EXT "cpp")
endif()
if(MSVC)
# __cplusplus value is not in sync with language version used. MVSC needs this flag to update it accordingly
# https://gitlab.kitware.com/cmake/cmake/-/issues/18837
add_compile_options(/Zc:__cplusplus)
# https://devblogs.microsoft.com/cppblog/announcing-full-support-for-a-c-c-conformant-preprocessor-in-msvc/
add_compile_options(/Zc:preprocessor)
# default to /W3
add_compile_options(/W3)
# Enable multiprocessor compilation for faster builds
add_compile_options(/MP)
endif()
if(APPLE)
# Create scheme for installation and other targets
set(CMAKE_XCODE_GENERATE_SCHEME TRUE)
endif()
if(BABYLON_DEBUG_TRACE)
add_compile_definitions(BABYLON_DEBUG_TRACE)
endif()
add_subdirectory(Dependencies)
add_subdirectory(Core)
add_subdirectory(Plugins)
add_subdirectory(Polyfills)
if(BABYLON_NATIVE_BUILD_APPS)
add_subdirectory(Apps)
endif()
# no install for glslang compiled for shaderc
if(BABYLON_NATIVE_INSTALL)
include(Install/Install.cmake)
endif()