cmake_minimum_required(VERSION 3.13.2) include(FetchContent) FetchContent_Declare(ios-cmake GIT_REPOSITORY https://github.com/leetal/ios-cmake.git GIT_TAG 4.4.1) FetchContent_MakeAvailable(ios-cmake) set(CMAKE_TOOLCHAIN_FILE "${ios-cmake_SOURCE_DIR}/ios.toolchain.cmake" CACHE PATH "") set(PLATFORM "OS64COMBINED" CACHE STRING "") # Allow the consuming project to override the iOS deployment target used when # generating the Xcode project. Resolution order: # 1. -DDEPLOYMENT_TARGET= on the cmake command line (highest priority) # 2. BABYLON_IOS_DEPLOYMENT_TARGET environment variable (forwarded by # postinstall.js so consumers can set it before `npm install`) # 3. 16.0 (default). iOS 12 used to be the default, but it is known to crash # Xcode 26's Clang while compiling DeviceImpl_iOS.mm; iOS 16 is now the # supported minimum. if(NOT DEFINED DEPLOYMENT_TARGET OR "${DEPLOYMENT_TARGET}" STREQUAL "") if(DEFINED ENV{BABYLON_IOS_DEPLOYMENT_TARGET} AND NOT "$ENV{BABYLON_IOS_DEPLOYMENT_TARGET}" STREQUAL "") set(DEPLOYMENT_TARGET "$ENV{BABYLON_IOS_DEPLOYMENT_TARGET}" CACHE STRING "iOS deployment target") else() set(DEPLOYMENT_TARGET "16" CACHE STRING "iOS deployment target") endif() endif() message(STATUS "BabylonReactNative iOS DEPLOYMENT_TARGET: ${DEPLOYMENT_TARGET}") set(ENABLE_ARC OFF CACHE STRING "Enables or disables ARC support.") set(ENABLE_PCH OFF CACHE STRING "Enables or disables precompiled headers.") set(CMAKE_XCODE_GENERATE_SCHEME ON) project(ReactNativeBabylon) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -x objective-c++") # wstring_convert and codecvt_utf8_utf16 are deprecated in C++17; prevent this from # being treated as a hard error so the build succeeds on Xcode 26+ / Clang 20+. if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang") add_compile_options(-Wno-deprecated-declarations) endif() set(BABYLON_NATIVE_PLUGIN_NATIVEXR 1) if(DEFINED ENV{BABYLON_NATIVE_PLUGIN_NATIVEXR}) set(BABYLON_NATIVE_PLUGIN_NATIVEXR $ENV{BABYLON_NATIVE_PLUGIN_NATIVEXR}) endif() set(BABYLON_NATIVE_PLUGIN_NATIVECAMERA 1) if(DEFINED ENV{BABYLON_NATIVE_PLUGIN_NATIVECAMERA}) set(BABYLON_NATIVE_PLUGIN_NATIVECAMERA $ENV{BABYLON_NATIVE_PLUGIN_NATIVECAMERA}) endif() # configure Babylon Native to use JSI set(NAPI_JAVASCRIPT_ENGINE "JSI" CACHE STRING "The JavaScript engine to power N-API") get_filename_component(REACTNATIVE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../react-native" ABSOLUTE) if(NOT EXISTS ${REACTNATIVE_DIR}) # when using symlinks get_filename_component(REACTNATIVE_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../../Apps/Playground/node_modules/react-native" ABSOLUTE) endif() # The CMake generator for XCode produces relative paths to source files. Additionally, when an XCode project # that lives in a sym linked directory is added to an XCode workspace, XCode resolves the actual path of the # XCode project. This combination results in incorrect relative paths, so just copy the jsi directory locally. file(COPY ${REACTNATIVE_DIR}/ReactCommon/jsi/jsi DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/jsi) add_subdirectory(${CMAKE_CURRENT_BINARY_DIR}/jsi/jsi ${CMAKE_CURRENT_BINARY_DIR}/jsi) target_include_directories(jsi INTERFACE ${REACTNATIVE_DIR}/ReactCommon/jsi) add_library(reactnative INTERFACE) target_include_directories(reactnative INTERFACE ${REACTNATIVE_DIR}/ReactCommon/callinvoker) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/") set(BABYLON_NATIVE_BUILD_APPS OFF CACHE BOOL "") set(BABYLON_REACT_NATIVE_SHARED_DIR "${CMAKE_CURRENT_LIST_DIR}/../../react-native/shared") add_subdirectory(${BABYLON_REACT_NATIVE_SHARED_DIR} ${CMAKE_CURRENT_BINARY_DIR}/shared) add_library(BabylonNative ${SHARED_SOURCES}) target_include_directories(BabylonNative PRIVATE ${SHARED_INCLUDES}) target_include_directories(BabylonNative PUBLIC ${CMAKE_CURRENT_LIST_DIR}) target_compile_definitions(BabylonNative PRIVATE BABYLON_NATIVE_PLUGIN_NATIVEXR=${BABYLON_NATIVE_PLUGIN_NATIVEXR}) target_compile_definitions(BabylonNative PRIVATE BABYLON_NATIVE_PLUGIN_NATIVECAMERA=${BABYLON_NATIVE_PLUGIN_NATIVECAMERA}) target_link_libraries(BabylonNative z arcana GraphicsDevice jsi reactnative JsRuntime NativeCapture NativeEngine NativeInput NativeOptimizations NativeTracing Foundation Window ShaderCache ShaderCompiler XMLHttpRequest Canvas ${ADDITIONAL_LIBRARIES}) # TODO: For some reason these don't work, so we specify these in the CMake command line args. set_target_properties(BabylonNative PROPERTIES XCODE_ATTRIBUTE_CLANG_ENABLE_OBJC_ARC NO XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET ${DEPLOYMENT_TARGET} XCODE_ATTRIBUTE_ENABLE_BITCODE YES XCODE_GENERATE_SCHEME ON )